6

I use a particular brand of TV tuner cards (TBS technologies) and the drivers are not included in the kernel, so must be rebuilt after each kernel update. After installing yesterday's kernel update to 4.4.0-143-generic the TBS drivers fail to build, but if I go back to 4.4.0-142-generic they work. The problem occurs when running make, specifically when it attempts to build a file called videobuf-dma-sg.o, and the error output is as follows:

  CC [M]  /home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.o
/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c: In function 'videobuf_dma_init_user_locked':
/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:187:21: warning: passing argument 6 of 'get_user_pages' makes pointer from integer without a cast [-Wint-conversion]
         rw == READ, 1, /* force */
                     ^
In file included from include/linux/scatterlist.h:7:0,
                 from include/linux/dma-mapping.h:10,
                 from /home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:28:
include/linux/mm.h:1222:6: note: expected 'struct page **' but argument is of type 'int'
 long get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
      ^
/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:188:9: warning: passing argument 7 of 'get_user_pages' from incompatible pointer type [-Wincompatible-pointer-types]
         dma->pages, NULL);
         ^
In file included from include/linux/scatterlist.h:7:0,
                 from include/linux/dma-mapping.h:10,
                 from /home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:28:
include/linux/mm.h:1222:6: note: expected 'struct vm_area_struct **' but argument is of type 'struct page **'
 long get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
      ^
/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:185:8: error: too many arguments to function 'get_user_pages'
  err = get_user_pages(current, current->mm,
        ^
In file included from include/linux/scatterlist.h:7:0,
                 from include/linux/dma-mapping.h:10,
                 from /home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.c:28:
include/linux/mm.h:1222:6: note: declared here
 long get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
      ^
scripts/Makefile.build:291: recipe for target '/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.o' failed
make[3]: *** [/home/backend/Drivers/linux-tbs-drivers/v4l/videobuf-dma-sg.o] Error 1
Makefile:1454: recipe for target '_module_/home/backend/Drivers/linux-tbs-drivers/v4l' failed
make[2]: *** [_module_/home/backend/Drivers/linux-tbs-drivers/v4l] Error 2
make[2]: Leaving directory '/usr/src/linux-headers-4.4.0-143-generic'
Makefile:51: recipe for target 'default' failed
make[1]: *** [default] Error 2
make[1]: Leaving directory '/home/backend/Drivers/linux-tbs-drivers/v4l'
Makefile:26: recipe for target 'all' failed
make: *** [all] Error 2

I am basically following a "recipe" for building these drivers, so I have no idea what the actual problem is or how to resolve it. I don't know if this is a bug in this particular version of the kernel, or if something has changed that will forever prevent the drivers from being rebuilt. I was hoping that maybe some kind person who knows a lot more about building from source than I could maybe give me some clue as to what is happening here, and more to the point, what I might need to do to fix it. Make runs just fine and completes without errors when using the previous 4.4.0-142-generic kernel. So what changed, I wonder?

2 Answers2

7

What changed is the mm.h file's get_user_pages() interface. This change to the base kernel code (in Jan) has finally worked its way down to the 4.4.0-143 Ubuntu kernel release. It caused all sorts of grief to Nvidia drivers and some vm drivers, but they got rewritten. Other drivers, like yours or the Intel Compute Stick's HDMI audio driver in oem-hdmi-audio-dkms_0.1_all.deb may or may not get a rewrite. Basically you have three choices:

  1. Stay with the 4.4.0-142 kernel. Forgo all future kernel patches -- the 4.4 series is dead to you until your driver is rewritten. Contact the card vendor about this, they may have a new driver.
  2. Rewrite the driver yourself. It may not be too bad, looks like this interface has seen changes in the past, and the current ones are just undoing some things. Don't attempt unless you have some kernel code experience. Maybe hire a third party developer to fix the driver, if security and using that card are critical to you.
  3. Spend your time looking for a later kernel with driver support. The HDMI audio has been fixed in later kernels, like the 4.18, so maybe you can upgrade OS/kernel. Again, check with the vendor of the card, they may be aware of which later kernels have a working driver (if any) included.

Some machines were crashing, somewhere, so somebody thought changing a LTS kernel interface was acceptable. I personally think they were wrong, but who am I to say. This alteration was upstream of Canonical, so it's considered a feature, not a bug, and unlikely to be changed because some old drivers don't work anymore.

ubfan1
  • 17,838
  • Thanks, I realize #1 is an option, but then I also have to forego security fixes in the kernel, which makes me less than enthusiastic about it. #2 is not an option for me, I am not a coder and know nothing about kernels. #3 is my hope, that at some point they will fix whatever they broke that is causing this, but I really don't even know how to effectively report this issue to whoever might be able to fix it (what I wrote above was really the best I could do to describe the problem). If you have any further suggestions, I'd much appreciate hearing them. – UbuntuUser Mar 16 '19 at 23:55
1

For anyone else that is trying to chase down this specific problem, a user that goes by the handle CrazyCat has provided patches/updates to the TBS drivers that fix this issue. There is also a discussion of this issue in the TBS Driver & Software Update forum.