Как использовать Linux Work Queue - PullRequest
       16

Как использовать Linux Work Queue

13 голосов
/ 29 октября 2011

Рабочие очереди Linux предназначены для потоков на уровне ядра с контекстом процесса.Я пытался использовать его как альтернативу kthread, который не имеет конкретного контекста процесса.Но как передать данные в рабочую очередь?work_struct имеет поле данных, которое имеет тип atomic_long_t.Я не мог передать указатель на это поле.Как мне это сделать?

Также я не смог найти ни одного конкретного примера рабочей очереди.Можете ли вы предложить один?

Ответы [ 3 ]

20 голосов
/ 29 октября 2011

Если вы хотите передать данные в вашу функцию рабочей очереди, просто внедрите структуру work_struct в вашу собственную структуру данных и используйте container_of в вашей рабочей функции, чтобы получить ее.

Что касается простого примера, ядро ​​полно его - просто git grep work_struct. Вы можете посмотреть на drivers/cpufreq/cpufreq.c (функция handle_update) для простого примера. В статье ниже также приведен пример в конце, но он не использует container_of и вместо этого полагается на тот факт, что первый член структуры имеет тот же адрес, что и его родитель:

http://www.ibm.com/developerworks/linux/library/l-tasklets/index.html

4 голосов
/ 02 февраля 2016

Кажется, это решено, и вы мне очень помогли понять, как использовать рабочие очереди.Я даю вам код простого примера в моем github, надеясь, что он будет полезен любому:

https://github.com/m0r3n/kernel_modules/blob/master/workQueue.c

Вы можете скомпилировать следующий Makefile:

KVERSION = $(shell uname -r)
obj-m = workQueue.o

all:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

Вставьте модуль с помощью:

# sync; insmod workQueue.ko; sync

И посмотрите журналы:

# tailf /var/log/kern.log

РЕДАКТИРОВАТЬ: Я только что добавил отложенную версию:

https://github.com/m0r3n/kernel_modules/blob/master/workQueueDelayed.c

0 голосов
/ 18 октября 2015

По умолчанию рабочая функция вызывается с заданным значением работы.Внутри потока элемент данных структуры может быть легко получен.Также Gnurou, чтобы получить доступ к большему количеству данных, рабочую структуру можно поместить в специфическую для реализации структуру, а с помощью контейнера макроса внутри потока можно получить доступ ко всем данным.

Простое описание рабочей очереди

worqueue - обработка прерываний в нижней половине механизма, где часть работы передается потоку ядра для последующего выполнения с предварительным включением при включении прерываний.События потока percpu / n создаются ядром, потоки также могут создаваться кодом драйверов. Структура используется для идентификации потока, важным параметром внутри структуры является поле имени. Оно также содержит структуру per CPU, которая, в свою очередь,содержит заголовок очереди ожидания, который ожидает поток, и список ссылок для добавления структуры, определяющей работу, т.е. функцию и данные. Рабочий поток получает эту структуру в качестве входного параметра. Поток запускается и ожидает очереди ожидания, чтобы кто-топробудить нитьСоздается рабочая структура, определяющая функцию.Когда рабочая очередь является расписанием, структура добавляется в конец списка ссылок, и рабочий поток просыпается.При пробуждении рабочий поток проходит по списку ссылок, определенному в структуре на процессор, и начинает выполнять функции, определенные с рабочей структурой в качестве параметра.После выполнения удаляет запись из списка ссылок.

...