print know descargar como linux-kernel interrupt-handling

linux kernel - know - ¿Qué significan estas banderas para workqueue?



print kernel version linux (1)

WQ_DRAINING

Este indicador se usa para indicar que el kernel está actualmente limpiando la pista de trabajo y que los nuevos elementos de trabajo no pueden ponerse en cola. Solo los elementos de trabajo actualmente pendientes o en ejecución pueden hacerlo durante esta fase hasta que toda la pista de trabajo esté completamente vacía.

Para obtener más información, consulte la implementación de drain_workqueue() en kernel/workqueue.c .

WQ_RESCUER

Este indicador ya está obsoleto en el Kernel más reciente según este parche y ahora el comportamiento está determinado por el indicador WQ_MEM_RECLAIM .

En lo que respecta a la funcionalidad de "rescatador", aquí está la sección relevante de documentación de kernel/workqueue.c ,

Función de hilo salvador de la cola de trabajo. Hay un rescatador para cada workqueue que tiene configurado WQ_MEM_RECLAIM.

El procesamiento regular del trabajo en un grupo puede bloquear el intento de crear un nuevo trabajador que utilice la asignación GFP_KERNEL, que tiene pocas posibilidades de convertirse en un punto muerto si se deben procesar algunos trabajos actualmente en la misma cola para satisfacer la asignación GFP_KERNEL. Este es el problema que el rescatador resuelve.

Cuando tal condición es posible, la agrupación convoca a los rescatadores de todas las colas de trabajo que tienen trabajos en cola en el grupo y les permite procesar esos trabajos para garantizar el avance.

WQ_MAX_UNBOUND_PER_CPU

(Al contrario de cómo lo ha interpretado, WQ_MAX_UNBOUND_PER_CPU NO es el número de cpus. Es el número de colas de trabajo que se pueden asociar con una CPU).

Las colas de trabajo han sido tradicionalmente por CPU, es decir, cada workqueue estaba asociada a una CPU particular, lo que resulta en un mejor rendimiento debido a la ubicación de la memoria caché. El programador kernel NO tiene otra opción que programarlo siempre en la CPU en la que se definió. En las arquitecturas actuales, esto conduce a un mayor consumo de energía, ya que incluso una única workqueue puede evitar que una CPU esté inactiva y apagada. Por lo tanto, se han introducido colas de trabajo independientes. El planificador es libre de volver a programar las secuencias de trabajo independientes en cualquier CPU como lo considere oportuno.

El número total de tales workqueues está limitado a WQ_UNBOUND_MAX_ACTIVE que se define como num_possible_cpus() * WQ_MAX_UNBOUND_PER_CPU (hasta un límite de total de las pistas de trabajo en el sistema determinado por WQ_MAX_ACTIVE ).

Mientras estudiaba workqueue, encontré indicadores y constantes de WorkQueue definidos en kernel. Tengo las siguientes dudas que no pude entender.

  1. ¿Qué significa exactamente drenar y rescatar aquí?

    WQ_DRAINING = 1 << 6, /* internal: workqueue is draining */ WQ_RESCUER = 1 << 7, /* internal: workqueue has rescuer */

  2. El número de CPU definidas para las secuencias de trabajo no vinculadas es 4. ¿Qué sucede si tengo un procesador de octa-core? Cómo la wq ilimitada estará limitada a cpus. Cómo decidieron qué CPU ejecutar, ya que ahora tienen 8 cpus no 4 cpus. ¿Es eso, se pueden ejecutar en cualquiera de 8 o solo 4 CPUs específicas?

    WQ_MAX_UNBOUND_PER_CPU = 4, / * 4 * #cpus para wq * / sin consolidar