2011-10-29 36 views
11

Las colas de trabajo de Linux están destinadas a ser subprocesos de nivel de núcleo 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?Cómo utilizar Linux Work Queue

Además, no pude encontrar un solo ejemplo concreto de cola de trabajos. ¿Puedes sugerir uno?

+3

Un excelente blog explica todo el concepto de núcleo de Linux básico con ejemplos: http://tuxthink.blogspot.co.il/2011/09 /workqueues-1-introduction.html http://tuxthink.blogspot.co.il/2011/09/workqueue-2-declarework.html http://tuxthink.blogspot.co.il/2011/09/workqueue -3-using-runtime-creation.html – 0x90

Respuesta

16

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, solo git grep work_struct. Puede mirar drivers/cpufreq/cpufreq.c (función handle_update) para un ejemplo simple. El siguiente artículo también incorpora un ejemplo al final, pero no utiliza 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 matriz:

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

+0

Gracias. Funciona y sorprendentemente simple. – max

+0

http://www.makelinux.net/ldd3/chp-7-sect-6 - pase esto por una segunda lectura (Solo colas de trabajo) –

0

Por defecto, el la función de trabajo se llama con el trabajo golpeado como parámetro. Dentro de la rosca, se puede obtener fácilmente el elemento de datos de la estructura. También un Gnurou, para obtener acceso a más datos, la estructura de trabajo se puede colocar 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.

Un simple descripcion de WorkQueue

worqueue son interrupción manejo medio mechanishm parte inferior, donde se da una parte de trabajo a un hilo del núcleo para ejecutar más tarde con preemtion en una interrupciones permiten. A percpu thread events/n es creado por kernel, 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 del nombre. También contiene una estructura por CPU que en 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 alguien para despertar 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.

2

Parece resuelto, y me ha sido muy útil para comprender cómo usar las colas de trabajos.Te doy un poco de código de un ejemplo sencillo en mi github, esperando que sea útil para cualquiera:

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

Se puede compilar con la 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 

Inserte el módulo por:

# sync; insmod workQueue.ko; sync 

y ver los registros:

# tailf /var/log/kern.log 

EDIT: Acabo de añadir la versión retardada:

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