工作队列:__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