工作队列:__WORK_INITIALIZER 编译器警告
workqueue: __WORK_INITIALIZER compiler warning
为了学习,我尝试在 Ubuntu 14 上编译一个旧的设备驱动程序示例,但我收到了警告。
我猜触发此警告是因为从 __WORK_INITIALIZER 返回的类型与 work_struct 结构之间存在一些不一致。我不明白的是这怎么会发生。 :)
这发生在我的文件 shortprint.c 的第 19 行,根据下面显示的调用堆栈,在包含 module.h 的包含行中。所以我想我的代码是无关紧要的,这似乎在 linux 包含文件中。我说得对吗?
我 运行 Ubuntu 14.04.
fredrik@fredrik-VirtualBox:~/Documents/lab8_3/shortprint$ make
make -C /lib/modules/3.13.0-45-generic/build M=/home/fredrik/Documents/lab8_3/shortprint modules
make[1]: Entering directory `/usr/src/linux-headers-3.13.0-45-generic'
CC [M] /home/fredrik/Documents/lab8_3/shortprint/shortprint.o
In file included from include/linux/srcu.h:34:0,
from include/linux/notifier.h:15,
from include/linux/memory_hotplug.h:6,
from include/linux/mmzone.h:801,
from include/linux/gfp.h:4,
from include/linux/kmod.h:22,
from include/linux/module.h:13,
from /home/fredrik/Documents/lab8_3/shortprint/shortprint.c:19:
include/linux/workqueue.h:172:9: warning: initialization from incompatible pointer type [enabled by default]
struct work_struct n = __WORK_INITIALIZER(n, f)
FWIW 我还包含了我的 makefile:
# Comment/uncomment the following line to disable/enable debugging
#DEBUG = y
EXTRA_CFLAGS += -O2 -I..
ifneq ($(KERNELRELEASE),)
# call from kernel build system
obj-m := shortprint.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
depend .depend dep:
$(CC) $(CFLAGS) -M *.c > .depend
ifeq (.depend,$(wildcard .depend))
include .depend
endif
更正后的代码。更正前函数为void short_do_work(void*):
static void shortp_do_work(struct work_struct *work);
static DECLARE_WORK(shortp_work, shortp_do_work);
您的代码肯定是相关的。整个内核都使用这些宏并且以某种方式工作,所以我怀疑问题出在您调用它们的方式上。这将是传递给 __WORK_INITIALIZER()
.
的不兼容函数指针类型
顺便说一下,请尽可能使用DECLARE_WORK()
或INIT_WORK()
。
工人的函数原型是
typedef void (*work_func_t)(struct work_struct *work);
定义于include/linux/workqueue.h
为了学习,我尝试在 Ubuntu 14 上编译一个旧的设备驱动程序示例,但我收到了警告。
我猜触发此警告是因为从 __WORK_INITIALIZER 返回的类型与 work_struct 结构之间存在一些不一致。我不明白的是这怎么会发生。 :)
这发生在我的文件 shortprint.c 的第 19 行,根据下面显示的调用堆栈,在包含 module.h 的包含行中。所以我想我的代码是无关紧要的,这似乎在 linux 包含文件中。我说得对吗?
我 运行 Ubuntu 14.04.
fredrik@fredrik-VirtualBox:~/Documents/lab8_3/shortprint$ make
make -C /lib/modules/3.13.0-45-generic/build M=/home/fredrik/Documents/lab8_3/shortprint modules
make[1]: Entering directory `/usr/src/linux-headers-3.13.0-45-generic'
CC [M] /home/fredrik/Documents/lab8_3/shortprint/shortprint.o
In file included from include/linux/srcu.h:34:0,
from include/linux/notifier.h:15,
from include/linux/memory_hotplug.h:6,
from include/linux/mmzone.h:801,
from include/linux/gfp.h:4,
from include/linux/kmod.h:22,
from include/linux/module.h:13,
from /home/fredrik/Documents/lab8_3/shortprint/shortprint.c:19:
include/linux/workqueue.h:172:9: warning: initialization from incompatible pointer type [enabled by default]
struct work_struct n = __WORK_INITIALIZER(n, f)
FWIW 我还包含了我的 makefile:
# Comment/uncomment the following line to disable/enable debugging
#DEBUG = y
EXTRA_CFLAGS += -O2 -I..
ifneq ($(KERNELRELEASE),)
# call from kernel build system
obj-m := shortprint.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
depend .depend dep:
$(CC) $(CFLAGS) -M *.c > .depend
ifeq (.depend,$(wildcard .depend))
include .depend
endif
更正后的代码。更正前函数为void short_do_work(void*):
static void shortp_do_work(struct work_struct *work);
static DECLARE_WORK(shortp_work, shortp_do_work);
您的代码肯定是相关的。整个内核都使用这些宏并且以某种方式工作,所以我怀疑问题出在您调用它们的方式上。这将是传递给 __WORK_INITIALIZER()
.
顺便说一下,请尽可能使用DECLARE_WORK()
或INIT_WORK()
。
工人的函数原型是
typedef void (*work_func_t)(struct work_struct *work);
定义于include/linux/workqueue.h