google / gasket-driver

GNU General Public License v2.0
47 stars 29 forks source link

Building against 6.4+ kernel fails #12

Closed claymen closed 11 months ago

claymen commented 1 year ago

Building on an Ubuntu 22.04 system, on 6.3.4 it builds without issue, on 6.4.x it fails with the following. Same problem on 6.4.3, 6.4.2 and 6.4.1.

DKMS make.log for gasket-1.0 for kernel 6.4.1-060401-generic (x86_64) Thu Jul 13 07:21:12 PM AWST 2023 make: Entering directory '/usr/src/linux-headers-6.4.1-060401-generic' warning: the compiler differs from the one used to build the kernel The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1) 12.3.0 You are using: gcc-12 (Ubuntu 12.1.0-2ubuntu1~22.04) 12.1.0 CC [M] /var/lib/dkms/gasket/1.0/build/gasket_core.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_ioctl.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_interrupt.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_page_table.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_sysfs.o CC [M] /var/lib/dkms/gasket/1.0/build/apex_driver.o /var/lib/dkms/gasket/1.0/build/gasket_core.c: In function ‘gasket_register_device’: /var/lib/dkms/gasket/1.0/build/gasket_core.c:1841:41: error: passing argument 1 of ‘class_create’ from incompatible pointer type [-Werror=incompatible-pointer-types] 1841 class_create(driver_desc->module, driver_desc->name); ~~~^~~~
struct module *

In file included from ./include/linux/device.h:31, from ./include/linux/cdev.h:8, from /var/lib/dkms/gasket/1.0/build/gasket_core.h:11, from /var/lib/dkms/gasket/1.0/build/gasket_core.c:12: ./include/linux/device/class.h:230:54: note: expected ‘const char ’ but argument is of type ‘struct module ’ 230 | struct class __must_check class_create(const char name); | ~~^~ /var/lib/dkms/gasket/1.0/build/gasket_core.c:1841:17: error: too many arguments to function ‘class_create’ 1841 | class_create(driver_desc->module, driver_desc->name); | ^~~~ ./include/linux/device/class.h:230:29: note: declared here 230 | struct class __must_check class_create(const char name); | ^~~~ cc1: some warnings being treated as errors make[1]: [scripts/Makefile.build:252: /var/lib/dkms/gasket/1.0/build/gasket_core.o] Error 1 make[1]: Waiting for unfinished jobs.... make: *** [Makefile:2032: /var/lib/dkms/gasket/1.0/build] Error 2 make: Leaving directory '/usr/src/linux-headers-6.4.1-060401-generic'

claymen commented 1 year ago

Tested again on a fresh Ubuntu 22.04 install and same results on 6.4.3

DKMS make.log for gasket-1.0 for kernel 6.4.3-060403-generic (x86_64) Thu Jul 13 01:12:18 PM UTC 2023 make: Entering directory '/usr/src/linux-headers-6.4.3-060403-generic' warning: the compiler differs from the one used to build the kernel The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1) 12.3.0 You are using: gcc-12 (Ubuntu 12.1.0-2ubuntu1~22.04) 12.1.0 CC [M] /var/lib/dkms/gasket/1.0/build/gasket_core.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_ioctl.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_interrupt.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_page_table.o /var/lib/dkms/gasket/1.0/build/gasket_core.c: In function ‘gasket_register_device’: /var/lib/dkms/gasket/1.0/build/gasket_core.c:1841:41: error: passing argument 1 of ‘class_create’ from incompatible pointer type [-Werror=incompatible-pointer-types] 1841 class_create(driver_desc->module, driver_desc->name); ~~~^~~~
struct module *

In file included from ./include/linux/device.h:31, from ./include/linux/cdev.h:8, from /var/lib/dkms/gasket/1.0/build/gasket_core.h:11, from /var/lib/dkms/gasket/1.0/build/gasket_core.c:12: ./include/linux/device/class.h:230:54: note: expected ‘const char ’ but argument is of type ‘struct module ’ 230 | struct class __must_check class_create(const char name); | ~~^~ /var/lib/dkms/gasket/1.0/build/gasket_core.c:1841:17: error: too many arguments to function ‘class_create’ 1841 | class_create(driver_desc->module, driver_desc->name); | ^~~~ ./include/linux/device/class.h:230:29: note: declared here 230 | struct class __must_check class_create(const char name); | ^~~~ cc1: some warnings being treated as errors make[1]: [scripts/Makefile.build:252: /var/lib/dkms/gasket/1.0/build/gasket_core.o] Error 1 make[1]: Waiting for unfinished jobs.... make: *** [Makefile:2032: /var/lib/dkms/gasket/1.0/build] Error 2 make: Leaving directory '/usr/src/linux-headers-6.4.3-060403-generic'

And testing on 23.04 same mainline 6.4.3 kernel

DKMS make.log for gasket-1.0 for kernel 6.4.3-060403-generic (x86_64) Thu Jul 13 01:12:11 PM UTC 2023 make: Entering directory '/usr/src/linux-headers-6.4.3-060403-generic' warning: the compiler differs from the one used to build the kernel The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1) 12.3.0 You are using: gcc-12 (Ubuntu 12.2.0-17ubuntu1) 12.2.0 CC [M] /var/lib/dkms/gasket/1.0/build/gasket_core.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_ioctl.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_page_table.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_interrupt.o /var/lib/dkms/gasket/1.0/build/gasket_core.c: In function ‘gasket_register_device’: /var/lib/dkms/gasket/1.0/build/gasket_core.c:1841:41: error: passing argument 1 of ‘class_create’ from incompatible pointer type [-Werror=incompatible-pointer-types] 1841 class_create(driver_desc->module, driver_desc->name); ~~~^~~~
struct module *

In file included from ./include/linux/device.h:31, from ./include/linux/cdev.h:8, from /var/lib/dkms/gasket/1.0/build/gasket_core.h:11, from /var/lib/dkms/gasket/1.0/build/gasket_core.c:12: ./include/linux/device/class.h:230:54: note: expected ‘const char ’ but argument is of type ‘struct module ’ 230 | struct class __must_check class_create(const char name); | ~~^~ /var/lib/dkms/gasket/1.0/build/gasket_core.c:1841:17: error: too many arguments to function ‘class_create’ 1841 | class_create(driver_desc->module, driver_desc->name); | ^~~~ ./include/linux/device/class.h:230:29: note: declared here 230 | struct class __must_check class_create(const char name); | ^~~~ cc1: some warnings being treated as errors make[1]: [scripts/Makefile.build:252: /var/lib/dkms/gasket/1.0/build/gasket_core.o] Error 1 make[1]: Waiting for unfinished jobs.... make: *** [Makefile:2032: /var/lib/dkms/gasket/1.0/build] Error 2 make: Leaving directory '/usr/src/linux-headers-6.4.3-060403-generic'

claymen commented 1 year ago

Just to be thorough, tested against 6.5-rc1 with the same results, so appears to be anything from 6.4 onwards.

DKMS make.log for gasket-1.0 for kernel 6.5.0-060500rc1-generic (x86_64) Thu Jul 13 01:19:54 PM UTC 2023 make: Entering directory '/usr/src/linux-headers-6.5.0-060500rc1-generic' warning: the compiler differs from the one used to build the kernel The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1) 12.3.0 You are using: gcc-12 (Ubuntu 12.1.0-2ubuntu1~22.04) 12.1.0 CC [M] /var/lib/dkms/gasket/1.0/build/gasket_core.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_ioctl.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_interrupt.o CC [M] /var/lib/dkms/gasket/1.0/build/gasket_page_table.o /var/lib/dkms/gasket/1.0/build/gasket_core.c: In function ‘gasket_register_device’: /var/lib/dkms/gasket/1.0/build/gasket_core.c:1841:41: error: passing argument 1 of ‘class_create’ from incompatible pointer type [-Werror=incompatible-pointer-types] 1841 class_create(driver_desc->module, driver_desc->name); ~~~^~~~
struct module *

In file included from ./include/linux/device.h:31, from ./include/linux/cdev.h:8, from /var/lib/dkms/gasket/1.0/build/gasket_core.h:11, from /var/lib/dkms/gasket/1.0/build/gasket_core.c:12: ./include/linux/device/class.h:230:54: note: expected ‘const char ’ but argument is of type ‘struct module ’ 230 | struct class __must_check class_create(const char name); | ~~^~ /var/lib/dkms/gasket/1.0/build/gasket_core.c:1841:17: error: too many arguments to function ‘class_create’ 1841 | class_create(driver_desc->module, driver_desc->name); | ^~~~ ./include/linux/device/class.h:230:29: note: declared here 230 | struct class __must_check class_create(const char name); | ^~~~ cc1: some warnings being treated as errors make[2]: [scripts/Makefile.build:243: /var/lib/dkms/gasket/1.0/build/gasket_core.o] Error 1 make[2]: Waiting for unfinished jobs.... make[1]: [/usr/src/linux-headers-6.5.0-060500rc1-generic/Makefile:2026: /var/lib/dkms/gasket/1.0/build] Error 2 make: [Makefile:234: __sub-make] Error 2 make: Leaving directory '/usr/src/linux-headers-6.5.0-060500rc1-generic'

chrBrd commented 1 year ago

The function signature for class_create() has been changed in 6.4 - see here for the relevant commit.

This will get the code to compile, and I don't expect it to break anything, but be aware haven't tested this with hardware yet, and won't be able to for a few days:

EDIT: I've now verified it with hardware, it works as expected.

// `gasket_core.c`, line 1841:

// Change from this:
class_create(driver_desc->module, driver_desc->name);

// to this:
class_create(driver_desc->name);
claymen commented 1 year ago

Thank you for the fix, this is well outside my skillset, but had suspected there was some kind of fundamental change that was breaking it. I'll be able to give it a test later this evening and report back.

The function signature for class_create() has been changed in 6.4 - see here for the relevant commit.

This will get the code to compile, and I don't expect it to break anything, but be aware haven't tested this with hardware yet, and won't be able to for a few days:

// `gasket_core.c`, line 1841:

// Change from this:
class_create(driver_desc->module, driver_desc->name);

// to this:
class_create(driver_desc->name);