linux-kernel interrupt-handling softirq tasklet

linux kernel - Diferencia entre SoftIRQs y Tasklets



linux-kernel interrupt-handling (4)

Mientras estudiaba el manejo de interrupciones de Linux, descubrí que los Tasklets y los SoftIRQ son dos métodos diferentes para realizar la "mitad inferior" (trabajo de menor prioridad). Entiendo esto (necesidad bastante genuina).

La diferencia es que los SoftIRQ son re-entarantes mientras que un Tasklet NO lo es. Ese mismo SoftIRQ puede ejecutarse en diferentes CPU, mientras que este NO es el caso de Tasklets.

Aunque entiendo esto de la superficie, no logro comprender los requisitos de las dos características. ¿En qué caso (s) podemos utilizar estas instalaciones? Cómo reconocer que debería usar Tasklets ahora y SoftIRQ entonces.

También, ¿qué queremos decir con Tasklets que se crean en SoftIRQs? En uno de los libros que leí en LKML hubo debates sobre la eliminación de Tasklets. Me confundí por completo por qué uno traería tal característica? Alguna miopía (sin ofender)

Cualquier sugerencia sobre esto ayudará mucho.


Los Sofirqs son reingresantes, es decir, la CPU diferente puede tomar el mismo softirq y ejecutarlo, mientras que los Tasklets están serializados, es decir, la misma CPU que ejecuta el tasklet tiene el derecho de completarlo, ninguna otra CPU puede tomarlo (en caso de que de programación). Consulte este excellent artículo.

También puede habilitar / deshabilitar el procesamiento de diferimientos utilizando el local_bh_enable () en la CPU local, lo que en realidad hace que _ _local_bh_count no sea cero.

Lea también este libro (descargable de forma gratuita), página número 131, que explica la diferencia y explica cómo utilizar el código con un dispositivo falso / falso: rodillo.


Los Tasklets se implementan sobre softirq''s, por lo que son softirq''s. están representados por la diferencia "HI_SOFTIRQ & TASKLET_SOFTIRQ" de dos softirq es la prioridad. Aunque se implementan en la parte superior de softirq, se diferencian en:

  • Los Tasklets se pueden crear / destruir de forma estática o dinámica, pero los softirq son solo de forma estática.

  • Dos tasklets diferentes pueden ejecutarse simultáneamente en la misma CPU. Pero dos del mismo tipo de tasklets no pueden ejecutarse en la misma CPU. Mientras que los softirq son de otra manera.

Los softirq están reservados para el procesamiento de la mitad inferior de la mayoría del tiempo crítico e importante en el sistema.


Los softirqs se asignan estáticamente en tiempo de compilación. A diferencia de los tasklets, no puede registrar y destruir softirq dinámicamente. Los tasklets son similares a softirqs (en funcionamiento), sin embargo, tienen una interfaz más sencilla. Los softirqs son necesarios solo para aplicaciones de muy alta frecuencia y altamente subprocesos, mientras que, las herramientas de tareas funcionan bien en cualquier otro caso.


include/linux/interrupt.h

/* PLEASE, avoid to allocate new softirqs, if you need not _really_ high frequency threaded job scheduling. For almost all the purposes tasklets are more than enough. F.e. all serial device BHs et al. should be converted to tasklets, not to softirqs. */ enum { HI_SOFTIRQ=0, /* High Priority */ TIMER_SOFTIRQ, NET_TX_SOFTIRQ, NET_RX_SOFTIRQ, BLOCK_SOFTIRQ, BLOCK_IOPOLL_SOFTIRQ, TASKLET_SOFTIRQ, SCHED_SOFTIRQ, HRTIMER_SOFTIRQ, RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */ NR_SOFTIRQS };

Las diferencias clave entre softirq y tasklet son:

Asignación

  • Los softirqs se asignan estáticamente en tiempo de compilación. A diferencia de los tasklets, no puede registrar y destruir softirqs dinámicamente.
  • Los Tasklets pueden asignarse estáticamente utilizando DECLARE_TASKLET(name, func, data) o también pueden asignarse dinámicamente e inicializarse en tiempo de ejecución utilizando tasklet_init(name, func, data)

Concurrencia

  • Los softirqs pueden ejecutarse simultáneamente en varias CPU, incluso si son del mismo tipo porque los softirqs son funciones reentrant y deben proteger explícitamente sus estructuras de datos con los spinlocks.
  • Los Tasklets non-reentrant son non-reentrant y los tasklets del mismo tipo siempre se serializan: en otras palabras, el mismo tipo de tasklet no puede ser ejecutado por dos CPU al mismo tiempo. Sin embargo, los tasklets de diferentes tipos pueden ejecutarse simultáneamente en varias CPU.

Tratamiento

  • Los softirqs se activan mediante raise_softirq() . Los softirqs pendientes son procesados ​​por do_softirq() y ksoftirqd subproceso del kernel después de ser habilitados por local_bh_enable() o por spin_unlock_bh()
  • Los Tasklets son un mecanismo de la mitad inferior construido sobre softirqs, es decir, los tasklets están representados por dos softirqs: HI_SOFTIRQ y TASKLET_SOFTIRQ . Los Tasklets se ejecutan realmente desde un softirq. La única diferencia real en estos tipos es que las HI_SOFTIRQ basadas en HI_SOFTIRQ ejecutan antes de las TASKLET_SOFTIRQ . Entonces, tasklet_schedule() básicamente llama raise_softirq(TASKLET_SOFTIRQ)
  • Tenga en cuenta que los softirqs (y, por lo tanto, los tasklets y los temporizadores) se ejecutan en el retorno de interrupciones de hardware, o en el retorno de una llamada del sistema. También, tan pronto como el hilo que elevó el softirq termina, ese solo softirq (y en otro) se ejecuta para minimizar la softirq latency .