Lines Matching full:de

13 			 BARRERAS DE MEMORIA EN EL KERNEL LINUX
22 Nota: Si tiene alguna duda sobre la exactitud del contenido de esta
31 de brevedad) y sin querer (por ser humanos) incompleta. Este documento
32 pretende ser una guía para usar las diversas barreras de memoria
34 pregunte. Algunas dudas pueden ser resueltas refiriéndose al modelo de
35 consistencia de memoria formal y documentación en tools/memory-model/. Sin
36 embargo, incluso este modelo debe ser visto como la opinión colectiva de
37 sus maintainers en lugar de que como un oráculo infalible.
39 De nuevo, este documento no es una especificación de lo que Linux espera
42 El propósito de este documento es doble:
51 arquitectura proporciona menos de eso, dicha arquitectura es incorrecta.
61 (*) Modelo abstracto de acceso a memoria.
66 (*) ¿Qué son las barreras de memoria?
68 - Variedades de barrera de memoria.
69 - ¿Qué no se puede asumir sobre las barreras de memoria?
70 - Barreras de dirección-dependencia (históricas).
71 - Dependencias de control.
72 - Emparejamiento de barreras smp.
73 - Ejemplos de secuencias de barrera de memoria.
74 - Barreras de memoria de lectura frente a especulación de carga.
80 - Barreras de memoria de la CPU.
82 (*) Barreras de memoria implícitas del kernel.
84 - Funciones de adquisición de cerrojo.
85 - Funciones de desactivación de interrupciones.
86 - Funciones de dormir y despertar.
89 (*) Efectos de barrera adquiriendo intra-CPU.
93 (*) ¿Dónde se necesitan barreras de memoria?
100 (*) Efectos de barrera de E/S del kernel.
102 (*) Modelo de orden mínimo de ejecución asumido.
104 (*) Efectos de la memoria caché de la CPU.
106 - Coherencia de caché.
107 - Coherencia de caché frente a DMA.
108 - Coherencia de caché frente a MMIO.
113 - Guests de máquinas virtuales.
115 (*) Ejemplos de usos.
123 MODELO ABSTRACTO DE ACCESO A MEMORIA
151 Cada CPU ejecuta un programa que genera operaciones de acceso a la memoria.
152 En la CPU abstracta, el orden de las operaciones de memoria es muy
153 relajado, y una CPU en realidad puede realizar las operaciones de memoria
155 mantenerse. De manera similar, el compilador también puede organizar las
159 Entonces, en el diagrama anterior, los efectos de las operaciones de
164 Por ejemplo, considere la siguiente secuencia de eventos:
172 El conjunto de accesos visto por el sistema de memoria en el medio se puede
186 y por lo tanto puede resultar en cuatro combinaciones diferentes de
194 Además, los stores asignados por una CPU al sistema de memoria pueden no
198 Como otro ejemplo, considere esta secuencia de eventos:
206 Aquí hay una dependencia obvia de la dirección, ya que el valor cargado en
207 D depende en la dirección recuperada de P por la CPU 2. Al final de la
208 secuencia, cualquiera de los siguientes resultados son posibles:
215 cargará P en Q antes de emitir la carga de *Q.
220 Algunos dispositivos presentan sus interfaces de control como colecciones
221 de ubicaciones de memoria, pero el orden en que se accede a los registros
222 de control es muy importante. Por ejemplo, imagine una tarjeta ethernet con
223 un conjunto de registros a los que se accede a través de un registro de
224 puerto de dirección (A) y un registro de datos del puerto (D). Para leer el
230 pero esto podría aparecer como cualquiera de las siguientes dos secuencias:
235 el segundo de las cuales casi con certeza resultará en mal funcionamiento,
236 ya que se estableció la dirección _después_ de intentar leer el registro.
242 Hay algunas garantías mínimas que se pueden esperar de una CPU:
250 operaciones de memoria:
255 emite una instrucción de barrera de memoria, de modo que una CPU DEC
256 Alpha, sin embargo emite las siguientes operaciones de memoria:
263 (*) Los loads y stores superpuestos dentro de una CPU en particular
264 parecerán ser ordenados dentro de esa CPU. Esto significa que para:
269 siguiente secuencia de operaciones de memoria:
282 superpuestas de memoria).
284 Y hay una serie de cosas que _deben_ o _no_ deben asumirse:
287 con referencias de memoria que no están protegidas por READ_ONCE() y
289 de transformaciones "creativas", que se tratan en la sección BARRERA
297 podemos obtener cualquiera de las siguientes secuencias:
306 (*) Se _debe_ suponer que los accesos de memoria superpuestos pueden
311 podemos obtener cualquiera de las siguientes secuencias:
321 podemos obtener cualquiera de:
329 (*) Estas garantías no se aplican a los campos de bits, porque los
331 secuencias de lectura-modificación-escritura no atómica. No intente
332 utilizar campos de bits para sincronizar algoritmos paralelos.
334 (*) Incluso en los casos en que los campos de bits están protegidos por
336 de bits dado deben estar protegidos por un candado. Si dos campos en un
337 campo de bits dado están protegidos por diferentes locks, las
338 secuencias de lectura-modificación-escritura no atómicas del lock
339 pueden causar una actualización a una campo para corromper el valor de
343 dimensionados. De "tamaño adecuado" significa actualmente variables que
346 no hay restricciones para "char", alineación de dos bytes para "short",
347 alineación de cuatro bytes para "int", y alineación de cuatro u ocho
348 bytes para "long", en sistemas de 32 y 64 bits, respectivamente. Tenga
351 ejemplo, gcc 4.6). La parte de la norma que contiene esta garantía es
352 la Sección 3.14, que define "ubicación de memoria" de la siguiente
355 ubicación de memoria
356 ya sea un objeto de tipo escalar, o una secuencia máxima
357 de campos de bits adyacentes, todos con ancho distinto de cero
359 NOTE 1: Dos hilos de ejecución pueden actualizar y acceder
360 ubicaciones de memoria separadas sin interferir entre
363 NOTE 2: Un campo de bits y un miembro adyacente que no es un campo de
364 bits están en ubicaciones de memoria separadas. Lo mismo sucede con
365 dos campos de bits, si uno se declara dentro de un declaración de
367 declaración de campo de bits de longitud cero, o si están separados por
368 un miembro no declarado como campo de bits. No es seguro actualizar
369 simultáneamente dos campos de bits en la misma estructura si entre
370 todos los miembros declarados también hay campos de bits, sin importar
371 cuál resulta ser el tamaño de estos campos de bits intermedios.
375 ¿QUÉ SON LAS BARRERAS DE MEMORIA?
378 Como se puede leer arriba, las operaciones independientes de memoria se
379 realizan de manera efectiva en orden aleatorio, pero esto puede ser un
381 requiere es alguna forma de intervenir para instruir al compilador y al
384 Las barreras de memoria son este tipo de intervenciones. Imponen una
385 percepción de orden parcial, sobre las operaciones de memoria a ambos lados
386 de la barrera.
389 sistema pueden usar una variedad de trucos para mejorar el rendimiento,
390 incluido el reordenamiento, diferimiento y combinación de operaciones de
391 memoria; cargas especulativas; predicción de "branches" especulativos y
392 varios tipos de almacenamiento en caché. Las barreras de memoria se
394 controle sensatamente la interacción de múltiples CPU y/o dispositivos.
397 VARIEDADES DE BARRERA DE MEMORIA
400 Las barreras de memoria vienen en cuatro variedades básicas:
402 (1) Barreras de memoria al escribir o almacenar (Write or store memory
405 Una barrera de memoria de escritura garantiza que todas las
406 operaciones de STORE especificadas antes de que la barrera aparezca
407 suceden antes de todas las operaciones STORE especificadas después
408 de la barrera, con respecto a los otros componentes del sistema.
410 Una barrera de escritura es un orden parcial solo en los stores; No
413 Se puede considerar que una CPU envía una secuencia de operaciones de
414 store al sistema de memoria a medida que pasa el tiempo. Todos los
415 stores _antes_ de una barrera de escritura ocurrirán _antes_ de todos
416 los stores después de la barrera de escritura.
418 [!] Tenga en cuenta que las barreras de escritura normalmente deben
419 combinarse con read o barreras de address-dependency barriers
420 (dependencia de dirección); consulte la subsección
421 "Emparejamiento de barreras smp".
424 (2) Barrera de dependencia de dirección (histórico).
426 Una barrera de dependencia de dirección es una forma más débil de
427 barrera de lectura. En el caso de que se realicen dos loads de manera
428 que la segunda dependa del resultado de la primera (por ejemplo: el
430 load), una barrera de dependencia de dirección sería necesaria para
431 asegurarse de que el objetivo de la segunda carga esté actualizado
432 después de acceder a la dirección obtenida por la primera carga.
434 Una barrera de dependencia de direcciones es una ordenación parcial en
435 laods de direcciones interdependientes; no se requiere que tenga
436 ningún efecto en los stores, ya sean cargas de memoria o cargas
437 de memoria superpuestas.
440 secuencias de stores en el sistema de memoria que la considerada CPU
441 puede percibir. Una barrera de dependencia de dirección emitida por
443 si esa carga toca alguna secuencia de stores de otra CPU, entonces
444 en el momento en que la barrera se complete, los efectos de todos los
446 carga emitida después la barrera de la dependencia de la dirección.
448 Consulte la subsección "Ejemplos de secuencias de barrera de memoria"
449 para ver los diagramas mostrando las restricciones de orden.
452 dependencia de _dirección_ y no es una dependencia de control. Si la
453 dirección para la segunda carga depende de la primera carga, pero la
454 dependencia es a través de un condicional en lugar de -en realidad-
455 cargando la dirección en sí, entonces es una dependencia de _control_
456 y se requiere una barrera de lectura completa o superior. Consulte la
457 subsección "Dependencias de control" para más información.
459 [!] Tenga en cuenta que las barreras de dependencia de dirección
460 normalmente deben combinarse con barreras de escritura; consulte la
461 subsección "Emparejamiento de barreras smp".
464 de memoria de direcciones explícitas. Hoy en día, las APIs para marcar
465 cargas de variables compartidas, como READ_ONCE() y rcu_dereference(),
466 proporcionan barreras de dependencia de dirección implícitas.
468 (3) Barreras de memoria al leer o cargar (Read or load memory
471 Una barrera de lectura es una barrera de dependencia de direcciones,
472 más una garantía de que todas las operaciones de LOAD especificadas
473 antes de la barrera parecerán ocurrir antes de todas las operaciones
474 de LOAD especificadas después de la barrera con respecto a los demás
477 Una barrera de lectura es un orden parcial solo en cargas; no es
480 Las barreras de memoria de lectura implican barreras de dependencia de
483 [!] Tenga en mente que las barreras de lectura normalmente deben
484 combinarse con barreras de escritura; consulte la subsección
485 "Emparejamiento de barreras smp".
487 (4) Barreras de memoria generales
489 Una barrera de memoria general proporciona la garantía de que todas
490 las operaciones LOAD y STORE especificadas antes de que la barrera
491 aparezca suceden antes de que todas las operaciones LOAD y STORE
492 especificadas después de la barrera con respecto a los demás
495 Una barrera de memoria general es un orden parcial tanto en
496 operaciones de carga como de almacenamiento.
498 Las barreras de memoria generales implican barreras de memoria tanto
499 de lectura como de escritura, de modo que pueden sustituir a
502 Y un par de variedades implícitas:
504 (5) ACQUIRE (de adquisición).
507 toda las operaciones de memoria después de la operación ACQUIRE
508 parezcan suceder después de la ACQUIRE con respecto a los demás
512 Las operaciones de memoria que ocurren antes de una operación ACQUIRE
513 pueden parecer suceder después de que se complete.
516 operación RELEASE (de liberación).
519 (6) Operaciones RELEASE (de liberación).
522 Garantiza que todas las operaciones de memoria antes de la operación
523 RELEASE parecerán ocurrir antes de la operación RELEASE con respecto a
524 los demás componentes del sistema. Las operaciones de RELEASE incluyen
525 operaciones de UNLOCK y operaciones smp_store_release().
527 Las operaciones de memoria que ocurren después de una operación
528 RELEASE pueden parecer suceder antes de que se complete.
530 El uso de las operaciones ACQUIRE y RELEASE generalmente excluye la
531 necesidad de otros tipos de barrera de memoria. Además, un par
532 RELEASE+ACQUIRE NO garantiza actuar como una barrera de memoria
533 completa. Sin embargo, después de un ACQUIRE de una variable dada,
536 otras palabras, dentro de la sección crítica de una variable dada,
537 todos los accesos de todas las secciones críticas anteriores para esa
538 variable habrán terminado de forma garantizada.
540 Esto significa que ACQUIRE actúa como una operación mínima de
541 "adquisición" y RELEASE actúa como una operación mínima de
544 Un subconjunto de las operaciones atómicas descritas en atomic_t.txt
545 contiene variantes de ACQUIRE y RELEASE, además de definiciones
549 la parte de la operación del store.
551 Las barreras de memoria solo son necesarias cuando existe la posibilidad de
553 garantizar que no habrá tal interacción en ninguna pieza de código en
554 particular, entonces las barreras de memoria son innecesarias en ese
555 fragmento de código.
559 puede confiar en estas fuera de esa arquitectura en específico.
562 ¿QUÉ NO SE PUEDE ASUMIR SOBRE LAS BARRERAS DE LA MEMORIA?
565 Hay ciertas cosas que las barreras de memoria del kernel Linux no
568 (*) No hay garantía de que ninguno de los accesos a la memoria
569 especificados antes de una barrera de memoria estará _completo_ al
570 completarse una instrucción de barrera de memoria; se puede considerar
571 que la barrera dibuja una línea en la cola de acceso del CPU que no
574 (*) No hay garantía de que la emisión de una barrera de memoria en una CPU
577 ve los efectos de los primeros accesos que ocurren de la CPU, pero lea
580 (*) No hay garantía de que una CPU vea el orden correcto de los efectos
581 de los accesos de una segunda CPU, incluso _si_ la segunda CPU usa una
582 barrera de memoria, a menos que la primera CPU _también_ use una
583 barrera de memoria coincidente (vea el subapartado "Emparejamiento de
586 (*) No hay garantía de que alguna pieza intermedia fuera del hardware[*]
587 del CPU no reordenará los accesos a la memoria. Los mecanismos de
588 coherencia de caché del CPU deben propagar los efectos indirectos de
589 una barrera de memoria entre las CPU, pero es posible que no lo hagan
599 BARRERA DE DEPENDENCIA DE DIRECCIÓN (HISTÓRICO)
602 A partir de la versión 4.15 del kernel Linux, se agregó un smp_mb() a
605 código específico de la arquitectura DEC Alpha y aquellas que trabajan en
607 estén interesados desde un punto de vista histórico, aquí está la historia
608 de las barreras de dependencia de dirección.
610 [!] Si bien las dependencias de direcciones se observan tanto en carga a
611 carga como en relaciones de carga a store, las barreras de dependencia de
612 dirección no son necesarias para situaciones de carga a store.
614 El requisito de las barreras de dependencia de dirección es un poco sutil,
616 siguiente secuencia de eventos:
622 <barrera de escritura>
628 que no implica una barrera de dependencia de direcciones.
630 Hay una clara dependencia de dirección aquí, y parecería que al final de
636 ¡Pero! La percepción de la CPU 2 de P puede actualizarse _antes_ de su
637 percepción de B, por lo tanto dando lugar a la siguiente situación:
641 Si bien esto puede parecer una falla en el mantenimiento de la coherencia
645 Para lidiar con esto, READ_ONCE() proporciona una barrera de dependencia
646 de dirección implícita desde el lanzamiento del kernel v4.15:
652 <barrera de escritura>
655 <barrera de dependencia de dirección implícita>
658 Esto refuerza la ocurrencia de una de las dos implicaciones, y previene la
659 tercera posibilidad de surgir.
663 intuición surge más fácilmente en máquinas con cachés divididos, de modo
664 que, por ejemplo, un banco de caché procesa líneas de caché pares y el otro
665 banco procesa líneas impares de caché. El puntero P podría almacenarse en
666 una línea de caché impar y la variable B podría almacenarse en una línea de
667 caché con número par. Entonces, si el banco de números pares de la memoria
668 caché de la CPU de lectura está extremadamente ocupado mientras que el
670 (&B), pero el antiguo valor de la variable B (2).
673 No se requiere una barrera de dependencia de dirección para ordenar
675 escriben hasta que están seguros (1) de que la escritura realmente
676 sucederá, (2) de la ubicación de la escritura, y (3) del valor a escribir.
685 <barrera de escritura>
690 Por lo tanto, no se requiere ninguna barrera de dependencia de direcciones
692 resultado está prohibido, incluso sin una barrera de dependencia de
697 Tenga en cuenta que este patrón debe ser raro. Después de todo, el objetivo
698 del orden de dependencia es -prevenir- escrituras en la estructura de
699 datos, junto con los costosos errores de caché asociados con tales
701 de error y similares, y el orden natural de las CPUs evita que se pierdan
705 Tenga en cuenta que el orden proporcionado por una dependencia de dirección
710 La barrera de dependencia de dirección es muy importante para el sistema
712 include/linux/rcupdate.h. Esto permite que el objetivo actual de un puntero
714 del reemplazo parezca estar inicializado de manera incompleta.
716 Consulte también la subsección sobre "Coherencia de caché" para obtener un
719 DEPENDENCIAS DE CONTROL
722 Las dependencias de control pueden ser un poco complicadas porque los
723 compiladores actuales no las entienden. El propósito de esta sección es
726 Una dependencia de control load-load (de carga a carga) requiere una
727 barrera de memoria de lectura completa, no simplemente una barrera
728 (implícita) de dependencia de direcciones para que funcione correctamente.
729 Considere el siguiente fragmento de código:
732 <barrera implícita de dependencia de direcciones>
734 /* BUG: No hay dependencia de dirección!!! */
738 Esto no tendrá el efecto deseado porque no hay una dependencia de dirección
739 real, sino más bien una dependencia de control que la CPU puede
741 otras CPU vean la carga de b como si hubiera ocurrido antes que la carga de
746 <barrera de lectura>
751 provisto para dependencias de control de load-store, como en el siguiente
759 Las dependencias de control se emparejan normalmente con otros tipos de
761 son opcionales! Sin READ_ONCE(), el compilador podría combinar la carga de
762 'a' con otras cargas de 'a'. Sin WRITE_ONCE(), el compilador podría
763 combinar el store de 'b' con otros stores de 'b'. Cualquiera de estos casos
766 Peor aún, si el compilador puede probar (decir) que el valor de la
767 variable 'a' siempre es distinta de cero, estaría dentro de sus derechos
773 Así que no deje de lado READ_ONCE().
775 Es tentador tratar de hacer cumplir el orden en stores idénticos en ambos
776 caminos del "if" de la siguiente manera:
789 Desafortunadamente, los compiladores actuales transformarán esto de la
790 siguiente manera en casos de alto nivel de optimización:
794 WRITE_ONCE(b, 1); /* BUG: No hay orden en load de a!!! */
803 Ahora no hay condicional entre la carga de 'a' y el store de 'b', lo que
804 significa que la CPU está en su derecho de reordenarlos: El condicional es
806 incluso después de que se hayan aplicado todas las optimizaciones del
808 explícitamente barreras de memoria, por ejemplo, smp_store_release():
820 Por el contrario, sin barreras de memoria explícita, el control de un if
834 el valor de 'a'.
836 Además, debe tener cuidado con lo que hace con la variable local 'q', de lo
858 la carga de la variable 'a' y el store de la variable 'b'. Es tentador
860 barrera no lo traerá de vuelta. Por lo tanto, si confia en este orden, debe
861 asegurarse de que MAX sea mayor que uno, tal vez de la siguiente manera:
864 BUILD_BUG_ON(MAX <= 1); /* Orden de carga de a con store de b */
873 Tenga en cuenta una vez más que los stores de 'b' difieren. Si fueran
875 store fuera de la declaración 'if'.
877 También debe tener cuidado de no confiar demasiado en el cortocircuito
878 de la evaluación booleana. Considere este ejemplo:
885 siempre cierta, el compilador puede transformar este ejemplo de la
891 Este ejemplo subraya la necesidad de asegurarse de que el compilador no
896 Además, las dependencias de control se aplican solo a la cláusula then y
897 la cláusula else de la sentencia if en cuestión. En particular, no se
906 WRITE_ONCE(c, 1); /* BUG: No hay orden para la lectura de 'a'. */
908 Es tentador argumentar que, de hecho, existe un orden porque el compilador
910 en 'b' con la condición. Desafortunadamente para esta línea de
912 instrucciones de movimiento condicional, como en este fantástico idioma
922 Una CPU débilmente ordenada no tendría dependencia de ningún tipo entre la
923 carga de 'a' y el store de 'c'. Las dependencias de control se extenderían
924 solo al par de instrucciones cmov y el store dependiente de ellas. En
925 resumen, las dependencias de control se aplican solo a los stores en la
926 cláusula then y la cláusula else de la sentencia if en cuestión (incluidas
931 Tenga muy en cuenta que el orden proporcionado por una dependencia de
932 control es local a la CPU que lo contiene. Vea el apartado de "Atomicidad
938 (*) Las dependencias de control pueden ordenar cargas anteriores para
939 stores posteriores. Sin embargo, no garantizan ningún otro tipo de
941 almacenamientos previos y luego nada. Si necesita tales formas de
942 orden, use smp_rmb(), smp_wmb() o, en el caso de stores anteriores y
945 (*) Si ambos caminos de la declaración "if" comienzan con stores
946 idénticos de la misma variable, entonces esos stores deben ser
949 es suficiente usar barrier() al comienzo de cada caso de la
951 optimización de los compiladores puede destruir la dependencia de
952 control respetando al pie de la letra la ley de barrier().
954 (*) Las dependencias de control requieren al menos un condicional en
955 tiempo de ejecución entre la carga anterior y el almacenamiento
957 compilador es capaz de optimizar el condicional y quitarlo, también
958 habrá optimizado el ordenar. El uso cuidadoso de READ_ONCE() y
961 (*) Las dependencias de control requieren que el compilador evite
962 reordenar las dependencia hasta su inexistencia. El uso cuidadoso de
964 dependencia de control. Consulte la sección BARRERA DEL COMPILADOR
967 (*) Las dependencias de control se aplican solo a la cláusula then y la
968 cláusula else de la sentencia "if" que contiene la dependencia de
970 cláusulas. Las dependencias de control no se aplican al código que
971 sigue a la instrucción if que contiene la dependencia de control.
973 (*) Las dependencias de control se emparejan normalmente con otros tipos
974 de barreras.
976 (*) Las dependencias de control no proporcionan atomicidad multicopia. Si
980 (*) Los compiladores no entienden las dependencias de control. Por lo
981 tanto es su trabajo asegurarse de que no rompan su código.
984 EMPAREJAMIENTO DE BARRERAS SMP
987 Cuando se trata de interacciones CPU-CPU, ciertos tipos de barrera de
992 con la mayoría de otro tipo de barreras, aunque sin atomicidad multicopia.
993 Una barrera de adquisición se empareja con una barrera de liberación, pero
995 supuesto, las barreras generales. Una barrera de escritura se empareja con
996 una barrera de dependencia de dirección, una dependencia de control, una
997 barrera de adquisición, una barrera de liberación, una barrera de lectura
998 o una barrera general. Del mismo modo, una barrera de lectura se empareja
999 con una de dependencia de control o barrera de dependencia de dirección con
1000 una barrera de escritura, una barrera de adquisición, una barrera de
1006 <barrera de escritura>
1008 <barrera de lectura>
1016 <barrera de escritura>
1018 <barrera de dependencia de dirección implícita>
1028 <barrera de control implícita>
1034 Básicamente, la barrera de lectura siempre tiene que estar ahí, aunque
1037 [!] Tenga en cuenta que normalmente se esperaría que los stores antes de la
1038 barrera de escritura se hagan coincidir con los stores después de la
1039 barrera de lectura o la barrera de dependencia de dirección, y viceversa:
1045 <barrera de escritura> \ <barrera de lectura>
1050 EJEMPLOS DE SECUENCIAS DE BARRERA DE MEMORIA
1053 En primer lugar, las barreras de escritura actúan como orden parcial en las
1054 operaciones de store. Considere la siguiente secuencia de eventos:
1061 <barrera de escritura>
1065 Esta secuencia de eventos es finalizado para con el sistema de coherencia
1066 de memoria en un orden que el resto del sistema podría percibir como el
1079 | | wwwwwwwwwwwwwwww } <--- En este momento la barrera de
1082 | | : +------+ } sean confirmados antes de que otros
1088 | sistema de memoria por parte del CPU 1
1091 En segundo lugar, las barreras de dependencia de dirección actúan como
1092 órdenes parciales sobre la dirección de cargas dependientes. Considere la
1093 siguiente secuencia de eventos:
1100 <barrera de escritura>
1106 aleatorio a efectos prácticos, a pesar de la barrera de escritura emitida
1110 | | +------+ +-------+ | Secuencia de
1111 | |------>| B=2 |----- --->| Y->8 | | actualizado de
1125 Percepción de B ---> | | B->7 |------>| |
1129 La carga de X frena ---> \ | X->9 |------>| |
1130 el mantenimiento de \ +-------+ | |
1131 la coherencia de B ----->| B->2 | +-------+
1136 En el ejemplo anterior, la CPU 2 percibe que B es 7, a pesar de la carga de
1137 *C (que sería B) viniendo después del LOAD de C.
1139 Sin embargo, si se colocara una barrera de dependencia de dirección entre
1140 la carga de C y la carga de *C (es decir: B) en la CPU 2:
1147 <barrera de escritura>
1150 <barrera de dependencia de dirección>
1173 Se asegura de que ---> \ aaaaaaaaaaaaaaaaa | |
1175 store de C sean percibidos ----->| B->2 |------>| |
1180 Y en tercer lugar, una barrera de lectura actúa como un orden parcial sobre
1181 las cargas. Considere la siguiente secuencia de eventos:
1187 <barrera de escritura>
1193 algún orden aleatorio a efectos prácticos, a pesar de la barrera de
1216 Sin embargo, si se colocara una barrera de lectura entre la carga de B y la
1217 carga de A en la CPU 2:
1223 <barrera de escritura>
1226 <barrera de lectura>
1246 de lectura consigue que \ +-------+ | |
1248 al almacenamiento de B sean +-------+ | |
1252 Para ilustrar esto de manera más completa, considere lo que podría pasar si
1253 el código contenía una carga de A a cada lado de la barrera de lectura:
1259 <barrera de escritura>
1262 LOAD A [primer load de A]
1263 <rbarrera de lectura>
1264 LOAD A [segundo load de A]
1266 Aunque las dos cargas de A ocurren después de la carga de B, ambas pueden
1286 de lectura consigue que \ +-------+ | |
1288 al almacenamiento de B sean +-------+ | |
1292 perceptible para la CPU 2 antes de que la barrera de lectura se complete de
1318 la carga de B resultó en B == 2. No existe tal garantía para la primera
1319 carga de A; esto puede dar como resultado A == 0 o A == 1.
1322 BARRERAS DE MEMORIA DE LECTURA FRENTE A ESPECULACIÓN DE CARGA
1326 un elemento de la memoria, y encuentran un momento en el que no están
1328 aunque en realidad no lo hayan llegado a ese punto en el flujo de ejecución
1329 de instrucciones todavía. Esto permite que la instrucción de carga real
1330 potencialmente complete de inmediato, porque la CPU ya tiene el valor a
1342 DIVIDE } Instrucciones de división
1355 especula sobre el LOAD de A +-------+ ~ | |
1364 Colocando una barrera de lectura o una barrera de dependencia de dirección
1365 justo antes de la segundo carga:
1374 <rbarrera de lectura>
1378 medida dependiente del tipo de barrera utilizada. Si no se hizo ningún
1379 cambio en la ubicación de memoria especulada, entonces el valor especulado
1389 especula sobre el LOAD de A +-------+ ~ | |
1401 pero si había una actualización o una invalidación de otra CPU pendiente,
1411 especula sobre el LOAD de A +-------+ ~ | |
1433 al mismo tiempo en todas las -otras- CPUs. El resto de este documento
1443 <barrera general> <barrera de lectura>
1446 Suponga que la carga de la CPU 2 desde X devuelve 1, que luego almacena en
1447 Y, y la carga de la CPU 3 desde Y devuelve 1. Esto indica que el store de
1448 la CPU 1 a X precede a la carga de la CPU 2 desde X y el store de esa CPU 2
1449 a Y precede la carga de la CPU 3 desde Y. Además, las barreras de memoria
1451 CPU 3 carga desde Y antes de cargar desde X. La pregunta entonces es
1452 "¿Puede la carga de la CPU 3 desde X devolver 0?"
1454 Debido a que la carga de la CPU 3 desde X en cierto sentido viene después
1455 de la carga de la CPU 2, es natural esperar que la carga de la CPU 3 desde
1456 X deba devolver 1. Esta expectativa se deriva de la atomicidad multicopia:
1457 si una carga que se ejecuta en la CPU B sigue una carga de la misma
1459 el valor que leyó), entonces en sistemas atómicos multicopia, la carga de
1460 la CPU B debe devolver el mismo valor que hizo la carga de la CPU A o algún
1464 El uso de una barrera de memoria general en el ejemplo anterior compensa
1465 cualquier falta de atomicidad multicopia. En el ejemplo, si la carga de la
1466 CPU 2 de X devuelve 1 y la carga de la CPU 3 de Y devuelve 1, entonces la
1467 carga de la CPU 3 desde X debe de hecho también devolver 1.
1469 Sin embargo, las dependencias, las barreras de lectura y las barreras de
1470 escritura no siempre son capaces de compensar la atomicidad no multicopia.
1471 Por ejemplo, supongamos que la barrera general de la CPU 2 se elimina del
1472 ejemplo anterior, dejando solo la dependencia de datos que se muestra a
1479 <dependencia de datos> <barrera de lectura>
1483 este ejemplo, es perfectamente legal que la carga de la CPU 2 desde X
1484 devuelva 1, la carga de la CPU 3 desde Y devuelva 1, y su carga desde X
1487 El punto clave es que aunque la dependencia de datos de la CPU 2 ordena su
1488 carga y store, no garantiza ordenar el store de la CPU 1. De forma que, si
1490 y 2 comparten un buffer de almacenamiento o un nivel de caché, la CPU 2
1491 podría tener acceso anticipado de escritura a CPU 1. Por lo tanto, se
1493 orden combinado de accesos múltiples.
1497 que -todas- las CPU percibirán el mismo orden de -todas- las operaciones.
1498 Por el contrario, una cadena de parejas de liberación-adquisición no
1500 que las CPU de la cadena estén de acuerdo en el orden combinado de los
1501 accesos. Por ejemplo, cambiando a código C en deferencia al fantasma de
1534 Dado que cpu0(), cpu1() y cpu2() participan en una cadena de parejas
1541 cpu1() debe ver las escrituras de cpu0(), de modo que el siguiente
1546 Sin embargo, el orden proporcionado por una cadena de
1548 se aplica a cpu3(), al menos aparte de los stores. Por lo tanto, es posible
1558 en orden, las CPU que no participan en la cadena de liberación-adquisición
1560 de que las instrucciones de barrera de memoria débiles utilizadas para
1563 Esto significa que cpu3() puede ver el store de cpu0() suceder -después- de
1564 la carga de cpu1() desde v, aunque tanto cpu0() como cpu1() están de
1568 particular, simplemente lee de su argumento en orden. Es decir, -no-
1577 Para reiterar, si su código requiere un orden completo de todas las
1585 El kernel Linux tiene una variedad de diferentes barreras que actúan a
1590 (*) Barreras de memoria de la CPU.
1596 El kernel de Linux tiene una función de barrera del compilador explícita
1597 que evita que el el compilador mueva los accesos a la memoria de cualquier
1602 Esta es una barrera general: no hay variantes de barrier() para casos de
1604 WRITE_ONCE() pueden ser considerado como formas débiles de barrier() que
1610 preceder a cualquier acceso que preceda a barrier(). Un ejemplo de uso
1611 de esta propiedad es facilitar la comunicación entre código del
1612 interrupt-handler (encargo de gestionar interrupciones) y el código
1615 (*) Dentro de un bucle ("loop"), obliga al compilador a cargar las
1616 variables utilizadas en ese loop condicional en cada paso a través de
1620 de optimizaciones que, si bien son perfectamente seguras en código de un
1622 algunos ejemplos de tal tipo de optimizaciones:
1624 (*) El compilador está en su derecho de reordenar cargas y stores de la
1625 misma variable, y en algunos casos, la CPU está dentro de su
1626 derecho de reordenar cargas a la misma variable. Esto significa que
1632 Podría resultar en un valor más antiguo de x almacenado en a[1] que en
1633 a[0]. Evite que tanto el compilador como la CPU hagan esto de la
1639 En resumen, READ_ONCE() y WRITE_ONCE() proporcionan coherencia de
1642 (*) El compilador tiene derecho a juntar cargas sucesivas de la misma
1650 para un código de un solo subproceso, es casi seguro que no es lo
1663 en los casos en que la alta presión de los registros impida que el
1664 compilador mantenga todos los datos de interés en registros. El
1665 compilador podría por lo tanto, optimizar la variable 'tmp' de nuestro
1672 seguro en código de subproceso único, pero puede ser fatal en código
1678 Por ejemplo, la versión optimizada de este código podría resultar en
1679 pasar un cero a hacer_algo_con() en el caso de que la variable a sea
1683 De nuevo, use READ_ONCE() para evitar que el compilador haga esto:
1689 guardar tmp en la pila ("stack"). El overhead (coste en eficiencia) de
1691 recargan las variables. Hacerlo es perfectamente seguro para código de
1695 (*) El compilador está en su derecho de omitir una carga por completo si
1697 que el valor de la variable 'a' siempre es cero, puede optimizar este
1707 Esta transformación es una victoria para un código de un solo
1708 subproceso, porque se deshace de una carga y un branch. El problema es
1718 observando de cerca lo que usted hace con el valor después de
1720 una macro de preprocesador con el valor 1:
1730 (*) De manera similar, el compilador tiene derecho a omitir un store por
1741 El compilador observa que el valor de la variable 'a' ya es cero, por
1746 Use WRITE_ONCE() para evitar que el compilador haga este tipo de
1755 entre el código de nivel de proceso y un controlador de interrupción:
1770 nivel_de_procesamiento() a lo siguiente, que de hecho, bien podría ser
1771 una victoria para código de un solo subproceso:
1781 READ_ONCE() para evitar esto de la siguiente manera:
1797 controlador de interrupciones puede ser interrumpido por algo que
1799 o un NMI. De lo contrario, READ_ONCE() y WRITE_ONCE() no son
1800 necesarios en controlador_interrupcion() aparte de con fines de
1802 anidadas no ocurren típicamente en los kernels Linux modernos, de
1803 hecho, si un controlador de interrupciones regresa con interrupciones
1812 compilador solo necesita olvidar el contenido de ubicaciones de
1814 descartar el valor de todas las ubicaciones de memoria que tiene
1815 actualmente almacenadas en caché, en cualquier registro de la máquina.
1828 El compilador podría ahorrar un branch al optimizar esto de la
1835 En el código de un solo subproceso, esto no solo es seguro, sino que
1838 de 42, incluso si la variable 'a' nunca fue cero, al cargar la
1839 variable 'b'. Use WRITE_ONCE() para evitar esto de la siguiente
1848 menos perjudiciales, pero pueden dar como resultado "bouncing" de la
1849 línea de caché y, por lo tanto, bajo rendimiento y escalabilidad.
1852 (*) Para ubicaciones de memoria alineadas cuyo tamaño les permita
1853 acceder con una sola instrucción de referencia de memoria, evite el
1854 "desgarro de la carga" (load tearing) y "desgarro del store" (store
1857 instrucciones de almacenamiento de 16 bits con campos inmediatos de 7
1858 bits, el compilador podría tener la tentación de usar dos
1859 instrucciones inmediatas de almacenamiento de 16 bits para implementar
1860 el siguiente store de 32 bits:
1864 Tenga en cuenta que GCC realmente usa este tipo de optimización, lo
1865 cual no es sorprendente dado que probablemente costaría más de dos
1867 tanto, esta optimización puede ser una victoria en un código de un
1868 solo subproceso. De hecho, un error reciente (desde que se solucionó)
1870 volátil. En ausencia de tales errores, el uso de WRITE_ONCE() evita el
1886 hay markings volátiles, el compilador estaría en su derecho de
1887 implementar estas tres declaraciones de asignación como un par de
1888 cargas de 32 bits, seguido de un par de stores de 32 bits. Esto
1897 Aparte de esto, nunca es necesario usar READ_ONCE() y WRITE_ONCE() en una
1900 razón de esto es que READ_ONCE() y WRITE_ONCE() se implementan como
1908 BARRERAS DE MEMORIA DE LA CPU
1911 El kernel de Linux tiene siete barreras básicas de memoria de CPU:
1918 DEPEDENCIA DE DIRECCIÓN READ_ONCE()
1921 Todas las barreras de memoria, excepto las barreras de dependencia de
1922 direcciones, implican una barrera del compilador. Las dependencias de
1923 direcciones no imponen ningún orden de compilación adicional.
1925 Además: en el caso de las dependencias de direcciones, se esperaría que el
1927 tendría que cargar el valor de b antes de cargar a[b]), sin embargo, no hay
1928 garantía alguna en la especificación de C sobre que el compilador no puede
1929 especular el valor de b (por ejemplo, es igual a 1) y carga a[b] antes que
1930 b (ej. tmp = a[1]; if (b != 1) tmp = a[b]; ). También existe el problema de
1931 que un compilador vuelva a cargar b después de haber cargado a[b], teniendo
1932 así una copia más nueva de b que a[b]. Aún no se ha conseguido un consenso
1933 acerca de estos problemas, sin embargo, el macro READ_ONCE() es un buen
1936 Las barreras de memoria SMP se reducen a barreras de compilador cuando se
1939 respecto a sí misma. Sin embargo, consulte la subsección "Guests de
1942 [!] Tenga en cuenta que las barreras de memoria SMP _deben_ usarse para
1943 controlar el orden de referencias a memoria compartida en sistemas SMP,
1944 aunque el uso de bloqueo en su lugar sea suficiente.
1946 Las barreras obligatorias no deben usarse para controlar los efectos de
1949 MMIO en los accesos a través de ventanas E/S de memoria relajada. Estas
1951 al orden en que las operaciones de memoria aparecen en un dispositivo, al
1955 Hay algunas funciones de barrera más avanzadas:
1959 Asigna el valor a la variable y luego inserta una barrera de memoria
1960 completa después de ella. No se garantiza insertar nada más que una
1968 barreras de memoria, pero donde el código necesita una barrera de
1969 memoria. Ejemplos de funciones RMW atómicas que no implican una
1970 barrera de memoria son, por ejemplo, agregar, restar, operaciones
1973 cuando se usan operaciones atómicas como referencia de contador.
1976 implican una barrera de memoria (como set_bit y clear_bit).
1978 Como ejemplo, considere una pieza de código que marca un objeto como
1979 muerto y luego disminuye el contador de referencias del objeto:
1985 Esto asegura que la marca de muerte en el objeto se perciba como
1986 fijada *antes* de que disminuya el contador de referencia.
1996 Estos son usados con memoria consistente para garantizar el orden de
1997 escrituras o lecturas de memoria compartida accesible tanto para la
2000 Por ejemplo, considere un controlador de dispositivo que comparte
2001 memoria con otro dispositivo y usa un valor de estado del descriptor
2003 un "doorbell" (timbre, punto de acceso) para avisarle cuando haya
2014 /* flush de modificaciones antes de la actualización de estado */
2020 /* notificar al dispositivo de nuevos descriptores */
2025 propiedad antes de que leamos los datos del descriptor, y el dma_wmb()
2026 permite garantizar que los datos se escriben en el descriptor antes de
2030 las escrituras de la memoria caché coherente se hayan completado antes
2034 Consulte la subsección "Efectos de barrera de E/S del kernel" para
2035 obtener más información sobre accesorios de E/S relajados y el archivo
2043 persistente llegaron a dominio de durabilidad de la plataforma.
2045 Por ejemplo, después de una escritura no temporal en la región pmem,
2047 dominio de durabilidad de la plataforma. Esto garantiza que los stores
2048 han actualizado el almacenamiento persistente antes de cualquier
2049 acceso a datos o transferencia de datos causada por instrucciones
2052 Para la carga desde memoria persistente, las barreras de memoria de
2053 lectura existentes son suficientes para garantizar el orden de
2058 Para accesos a memoria con atributos de combinación de escritura (por
2061 puede utilizar para evitar la combinación de accesos a memoria de
2062 de escritura antes de esta macro, con los posteriores, cuando dicha
2066 BARRERAS DE MEMORIA IMPLÍCITAS DEL KERNEL
2069 Algunas de las otras funciones en el kernel Linux implican barreras de
2070 memoria, entre estas encontramos funciones de bloqueo y planificación
2075 confiar en estas fuera de código específico de arquitectura.
2078 FUNCIONES DE ADQUISICIÓN DE CERROJO
2081 El kernel Linux tiene una serie de abstracciones de bloqueo:
2084 (*) R/W spin lock (cerrojos de escritura/lectura)
2089 En todos los casos existen variantes de las operaciones "ACQUIRE" y
2090 "RELEASE" para cada uno de ellos. Todas estas operaciones implican ciertas
2093 (1) Implicaciones de la operación ACQUIRE:
2095 Las operaciones de memoria emitidas después del ACQUIRE se completarán
2096 después de que la operación ACQUIRE haya finalizado.
2098 Las operaciones de memoria emitidas antes de ACQUIRE pueden
2101 (2) Implicaciones de la operación RELEASE:
2103 Las operaciones de memoria emitidas antes de la RELEASE se
2104 completarán antes de que la operación de RELEASE se haya completado.
2106 Las operaciones de memoria emitidas después de la RELEASE pueden
2107 completarse antes de que la operación de RELEASE se haya completado.
2109 (3) Implicación de ACQUIRE vs ACQUIRE:
2111 Todas las operaciones ACQUIRE emitidas antes de otra operación
2112 ACQUIRE serán completadas antes de esa operación ACQUIRE.
2114 (4) Implicación de ACQUIRE vs RELEASE:
2116 Todas las operaciones ACQUIRE emitidas antes de una operación RELEASE
2117 serán completadas antes de la operación RELEASE.
2119 (5) Implicación de ACQUIRE condicional fallido:
2121 Ciertas variantes de bloqueo de la operación ACQUIRE pueden fallar, ya
2122 sea debido a no poder obtener el bloqueo de inmediato, o debido a que
2123 recibieron una señal de desbloqueo mientras dormían esperando que el
2125 ningún tipo de barrera.
2127 [!] Nota: una de las consecuencias de que los cerrojos en ACQUIRE y RELEASE
2128 sean barreras unidireccionales, es que los efectos de las instrucciones
2129 fuera de una sección crítica pueden filtrarse al interior de la sección
2132 No se puede suponer que un ACQUIRE seguido de una RELEASE sea una barrera
2133 de memoria completa dado que es posible que un acceso anterior a ACQUIRE
2146 Cuando ACQUIRE y RELEASE son bloqueo de adquisición y liberación,
2148 RELEASE son para la misma variable de bloqueo, pero solo desde la
2149 perspectiva de otra CPU que no tiene ese bloqueo. En resumen, un ACQUIRE
2150 seguido de un RELEASE NO puede entenderse como una barrera de memoria
2153 De manera similar, el caso inverso de un RELEASE seguido de un ACQUIRE no
2154 implica una barrera de memoria completa. Por lo tanto, la ejecución de la
2155 CPU de los tramos críticos correspondientes a la RELEASE y la ACQUIRE
2156 pueden cruzarse, de modo que:
2174 Un punto clave es que solo estamos hablando de la CPU re-haciendo el
2180 simplemente eligió intentar ejecutar primero la última operación de
2181 bloqueo. Si hay un interbloqueo, esta operación de bloqueo simplemente
2182 esperará (o tratará de dormir, pero hablaremos de eso más adelante). La
2183 CPU eventualmente ejecutará la operación de desbloqueo (que precedió a la
2184 operación de bloqueo en el código ensamblador), lo que desenmascará el
2185 potencial punto muerto, permitiendo que la operación de bloqueo tenga
2190 encontrará una barrera de memoria, que forzará la operación de desbloqueo
2192 haber una carrera de desbloqueo del sueño ("sleep-unlock race"), pero la
2193 primitiva de bloqueo necesita resolver tales carreras correctamente en
2197 garantía de orden en sistemas compilados en UP, por lo que no se puede
2199 especialmente con respecto a los accesos de E/S, a menos que se combinen
2200 con operaciones de inhabilitación de interrupciones.
2202 Consulte también la sección "Efectos de barrera adquiriendo intra-CPU".
2216 La siguiente secuencia de eventos es aceptable:
2222 Pero ninguno de los siguientes lo son:
2231 FUNCIONES DE DESACTIVACIÓN DE INTERRUPCIONES
2240 FUNCIONES DE DORMIR Y DESPERTAR
2244 que se pueden ver como una interacción entre dos piezas de datos: el estado
2245 de la task (hilo, proceso, tarea) que espera el evento y los datos globales
2246 utilizados para indicar el evento. Para asegurarse de que estos parezcan
2247 suceder en el orden correcto, las primitivas para comenzar el proceso de ir
2252 secuencia de eventos:
2261 Una barrera de memoria general se obtiene automáticamente mediante
2262 set_current_state() después de haber alterado el estado de la tarea:
2277 que por lo tanto también implican una barrera de memoria general después de
2279 formas, todas las cuales obtienen la barrera de memoria en el lugar
2303 wake_up() ejecuta una barrera de memoria general si despierta algo. Si no
2304 despierta nada, entonces una barrera de memoria puede o no ser ejecutada;
2306 de la tarea. En particular, se encuentra entre el STORE para indicar el
2319 "current" (hilo actual) de la CPU 1.
2321 Para reiterar, se garantiza la ejecución de una barrera de memoria general
2322 mediante wake_up() si algo está realmente despierto, pero de lo contrario
2324 secuencia de eventos, donde X e Y son ambos cero inicialmente:
2332 Si ocurre una reactivación ("wakeup"), una (al menos) de las dos cargas
2336 wake_up_process() siempre ejecuta una barrera de memoria general. La
2337 barrera, de nuevo, ocurre antes de que se acceda al estado del hilo. En
2341 Las funciones de activación disponibles incluyen:
2359 En términos de orden de la memoria, todas estas funciones proporcionan las
2362 [!] Tenga en cuenta que las barreras de la memoria implicadas por el
2364 respecto a cargas de los valores guardados después de que el durmiente haya
2379 no existe garantía de que el cambio a event_indicated sea percibido por
2380 el durmiente de manera que venga después del cambio a my_data. En tal
2381 circunstancia, el código en ambos lados debe sacar sus propias barreras de
2403 (*) schedule() y similares implican barreras completas de memoria.
2407 EFECTOS DE BARRERA ADQUIRIENDO INTRA-CPU
2410 En los sistemas SMP, las primitivas de bloqueo proveen una forma más
2411 sustancial de barrera: una que afecta el orden de acceso a la memoria en
2412 otras CPU, dentro del contexto de conflicto en cualquier bloqueo en
2419 Considere lo siguiente: el sistema tiene un par de spinlocks (M) y (Q), y
2420 tres CPU; entonces la siguiente secuencia de eventos debería ocurrir:
2432 hasta que *H ocurra, además de las restricciones impuestas por los bloqueos
2437 Pero no verá ninguno de:
2445 ¿DÓNDE SE NECESITAN BARRERAS DE MEMORIA?
2448 Bajo operación normal, el re-ordenamiento de una operación de memoria
2449 generalmente no va a suponer un problema, ya que para una pieza de código
2450 lineal de un solo subproceso seguirá pareciendo que funciona correctamente,
2467 Cuando se da un sistema con más de un procesador, más de una CPU en el
2468 sistema puede estar trabajando en el mismo conjunto de datos al mismo
2469 tiempo. Esto puede causar problemas de sincronización, y la forma habitual
2470 de tratar con estos es utilizar cerrojos. Sin embargo, los cerrojos son
2471 bastante caros, por lo que puede ser preferible operar sin el uso de un
2477 de espera en cola del semáforo, en virtud de que tiene una parte de su pila
2478 vinculada a la lista de procesos en espera del semáforo:
2494 (1) leer el siguiente puntero del registro de este proceso que espera,
2497 (2) leer el puntero a la estructura de tareas del waiter;
2499 (3) borrar el puntero de la tarea para decirle al waiter que se le ha dado
2504 (5) liberar la referencia retenida en la estructura de tareas del waiter.
2506 En otras palabras, tiene que realizar esta secuencia de eventos:
2514 y si alguno de estos pasos ocurre fuera de orden, entonces todo puede que
2517 Una vez que se ha puesto en cola y soltado el bloqueo de semáforo, el
2518 proceso que espera no consigue el candado de nuevo; en cambio, solo espera
2519 a que se borre su puntero de tarea antes de continuar. Dado que el registro
2520 está en la pila del proceso que espera, esto significa que si el puntero de
2521 la tarea se borra _antes_ de que se lea el siguiente puntero de la lista,
2523 el stack del proceso que espera antes de que la función up*() tenga la
2524 oportunidad de leer el puntero que sigue.
2526 Considere entonces lo que podría suceder con la secuencia de eventos
2547 Esto podría solucionarse usando el bloqueo de semáforo, pero luego la
2549 nuevamente, después de ser despertado el hilo.
2551 La forma de lidiar con esto es insertar una barrera de memoria SMP general:
2560 En este caso, la barrera garantiza que todos los accesos a memoria antes de
2561 la barrera parecerán suceder antes de todos los accesos a memoria después
2562 de dicha barrera con respecto a las demás CPU del sistema. _No_ garantiza
2563 que todos los accesos a memoria antes de la barrera se completarán en el
2564 momento en que la instrucción de la barrera en sí se complete.
2567 solo una barrera del compilador, asegurándose así de que el compilador
2569 CPU. Como solo hay un CPU, la lógica de orden de dependencias de esa CPU se
2570 encargará de todo lo demás.
2576 Si bien son, técnicamente, consideraciones de interacción entre
2578 algunas de ellas implican barreras de memoria completa y algunas otras no,
2587 Un driver puede ser interrumpido por su propia rutina de servicio de
2589 con los intentos de controlar o acceder al dispositivo.
2592 locales (una forma de bloqueo), de modo que las operaciones críticas sean
2593 todas contenidas dentro la sección de interrupción desactivada en el
2597 actual haya sido resuelta, por lo tanto, el controlador de interrupción no
2601 ethernet que tiene un registro de direcciones y un registro de datos. Si
2602 el core de ese controlador habla con la tarjeta estando en desactivación de
2603 interrupción y luego se invoca el controlador de interrupción del
2615 El almacenamiento en el registro de datos puede ocurrir después del segundo
2616 almacenamiento en el registro de direcciones si las reglas de orden son lo
2621 Si se relajan las reglas de orden, se debe asumir que los accesos
2622 realizados dentro de la sección con interrupción deshabilitada pueden
2623 filtrarse fuera de esta y pueden intercalarse con accesos realizados en una
2627 Normalmente, esto no será un problema porque los accesos de E/S realizados
2628 dentro de tales secciones incluirán operaciones de carga síncronas en
2629 registros E/S estrictamente ordenados, que forman barreras de E/S
2633 Una situación similar puede ocurrir entre una rutina de interrupción y dos
2635 caso es probable, entonces se deben usar bloqueos de desactivación de
2640 Efectos de barrera de E/S del kernel
2643 La interfaz con periféricos a través de accesos de E/S es profundamente
2645 que son inherentemente no portátiles pueden depender de comportamientos
2646 específicos de sus sistemas de destino, con el fin de lograr la
2647 sincronización de la manera más ligera posible. Para drivers que deseen ser
2648 portátiles entre múltiples arquitecturas e implementaciones de bus, el
2649 kernel ofrece una serie de funciones de acceso que proporcionan varios
2650 grados de garantías de orden:
2654 Las funciones de acceso MMIO readX() y writeX() usan un puntero al
2656 asignados los atributos de E/S predeterminados (por ejemplo, los
2657 devueltos por ioremap()), las garantías de orden son las siguientes:
2660 entre estos. Esto asegura que los registros de acceso MMIO por el
2661 mismo subproceso de la CPU a un dispositivo en particular llegarán en
2664 2. Se ordena un writeX() emitido por un subproceso de CPU que contiene un
2665 spinlock antes de un writeX() al mismo periférico desde otro
2666 subproceso de CPU, si emitido después de una adquisición posterior del
2671 3. Un writeX() por un subproceso de la CPU al periférico primero esperará
2672 a la finalización de todas las escrituras anteriores en la memoria
2674 que las escrituras de la CPU a un búfer DMA de salida asignadas por
2676 cuando la CPU escriba en sus registros de control MMIO, para activar
2679 4. Un readX() de un subproceso del CPU, desde el periférico, se
2680 completará antes de que cualquier lectura subsiguiente de memoria por
2681 el mismo subproceso pueda comenzar. Esto asegura que las lecturas de
2683 dma_alloc_coherent(), no verán datos obsoletos después de leer el
2684 registro de estado MMIO del motor DMA, para establecer que la
2688 completará antes de que cualquier bucle delay() subsiguiente pueda
2691 con 1us de diferencia, si la primera escritura se lee inmediatamente
2692 de vuelta con readX() y se llama a udelay(1) antes del segundo
2698 writel(42, DEVICE_REGISTER_1); // al menos 1us antes de esto....
2700 Las propiedades de orden de los punteros __iomem obtenidos con valores de
2702 por ioremap_wc()) son específicos de la arquitectura subyacente y, por lo
2704 aseguradas para accesos a este tipo de "mappings" (asignaciones).
2708 Son similares a readX() y writeX(), pero proporcionan una garantía de
2709 orden de memoria más débil. Específicamente, no garantizan orden con
2712 se ordenarán con respecto a otros accesos desde el mismo hilo de la CPU,
2714 valor predeterminado para los atributos de E/S.
2718 Los puntos de entrada readsX() y writesX() MMIO están diseñados para
2720 periféricos, que no son capaces de realizar DMA. Por tanto, sólo
2721 proporcionan garantías de orden readX_relaxed() y writeX_relaxed(), como
2726 Los puntos de entrada inX() y outX() están destinados a acceder a mapas
2727 de puertos "legacy" (antiguos) de periféricos de E/S, que pueden requerir
2729 x86). El número de puerto del periférico que se está accedido se pasa
2732 Dado que muchas arquitecturas de CPU acceden finalmente a estos
2733 periféricos a través de un mapeo interno de memoria virtual, las
2734 garantías de orden portátiles proporcionadas por inX() y outX() son las
2736 acceder a una asignación con los valores de atributos de E/S
2739 Los drivers de dispositivos pueden esperar que outX() emita una
2740 transacción de escritura no publicada, que espera una respuesta de
2741 finalización del periférico de E/S antes de regresar. Esto no está
2742 garantizado por todas las arquitecturas y por lo tanto no forma parte de
2743 la semántica de orden portátil.
2747 Como arriba, los puntos de entrada insX() y outsX() proporcionan el mismo
2749 un mapping con los atributos de E/S predeterminados.
2753 Estos funcionarán adecuadamente para el tipo de acceso que realmente están
2756 Con la excepción de los puntos de entrada (insX(), outsX(), readsX() y
2758 little-endian y, por lo tanto, realizará operaciones de intercambio de
2763 MODELO DE ORDEN MÍNIMO DE EJECUCIÓN ASUMIDO
2767 mantiene la apariencia de causalidad del programa con respecto a sí misma.
2770 debe asumir fuera de código específico de arquitectura.
2772 Esto significa que se debe considerar que la CPU ejecutará su flujo de
2774 que si una instrucción en el flujo depende de una instrucción anterior,
2776 antes de que la posterior instrucción puede proceder; en otras palabras:
2777 siempre que la apariencia de causalidad se mantenga.
2779 [*] Algunas instrucciones tienen más de un efecto, como cambiar el
2780 código de condición, cambio de registros o cambio de memoria - y
2781 distintas instrucciones pueden depender de diferentes efectos.
2783 Una CPU puede también descartar cualquier secuencia de instrucciones que
2789 De manera similar, se debe suponer que el compilador podría reordenar la
2790 corriente de instrucciones de la manera que crea conveniente, nuevamente
2791 siempre que la apariencia de causalidad se mantenga.
2795 EFECTOS DE LA MEMORIA CACHÉ DE LA CPU
2798 La forma en que se perciben las operaciones de memoria caché en todo el
2800 encuentran entre las CPU y la memoria, y por el sistema de coherencia en
2801 memoria que mantiene la consistencia de estado en el sistema.
2804 través del caché, el sistema de memoria tiene que incluir los cachés de la
2805 CPU y barreras de memoria, que en su mayor parte actúan en la interfaz
2806 entre la CPU y su caché (las barreras de memoria lógicamente actúan sobre
2807 la línea de puntos en el siguiente diagrama):
2813 | CPU | | de | : | CPU | | | | |
2818 : | de | +---------+
2820 : | de la | +--------+
2823 | CPU | | de | : | CPU | | |--->| Dispos |
2831 Aunque es posible que una carga o store en particular no aparezca fuera de
2833 caché de la CPU, seguirá pareciendo como si el acceso total a la memoria
2834 hubiera tenido lugar para las otras CPUs, ya que los mecanismos de
2835 coherencia de caché migrarán la cacheline sobre la CPU que accede y se
2836 propagarán los efectos en caso de conflicto.
2838 El núcleo de la CPU puede ejecutar instrucciones en el orden que considere
2840 programa. Algunas de las instrucciones generan operaciones de carga y
2841 almacenamiento que luego van a la cola de accesos a memoria a realizar. El
2846 De lo que se ocupan las barreras de la memoria es de controlar el orden en
2847 que los accesos cruzan, desde el lado de la CPU, hasta el lado de memoria,
2851 [!] Las barreras de memoria _no_ son necesarias dentro de una CPU
2856 sistema de caché. Esto depende de las propiedades de la ventana de memoria
2857 a través de la cual se accede a los dispositivos y/o el uso de
2858 instrucciones especiales de comunicación con dispositivo que pueda tener la
2862 COHERENCIA DE CACHÉ FRENTE A DMA
2865 No todos los sistemas mantienen coherencia de caché con respecto a los
2867 DMA puede obtener datos obsoletos de la RAM, porque las líneas de caché
2868 "sucias" pueden residir en los cachés de varias CPU, y es posible que no
2870 parte apropiada del kernel debe vaciar los bits superpuestos de caché en
2874 sobrescritos por líneas de caché sucias que se escriben de nuevo en la RAM
2875 desde el caché de una CPU, después de que el dispositivo haya puesto sus
2876 propios datos, o las líneas de caché presentes en el caché de la CPU pueden
2877 simplemente ocultar el hecho de que la memoria RAM se haya actualizado,
2878 hasta el momento en que la caché se descarta de la memoria caché de la CPU
2883 sobre administración de la memoria caché.
2886 COHERENCIA DE CACHÉ FRENTE A MMIO
2889 La E/S mapeada en memoria generalmente se lleva a cabo a través de
2890 ubicaciones de memoria que forman parte de una ventana del espacio de
2891 memoria de la CPU, que tiene diferentes propiedades asignadas que la
2894 Entre dichas propiedades, suele existir el hecho de que tales accesos
2898 anteriormente. Una barrera de memoria no es suficiente en tal caso, sino
2899 que el caché debe ser vaciado entre la escritura de la memoria caché, y el
2900 acceso MMIO, si los dos son de cualquier manera dependiente.
2908 de memoria exactamente en el orden especificado, de modo que si a la CPU se
2909 entrega, por ejemplo, el siguiente fragmento de código a ejecutar:
2917 esperarían entonces que la CPU complete la operación de memoria para cada
2918 instrucción antes de pasar a la siguiente, lo que lleva a una definida
2919 secuencia de operaciones vistas por observadores externos en el sistema:
2926 (*) es más probable que las cargas deban completarse de inmediato para
2933 (*) las cargas se pueden hacer de forma especulativa, lo que lleva a que
2934 se haya obtenido el resultado en el momento equivocado de la secuencia
2935 de eventos esperada;
2937 (*) el orden de los accesos a memoria se puede reorganizar para promover
2938 un mejor uso de los buses y cachés de la CPU;
2941 cuando se habla con memoria o hardware de E/S, que puede realizar
2943 de configuración de transacciones (la memoria y los dispositivos PCI
2946 (*) la caché de datos de la CPU puede afectar al orden, y mientras sus
2947 mecanismos de coherencia pueden aliviar esto, una vez que el store
2948 haya accedido al caché- no hay garantía de que la gestión de la
2951 Entonces, digamos que lo que otra CPU podría observar en el fragmento de
2960 _propios_ accesos parecen estar correctamente ordenados, sin necesidad de
2961 barrera de memoria. Por ejemplo con el siguiente código:
2970 y asumiendo que no hay intervención de una influencia externa, se puede
2973 U == el valor original de *A
2978 El código anterior puede hacer que la CPU genere la secuencia completa de
2979 accesos de memoria:
2984 cualquier combinación de elementos combinados o descartados, siempre que la
2994 El compilador también puede combinar, descartar o diferir elementos de la
2995 secuencia antes incluso de que la CPU los vea.
3006 ya que, sin una barrera de escritura o WRITE_ONCE(), puede que se asuma
3007 que el efecto del almacenamiento de V a *A se pierde. Similarmente:
3012 puede, sin una barrera de memoria o un READ_ONCE() y WRITE_ONCE(), esto
3018 y la operación LOAD nunca aparezca fuera de la CPU.
3024 La CPU DEC Alpha es una de las CPU más relajadas que existen. No solo eso,
3025 algunas versiones de la CPU Alpha tienen un caché de datos dividido, lo que
3026 les permite tener dos líneas de caché relacionadas semánticamente,
3027 actualizadas en momentos separados. Aquí es donde la barrera de dependencia
3028 de dirección realmente se vuelve necesaria, ya que se sincronizan ambos
3029 cachés con el sistema de coherencia de memoria, lo que hace que parezca un
3033 Alpha define el modelo de memoria del kernel Linux, aunque a partir de
3034 v4.15, la adición al kernel de Linux de smp_mb() a READ_ONCE() en Alpha
3035 redujo en gran medida su impacto en el modelo de memoria.
3038 GUESTS DE MÁQUINAS VIRTUALES
3042 afectados por los efectos de SMP incluso si el "host" (huésped) en sí se
3043 compila sin compatibilidad con SMP. Este es un efecto de la interacción con
3044 un host SMP mientras ejecuta un kernel UP. El uso obligatorio de barreras
3045 para este caso de uso sería posible, pero a menudo no son óptimas.
3047 Para hacer frente a este caso de manera óptima, están disponibles macros de
3050 y no SMP. Por ejemplo, los invitados de máquinas virtuales debería usar
3051 virt_mb() en lugar de smp_mb() al sincronizar contra un (posiblemente SMP)
3060 EJEMPLOS DE USOS
3066 Las barreras de memoria se pueden utilizar para implementar almacenamiento
3067 en búfer circular, sin necesidad de un cerrojo para serializar al productor