software de núcleo de análisis de interrupción profundidad Linux

  
 

suave interrumpir introducir

El proceso se puede retrasar de un manejador de interrupciones disco independiente, por lo que este proceso puede funcionar sin interrupción abierta, este proceso es de interrupción suave. Visible interrupción, suave esto puede reducir considerablemente el tiempo de respuesta de la alarma de proceso, para muchas aplicaciones en tiempo real y su importancia.

En este artículo hablamos de interrupción blanda, como tasklet, WorkQueue Cuando hablamos más tarde. Cuando hablamos proceso de interrupción suave (consulte Linux kernel 4.0) trata de la comprensión en profundidad de los detalles de cada uno de ellos, compartir nuestra propia comprensión (si no es correcta, mira a señalar, gracias).
(título de la figura a partir de: techvark.com)

estructura de datos de interrupción suave definidos

Hay software interrumpe 10 (definido por el NR_SOFTIRQS) -ésima, a través de softirq_vec [NR_SOFTIRQS] array para gestionar estos interrupción suave, todos comparten cpu.

suave de interrupción regístrese

Encuadernación número de interrupción por open_softirq () los manipuladores específicos de interrupción suave y blando. El registro del sistema de red de paquetes transceptor suave controlador de interrupción:

 open_softirq (NET_TX_SOFTIRQ, net_tx_action); open_softirq (NET_RX_SOFTIRQ, net_rx_action); 


activación de interrupción suave

son cada uno cpu existe un mapa de bits de 32 bits (es decir __softirq_pending) para mantener suave en esta interrupción de la CPU está activo.

 typedef struct {unsigned int __softirq_pending; #ifdef CONFIG_SMP sin signo ipi_irqs int [NR_IPI]; #endif} ____cacheline_aligned irq_cpustat_irq_cpustat_t irq_stat [NR_CPUS] ____ cacheline_aligned; 

activando una tiempo de interrupción suave: irq_exit

irq_exit puede activar una función en interrupción suave, condiciones de activación son:

no se interrumpa de interrupción dura y blanda no es de por __softirq_pending esta CPU ha establecido.

 si (in_interrupt () &! &local_softirq_pending ()) invoke_softirq (); 

A partir de esta condición, podemos saber, las interrupciones Software y hardware interrumpe aquí es la igualdad de trato (en el carril in_interrupt) que encarna la esencia de este proceso se interrumpe. no puede ser interrumpido en condiciones difíciles, lo que indica que la prioridad debe ser, tiene que ser duro todo el procesado de interrupción, antes de considerar la interrupción suave; no en la condición de interrupción blanda, lo que indica que protege a la anidación de interrupción suave.

invoke_softirq función de procesamiento está bien (primera ksoftirqd estela) será entregado a ksoftirqd procesamiento especializado hilo de interrupción de software, o bien llamar directamente __do_softirq tratamiento inmediato (por supuesto, el procesamiento en tiempo real para distinguir entre lo que es en la pila: la corriente en la pila o en la pila de interrupción de software independiente).

Nos fijamos en este flujo de procesamiento en tiempo real. Ciertamente antes local_softirq_pending preempt_count restablece el bit de interrupción dura, si en este momento no hay preempt_count bits de interrupción suaves se puede interrumpir (inmediata interrupción de hardware cerrada). En __do_softirq transformación en diversos periodo de interrupción suave, sin duda apoderarse prohibido. Aprovecha el disco (blando) en el contexto de interrupciones bien se sabe que no se permiten: dejar que los tiempos de ejecución de procesos interrumpidos de incertidumbre, que no es justo (es decir, no tener que dejar en el proceso de programación dura y blanda interrupt interrumpido en intención). tiempo de activación de

interrupción suave II: raise_softirq

tarjeta de red en modo paquete recibido de la no NAPI manera NAPI evolucionando, está demostrando las ventajas de interrupción suave: la tarea cerca de la mayor medida posible manejo de interrupciones suave, máximo de manejo de interrupciones duro simplificación. Esta evolución, vamos a retomar más adelante.

Función raise_softirq llama __raise_softirq_irqoff función, ajuste la interrupción suave correspondiente en __softirq_pending mapa de bits de la CPU especificado. Raise_softirq_irqoff diferencia si la función y la función está desactivada raise_softirq funcionamiento interrumpido se ha completado. Ajuste de mapa de bits es una operación competitiva en toda interrupción de hardware puede hacer, por lo que tiene para asegurar la terminación en el caso de interrupción fuera. Tres

interrupción suave activarlo: ksoftirqd

ksoftirqd cada CPU tiene un hilo dedicado al procesamiento en la gran suave interrumpir interrupción suave:

 DEFINE_PER_CPU (task_struct struct * , ksoftirqd); 

hilo proceso central función ksoftirqd run_ksoftirqd (bucle) son: Visualización de la presente __softirq_pending la CPU conjunto, si el __do_softirqd ejecución (), ejecutar la interrupción fue terminado). Esta ejecución es muy suave, porque el hilo está en su propia pila, el problema no afecta a los procesos de usuario.

Aquí hay una pregunta, aquí solía ser cerrado para aprovechar la protección, ahora está fuera de la protección de interrupción (consulte el parche 2012 3e339b, softirq: Uso de infraestructura hotplugthread)? Nuestro entendimiento es: Off protección preventiva, hace las cosas más flexible interrumpido por el procesamiento ksoftirqd, no cumplen con la posición secundaria ksoftirqd. En cuanto al estado de procesamiento de interrupción suave, debe ser el principal irq_exit, ksoftirqd el suplemento. )

ksoftirqd Lane también se puede ver, antes de realizar la interrupción suave pueda ser substituida, pero una vez comenzado no se puede interrumpir (y uno de los esquema anterior: pensando en el irq_exit es consistente a). Es decir, la ideología y la interrupción de hardware de procesamiento de interrupción suave es el mismo: la programación permite que ocurra durante la ejecución!

La razón de lo anterior en realidad no se adelantará a otra transaccional principio similar: una vez comenzado no se puede detener. Otra razón es que la aplicación de (suave) programa de interrupción definido por el usuario duro, la operación es incierto si el calendario tiene que hacer durante estas operaciones pueden, oscilará entre el control del núcleo.

activación de interrupción suave de los cuatro: el resto de

Por ejemplo netif_rx_ni (), antes de aprovechar realizan costumbres do_softirq, no puede realizar un período de interrupción de programación suave.

suave de activación de interrupción Cinco: local_bh_enable

 if (! improbable (in_interrupt () &&local_softirq_pending ())) do_softirq (); 

Piense en ello, si las excepciones y se necesita ser activado suave suave interrupción de interrupción ha compartido los datos, manejo de excepciones se dirigió esta área crítica de los datos compartidos, pero no es necesario para apagar la alarma de proceso. Así que cuando se complete la zona crítica, es necesario abrir la interrupción suave en este momento es un momento de activar (ver preempt_count, de hecho, también puede ser un momento de aprovechar).

con y " la activación y " en lugar de y " Call " debido a que el procesamiento periférica modifica solamente __softirq_pending mapa de bits actual de la CPU, y, finalmente, por los mecanismos centrales (tales como la ksoftirqd, por cheque in_interrupt controlador de interrupción suave ) oferta real, y esta es la idea de interrupción suave: permiten interrupción de hardware (u otro) para llevar a cabo más rápido, lo mismo ocurre con el uso de las llamadas directas.

" la activación y " el principio de que es activo, que se ocupan de, duro en la CPU que interrumpen interrupción suave traerá la CPU que es manejado por (o CPU atribuye es difícil de interrupción suave interrupción acompañar) . De este modo, poner en pleno juego las ventajas de smp, equilibrado a cada CPU. En cuanto a la relación entre la interrupción de hardware y CPU, veremos más adelante hablamos de la interrupción dura. Cada mantiene su propio mecanismo de cpu suave de interrupción en la línea, cada CPU no está relacionado. Nota, hay relevancia: cada procesamiento paralelo de la CPU cuando el mismo tipo de interrupción suave, el manejo de tipo blando de interrupción que hay que hacer para proteger los datos compartidos, que es suave interrupción precio a pagar reentrada.

interrupción suave función de núcleo de procesamiento de do_softirq

do_softirq comprobar las condiciones de re-entrada de interrupción suaves: no debe ser interrumpido en interrupción dura y blanda no está en, puede empezar después de la calificación para realizar las siguientes interrupciones de software tratado:

 pendiente = local_softirq_pending (); si (pendiente) __do_softirq (); 

este proceso se realiza bajo la protección de las costumbres interrumpido, después de todo, de interrupción dura y blanda interrumpe esencialmente el mismo, son sistema interrumpida (por supuesto, en el duro /blando interrumpir la interna volvió a abrir otro asunto). También se puede ver, no hay pendientes variables locales entrantes dentro __do_softirq, por lo que aquí sólo el juicio, en vez de usar, y el valor de determinación interna, donde el valor puede variar, el número de bits puestos en el mapa de bits será menor.

Vamos a entrar en lo que esta condiciones de examen. Nuestro entendimiento es:

Esta condición ha llegado a dos efectos: el mismo suave sobre una CPU no interrumpir la anidación; anidado interrumpe difícil no suave manejo de interrupciones. Cpu en las mismas condiciones, __ función se realiza do_softirq serie, no reentrante (do_softirq función puede decirse que es reentrante); cpu a una pluralidad de términos, __ función do_softirq es reentrante, incluso con un tipo de interrupción suave. Es decir, la suave interrumpir esto comprobando las condiciones lo hicieron en esta CPU suave tratamiento de interrupciones serialización, por supuesto, entre el paralelo o multi-CPU, por lo que el mismo tipo de manejo de interrupciones suave todavía necesitan para proteger su parte de las estructuras de datos relevantes .

Kernel software de manejo de interrupciones de __do_softirq

__ do_softirq procesamiento función es posible (aunque todavía puede llevar a cabo acabado) se activa para llevar a cabo todas las interrupciones de software (__softirq_pending una identificación de mapa de bits de la presente cpu ) proceso. Se analizaron tres etapas.

etapas de procesamiento de preparación: Cerrar interrupción suave (el efecto es comprobar la condición mencionada arriba es verdadera, a fin de lograr el propósito de la prohibición suave en esta CPU anidación de interrupción).

etapas de procesamiento central: off interrupción de hardware, este mapa de bits se obtiene __softirq_pending CPU y almacenado, mapa de bits vacío, interrupción de hardware abierto (interrupción de hardware necesita ser activado sólo cuando el mapa de bits de lectura, evitar otra interrupción de hardware operación simultánea). La implementación de este cpu todo interrupción suave (obtenido de la memoria de mapa de bits hacia arriba). Se trata de los ciclos de procesamiento del núcleo de hasta 10 (MAX_SOFTIRQ_RESTART), después de todo este tiempo utilizando una pila de proceso de usuario, no se puede tomar prestado demasiado tiempo. condiciones de salida de bucle son: tiempo total excede o sea invalidada (ruptura abierta habría adelantó) o hasta 10 veces.

al final de las etapas de procesamiento: Off interrumpir dura suave interrumpir abierta.

Además, si se resuelven 10 ciclos de interrupción suave sin fin, la interrupción se produce durante el difícil explicar mucho, traer suave adicional interrumpir mucho. Entonces no seguir afectando el préstamo de la pila de proceso de usuario, y directamente a un dedicado hilos ksoftirqd kernel. Esto también explica el significado del ciclo: entrará en un nuevo período de interrupción suave duro proceso de interrupción, lo que trajo nueva interrupción suave (por supuesto, sólo se fija en __softirq_pending esta CPU no tendrá el procesamiento real) , por lo que es necesario repetir el procesamiento (objetivo de procesamiento es muy clara, es para vaciar el mapa de bits __softirq_pending en esta CPU).

Mira que impiden proceso de anidación de interrupción suave. Off suaves frases clave de interrupción deben tener un átomo más 1, si el núcleo de una trayectoria de corriente antes de la operación atómica es interrumpido por otro camino central B, entonces B Después de realizar interrupción de hardware y software interrupciones, este retorno a la A en una se realiza la operación atómica a continuación, después de que el controlador de interrupción suave debe estar inactivo, debido B debe haberse terminado de procesar. Si B se interrumpe después de que se complete la operación atómica B realiza interrupción de hardware, interrupción de software no lleva a cabo su propia pero saldrá (debido a que la interrupción de software de anidamiento), el regreso al lugar donde, se realiza entonces una A, una, además de la suave manejo de interrupciones propias, sino también para hacer frente a las interrupciones adicionales blandos B.

preempt_count para el bit de interrupción blanda, puede saber de lo anterior, tiene dos funciones: prevenir la interrupción suave que anidan en una sola CPU, no asegura que se adelantó durante la ejecución de interrupción suave.

Finalmente, tuvo una repetición: hablar aquí __do_softirq funciones se procesan en una CPU, en paralelo en múltiples CPU no está sujeto a ningún tipo de control.

Resumen

Sobre la interrupción momento parece muy complicado, pero no puede escapar dos principios: la alarma de proceso interrumpirá interrupción de hardware (por supuesto diferentes tipos); interrupción de hardware interrumpirán interrupción suave (de la misma manera: disco blando interrupción de interrupción no interrumpirá, no interrumpa interrupción suave suave de interrupción). De hecho, todo el tiempo aparentemente complejo son sólo dos de los superpuesta única

Copyright © Conocimiento de Windows All Rights Reserved