linux kernel - tipos - Cómo usar Linux Work Queue
linux y sus versiones (3)
Las colas de trabajo de Linux están destinadas a ser subprocesos de nivel de kernel con contexto de proceso. Intentaba usarlo como una alternativa a kthread que no tiene un contexto de proceso específico. ¿Pero cómo paso los datos a la cola de trabajo? work_struct tiene un campo de datos que es de tipo atomic_long_t. No pude pasar el puntero a este campo. ¿Cómo lo hago?
Además, no pude encontrar un solo ejemplo concreto de cola de trabajos. ¿Puedes sugerir uno?
Si desea pasar datos a su función de cola de trabajo, solo incruste la estructura work_struct
dentro de su propia estructura de datos y use container_of
dentro de su función de trabajo para recuperarla.
En cuanto a un ejemplo simple, el kernel está lleno de eso, solo git grep work_struct
. Puede ver los drivers/cpufreq/cpufreq.c
(función handle_update
) para ver un ejemplo simple. El artículo siguiente también incluye un ejemplo al final, pero no usa container_of
y en su lugar se basa en el hecho de que el primer miembro de una estructura tiene la misma dirección que su principal:
http://www.ibm.com/developerworks/linux/library/l-tasklets/index.html
Por defecto, la función de trabajo se llama con el trabajo marcado como parámetro. Dentro del hilo, el elemento de datos de la estructura puede obtenerse fácilmente. También un Gnurou, para obtener acceso a más datos, la estructura de trabajo puede colocarse dentro de una estructura específica de implementación y utilizando el contenedor de macro dentro del hilo se puede acceder a todos los datos.
Una descripción simple sobre workqueue
Los worqueue son interrupts que manejan la mitad inferior de mechanishm, donde se da una parte del trabajo a un hilo del kernel para ejecutarlo más tarde con preemtion en una activación de interrupciones. El kernel crea un thread percpu events / n, los hilos también pueden ser creados por el código del controlador. Una estructura se usa para identificar el hilo, un parámetro importante dentro de la estructura es el campo de nombre. También contiene una estructura por CPU que a su vez contiene el encabezado waitqueue en el que espera el subproceso y una lista de enlaces para agregar la estructura que define el trabajo, es decir, la función y los datos. El subproceso worker obtiene esa estructura como parámetro de entrada. El subproceso se ejecuta y espera en la cola de espera para que alguien despierta el hilo. Se crea una estructura de trabajo definiendo la función. Cuando se programa una secuencia de trabajo, la estructura se agrega a la cola de la lista de enlaces y el subproceso de trabajo se activa. Al despertar, el hilo de trabajo recorre la lista de enlaces definida en la estructura por CPU y comienza a ejecutar las funciones definidas con la estructura de trabajo como parámetro. Después de ejecutarlo, elimina la entrada de la lista de enlaces.
Parece resuelto, y me has sido muy útil para entender cómo usar las colas de trabajos. Te doy un código de un ejemplo simple en mi github, esperando que sea útil para cualquiera:
https://github.com/m0r3n/kernel_modules/blob/master/workQueue.c
Puede compilar con el siguiente 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
Inserta el módulo por:
# sync; insmod workQueue.ko; sync
Y mira los registros:
# tailf /var/log/kern.log
EDITAR: Acabo de agregar la versión demorada:
https://github.com/m0r3n/kernel_modules/blob/master/workQueueDelayed.c