From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Linux Users

cancel
Showing results for 
Search instead for 
Did you mean: 

nirlpk.c compile errors with 2.6.27 kernel

Compiling nirlpk.c from the DDK with a 2.6.27-3-rt (Ubuntu 8.10) kernel produces the following errors:

nirlpk.c:48:28: error: linux/config.h: No such file or directory

nirlpk.c:111: error: unknown field ‘enable_wake’ specified in initializer

nirlpk.c:324: error: unknown field ‘nopage’ specified in initializer

nirlpk.c:407: error: ‘VM_SHM’ undeclared (first use in this function)

Most error lines can be commented out (see http://forums.ni.com/ni/board/message?board.id=90&thread.id=1477) but not the the 'nopage' field of vm_operations_struct (now changed to 'fault').

Is there a patched version of nirlpk.c?

0 Kudos
Message 1 of 5
(7,405 Views)

I don't have a patch for nirlpk.c, but the conversion to from nopage to fault shouldn't be too difficult.  If you haven't already you may want to read:

http://lwn.net/Articles/242625/

If you have any questions about the conversion let me know, and I can probably help you out.

Shawn Bohrer

National Instruments

Use NI products on Linux? Come join the NI Linux Users Community
0 Kudos
Message 2 of 5
(3,815 Views)

Here's what I hope is a patch for this.  Can you confirm this is right?

I'm not confident that it's the correct thing to do here, but it sort of looks right.  Inspired somewhat by ieee1394/dma.c

I'm not even sure how to test this properly...

Anyways, the new function looks like:

/*
  nNIRLP_vmaFault
   
  Description: virtual memory area (vma) page fault handler.
               (*fault)() replaced (*nopage)() in 2.6.23
*/

static int nNIRLP_vmaFault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
    struct nNIRLP_tDMA *dma = vma->vm_private_data;

    vmf->page = virt_to_page(dma->address.cpu + (vmf->pgoff << PAGE_SHIFT));
    get_page(vmf->page);
    return 0;
}

0 Kudos
Message 3 of 5
(3,815 Views)

Thanks. It looks right. As far as I understand, we need to calculate the virtual address of the dma buffer page that's missing, then load it, which it does as far as I can tell (there's a bit of info on virt_to_page() here that I found useful too). Note I also added VM_CAN_NONLINEAR to the vm_fault flags field as suggested here (thanks Shawn).

The complete patch for nirlpk.c based on yours is attached. It compiles and installs OK now, but I haven't tested it either yet (and won't be able to for a while).

For anyone else interested, the steps I took were:

In the /.../nimhddk_linux26/Linux26/nirlpk directory

1. Patch the nirlpk.c file: patch nirlpk.c < nirlpk-patch-2.6.27

2. Change the #!bin/sh header line in files install.sh, uninstall.sh and nirlp to read #!bin/bash. This is to suit Ubuntu that runs dash as the default shell. These scripts need bash not dash it seems.

3. Run make

4. Run make install

🙂

0 Kudos
Message 4 of 5
(3,815 Views)

OK, I lied when I said this was easy to convert.  I spent some time thinking about it and I think it you want:

vmf->page = virt_to_page(dma->address.cpu + ((vmf->pgoff - vma->vm_pgoff) << PAGE_SHIFT));

The code in 'drivers/ieee1394/dma.c' works because they guarantee that vma->vm_pgoff == 0 in their mmap implementation.  In the nirlpk.c case vma->vm_pgoff is the bus address of the DMA buffer.  Therefore (vmf->pgoff - vma->vm_pgoff) gives you the offset into the buffer where the fault occured.

Now since you are touching more than just vmf->pgoff I'm not sure if you can set VM_CAN_NONLINEAR.

Keep in mind this is all from me just looking at the code, and I have not tested anything myself.  I would think that if you want to test this all you would need to do is mmap() a DMA buffer and try to do some DMA.

Shawn Bohrer

National Instruments

Use NI products on Linux? Come join the NI Linux Users Community
0 Kudos
Message 5 of 5
(3,815 Views)