1 NOTE: 2 This is a version of Documentation/memory-barriers.txt translated into 3 Spanish by Carlos Bilbao <carlos.bilbao.osdev@gmail.com>. If you find any 4 difference between this document and the original file or a problem with 5 the translation, please contact the maintainer of this file. Please also 6 note that the purpose of this file is to be easier to read for non English 7 (read: Spanish) speakers and is not intended as a fork. So if you have any 8 comments or updates for this file please update the original English file 9 first. The English version is definitive, and readers should look there if 10 they have any doubt. 11 12 ====================================== 13 BARRERAS DE MEMORIA EN EL KERNEL LINUX 14 ====================================== 15 16 Documento original: David Howells <dhowells@redhat.com> 17 Paul E. McKenney <paulmck@linux.ibm.com> 18 Will Deacon <will.deacon@arm.com> 19 Peter Zijlstra <peterz@infradead.org> 20 21 Traducido por: Carlos Bilbao <carlos.bilbao.osdev@gmail.com> 22 Nota: Si tiene alguna duda sobre la exactitud del contenido de esta 23 traducción, la única referencia válida es la documentación oficial en 24 inglés. 25 26 =========== 27 ADVERTENCIA 28 =========== 29 30 Este documento no es una especificación; es intencionalmente (por motivos 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 33 proporcionadas por Linux, pero ante cualquier duda (y hay muchas) por favor 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. 38 39 De nuevo, este documento no es una especificación de lo que Linux espera 40 del hardware. 41 42 El propósito de este documento es doble: 43 44 (1) especificar la funcionalidad mínima en la que se puede confiar para 45 cualquier barrera en concreto, y 46 47 (2) proporcionar una guía sobre cómo utilizar las barreras disponibles. 48 49 Tenga en cuenta que una arquitectura puede proporcionar más que el 50 requisito mínimo para cualquier barrera en particular, pero si la 51 arquitectura proporciona menos de eso, dicha arquitectura es incorrecta. 52 53 Tenga en cuenta también que es posible que una barrera no valga (sea no-op) 54 para alguna arquitectura porque por la forma en que funcione dicha 55 arquitectura, la barrera explícita resulte innecesaria en ese caso. 56 57 ========== 58 CONTENIDOS 59 ========== 60 61 (*) Modelo abstracto de acceso a memoria. 62 63 - Operaciones del dispositivo. 64 - Garantías. 65 66 (*) ¿Qué son las barreras de memoria? 67 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. 75 - Atomicidad multicopia. 76 77 (*) Barreras explícitas del kernel. 78 79 - Barrera del compilador. 80 - Barreras de memoria de la CPU. 81 82 (*) Barreras de memoria implícitas del kernel. 83 84 - Funciones de adquisición de cerrojo. 85 - Funciones de desactivación de interrupciones. 86 - Funciones de dormir y despertar. 87 - Funciones varias. 88 89 (*) Efectos de barrera adquiriendo intra-CPU. 90 91 - Adquisición vs accesos a memoria. 92 93 (*) ¿Dónde se necesitan barreras de memoria? 94 95 - Interacción entre procesadores. 96 - Operaciones atómicas. 97 - Acceso a dispositivos. 98 - Interrupciones. 99 100 (*) Efectos de barrera de E/S del kernel. 101 102 (*) Modelo de orden mínimo de ejecución asumido. 103 104 (*) Efectos de la memoria caché de la CPU. 105 106 - Coherencia de caché. 107 - Coherencia de caché frente a DMA. 108 - Coherencia de caché frente a MMIO. 109 110 (*) Cosas que hacen las CPU. 111 112 - Y luego está el Alfa. 113 - Guests de máquinas virtuales. 114 115 (*) Ejemplos de usos. 116 117 - Buffers circulares. 118 119 (*) Referencias. 120 121 122 ==================================== 123 MODELO ABSTRACTO DE ACCESO A MEMORIA 124 ==================================== 125 126 Considere el siguiente modelo abstracto del sistema: 127 128 : : 129 : : 130 : : 131 +-------+ : +--------+ : +-------+ 132 | | : | | : | | 133 | | : | | : | | 134 | CPU 1 |<----->| Memoria|<----->| CPU 2 | 135 | | : | | : | | 136 | | : | | : | | 137 +-------+ : +--------+ : +-------+ 138 ^ : ^ : ^ 139 | : | : | 140 | : | : | 141 | : v : | 142 | : +--------+ : | 143 | : | | : | 144 | : | Disposi| : | 145 +---------->| tivo |<----------+ 146 : | | : 147 : | | : 148 : +--------+ : 149 : : 150 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 154 en el orden que desee, siempre que la causalidad del programa parezca 155 mantenerse. De manera similar, el compilador también puede organizar las 156 instrucciones que emite en el orden que quiera, siempre que no afecte al 157 funcionamiento aparente del programa. 158 159 Entonces, en el diagrama anterior, los efectos de las operaciones de 160 memoria realizadas por un CPU son percibidos por el resto del sistema a 161 medida que las operaciones cruzan la interfaz entre la CPU y el resto del 162 sistema (las líneas discontinuas a puntos). 163 164 Por ejemplo, considere la siguiente secuencia de eventos: 165 166 CPU 1 CPU 2 167 =============== =============== 168 { A == 1; B == 2 } 169 A = 3; x = B; 170 B = 4; y = A; 171 172 El conjunto de accesos visto por el sistema de memoria en el medio se puede 173 organizar en 24 combinaciones diferentes (donde LOAD es cargar y STORE es 174 guardar): 175 176 STORE A=3, STORE B=4, y=LOAD A->3, x=LOAD B->4 177 STORE A=3, STORE B=4, x=LOAD B->4, y=LOAD A->3 178 STORE A=3, y=LOAD A->3, STORE B=4, x=LOAD B->4 179 STORE A=3, y=LOAD A->3, x=LOAD B->2, STORE B=4 180 STORE A=3, x=LOAD B->2, STORE B=4, y=LOAD A->3 181 STORE A=3, x=LOAD B->2, y=LOAD A->3, STORE B=4 182 STORE B=4, STORE A=3, y=LOAD A->3, x=LOAD B->4 183 STORE B=4, ... 184 ... 185 186 y por lo tanto puede resultar en cuatro combinaciones diferentes de 187 valores: 188 189 x == 2, y == 1 190 x == 2, y == 3 191 x == 4, y == 1 192 x == 4, y == 3 193 194 Además, los stores asignados por una CPU al sistema de memoria pueden no 195 ser percibidos por los loads realizados por otra CPU en el mismo orden en 196 que fueron realizados. 197 198 Como otro ejemplo, considere esta secuencia de eventos: 199 200 CPU 1 CPU 2 201 =============== =============== 202 { A == 1, B == 2, C == 3, P == &A, Q == &C } 203 B = 4; Q = P; 204 P = &B; D = *Q; 205 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: 209 210 (Q == &A) y (D == 1) 211 (Q == &B) y (D == 2) 212 (Q == &B) y (D == 4) 213 214 Tenga en cuenta que la CPU 2 nunca intentará cargar C en D porque la CPU 215 cargará P en Q antes de emitir la carga de *Q. 216 217 OPERACIONES DEL DISPOSITIVO 218 --------------------------- 219 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 225 registro interno 5, el siguiente código podría entonces ser usado: 226 227 *A = 5; 228 x = *D; 229 230 pero esto podría aparecer como cualquiera de las siguientes dos secuencias: 231 232 STORE *A = 5, x = LOAD *D 233 x = LOAD *D, STORE *A = 5 234 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. 237 238 239 GARANTÍAS 240 --------- 241 242 Hay algunas garantías mínimas que se pueden esperar de una CPU: 243 244 (*) En cualquier CPU dada, los accesos a la memoria dependiente se 245 emitirán en orden, con respeto a sí mismo. Esto significa que para: 246 247 Q = READ_ONCE(P); D = READ_ONCE(*Q); 248 249 donde READ_ONCE() es LEER_UNA_VEZ(), la CPU emitirá las siguientes 250 operaciones de memoria: 251 252 Q = LOAD P, D = LOAD *Q 253 254 y siempre en ese orden. Sin embargo, en DEC Alpha, READ_ONCE() también 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: 257 258 Q = LOAD P, MEMORY_BARRIER, D = LOAD *Q, MEMORY_BARRIER 259 260 Ya sea en DEC Alpha o no, READ_ONCE() también evita que el compilador 261 haga cosas inapropiadas. 262 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: 265 266 a = READ_ONCE(*X); WRITE_ONCE(*X, b); 267 268 donde WRITE_ONCE() es ESCRIBIR_UNA_VEZ(), la CPU solo emitirá la 269 siguiente secuencia de operaciones de memoria: 270 271 a = LOAD *X, STORE *X = b 272 273 Y para: 274 275 WRITE_ONCE(*X, c); d = READ_ONCE(*X); 276 277 la CPU solo emitirá: 278 279 STORE *X = c, d = LOAD *X 280 281 (Los loads y stores se superponen si están destinados a piezas 282 superpuestas de memoria). 283 284 Y hay una serie de cosas que _deben_ o _no_ deben asumirse: 285 286 (*) _No_debe_ asumirse que el compilador hará lo que usted quiera 287 con referencias de memoria que no están protegidas por READ_ONCE() y 288 WRITE ONCE(). Sin ellos, el compilador tiene derecho a hacer todo tipo 289 de transformaciones "creativas", que se tratan en la sección BARRERA 290 DEL COMPILADOR. 291 292 (*) _No_debe_ suponerse que se emitirán loads y stores independientes 293 en el orden dado. Esto significa que para: 294 295 X = *A; Y = *B; *D = Z; 296 297 podemos obtener cualquiera de las siguientes secuencias: 298 299 X = LOAD *A, Y = LOAD *B, STORE *D = Z 300 X = LOAD *A, STORE *D = Z, Y = LOAD *B 301 Y = LOAD *B, X = LOAD *A, STORE *D = Z 302 Y = LOAD *B, STORE *D = Z, X = LOAD *A 303 STORE *D = Z, X = LOAD *A, Y = LOAD *B 304 STORE *D = Z, Y = LOAD *B, X = LOAD *A 305 306 (*) Se _debe_ suponer que los accesos de memoria superpuestos pueden 307 fusionarse o ser descartados. Esto significa que para: 308 309 X = *A; Y = *(A + 4); 310 311 podemos obtener cualquiera de las siguientes secuencias: 312 313 X = LOAD *A; Y = LOAD *(A + 4); 314 Y = LOAD *(A + 4); X = LOAD *A; 315 {X, Y} = LOAD {*A, *(A + 4) }; 316 317 Y para: 318 319 *A = X; *(A + 4) = Y; 320 321 podemos obtener cualquiera de: 322 323 STORE *A = X; STORE *(A + 4) = Y; 324 STORE *(A + 4) = Y; STORE *A = X; 325 STORE {*A, *(A + 4) } = {X, Y}; 326 327 Y hay anti-garantías: 328 329 (*) Estas garantías no se aplican a los campos de bits, porque los 330 compiladores a menudo generan código para modificarlos usando 331 secuencias de lectura-modificación-escritura no atómica. No intente 332 utilizar campos de bits para sincronizar algoritmos paralelos. 333 334 (*) Incluso en los casos en que los campos de bits están protegidos por 335 cerrojos (o "cerrojos", o "locks"), todos los componentes en un campo 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 340 un campo adyacente. 341 342 (*) Estas garantías se aplican solo a escalares correctamente alineados y 343 dimensionados. De "tamaño adecuado" significa actualmente variables que 344 son del mismo tamaño que "char", "short", "int" y "long". 345 "Adecuadamente alineado" significa la alineación natural, por lo tanto, 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 349 en cuenta que estos garantías se introdujeron en el estándar C11, así 350 que tenga cuidado cuando utilice compiladores anteriores a C11 (por 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 353 manera: 354 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 358 359 NOTE 1: Dos hilos de ejecución pueden actualizar y acceder 360 ubicaciones de memoria separadas sin interferir entre 361 ellos. 362 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 366 estructura anidada y el otro no, o si las dos están separados por una 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. 372 373 374 ================================== 375 ¿QUÉ SON LAS BARRERAS DE MEMORIA? 376 ================================== 377 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 380 problema para la interacción CPU-CPU y para la E/S ("I/O"). Lo que se 381 requiere es alguna forma de intervenir para instruir al compilador y al 382 CPU para restringir el orden. 383 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. 387 388 Tal cumplimiento es importante porque las CPUs y otros dispositivos en un 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 393 utilizan para anular o suprimir estos trucos, permitiendo que el código 394 controle sensatamente la interacción de múltiples CPU y/o dispositivos. 395 396 397 VARIEDADES DE BARRERA DE MEMORIA 398 --------------------------------- 399 400 Las barreras de memoria vienen en cuatro variedades básicas: 401 402 (1) Barreras de memoria al escribir o almacenar (Write or store memory 403 barriers). 404 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. 409 410 Una barrera de escritura es un orden parcial solo en los stores; No 411 es requerido que tenga ningún efecto sobre los loads. 412 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. 417 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". 422 423 424 (2) Barrera de dependencia de dirección (histórico). 425 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 429 primer load recupera la dirección a la que se dirigirá el segundo 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. 433 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. 438 439 Como se mencionó en (1), las otras CPU en el sistema pueden verse como 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 442 la CPU en cuestión garantiza que para cualquier carga que la preceda, 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 445 stores antes del cambio del load serán perceptibles por cualquier 446 carga emitida después la barrera de la dependencia de la dirección. 447 448 Consulte la subsección "Ejemplos de secuencias de barrera de memoria" 449 para ver los diagramas mostrando las restricciones de orden. 450 451 [!] Tenga en cuenta que la primera carga realmente tiene que tener una 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. 458 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". 462 463 [!] Desde el kernel v5.9, se eliminó la API del kernel para barreras 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. 467 468 (3) Barreras de memoria al leer o cargar (Read or load memory 469 barriers). 470 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 475 componentes del sistema. 476 477 Una barrera de lectura es un orden parcial solo en cargas; no es 478 necesario que tenga ningún efecto en los stores. 479 480 Las barreras de memoria de lectura implican barreras de dependencia de 481 direcciones, y por tanto puede sustituirlas por estas. 482 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". 486 487 (4) Barreras de memoria generales 488 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 493 componentes del sistema. 494 495 Una barrera de memoria general es un orden parcial tanto en 496 operaciones de carga como de almacenamiento. 497 498 Las barreras de memoria generales implican barreras de memoria tanto 499 de lectura como de escritura, de modo que pueden sustituir a 500 cualquiera. 501 502 Y un par de variedades implícitas: 503 504 (5) ACQUIRE (de adquisición). 505 506 Esto actúa como una barrera permeable unidireccional. Garantiza que 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 509 componentes del sistema. Las operaciones ACQUIRE incluyen operaciones 510 LOCK y smp_load_acquire(), y operaciones smp_cond_load_acquire(). 511 512 Las operaciones de memoria que ocurren antes de una operación ACQUIRE 513 pueden parecer suceder después de que se complete. 514 515 Una operación ACQUIRE casi siempre debe estar emparejada con una 516 operación RELEASE (de liberación). 517 518 519 (6) Operaciones RELEASE (de liberación). 520 521 Esto también actúa como una barrera permeable unidireccional. 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(). 526 527 Las operaciones de memoria que ocurren después de una operación 528 RELEASE pueden parecer suceder antes de que se complete. 529 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, 534 todos los accesos a la memoria que preceden a cualquier anterior 535 RELEASE en esa misma variable están garantizados como visibles. En 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. 539 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 542 "liberación". 543 544 Un subconjunto de las operaciones atómicas descritas en atomic_t.txt 545 contiene variantes de ACQUIRE y RELEASE, además de definiciones 546 completamente ordenadas o relajadas (sin barrera semántica). Para 547 composiciones atómicas que realizan tanto un load como store, la semántica 548 ACQUIRE se aplica solo a la carga y la semántica RELEASE se aplica sólo a 549 la parte de la operación del store. 550 551 Las barreras de memoria solo son necesarias cuando existe la posibilidad de 552 interacción entre dos CPU o entre una CPU y un dispositivo. Si se puede 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. 556 557 Tenga en cuenta que estas son las garantías _mínimas_. Diferentes 558 arquitecturas pueden proporcionar garantías más sustanciales, pero no se 559 puede confiar en estas fuera de esa arquitectura en específico. 560 561 562 ¿QUÉ NO SE PUEDE ASUMIR SOBRE LAS BARRERAS DE LA MEMORIA? 563 --------------------------------------------------------- 564 565 Hay ciertas cosas que las barreras de memoria del kernel Linux no 566 garantizan: 567 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 572 pueden cruzar los accesos del tipo correspondiente. 573 574 (*) No hay garantía de que la emisión de una barrera de memoria en una CPU 575 tenga cualquier efecto directo en otra CPU o cualquier otro hardware 576 en el sistema. El efecto indirecto será el orden en que la segunda CPU 577 ve los efectos de los primeros accesos que ocurren de la CPU, pero lea 578 el siguiente argumento: 579 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 584 barrera SMP"). 585 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 590 en orden. 591 592 [*] Para obtener información sobre bus mastering DMA y coherencia, lea: 593 594 Documentation/driver-api/pci/pci.rst 595 Documentation/core-api/dma-api-howto.rst 596 Documentation/core-api/dma-api.rst 597 598 599 BARRERA DE DEPENDENCIA DE DIRECCIÓN (HISTÓRICO) 600 ----------------------------------------------- 601 602 A partir de la versión 4.15 del kernel Linux, se agregó un smp_mb() a 603 READ_ONCE() para DEC Alpha, lo que significa que las únicas personas que 604 necesitan prestar atención a esta sección son aquellas que trabajan en el 605 código específico de la arquitectura DEC Alpha y aquellas que trabajan en 606 READ_ONCE() por dentro. Para aquellos que lo necesitan, y para aquellos que 607 estén interesados desde un punto de vista histórico, aquí está la historia 608 de las barreras de dependencia de dirección. 609 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. 613 614 El requisito de las barreras de dependencia de dirección es un poco sutil, 615 y no siempre es obvio que sean necesarias. Para ilustrar, considere la 616 siguiente secuencia de eventos: 617 618 CPU 1 CPU 2 619 =============== =============== 620 { A == 1, B == 2, C == 3, P == &A, Q == &C } 621 B = 4; 622 <barrera de escritura> 623 WRITE_ONCE(P, &B); 624 Q = READ_ONCE_OLD(P); 625 D = *Q; 626 627 [!] READ_ONCE_OLD() corresponde a READ_ONCE() del kernel anterior a 4.15, 628 que no implica una barrera de dependencia de direcciones. 629 630 Hay una clara dependencia de dirección aquí, y parecería que al final de 631 la secuencia, Q debe ser &A o &B, y que: 632 633 (Q == &A) implica (D == 1) 634 (Q == &B) implica (D == 4) 635 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: 638 639 (Q == &B) y (D == 2) ???? 640 641 Si bien esto puede parecer una falla en el mantenimiento de la coherencia 642 o la causalidad, no lo es, y este comportamiento se puede observar en 643 ciertas CPU reales (como DEC Alfa). 644 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: 647 648 CPU 1 CPU 2 649 =============== =============== 650 { A == 1, B == 2, C == 3, P == &A, Q == &C } 651 B = 4; 652 <barrera de escritura> 653 WRITE_ONCE(P, &B); 654 Q = READ_ONCE(P); 655 <barrera de dependencia de dirección implícita> 656 D = *Q; 657 658 Esto refuerza la ocurrencia de una de las dos implicaciones, y previene la 659 tercera posibilidad de surgir. 660 661 662 [!] Tenga en cuenta que esta situación extremadamente contraria a la 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 669 banco impar está inactivo, uno podría ver el nuevo valor del puntero P 670 (&B), pero el antiguo valor de la variable B (2). 671 672 673 No se requiere una barrera de dependencia de dirección para ordenar 674 escrituras dependientes porque las CPU que admite el kernel Linux no 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. 677 Pero, por favor, lea atentamente la sección "DEPENDENCIAS DEL CONTROL" y el 678 archivo Documentation/RCU/rcu_dereference.rst: el compilador puede romperse 679 y romper dependencias en muchas formas altamente creativas. 680 681 CPU 1 CPU 2 682 =============== =============== 683 { A == 1, B == 2, C = 3, P == &A, Q == &C } 684 B = 4; 685 <barrera de escritura> 686 WRITE_ONCE(P, &B); 687 Q = READ_ONCE_OLD(P); 688 WRITE_ONCE(*Q, 5); 689 690 Por lo tanto, no se requiere ninguna barrera de dependencia de direcciones 691 para ordenar la lectura en Q con el load en *Q. En otras palabras, este 692 resultado está prohibido, incluso sin una barrera de dependencia de 693 dirección implícita del READ_ONCE() moderno: 694 695 (Q == &B) && (B == 4) 696 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 700 escrituras. Este patrón se puede utilizar para registrar raras condiciones 701 de error y similares, y el orden natural de las CPUs evita que se pierdan 702 tales registros. 703 704 705 Tenga en cuenta que el orden proporcionado por una dependencia de dirección 706 es local para la CPU que lo contiene. Lea la sección sobre "Atomicidad 707 multicopia" para más información. 708 709 710 La barrera de dependencia de dirección es muy importante para el sistema 711 RCU, por ejemplo. Vea rcu_assign_pointer() y rcu_dereference() en 712 include/linux/rcupdate.h. Esto permite que el objetivo actual de un puntero 713 RCU sea reemplazado con un nuevo objetivo modificado, sin que el objetivo 714 del reemplazo parezca estar inicializado de manera incompleta. 715 716 Consulte también la subsección sobre "Coherencia de caché" para obtener un 717 ejemplo más completo. 718 719 DEPENDENCIAS DE CONTROL 720 ----------------------- 721 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 724 ayudarle a prevenir que la ignorancia del compilador rompa su código. 725 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: 730 731 q = READ_ONCE(a); 732 <barrera implícita de dependencia de direcciones> 733 if (q) { 734 /* BUG: No hay dependencia de dirección!!! */ 735 p = READ_ONCE(b); 736 } 737 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 740 cortocircuitar al intentar predecir el resultado por adelantado, para que 741 otras CPU vean la carga de b como si hubiera ocurrido antes que la carga de 742 a. En cuyo caso lo que realmente se requiere es: 743 744 q = READ_ONCE(a); 745 if (q) { 746 <barrera de lectura> 747 p = READ_ONCE(b); 748 } 749 750 Sin embargo, los stores no se especulan. Esto significa que ordenar -es- 751 provisto para dependencias de control de load-store, como en el siguiente 752 ejemplo: 753 754 q = READ_ONCE(a); 755 if (q) { 756 WRITE_ONCE(b, 1); 757 } 758 759 Las dependencias de control se emparejan normalmente con otros tipos de 760 barreras. Dicho esto, tenga en cuenta que ni READ_ONCE() ni WRITE_ONCE() 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 764 puede dar lugar a efectos en el orden muy contrarios a la intuición. 765 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 768 para optimizar el ejemplo original eliminando la declaración "if", como: 769 770 q = a; 771 b = 1; /* BUG: Compilador y CPU pueden ambos reordernar!!! */ 772 773 Así que no deje de lado READ_ONCE(). 774 775 Es tentador tratar de hacer cumplir el orden en stores idénticos en ambos 776 caminos del "if" de la siguiente manera: 777 778 q = READ_ONCE(a); 779 if (q) { 780 barrier(); 781 WRITE_ONCE(b, 1); 782 hacer_algo(); 783 } else { 784 barrier(); 785 WRITE_ONCE(b, 1); 786 hacer_otra_cosa(); 787 } 788 789 Desafortunadamente, los compiladores actuales transformarán esto de la 790 siguiente manera en casos de alto nivel de optimización: 791 792 q = READ_ONCE(a); 793 barrier(); 794 WRITE_ONCE(b, 1); /* BUG: No hay orden en load de a!!! */ 795 if (q) { 796 /* WRITE_ONCE(b, 1); -- movido arriba, BUG!!! */ 797 hacer_algo(); 798 } else { 799 /* WRITE_ONCE(b, 1); -- movido arriba, BUG!!! */ 800 hacer_otra_cosa(); 801 } 802 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 805 absolutamente necesario y debe estar presente en el código ensamblador 806 incluso después de que se hayan aplicado todas las optimizaciones del 807 compilador. Por lo tanto, si necesita ordenar en este ejemplo, necesita 808 explícitamente barreras de memoria, por ejemplo, smp_store_release(): 809 810 811 q = READ_ONCE(a); 812 if (q) { 813 smp_store_release(&b, 1); 814 hacer_algo(); 815 } else { 816 smp_store_release(&b, 1); 817 hacer_otra_cosa(); 818 } 819 820 Por el contrario, sin barreras de memoria explícita, el control de un if 821 con dos opciones está garantizado solo cuando los stores difieren, por 822 ejemplo: 823 824 q = READ_ONCE(a); 825 if (q) { 826 WRITE_ONCE(b, 1); 827 hacer_algo(); 828 } else { 829 WRITE_ONCE(b, 2); 830 hacer_otra_cosa(); 831 } 832 833 Aún se requiere el inicial READ_ONCE() para evitar que el compilador toque 834 el valor de 'a'. 835 836 Además, debe tener cuidado con lo que hace con la variable local 'q', de lo 837 contrario, el compilador podría adivinar el valor y volver a eliminar el 838 necesario condicional. Por ejemplo: 839 840 q = READ_ONCE(a); 841 if (q % MAX) { 842 WRITE_ONCE(b, 1); 843 hacer_algo(); 844 } else { 845 WRITE_ONCE(b, 2); 846 hacer_otra_cosa(); 847 } 848 849 Si MAX se define como 1, entonces el compilador sabe que (q % MAX) es igual 850 a cero, en cuyo caso el compilador tiene derecho a transformar el código 851 anterior en el siguiente: 852 853 q = READ_ONCE(a); 854 WRITE_ONCE(b, 2); 855 hacer_otra_cosa(); 856 857 Dada esta transformación, la CPU no está obligada a respetar el orden entre 858 la carga de la variable 'a' y el store de la variable 'b'. Es tentador 859 agregar una barrier(), pero esto no ayuda. El condicional se ha ido, y la 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: 862 863 q = READ_ONCE(a); 864 BUILD_BUG_ON(MAX <= 1); /* Orden de carga de a con store de b */ 865 if (q % MAX) { 866 WRITE_ONCE(b, 1); 867 hacer_algo(); 868 } else { 869 WRITE_ONCE(b, 2); 870 hacer_otra_cosa(); 871 } 872 873 Tenga en cuenta una vez más que los stores de 'b' difieren. Si fueran 874 idénticos, como se señaló anteriormente, el compilador podría sacar ese 875 store fuera de la declaración 'if'. 876 877 También debe tener cuidado de no confiar demasiado en el cortocircuito 878 de la evaluación booleana. Considere este ejemplo: 879 880 q = READ_ONCE(a); 881 if (q || 1 > 0) 882 WRITE_ONCE(b, 1); 883 884 Debido a que la primera condición no puede fallar y la segunda condición es 885 siempre cierta, el compilador puede transformar este ejemplo de la 886 siguiente manera, rompiendo la dependencia del control: 887 888 q = READ_ONCE(a); 889 WRITE_ONCE(b, 1); 890 891 Este ejemplo subraya la necesidad de asegurarse de que el compilador no 892 pueda adivinar su código. Más generalmente, aunque READ_ONCE() fuerza 893 al compilador para emitir código para una carga dada, no fuerza al 894 compilador para usar los resultados. 895 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 898 aplica necesariamente al código que sigue a la declaración if: 899 900 q = READ_ONCE(a); 901 if (q) { 902 WRITE_ONCE(b, 1); 903 } else { 904 WRITE_ONCE(b, 2); 905 } 906 WRITE_ONCE(c, 1); /* BUG: No hay orden para la lectura de 'a'. */ 907 908 Es tentador argumentar que, de hecho, existe un orden porque el compilador 909 no puede reordenar accesos volátiles y tampoco puede reordenar escrituras 910 en 'b' con la condición. Desafortunadamente para esta línea de 911 razonamiento, el compilador podría compilar las dos escrituras en 'b' como 912 instrucciones de movimiento condicional, como en este fantástico idioma 913 pseudo-ensamblador: 914 915 ld r1,a 916 cmp r1,$0 917 cmov,ne r4,$1 918 cmov,eq r4,$2 919 st r4,b 920 st $1,c 921 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 927 las funciones invocado por esas dos cláusulas), no al código que sigue a 928 esa declaración if. 929 930 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 933 multicopia" para más información. 934 935 936 En resumen: 937 938 (*) Las dependencias de control pueden ordenar cargas anteriores para 939 stores posteriores. Sin embargo, no garantizan ningún otro tipo de 940 orden: No cargas previas contra cargas posteriores, ni 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 943 cargas posteriores, smp_mb(). 944 945 (*) Si ambos caminos de la declaración "if" comienzan con stores 946 idénticos de la misma variable, entonces esos stores deben ser 947 ordenados, ya sea precediéndoles a ambos con smp_mb() o usando 948 smp_store_release() para realizar el store. Tenga en cuenta que -no- 949 es suficiente usar barrier() al comienzo de cada caso de la 950 declaración "if" porque, como se muestra en el ejemplo anterior, la 951 optimización de los compiladores puede destruir la dependencia de 952 control respetando al pie de la letra la ley de barrier(). 953 954 (*) Las dependencias de control requieren al menos un condicional en 955 tiempo de ejecución entre la carga anterior y el almacenamiento 956 posterior, y este condicional debe implicar la carga previa. Si el 957 compilador es capaz de optimizar el condicional y quitarlo, también 958 habrá optimizado el ordenar. El uso cuidadoso de READ_ONCE() y 959 WRITE_ONCE() puede ayudar a preservar el necesario condicional. 960 961 (*) Las dependencias de control requieren que el compilador evite 962 reordenar las dependencia hasta su inexistencia. El uso cuidadoso de 963 READ_ONCE() o atomic{,64}_read() puede ayudarle a preservar la 964 dependencia de control. Consulte la sección BARRERA DEL COMPILADOR 965 para obtener más información al respecto. 966 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 969 control, incluyendo cualquier función a la que llamen dichas dos 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. 972 973 (*) Las dependencias de control se emparejan normalmente con otros tipos 974 de barreras. 975 976 (*) Las dependencias de control no proporcionan atomicidad multicopia. Si 977 usted necesita todas las CPU para ver un store dado al mismo tiempo, 978 emplee smp_mb(). 979 980 (*) Los compiladores no entienden las dependencias de control. Por lo 981 tanto es su trabajo asegurarse de que no rompan su código. 982 983 984 EMPAREJAMIENTO DE BARRERAS SMP 985 ------------------------------ 986 987 Cuando se trata de interacciones CPU-CPU, ciertos tipos de barrera de 988 memoria deben estar siempre emparejados. La falta del apropiado 989 emparejamiento es casi seguro un error. 990 991 Las barreras generales se emparejan entre sí, aunque también se emparejan 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 994 ambas también pueden emparejarse con otras barreras, incluidas, por 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 1001 liberación o una barrera general: 1002 1003 CPU 1 CPU 2 1004 =============== =============== 1005 WRITE_ONCE(a, 1); 1006 <barrera de escritura> 1007 WRITE_ONCE(b, 2); x = READ_ONCE(b); 1008 <barrera de lectura> 1009 y = READ_ONCE(a); 1010 1011 O bien: 1012 1013 CPU 1 CPU 2 1014 =============== =============================== 1015 a = 1; 1016 <barrera de escritura> 1017 WRITE_ONCE(b, &a); x = READ_ONCE(b); 1018 <barrera de dependencia de dirección implícita> 1019 y = *x; 1020 1021 O incluso: 1022 1023 CPU 1 CPU 2 1024 =============== =============================== 1025 r1 = READ_ONCE(y); 1026 <barrera general> 1027 WRITE_ONCE(x, 1); if (r2 = READ_ONCE(x)) { 1028 <barrera de control implícita> 1029 WRITE_ONCE(y, 1); 1030 } 1031 1032 assert(r1 == 0 || r2 == 0); 1033 1034 Básicamente, la barrera de lectura siempre tiene que estar ahí, aunque 1035 puede ser del tipo "más débil". 1036 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: 1040 1041 CPU 1 CPU 2 1042 =================== =================== 1043 WRITE_ONCE(a, 1); }---- --->{ v = READ_ONCE(c); 1044 WRITE_ONCE(b, 2); } \ / { w = READ_ONCE(d); 1045 <barrera de escritura> \ <barrera de lectura> 1046 WRITE_ONCE(c, 3); } / \ { x = READ_ONCE(a); 1047 WRITE_ONCE(d, 4); }---- --->{ y = READ_ONCE(b); 1048 1049 1050 EJEMPLOS DE SECUENCIAS DE BARRERA DE MEMORIA 1051 -------------------------------------------- 1052 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: 1055 1056 CPU 1 1057 ======================= 1058 STORE A = 1 1059 STORE B = 2 1060 STORE C = 3 1061 <barrera de escritura> 1062 STORE D = 4 1063 STORE E = 5 1064 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 1067 conjunto desordenado { STORE A, STORE B, STORE C} todo ocurriendo antes del 1068 conjunto desordenado { STORE D, STORE E}: 1069 1070 1071 +-------+ : : 1072 | | +------+ 1073 | |------>| C=3 | } /\ 1074 | | : +------+ }----- \ -----> Eventos perceptibles para 1075 | | : | A=1 | } \/ el resto del sistema 1076 | | : +------+ } 1077 | CPU 1 | : | B=2 | } 1078 | | +------+ } 1079 | | wwwwwwwwwwwwwwww } <--- En este momento la barrera de 1080 | | +------+ } escritura requiere que todos los 1081 | | : | E=5 | } stores anteriores a la barrera 1082 | | : +------+ } sean confirmados antes de que otros 1083 | |------>| D=4 | } store puedan suceder 1084 | | +------+ 1085 +-------+ : : 1086 | 1087 | Secuencia por la cual los stores son confirmados al 1088 | sistema de memoria por parte del CPU 1 1089 V 1090 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: 1094 1095 CPU 1 CPU 2 1096 ======================= ======================= 1097 { B = 7; X = 9; Y = 8; C = &Y } 1098 STORE A = 1 1099 STORE B = 2 1100 <barrera de escritura> 1101 STORE C = &B LOAD X 1102 STORE D = 4 LOAD C (consigue &B) 1103 LOAD *C (lee B) 1104 1105 Sin intervención, la CPU 2 puede percibir los eventos en la CPU 1 en orden 1106 aleatorio a efectos prácticos, a pesar de la barrera de escritura emitida 1107 por la CPU 1: 1108 1109 +-------+ : : : : 1110 | | +------+ +-------+ | Secuencia de 1111 | |------>| B=2 |----- --->| Y->8 | | actualizado de 1112 | | : +------+ \ +-------+ | percepción en CPU 2 1113 | CPU 1 | : | A=1 | \ --->| C->&Y | V 1114 | | +------+ | +-------+ 1115 | | wwwwwwwwwwwwwwww | : : 1116 | | +------+ | : : 1117 | | : | C=&B |--- | : : +-------+ 1118 | | : +------+ \ | +-------+ | | 1119 | |------>| D=4 | ----------->| C->&B |------>| | 1120 | | +------+ | +-------+ | | 1121 +-------+ : : | : : | | 1122 | : : | | 1123 | : : | CPU 2 | 1124 | +-------+ | | 1125 Percepción de B ---> | | B->7 |------>| | 1126 aparentemente incorrecta! | +-------+ | | 1127 | : : | | 1128 | +-------+ | | 1129 La carga de X frena ---> \ | X->9 |------>| | 1130 el mantenimiento de \ +-------+ | | 1131 la coherencia de B ----->| B->2 | +-------+ 1132 +-------+ 1133 : : 1134 1135 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. 1138 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: 1141 1142 CPU 1 CPU 2 1143 ======================= ======================= 1144 { B = 7; X = 9; Y = 8; C = &Y } 1145 STORE A = 1 1146 STORE B = 2 1147 <barrera de escritura> 1148 STORE C = &B LOAD X 1149 STORE D = 4 LOAD C (consigue &B) 1150 <barrera de dependencia de dirección> 1151 LOAD *C (reads B) 1152 1153 entonces ocurrirá lo siguiente: 1154 1155 +-------+ : : : : 1156 | | +------+ +-------+ 1157 | |------>| B=2 |----- --->| Y->8 | 1158 | | : +------+ \ +-------+ 1159 | CPU 1 | : | A=1 | \ --->| C->&Y | 1160 | | +------+ | +-------+ 1161 | | wwwwwwwwwwwwwwww | : : 1162 | | +------+ | : : 1163 | | : | C=&B |--- | : : +-------+ 1164 | | : +------+ \ | +-------+ | | 1165 | |------>| D=4 | ----------->| C->&B |------>| | 1166 | | +------+ | +-------+ | | 1167 +-------+ : : | : : | | 1168 | : : | | 1169 | : : | CPU 2 | 1170 | +-------+ | | 1171 | | X->9 |------>| | 1172 | +-------+ | | 1173 Se asegura de que ---> \ aaaaaaaaaaaaaaaaa | | 1174 los efectos anteriores al \ +-------+ | | 1175 store de C sean percibidos ----->| B->2 |------>| | 1176 por los siguientes loads +-------+ | | 1177 : : +-------+ 1178 1179 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: 1182 1183 CPU 1 CPU 2 1184 ======================= ======================= 1185 { A = 0, B = 9 } 1186 STORE A=1 1187 <barrera de escritura> 1188 STORE B=2 1189 LOAD B 1190 LOAD A 1191 1192 Sin intervención, la CPU 2 puede elegir percibir los eventos en la CPU 1 en 1193 algún orden aleatorio a efectos prácticos, a pesar de la barrera de 1194 escritura emitida por la CPU 1: 1195 1196 +-------+ : : : : 1197 | | +------+ +-------+ 1198 | |------>| A=1 |------ --->| A->0 | 1199 | | +------+ \ +-------+ 1200 | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 | 1201 | | +------+ | +-------+ 1202 | |------>| B=2 |--- | : : 1203 | | +------+ \ | : : +-------+ 1204 +-------+ : : \ | +-------+ | | 1205 ---------->| B->2 |------>| | 1206 | +-------+ | CPU 2 | 1207 | | A->0 |------>| | 1208 | +-------+ | | 1209 | : : +-------+ 1210 \ : : 1211 \ +-------+ 1212 ---->| A->1 | 1213 +-------+ 1214 : : 1215 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: 1218 1219 CPU 1 CPU 2 1220 ======================= ======================= 1221 { A = 0, B = 9 } 1222 STORE A=1 1223 <barrera de escritura> 1224 STORE B=2 1225 LOAD B 1226 <barrera de lectura> 1227 LOAD A 1228 1229 entonces el orden parcial impuesto por la CPU 1 será percibido 1230 correctamente por la CPU 2: 1231 1232 +-------+ : : : : 1233 | | +------+ +-------+ 1234 | |------>| A=1 |------ --->| A->0 | 1235 | | +------+ \ +-------+ 1236 | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 | 1237 | | +------+ | +-------+ 1238 | |------>| B=2 |--- | : : 1239 | | +------+ \ | : : +-------+ 1240 +-------+ : : \ | +-------+ | | 1241 ---------->| B->2 |------>| | 1242 | +-------+ | CPU 2 | 1243 | : : | | 1244 | : : | | 1245 En este punto la barrera ----> \ rrrrrrrrrrrrrrrrr | | 1246 de lectura consigue que \ +-------+ | | 1247 todos los efectos anteriores ---->| A->1 |------>| | 1248 al almacenamiento de B sean +-------+ | | 1249 perceptibles por la CPU 2 : : +-------+ 1250 1251 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: 1254 1255 CPU 1 CPU 2 1256 ======================= ======================= 1257 { A = 0, B = 9 } 1258 STORE A=1 1259 <barrera de escritura> 1260 STORE B=2 1261 LOAD B 1262 LOAD A [primer load de A] 1263 <rbarrera de lectura> 1264 LOAD A [segundo load de A] 1265 1266 Aunque las dos cargas de A ocurren después de la carga de B, ambas pueden 1267 obtener diferentes valores: 1268 1269 +-------+ : : : : 1270 | | +------+ +-------+ 1271 | |------>| A=1 |------ --->| A->0 | 1272 | | +------+ \ +-------+ 1273 | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 | 1274 | | +------+ | +-------+ 1275 | |------>| B=2 |--- | : : 1276 | | +------+ \ | : : +-------+ 1277 +-------+ : : \ | +-------+ | | 1278 ---------->| B->2 |------>| | 1279 | +-------+ | CPU 2 | 1280 | : : | | 1281 | : : | | 1282 | +-------+ | | 1283 | | A->0 |------>| 1st | 1284 | +-------+ | | 1285 En este punto la barrera ----> \ rrrrrrrrrrrrrrrrr | | 1286 de lectura consigue que \ +-------+ | | 1287 todos los efectos anteriores ---->| A->1 |------>| | 1288 al almacenamiento de B sean +-------+ | | 1289 perceptibles por la CPU 2 : : +-------+ 1290 1291 Pero puede ser que la actualización a A desde la CPU 1 se vuelva 1292 perceptible para la CPU 2 antes de que la barrera de lectura se complete de 1293 todos modos: 1294 1295 +-------+ : : : : 1296 | | +------+ +-------+ 1297 | |------>| A=1 |------ --->| A->0 | 1298 | | +------+ \ +-------+ 1299 | CPU 1 | wwwwwwwwwwwwwwww \ --->| B->9 | 1300 | | +------+ | +-------+ 1301 | |------>| B=2 |--- | : : 1302 | | +------+ \ | : : +-------+ 1303 +-------+ : : \ | +-------+ | | 1304 ---------->| B->2 |------>| | 1305 | +-------+ | CPU 2 | 1306 | : : | | 1307 \ : : | | 1308 \ +-------+ | | 1309 ---->| A->1 |------>| 1st | 1310 +-------+ | | 1311 rrrrrrrrrrrrrrrrr | | 1312 +-------+ | | 1313 | A->1 |------>| 2nd | 1314 +-------+ | | 1315 : : +-------+ 1316 1317 La garantía es que la segunda carga siempre dará como resultado A == 1 si 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. 1320 1321 1322 BARRERAS DE MEMORIA DE LECTURA FRENTE A ESPECULACIÓN DE CARGA 1323 ------------------------------------------------------------- 1324 1325 Muchas CPU especulan con las cargas: es decir, ven que necesitarán cargar 1326 un elemento de la memoria, y encuentran un momento en el que no están 1327 usando el bus para ningún otra carga, y también en la carga por adelantado, 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 1331 mano. 1332 1333 Puede resultar que la CPU en realidad no necesitara el valor, tal vez 1334 porque una condición eludió la carga, en cuyo caso puede descartar el valor 1335 o simplemente almacenar en caché para su uso posterior. 1336 1337 Considere: 1338 1339 CPU 1 CPU 2 1340 ======================= ======================= 1341 LOAD B 1342 DIVIDE } Instrucciones de división 1343 DIVIDE } tardan mucho en terminar 1344 LOAD A 1345 1346 donde DIVIDE es DIVIDIR. Que podría aparecer como esto: 1347 1348 : : +-------+ 1349 +-------+ | | 1350 --->| B->2 |------>| | 1351 +-------+ | CPU 2 | 1352 : :DIVIDE | | 1353 +-------+ | | 1354 La CPU ocupada con la división ---> --->| A->0 |~~~~ | | 1355 especula sobre el LOAD de A +-------+ ~ | | 1356 : : ~ | | 1357 : :DIVIDE | | 1358 : : ~ | | 1359 Una vez completadas las divisiones --> : : ~-->| | 1360 la CPU puede realizar el : : | | 1361 LOAD con efecto inmediato : : +-------+ 1362 1363 1364 Colocando una barrera de lectura o una barrera de dependencia de dirección 1365 justo antes de la segundo carga: 1366 1367 1368 1369 CPU 1 CPU 2 1370 ======================= ======================= 1371 LOAD B 1372 DIVIDE 1373 DIVIDE 1374 <rbarrera de lectura> 1375 LOAD A 1376 1377 obligará a reconsiderar cualquier valor obtenido especulativamente en una 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 1380 solo se usará: 1381 1382 : : +-------+ 1383 +-------+ | | 1384 --->| B->2 |------>| | 1385 +-------+ | CPU 2 | 1386 : :DIVIDE | | 1387 +-------+ | | 1388 La CPU ocupada con la división ---> --->| A->0 |~~~~ | | 1389 especula sobre el LOAD de A +-------+ ~ | | 1390 : : ~ | | 1391 : :DIVIDE | | 1392 : : ~ | | 1393 : : ~ | | 1394 rrrrrrrrrrrrrrrr~ | | 1395 : : ~ | | 1396 : : ~-->| | 1397 : : | | 1398 : : +-------+ 1399 1400 1401 pero si había una actualización o una invalidación de otra CPU pendiente, 1402 entonces la especulación será cancelada y el valor recargado: 1403 1404 : : +-------+ 1405 +-------+ | | 1406 --->| B->2 |------>| | 1407 +-------+ | CPU 2 | 1408 : :DIVIDE | | 1409 +-------+ | | 1410 La CPU ocupada con la división ---> --->| A->0 |~~~~ | | 1411 especula sobre el LOAD de A +-------+ ~ | | 1412 : : ~ | | 1413 : :DIVIDE | | 1414 : : ~ | | 1415 : : ~ | | 1416 rrrrrrrrrrrrrrrrr | | 1417 +-------+ | | 1418 La especulación es descartada ---> --->| A->1 |------>| | 1419 y un valor actualizado +-------+ | | 1420 es conseguido : : +-------+ 1421 1422 ATOMICIDAD MULTICOPIA 1423 --------------------- 1424 1425 La atomicidad multicopia es una noción profundamente intuitiva sobre el 1426 orden que no es siempre proporcionada por los sistemas informáticos reales, 1427 a saber, que un determinada store se vuelve visible al mismo tiempo para 1428 todos las CPU o, alternativamente, que todas las CPU acuerdan el orden en 1429 que todos los stores se vuelven visibles. Sin embargo, el soporte para 1430 atomicidad multicopia completa descartaría valiosas optimizaciones 1431 hardware, por lo que una versión más débil conocida como ``otra atomicidad 1432 multicopia'' en cambio, solo garantiza que un store dado se vuelva visible 1433 al mismo tiempo en todas las -otras- CPUs. El resto de este documento 1434 discute esta versión más débil, pero por brevedad lo llamaremos simplemente 1435 ``atomicidad multicopia''. 1436 1437 El siguiente ejemplo demuestra la atomicidad multicopia: 1438 1439 CPU 1 CPU 2 CPU 3 1440 ======================= ======================= ======================= 1441 { X = 0, Y = 0 } 1442 STORE X=1 r1=LOAD X (reads 1) LOAD Y (reads 1) 1443 <barrera general> <barrera de lectura> 1444 STORE Y=r1 LOAD X 1445 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 1450 garantizan que la CPU 2 ejecuta su carga antes que su almacenamiento, y la 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?" 1453 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 1458 variable que se ejecuta en la CPU A (y la CPU A no almacenó originalmente 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 1461 valor posterior. Sin embargo, el kernel Linux no requiere que los sistemas 1462 sean atómicos multicopia. 1463 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. 1468 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 1473 continuación: 1474 1475 CPU 1 CPU 2 CPU 3 1476 ======================= ======================= ======================= 1477 { X = 0, Y = 0 } 1478 STORE X=1 r1=LOAD X (escribe 1) LOAD Y (lee 1) 1479 <dependencia de datos> <barrera de lectura> 1480 STORE Y=r1 LOAD X (lee 0) 1481 1482 Esta sustitución permite que la atomicidad no multicopia se desenfrene: en 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 1485 tenga valor 0. 1486 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 1489 este ejemplo se ejecuta en un sistema atómico no multicopia donde las CPU 1 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 1492 requieren barreras generales para garantizar que todas las CPU acurden el 1493 orden combinado de accesos múltiples. 1494 1495 Las barreras generales pueden compensar no solo la atomicidad no 1496 multicopia, pero también pueden generar orden adicional que puede asegurar 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 1499 proporciona este orden adicional, lo que significa que solo se garantiza 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 1502 Herman Hollerith: 1503 1504 int u, v, x, y, z; 1505 1506 void cpu0(void) 1507 { 1508 r0 = smp_load_acquire(&x); 1509 WRITE_ONCE(u, 1); 1510 smp_store_release(&y, 1); 1511 } 1512 1513 void cpu1(void) 1514 { 1515 r1 = smp_load_acquire(&y); 1516 r4 = READ_ONCE(v); 1517 r5 = READ_ONCE(u); 1518 smp_store_release(&z, 1); 1519 } 1520 1521 void cpu2(void) 1522 { 1523 r2 = smp_load_acquire(&z); 1524 smp_store_release(&x, 1); 1525 } 1526 1527 void cpu3(void) 1528 { 1529 WRITE_ONCE(v, 1); 1530 smp_mb(); 1531 r3 = READ_ONCE(u); 1532 } 1533 1534 Dado que cpu0(), cpu1() y cpu2() participan en una cadena de parejas 1535 smp_store_release()/smp_load_acquire(), el siguiente resultado estaría 1536 prohibido: 1537 1538 r0 == 1 && r1 == 1 && r2 == 1 1539 1540 Además, debido a la relación liberación-adquisición entre cpu0() y cpu1(), 1541 cpu1() debe ver las escrituras de cpu0(), de modo que el siguiente 1542 resultado estaría prohibido: 1543 1544 r1 == 1 && r5 == 0 1545 1546 Sin embargo, el orden proporcionado por una cadena de 1547 liberación-adquisición es local a las CPU que participan en esa cadena y no 1548 se aplica a cpu3(), al menos aparte de los stores. Por lo tanto, es posible 1549 el siguiente resultado: 1550 1551 r0 == 0 && r1 == 1 && r2 == 1 && r3 == 0 && r4 == 0 1552 1553 Por otro lado, también el siguiente resultado es posible: 1554 1555 r0 == 0 && r1 == 1 && r2 == 1 && r3 == 0 && r4 == 0 && r5 == 1 1556 1557 Aunque cpu0(), cpu1() y cpu2() verán sus respectivas lecturas y escrituras 1558 en orden, las CPU que no participan en la cadena de liberación-adquisición 1559 pueden estar en desacuerdo con el orden. Este desacuerdo se debe al hecho 1560 de que las instrucciones de barrera de memoria débiles utilizadas para 1561 implementar smp_load_acquire() y smp_store_release() no son necesarios para 1562 ordenar stores anteriores contra cargas posteriores en todos los casos. 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 1565 acuerdo en que estas dos operaciones ocurrieron en el orden previsto. 1566 1567 Sin embargo, tenga en cuenta que smp_load_acquire() no es mágico. En 1568 particular, simplemente lee de su argumento en orden. Es decir, -no- 1569 asegura que se leerá cualquier valor en particular. Por lo tanto, los 1570 siguiente resultados son posibles: 1571 1572 r0 == 0 && r1 == 0 && r2 == 0 && r5 == 0 1573 1574 Tenga en cuenta que este resultado puede ocurrir incluso en un mítico 1575 sistema, consistente en secuencia, donde nunca se reordena nada. 1576 1577 Para reiterar, si su código requiere un orden completo de todas las 1578 operaciones, utilice barreras generales en todo momento. 1579 1580 1581 ============================== 1582 BARRERAS EXPLÍCITAS DEL KERNEL 1583 ============================== 1584 1585 El kernel Linux tiene una variedad de diferentes barreras que actúan a 1586 diferentes niveles: 1587 1588 (*) Barrera del compilador. 1589 1590 (*) Barreras de memoria de la CPU. 1591 1592 1593 BARRERA DEL COMPILADOR 1594 ----------------------- 1595 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 1598 lado al otro: 1599 1600 barrier(); 1601 1602 Esta es una barrera general: no hay variantes de barrier() para casos de 1603 lectura-lectura o escritura-escritura. Sin embargo, READ_ONCE() y 1604 WRITE_ONCE() pueden ser considerado como formas débiles de barrier() que 1605 afectan solo específicos accesos marcados por READ_ONCE() o WRITE_ONCE(). 1606 1607 La función barrier() produce los siguientes efectos: 1608 1609 (*) Evita que el compilador reordene los accesos tras barrier() para 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 1613 que fue interrumpido. 1614 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 1617 ese loop. 1618 1619 Las funciones READ_ONCE() y WRITE_ONCE() pueden evitar cualquier cantidad 1620 de optimizaciones que, si bien son perfectamente seguras en código de un 1621 solo subproceso, pueden resultar fatales en código concurrente. Aquí hay 1622 algunos ejemplos de tal tipo de optimizaciones: 1623 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 1627 el siguiente código: 1628 1629 a[0] = x; 1630 a[1] = x; 1631 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 1634 siguiente manera: 1635 1636 a[0] = READ_ONCE(x); 1637 a[1] = READ_ONCE(x); 1638 1639 En resumen, READ_ONCE() y WRITE_ONCE() proporcionan coherencia de 1640 caché para accesos desde múltiples CPUs a una sola variable. 1641 1642 (*) El compilador tiene derecho a juntar cargas sucesivas de la misma 1643 variable. Tal fusión puede hacer que el compilador "optimice" el 1644 siguiente código: 1645 1646 while (tmp = a) 1647 hacer_algo_con(tmp); 1648 1649 en el siguiente código, que, aunque en cierto sentido es legítimo 1650 para un código de un solo subproceso, es casi seguro que no es lo 1651 que el desarrollador pretendía: 1652 1653 if (tmp = a) 1654 for (;;) 1655 hacer_algo_con(tmp); 1656 1657 Use READ_ONCE() para evitar que el compilador le haga esto: 1658 1659 while (tmp = READ_ONCE(a)) 1660 hacer_algo_con(tmp); 1661 1662 (*) El compilador tiene derecho a recargar una variable, por ejemplo, 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 1666 ejemplo anterior: 1667 1668 while (tmp = a) 1669 hacer_algo_con(tmp); 1670 1671 Esto podría resultar en el siguiente código, que es perfectamente 1672 seguro en código de subproceso único, pero puede ser fatal en código 1673 concurrente: 1674 1675 while (a) 1676 hacer_algo_con(a); 1677 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 1680 modificada por alguna otra CPU, entre la instrucción "while" y la 1681 llamada a hacer_algo_con(). 1682 1683 De nuevo, use READ_ONCE() para evitar que el compilador haga esto: 1684 1685 while (tmp = READ_ONCE(a)) 1686 hacer_algo_con(tmp); 1687 1688 Tenga en cuenta que si el compilador se queda sin registros, podría 1689 guardar tmp en la pila ("stack"). El overhead (coste en eficiencia) de 1690 este guardado y posterior restauración es por lo que los compiladores 1691 recargan las variables. Hacerlo es perfectamente seguro para código de 1692 subproceso único, por lo que debe informar al compilador sobre los 1693 casos donde no sea seguro. 1694 1695 (*) El compilador está en su derecho de omitir una carga por completo si 1696 sabe cual será su valor. Por ejemplo, si el compilador puede probar 1697 que el valor de la variable 'a' siempre es cero, puede optimizar este 1698 código: 1699 1700 while (tmp = a) 1701 hacer_algo_con(tmp); 1702 1703 En esto: 1704 1705 do { } while (0); 1706 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 1709 que el compilador llevará a cabo su prueba asumiendo que la CPU actual 1710 es la única actualizando la variable 'a'. Si la variable 'a' es 1711 compartida, entonces la prueba del compilador será errónea. Use 1712 READ_ONCE() para decirle al compilador que no sabe tanto como cree: 1713 1714 while (tmp = READ_ONCE(a)) 1715 hacer_algo_con(tmp); 1716 1717 Pero, por favor, tenga en cuenta que el compilador también está 1718 observando de cerca lo que usted hace con el valor después de 1719 READ_ONCE(). Por ejemplo, suponga que Ud. hace lo siguiente y MAX es 1720 una macro de preprocesador con el valor 1: 1721 1722 while ((tmp = READ_ONCE(a)) % MAX) 1723 hacer_algo_con(tmp); 1724 1725 Entonces el compilador sabe que el resultado del operador "%" aplicado 1726 a MAX siempre será cero, nuevamente permitiendo que el compilador 1727 optimice el código hasta su casi inexistencia. (Aún se cargará desde 1728 la variable 'a'.) 1729 1730 (*) De manera similar, el compilador tiene derecho a omitir un store por 1731 completo si sabe que la variable ya tiene el valor almacenado. 1732 Nuevamente, el compilador asume que la CPU actual es la única que 1733 almacena la variable, lo que puede hacer que el compilador haga 1734 algo incorrecto para las variables compartidas. Por ejemplo, suponga 1735 que tiene lo siguiente: 1736 1737 a = 0; 1738 ... Código que no almacena la variable a ... 1739 a = 0; 1740 1741 El compilador observa que el valor de la variable 'a' ya es cero, por 1742 lo que bien podría omitir el segundo store. Esto supondría una fatal 1743 sorpresa, si alguna otra CPU hubiera almacenado la variable 'a' 1744 mientras tanto. 1745 1746 Use WRITE_ONCE() para evitar que el compilador haga este tipo de 1747 suposición equivocada: 1748 1749 WRITE_ONCE(a, 0); 1750 ... Código que no almacena la variable a ... 1751 WRITE_ONCE(a, 0); 1752 1753 (*) El compilador tiene derecho a reordenar los accesos a memoria a menos 1754 que le diga que no. Por ejemplo, considere la siguiente interacción 1755 entre el código de nivel de proceso y un controlador de interrupción: 1756 1757 void nivel_de_procesamiento(void) 1758 { 1759 msg = ACQUIRE_mensaje(); 1760 flag = true; 1761 } 1762 1763 void controlador_interrupcion(void) 1764 { 1765 if (flag) 1766 procesar_mensaje(msg); 1767 } 1768 1769 No hay nada que impida que el compilador transforme 1770 nivel_de_procesamiento() a lo siguiente, que de hecho, bien podría ser 1771 una victoria para código de un solo subproceso: 1772 1773 void nivel_de_procesamiento(void) 1774 { 1775 flag = true; 1776 msg = ACQUIRE_mensaje(); 1777 } 1778 1779 Si la interrupción ocurre entre estas dos declaraciones, entonces 1780 controlador_interrupcion() podría recibir un mensaje ilegible. Use 1781 READ_ONCE() para evitar esto de la siguiente manera: 1782 1783 void nivel_de_procesamiento(void) 1784 { 1785 WRITE_ONCE(msg, ACQUIRE_mensaje()); 1786 WRITE_ONCE(flag, true); 1787 } 1788 1789 void controlador_interrupcion(void) 1790 { 1791 if (READ_ONCE(flag)) 1792 procesar_mensaje(READ_ONCE(msg)); 1793 } 1794 1795 Tenga en cuenta que los envoltorios ("wrappers") READ_ONCE() y 1796 WRITE_ONCE() en controlador_interrupcion() son necesarios si este 1797 controlador de interrupciones puede ser interrumpido por algo que 1798 también accede a 'flag' y 'msg', por ejemplo, una interrupción anidada 1799 o un NMI. De lo contrario, READ_ONCE() y WRITE_ONCE() no son 1800 necesarios en controlador_interrupcion() aparte de con fines de 1801 documentación. (Tenga también en cuenta que las interrupciones 1802 anidadas no ocurren típicamente en los kernels Linux modernos, de 1803 hecho, si un controlador de interrupciones regresa con interrupciones 1804 habilitadas, obtendrá un WARN_ONCE().) 1805 1806 Debe suponer que el compilador puede mover READ_ONCE() y WRITE_ONCE() 1807 a código que no contiene READ_ONCE(), WRITE_ONCE(), barrier(), o 1808 primitivas similares. 1809 1810 Este efecto también podría lograrse usando barrier(), pero READ_ONCE() 1811 y WRITE_ONCE() son más selectivos: Con READ_ONCE() y WRITE_ONCE(), el 1812 compilador solo necesita olvidar el contenido de ubicaciones de 1813 memoria indicadas, mientras que con barrier() el compilador debe 1814 descartar el valor de todas las ubicaciones de memoria que tiene 1815 actualmente almacenadas en caché, en cualquier registro de la máquina. 1816 Por supuesto, el compilador también debe respetar el orden en que 1817 ocurren READ_ONCE() y WRITE_ONCE(), aunque la CPU, efectivamente, no 1818 necesita hacerlo. 1819 1820 (*) El compilador tiene derecho a inventar stores para una variable, 1821 como en el siguiente ejemplo: 1822 1823 if (a) 1824 b = a; 1825 else 1826 b = 42; 1827 1828 El compilador podría ahorrar un branch al optimizar esto de la 1829 siguiente manera: 1830 1831 b = 42; 1832 if (a) 1833 b = a; 1834 1835 En el código de un solo subproceso, esto no solo es seguro, sino que 1836 también ahorra un branch. Desafortunadamente, en código concurrente, 1837 esta optimización podría causar que alguna otra CPU vea un valor falso 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 1840 manera: 1841 1842 if (a) 1843 WRITE_ONCE(b, a); 1844 else 1845 WRITE_ONCE(b, 42); 1846 1847 El compilador también puede inventar cargas. Estos casos suelen ser 1848 menos perjudiciales, pero pueden dar como resultado "bouncing" de la 1849 línea de caché y, por lo tanto, bajo rendimiento y escalabilidad. 1850 Utilice READ_ONCE() para evitar cargas inventadas. 1851 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 1855 tearing), en el que un solo gran acceso es reemplazado por múltiples 1856 accesos menores. Por ejemplo, dada una arquitectura que tiene 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: 1861 1862 p = 0x00010002; 1863 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 1866 instrucciones el construir la constante y luego almacenarla. Por lo 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ó) 1869 hizo que GCC usara incorrectamente esta optimización en un store 1870 volátil. En ausencia de tales errores, el uso de WRITE_ONCE() evita el 1871 desgarro del store en el siguiente ejemplo: 1872 1873 struct __attribute__((__packed__)) foo { 1874 short a; 1875 int b; 1876 short c; 1877 }; 1878 struct foo foo1, foo2; 1879 ... 1880 1881 foo2.a = foo1.a; 1882 foo2.b = foo1.b; 1883 foo2.c = foo1.c; 1884 1885 Debido a que no hay envoltorios READ_ONCE() o WRITE_ONCE() y no 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 1889 resultaría en una carga con desgarro en 'foo1.b' y store del desgarro 1890 en 'foo2.b'. READ_ONCE() y WRITE_ONCE() nuevamente evitan el desgarro 1891 en este ejemplo: 1892 1893 foo2.a = foo1.a; 1894 WRITE_ONCE(foo2.b, READ_ONCE(foo1.b)); 1895 foo2.c = foo1.c; 1896 1897 Aparte de esto, nunca es necesario usar READ_ONCE() y WRITE_ONCE() en una 1898 variable que se ha marcado como volátil. Por ejemplo, dado que 'jiffies' 1899 está marcado como volátil, nunca es necesario usar READ_ONCE(jiffies). La 1900 razón de esto es que READ_ONCE() y WRITE_ONCE() se implementan como 1901 conversiones volátiles, lo que no tiene efecto cuando su argumento ya está 1902 marcado como volátil. 1903 1904 Tenga en cuenta que estas barreras del compilador no tienen un efecto 1905 directo en la CPU, que luego puede reordenar las cosas como quiera. 1906 1907 1908 BARRERAS DE MEMORIA DE LA CPU 1909 ----------------------------- 1910 1911 El kernel de Linux tiene siete barreras básicas de memoria de CPU: 1912 1913 TIPO OBLIGATORIO SMP CONDICIONAL 1914 ======================= =============== =============== 1915 GENERAL mb() smp_mb() 1916 WRITE wmb() smp_wmb() 1917 READ rmb() smp_rmb() 1918 DEPEDENCIA DE DIRECCIÓN READ_ONCE() 1919 1920 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. 1924 1925 Además: en el caso de las dependencias de direcciones, se esperaría que el 1926 compilador emita las cargas en el orden correcto (por ejemplo, `a[b]` 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 1934 lugar para empezar a buscar. 1935 1936 Las barreras de memoria SMP se reducen a barreras de compilador cuando se 1937 compila a monoprocesador, porque se supone que una CPU parecerá ser 1938 auto-consistente, y ordenará correctamente los accesos superpuestos 1939 respecto a sí misma. Sin embargo, consulte la subsección "Guests de 1940 máquinas virtuales" mas adelante. 1941 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. 1945 1946 Las barreras obligatorias no deben usarse para controlar los efectos de 1947 SMP, ya que dichas barreras imponen una sobrecarga innecesaria en los 1948 sistemas SMP y UP. Se pueden, sin embargo, usar para controlar los efectos 1949 MMIO en los accesos a través de ventanas E/S de memoria relajada. Estas 1950 barreras son necesarias incluso en sistemas que no son SMP, ya que afectan 1951 al orden en que las operaciones de memoria aparecen en un dispositivo, al 1952 prohibir tanto al compilador como a la CPU que sean reordenados. 1953 1954 1955 Hay algunas funciones de barrera más avanzadas: 1956 1957 (*) smp_store_mb(var, valor) 1958 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 1961 barrera del compilador en una compilación UP. 1962 1963 1964 (*) smp_mb__before_atomic(); 1965 (*) smp_mb__after_atomic(); 1966 1967 Estos se pueden usar con funciones RMW atómicas que no implican 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 1971 condicionales (fallidas), funciones _relaxed, pero no atomic_read o 1972 atomic_set. Un ejemplo común donde se puede requerir una barrera es 1973 cuando se usan operaciones atómicas como referencia de contador. 1974 1975 Estos también se utilizan para funciones atómicas RMW bitop que no 1976 implican una barrera de memoria (como set_bit y clear_bit). 1977 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: 1980 1981 obj->dead = 1; 1982 smp_mb__before_atomic(); 1983 atomic_dec(&obj->ref_count); 1984 1985 Esto asegura que la marca de muerte en el objeto se perciba como 1986 fijada *antes* de que disminuya el contador de referencia. 1987 1988 Consulte Documentation/atomic_{t,bitops}.txt para obtener más 1989 información. 1990 1991 1992 (*) dma_wmb(); 1993 (*) dma_rmb(); 1994 (*) dma_mb(); 1995 1996 Estos son usados con memoria consistente para garantizar el orden de 1997 escrituras o lecturas de memoria compartida accesible tanto para la 1998 CPU como para un dispositivo compatible con DMA. 1999 2000 Por ejemplo, considere un controlador de dispositivo que comparte 2001 memoria con otro dispositivo y usa un valor de estado del descriptor 2002 para indicar si el descriptor pertenece al dispositivo o a la CPU, y 2003 un "doorbell" (timbre, punto de acceso) para avisarle cuando haya 2004 nuevos descriptores disponibles: 2005 2006 if (desc->status != DEVICE_OWN) { 2007 /* no leer los datos hasta que tengamos el descriptor */ 2008 dma_rmb(); 2009 2010 /* leer/modificar datos */ 2011 read_data = desc->data; 2012 desc->data = write_data; 2013 2014 /* flush de modificaciones antes de la actualización de estado */ 2015 dma_wmb(); 2016 2017 /* asignar propiedad */ 2018 desc->status = DEVICE_OWN; 2019 2020 /* notificar al dispositivo de nuevos descriptores */ 2021 writel(DESC_NOTIFY, doorbell); 2022 } 2023 2024 El dma_rmb() nos permite garantizar que el dispositivo ha liberado su 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 2027 que el dispositivo pueda ver que ahora tiene la propiedad. El dma_mb() 2028 implica tanto un dma_rmb() como un dma_wmb(). Tenga en cuenta que, al 2029 usar writel(), no se necesita un wmb() anterior para garantizar que 2030 las escrituras de la memoria caché coherente se hayan completado antes 2031 escribiendo a la región MMIO. El writel_relaxed() más barato no 2032 proporciona esta garantía y no debe utilizarse aquí. 2033 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 2036 Documentation/core-api/dma-api.rst para más información sobre memoria 2037 consistente. 2038 2039 (*) pmem_wmb(); 2040 2041 Es es para uso con memoria persistente para garantizar que los stores 2042 para los que las modificaciones se escriben en el almacenamiento 2043 persistente llegaron a dominio de durabilidad de la plataforma. 2044 2045 Por ejemplo, después de una escritura no temporal en la región pmem, 2046 usamos pmem_wmb() para garantizar que los stores hayan alcanzado el 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 2050 posteriores. Esto es además del orden realizado por wmb(). 2051 2052 Para la carga desde memoria persistente, las barreras de memoria de 2053 lectura existentes son suficientes para garantizar el orden de 2054 lectura. 2055 2056 (*) io_stop_wc(); 2057 2058 Para accesos a memoria con atributos de combinación de escritura (por 2059 ejemplo, los devueltos por ioremap_wc(), la CPU puede esperar a que 2060 los accesos anteriores se junten con posteriores. io_stop_wc() se 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 2063 espera tenga implicaciones en el rendimiento. 2064 2065 ========================================= 2066 BARRERAS DE MEMORIA IMPLÍCITAS DEL KERNEL 2067 ========================================= 2068 2069 Algunas de las otras funciones en el kernel Linux implican barreras de 2070 memoria, entre estas encontramos funciones de bloqueo y planificación 2071 ("scheduling"). 2072 2073 Esta especificación es una garantía _mínima_; cualquier arquitectura 2074 particular puede proporcionar garantías más sustanciales, pero no se puede 2075 confiar en estas fuera de código específico de arquitectura. 2076 2077 2078 FUNCIONES DE ADQUISICIÓN DE CERROJO 2079 ----------------------------------- 2080 2081 El kernel Linux tiene una serie de abstracciones de bloqueo: 2082 2083 (*) spin locks (cerrojos en loop) 2084 (*) R/W spin lock (cerrojos de escritura/lectura) 2085 (*) mutex 2086 (*) semáforos 2087 (*) R/W semáforos 2088 2089 En todos los casos existen variantes de las operaciones "ACQUIRE" y 2090 "RELEASE" para cada uno de ellos. Todas estas operaciones implican ciertas 2091 barreras: 2092 2093 (1) Implicaciones de la operación ACQUIRE: 2094 2095 Las operaciones de memoria emitidas después del ACQUIRE se completarán 2096 después de que la operación ACQUIRE haya finalizado. 2097 2098 Las operaciones de memoria emitidas antes de ACQUIRE pueden 2099 completarse después que la operación ACQUIRE se ha completado. 2100 2101 (2) Implicaciones de la operación RELEASE: 2102 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. 2105 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. 2108 2109 (3) Implicación de ACQUIRE vs ACQUIRE: 2110 2111 Todas las operaciones ACQUIRE emitidas antes de otra operación 2112 ACQUIRE serán completadas antes de esa operación ACQUIRE. 2113 2114 (4) Implicación de ACQUIRE vs RELEASE: 2115 2116 Todas las operaciones ACQUIRE emitidas antes de una operación RELEASE 2117 serán completadas antes de la operación RELEASE. 2118 2119 (5) Implicación de ACQUIRE condicional fallido: 2120 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 2124 cerrojo estuviera disponible. Los fallos en cerrojos no implican 2125 ningún tipo de barrera. 2126 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 2130 crítica. 2131 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 2134 suceda después del ACQUIRE, y un acceso posterior a la RELEASE suceda antes 2135 del RELEASE, y los dos accesos puedan entonces cruzarse: 2136 2137 *A = a; 2138 ACQUIRE M 2139 RELEASE M 2140 *B = b; 2141 2142 puede ocurrir como: 2143 2144 ACQUIRE M, STORE *B, STORE *A, RELEASE M 2145 2146 Cuando ACQUIRE y RELEASE son bloqueo de adquisición y liberación, 2147 respectivamente, este mismo orden puede ocurrir si el cerrojo ACQUIRE y 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 2151 completa. 2152 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: 2157 2158 *A = a; 2159 RELEASE M 2160 ACQUIRE N 2161 *B = b; 2162 2163 puede ocurrir como: 2164 2165 ACQUIRE N, STORE *B, STORE *A, RELEASE M 2166 2167 Podría parecer que este nuevo orden podría introducir un punto muerto. 2168 Sin embargo, esto no puede suceder porque si tal punto muerto amenazara 2169 con suceder, el RELEASE simplemente se completaría, evitando así el 2170 interbloqueo ("deadlock", punto muerto). 2171 2172 ¿Por qué funciona esto? 2173 2174 Un punto clave es que solo estamos hablando de la CPU re-haciendo el 2175 orden, no el compilador. Si el compilador (o, ya puestos, el 2176 desarrollador) cambió las operaciones, un deadlock -podría- ocurrir. 2177 2178 Pero supongamos que la CPU reordenó las operaciones. En este caso, el 2179 desbloqueo precede al bloqueo en el código ensamblador. La CPU 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 2186 éxito. 2187 2188 Pero, ¿y si el cerrojo es un cerrojo que duerme ("sleeplock")? En tal 2189 caso, el código intentará entrar al scheduler, donde eventualmente 2190 encontrará una barrera de memoria, que forzará la operación de desbloqueo 2191 anterior para completar, nuevamente desentrañando el punto muerto. Podría 2192 haber una carrera de desbloqueo del sueño ("sleep-unlock race"), pero la 2193 primitiva de bloqueo necesita resolver tales carreras correctamente en 2194 cualquier caso. 2195 2196 Es posible que los cerrojos y los semáforos no proporcionen ninguna 2197 garantía de orden en sistemas compilados en UP, por lo que no se puede 2198 contar con tal situación para lograr realmente nada en absoluto, 2199 especialmente con respecto a los accesos de E/S, a menos que se combinen 2200 con operaciones de inhabilitación de interrupciones. 2201 2202 Consulte también la sección "Efectos de barrera adquiriendo intra-CPU". 2203 2204 2205 Como ejemplo, considere lo siguiente: 2206 2207 *A = a; 2208 *B = b; 2209 ACQUIRE 2210 *C = c; 2211 *D = d; 2212 RELEASE 2213 *E = e; 2214 *F = f; 2215 2216 La siguiente secuencia de eventos es aceptable: 2217 2218 ACQUIRE, {*F,*A}, *E, {*C,*D}, *B, RELEASE 2219 2220 [+] Tenga en cuenta que {*F,*A} indica un acceso combinado. 2221 2222 Pero ninguno de los siguientes lo son: 2223 2224 {*F,*A}, *B, ACQUIRE, *C, *D, RELEASE, *E 2225 *A, *B, *C, ACQUIRE, *D, RELEASE, *E, *F 2226 *A, *B, ACQUIRE, *C, RELEASE, *D, *E, *F 2227 *B, ACQUIRE, *C, *D, RELEASE, {*F,*A}, *E 2228 2229 2230 2231 FUNCIONES DE DESACTIVACIÓN DE INTERRUPCIONES 2232 -------------------------------------------- 2233 2234 Las funciones que deshabilitan interrupciones (equivalentes a ACQUIRE) y 2235 habilitan interrupciones (equivalentes a RELEASE) actuarán únicamente como 2236 barrera del compilador. Por consiguiente, si la memoria o la E/S requieren 2237 barreras en tal situación, deben ser provistas por algún otro medio. 2238 2239 2240 FUNCIONES DE DORMIR Y DESPERTAR 2241 ------------------------------- 2242 2243 Dormir y despertar son eventos marcados ("flagged") en los datos globales 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 2248 a dormir, y las primitivas para iniciar un despertar implican ciertas 2249 barreras. 2250 2251 En primer lugar, el agente durmiente normalmente sigue algo similar a esta 2252 secuencia de eventos: 2253 2254 for (;;) { 2255 set_current_state(TASK_UNINTERRUPTIBLE); 2256 if (evento_indicado) 2257 break; 2258 schedule(); // planificar 2259 } 2260 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: 2263 2264 CPU 1 2265 =============================== 2266 set_current_state(); // hacer_estado_actual() 2267 smp_store_mb(); 2268 STORE current->state 2269 <barrera general> 2270 LOAD evento_indicado 2271 2272 set_current_state() puede estar envuelto por: 2273 2274 prepare_to_wait(); // preparese_para_esperar(); 2275 prepare_to_wait_exclusive(); // prepararse_para_solo_esperar(); 2276 2277 que por lo tanto también implican una barrera de memoria general después de 2278 establecer el estado. Toda la secuencia anterior está disponible en varias 2279 formas, todas las cuales obtienen la barrera de memoria en el lugar 2280 correcto: 2281 2282 wait_event(); 2283 wait_event_interruptible(); 2284 wait_event_interruptible_exclusive(); 2285 wait_event_interruptible_timeout(); 2286 wait_event_killable(); 2287 wait_event_timeout(); 2288 wait_on_bit(); 2289 wait_on_bit_lock(); 2290 2291 2292 En segundo lugar, el código que realiza una activación normalmente se 2293 asemeja a algo como esto: 2294 2295 evento_indicado = 1; 2296 wake_up(&event_wait_queue); // despertar 2297 2298 o: 2299 2300 evento_indicado = 1; 2301 wake_up_process(event_daemon); // despertar proceso 2302 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; 2305 no debe confiar en ello. La barrera se produce antes del acceso al estado 2306 de la tarea. En particular, se encuentra entre el STORE para indicar el 2307 evento y el STORE para configurar TASK_RUNNING (hilo ejecutando): 2308 2309 CPU 1 (Durmiente) CPU 2 (Despertadora) 2310 =============================== =============================== 2311 set_current_state(); STORE evento_indicado 2312 smp_store_mb(); wake_up(); 2313 STORE current->state ... 2314 <barrera general> <barrera general> 2315 LOAD evento_indicado if ((LOAD task->state) & TASK_NORMAL) 2316 STORE task->state 2317 2318 donde "task" es el subproceso que se está despertando y es igual al 2319 "current" (hilo actual) de la CPU 1. 2320 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 2323 no existe tal garantía. Para entender esto, considere la siguiente 2324 secuencia de eventos, donde X e Y son ambos cero inicialmente: 2325 2326 CPU 1 CPU 2 2327 =============================== =============================== 2328 X = 1; Y = 1; 2329 smp_mb(); wake_up(); 2330 LOAD Y LOAD X 2331 2332 Si ocurre una reactivación ("wakeup"), una (al menos) de las dos cargas 2333 debe ver 1. Si, por otro lado, no ocurre una reactivación, ambas cargas 2334 pueden ver 0. 2335 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 2338 particular, si wake_up(), en el fragmento anterior, fuera reemplazado por 2339 una llamada a wake_up_process(), las dos cargas verían 1, garantizado. 2340 2341 Las funciones de activación disponibles incluyen: 2342 2343 complete(); 2344 wake_up(); 2345 wake_up_all(); 2346 wake_up_bit(); 2347 wake_up_interruptible(); 2348 wake_up_interruptible_all(); 2349 wake_up_interruptible_nr(); 2350 wake_up_interruptible_poll(); 2351 wake_up_interruptible_sync(); 2352 wake_up_interruptible_sync_poll(); 2353 wake_up_locked(); 2354 wake_up_locked_poll(); 2355 wake_up_nr(); 2356 wake_up_poll(); 2357 wake_up_process(); 2358 2359 En términos de orden de la memoria, todas estas funciones proporcionan las 2360 mismas garantías que un wake_up() (o más fuertes). 2361 2362 [!] Tenga en cuenta que las barreras de la memoria implicadas por el 2363 durmiente y el despierto _no_ ordenan varios stores antes del despertar con 2364 respecto a cargas de los valores guardados después de que el durmiente haya 2365 llamado a set_current_state(). Por ejemplo, si el durmiente hace: 2366 2367 set_current_state(TASK_INTERRUPTIBLE); 2368 if (evento_indicado) 2369 break; 2370 __set_current_state(TASK_RUNNING); 2371 hacer_algo(my_data); 2372 2373 y el que despierta hace: 2374 2375 my_data = valor; 2376 evento_indicado = 1; 2377 wake_up(&event_wait_queue); 2378 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 2382 memoria entre los separados accesos a datos. Por lo tanto, el durmiente 2383 anterior debería hacer: 2384 2385 set_current_state(TASK_INTERRUPTIBLE); 2386 if (evento_indicado) { 2387 smp_rmb(); 2388 hacer_algo(my_data); 2389 } 2390 2391 y el que despierta debería hacer: 2392 2393 my_data = value; 2394 smp_wmb(); 2395 evento_indicado = 1; 2396 wake_up(&event_wait_queue); 2397 2398 FUNCIONES VARIAS 2399 ---------------- 2400 2401 Otras funciones que implican barreras: 2402 2403 (*) schedule() y similares implican barreras completas de memoria. 2404 2405 2406 ======================================== 2407 EFECTOS DE BARRERA ADQUIRIENDO INTRA-CPU 2408 ======================================== 2409 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 2413 particular. 2414 2415 2416 ADQUISICIÓN VS ACCESOS A MEMORIA 2417 -------------------------------- 2418 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: 2421 2422 CPU 1 CPU 2 2423 =============================== =============================== 2424 WRITE_ONCE(*A, a); WRITE_ONCE(*E, e); 2425 ACQUIRE M ACQUIRE Q 2426 WRITE_ONCE(*B, b); WRITE_ONCE(*F, f); 2427 WRITE_ONCE(*C, c); WRITE_ONCE(*G, g); 2428 RELEASE M RELEASE Q 2429 WRITE_ONCE(*D, d); WRITE_ONCE(*H, h); 2430 2431 Entonces no hay garantía sobre en qué orden verá la CPU 3 los accesos a *A 2432 hasta que *H ocurra, además de las restricciones impuestas por los bloqueos 2433 separados en las distintas CPUs. Podría, por ejemplo, ver: 2434 2435 *E, ACQUIRE M, ACQUIRE Q, *G, *C, *F, *A, *B, RELEASE Q, *D, *H, RELEASE M 2436 2437 Pero no verá ninguno de: 2438 2439 *B, *C or *D preceding ACQUIRE M 2440 *A, *B or *C following RELEASE M 2441 *F, *G or *H preceding ACQUIRE Q 2442 *E, *F or *G following RELEASE Q 2443 2444 ======================================== 2445 ¿DÓNDE SE NECESITAN BARRERAS DE MEMORIA? 2446 ======================================== 2447 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, 2451 incluso si está en un kernel SMP. Existen, sin embargo, cuatro 2452 circunstancias en las que reordenar definitivamente _podría_ ser un 2453 problema: 2454 2455 (*) Interacción entre procesadores. 2456 2457 (*) Operaciones atómicas. 2458 2459 (*) Acceso a dispositivos. 2460 2461 (*) Interrupciones. 2462 2463 2464 INTERACCIÓN ENTRE PROCESADORES 2465 ------------------------------ 2466 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 2472 cerrojo a ser posible. En cuyo caso, es posible que las operaciones que 2473 afectan a ambas CPU deban ordenarse cuidadosamente para evitar un 2474 funcionamiento incorrecto. 2475 2476 Considere, por ejemplo, la ruta lenta del semáforo R/W. Aquí hay un proceso 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: 2479 2480 struct rw_semaphore { 2481 ... 2482 spinlock_t lock; 2483 struct list_head waiters; 2484 }; 2485 2486 struct rwsem_waiter { 2487 struct list_head list; 2488 struct task_struct *task; 2489 }; 2490 2491 Para despertar a un proceso que espera ("waiter") en particular, las 2492 funciones up_read() o up_write() tienen que: 2493 2494 (1) leer el siguiente puntero del registro de este proceso que espera, 2495 para saber dónde está el registro del siguiente waiter; 2496 2497 (2) leer el puntero a la estructura de tareas del waiter; 2498 2499 (3) borrar el puntero de la tarea para decirle al waiter que se le ha dado 2500 el semáforo; 2501 2502 (4) llamar a wake_up_process() en la tarea; y 2503 2504 (5) liberar la referencia retenida en la estructura de tareas del waiter. 2505 2506 En otras palabras, tiene que realizar esta secuencia de eventos: 2507 2508 LOAD waiter->list.next; 2509 LOAD waiter->task; 2510 STORE waiter->task; 2511 CALL wakeup 2512 RELEASE task 2513 2514 y si alguno de estos pasos ocurre fuera de orden, entonces todo puede que 2515 funcione defectuosamente. 2516 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, 2522 otra CPU podría comenzar a procesar el proceso que espera y podría romper 2523 el stack del proceso que espera antes de que la función up*() tenga la 2524 oportunidad de leer el puntero que sigue. 2525 2526 Considere entonces lo que podría suceder con la secuencia de eventos 2527 anterior: 2528 2529 CPU 1 CPU 2 2530 =============================== =============================== 2531 down_xxx() 2532 Poner waiter en la "queue" (cola) 2533 Dormir 2534 up_yyy() 2535 LOAD waiter->task; 2536 STORE waiter->task; 2537 Despertado por otro evento 2538 <preempt> 2539 Reanudar el procesamiento 2540 down_xxx() regresa 2541 llamada a foo() 2542 foo() estropea *waiter 2543 </preempt> 2544 LOAD waiter->list.next; 2545 --- OOPS --- 2546 2547 Esto podría solucionarse usando el bloqueo de semáforo, pero luego la 2548 función down_xxx() tiene que obtener innecesariamente el spinlock 2549 nuevamente, después de ser despertado el hilo. 2550 2551 La forma de lidiar con esto es insertar una barrera de memoria SMP general: 2552 2553 LOAD waiter->list.next; 2554 LOAD waiter->task; 2555 smp_mb(); 2556 STORE waiter->task; 2557 CALL wakeup 2558 RELEASE task 2559 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. 2565 2566 En un sistema UP, donde esto no sería un problema, la función smp_mb() es 2567 solo una barrera del compilador, asegurándose así de que el compilador 2568 emita las instrucciones en el orden correcto sin realmente intervenir en la 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. 2571 2572 2573 OPERACIONES ATÓMICAS 2574 -------------------- 2575 2576 Si bien son, técnicamente, consideraciones de interacción entre 2577 procesadores, las operaciones atómicas se destacan especialmente porque 2578 algunas de ellas implican barreras de memoria completa y algunas otras no, 2579 pero se confía mucho en ellos en su conjunto a lo largo del kernel. 2580 2581 Consulte Documentation/atomic_t.txt para obtener más información. 2582 2583 2584 ACCESO A DISPOSITIVOS 2585 --------------------- 2586 2587 Un driver puede ser interrumpido por su propia rutina de servicio de 2588 interrupción y, por lo tanto, las dos partes del driver pueden interferir 2589 con los intentos de controlar o acceder al dispositivo. 2590 2591 Esto puede aliviarse, al menos en parte, desactivando las interrupciones 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 2594 controlador. Mientras la interrupción del driver está ejecutando la rutina, 2595 es posible que el "core" del controlador no se ejecute en la misma CPU y no 2596 se permita que su interrupción vuelva a ocurrir hasta que la interrupción 2597 actual haya sido resuelta, por lo tanto, el controlador de interrupción no 2598 necesita bloquearse contra esto. 2599 2600 Sin embargo, considere un driver que estaba hablando con una tarjeta 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 2604 controlador: 2605 2606 IRQ LOCALES DESACTIVADAS 2607 writew(ADDR, 3); 2608 writew(DATA, y); 2609 IRQ LOCALES ACTIVADAS 2610 <interrupción> 2611 writew(ADDR, 4); 2612 q = readw(DATA); 2613 </interrupción> 2614 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 2617 suficientemente relajadas: 2618 2619 STORE *ADDR = 3, STORE *ADDR = 4, STORE *DATA = y, q = LOAD *DATA 2620 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 2624 interrupción - y viceversa - a menos que se utilicenn barreras implícita o 2625 explícitas. 2626 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 2630 implícitas. 2631 2632 2633 Una situación similar puede ocurrir entre una rutina de interrupción y dos 2634 rutinas ejecutándose en separadas CPU que se comunican entre sí. Si tal 2635 caso es probable, entonces se deben usar bloqueos de desactivación de 2636 interrupciones para garantizar el orden. 2637 2638 2639 ===================================== 2640 Efectos de barrera de E/S del kernel 2641 ===================================== 2642 2643 La interfaz con periféricos a través de accesos de E/S es profundamente 2644 específica para cada arquitectura y dispositivo. Por lo tanto, los drivers 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: 2651 2652 (*) readX(), writeX(): 2653 2654 Las funciones de acceso MMIO readX() y writeX() usan un puntero al 2655 periférico al que se accede como un parámetro __iomem *. para punteros 2656 asignados los atributos de E/S predeterminados (por ejemplo, los 2657 devueltos por ioremap()), las garantías de orden son las siguientes: 2658 2659 1. Se ordenan todos los accesos readX() y writeX() a un mismo periférico 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 2662 el orden del programa. 2663 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 2667 mismo spinlock. Esto garantiza que ese registro MMIO escribe en un 2668 dispositivo en particular, mientras que se obtiene un spinlock en un 2669 orden consistente con las adquisiciones del cerrojo. 2670 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 2673 emitidas por, o bien propagadas por, el mismo subproceso. Esto asegura 2674 que las escrituras de la CPU a un búfer DMA de salida asignadas por 2675 dma_alloc_coherent() serán visibles para un motor ("engine") DMA 2676 cuando la CPU escriba en sus registros de control MMIO, para activar 2677 la transferencia. 2678 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 2682 la CPU desde un búfer DMA entrantes asignadas por 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 2685 transferencia DMA se haya completado. 2686 2687 5. Un readX() por un subproceso del CPU, desde el periférico, se 2688 completará antes de que cualquier bucle delay() subsiguiente pueda 2689 comenzar a ejecutarse en el mismo subproceso. Esto asegura que dos 2690 escrituras del CPU a registros MMIO en un periférico llegarán al menos 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 2693 writeX(): 2694 2695 writel(42, DEVICE_REGISTER_0); // Llega al dispositivo ... 2696 readl(DEVICE_REGISTER_0); 2697 udelay(1); 2698 writel(42, DEVICE_REGISTER_1); // al menos 1us antes de esto.... 2699 2700 Las propiedades de orden de los punteros __iomem obtenidos con valores de 2701 atributos que no sean los valores por defecto (por ejemplo, los devueltos 2702 por ioremap_wc()) son específicos de la arquitectura subyacente y, por lo 2703 tanto, las garantías enumeradas anteriormente no pueden por lo general ser 2704 aseguradas para accesos a este tipo de "mappings" (asignaciones). 2705 2706 (*) readX_relaxed(), writeX_relaxed(): 2707 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 2710 respecto al bloqueo, los accesos normales a la memoria o los bucles 2711 delay() (es decir, los puntos 2-5 arriba) pero todavía se garantiza que 2712 se ordenarán con respecto a otros accesos desde el mismo hilo de la CPU, 2713 al mismo periférico, cuando se opera en punteros __iomem asignados con el 2714 valor predeterminado para los atributos de E/S. 2715 2716 (*) readsX(), writesX(): 2717 2718 Los puntos de entrada readsX() y writesX() MMIO están diseñados para 2719 acceder FIFOs mapeados en memoria y basados en registros que residen en 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 2722 se documentó anteriormente. 2723 2724 (*) inX(), outX(): 2725 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 2728 instrucciones especiales en algunas arquitecturas (especialmente, en 2729 x86). El número de puerto del periférico que se está accedido se pasa 2730 como un argumento. 2731 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 2735 mismas que las proporcionadas por readX() y writeX(), respectivamente, al 2736 acceder a una asignación con los valores de atributos de E/S 2737 predeterminados (los que haya por defecto). 2738 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. 2744 2745 (*) insX(), outsX(): 2746 2747 Como arriba, los puntos de entrada insX() y outsX() proporcionan el mismo 2748 orden garantizado por readsX() y writesX() respectivamente, al acceder a 2749 un mapping con los atributos de E/S predeterminados. 2750 2751 (*) ioreadX(), iowriteX(): 2752 2753 Estos funcionarán adecuadamente para el tipo de acceso que realmente están 2754 haciendo, ya sea inX()/outX() o readX()/writeX(). 2755 2756 Con la excepción de los puntos de entrada (insX(), outsX(), readsX() y 2757 writesX()), todo lo anterior supone que el periférico subyacente es 2758 little-endian y, por lo tanto, realizará operaciones de intercambio de 2759 bytes en arquitecturas big-endian. 2760 2761 2762 =========================================== 2763 MODELO DE ORDEN MÍNIMO DE EJECUCIÓN ASUMIDO 2764 =========================================== 2765 2766 Debe suponerse que la CPU conceptual está débilmente ordenada, pero que 2767 mantiene la apariencia de causalidad del programa con respecto a sí misma. 2768 Algunas CPU (como i386 o x86_64) están más limitadas que otras (como 2769 powerpc o frv), por lo que el caso más relajado (es decir, DEC Alpha) se 2770 debe asumir fuera de código específico de arquitectura. 2771 2772 Esto significa que se debe considerar que la CPU ejecutará su flujo de 2773 instrucciones en el orden que se quiera - o incluso en paralelo - siempre 2774 que si una instrucción en el flujo depende de una instrucción anterior, 2775 entonces dicha instrucción anterior debe ser lo suficientemente completa[*] 2776 antes de que la posterior instrucción puede proceder; en otras palabras: 2777 siempre que la apariencia de causalidad se mantenga. 2778 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. 2782 2783 Una CPU puede también descartar cualquier secuencia de instrucciones que 2784 termine sin tener efecto final. Por ejemplo, si dos instrucciones 2785 adyacentes cargan un valor inmediato en el mismo registro, la primera puede 2786 descartarse. 2787 2788 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. 2792 2793 2794 ===================================== 2795 EFECTOS DE LA MEMORIA CACHÉ DE LA CPU 2796 ===================================== 2797 2798 La forma en que se perciben las operaciones de memoria caché en todo el 2799 sistema se ve afectada, hasta cierto punto, por los cachés que se 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. 2802 2803 En cuanto a la forma en que una CPU interactúa con otra parte del sistema a 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): 2808 2809 <--- CPU ---> : <----------- Memoria -----------> 2810 : 2811 +--------+ +--------+ : +--------+ +-----------+ 2812 | Core | | Cola | : | Cache | | | +---------+ 2813 | CPU | | de | : | CPU | | | | | 2814 | |--->| acceso |----->| |<-->| | | | 2815 | | | a | : | | | |--->| Memoria | 2816 | | | memoria| : | | | | | | 2817 +--------+ +--------+ : +--------+ | Mecanismo | | | 2818 : | de | +---------+ 2819 : | Coherencia| 2820 : | de la | +--------+ 2821 +--------+ +--------+ : +--------+ | cache | | | 2822 | Core | | Cola | : | Cache | | | | | 2823 | CPU | | de | : | CPU | | |--->| Dispos | 2824 | |--->| acceso |----->| |<-->| | | itivo | 2825 | | | a | : | | | | | | 2826 | | | memoria| : | | | | +--------+ 2827 +--------+ +--------+ : +--------+ +-----------+ 2828 : 2829 : 2830 2831 Aunque es posible que una carga o store en particular no aparezca fuera de 2832 la CPU que lo emitió, ya que puede haber sido satisfecha dentro del propio 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. 2837 2838 El núcleo de la CPU puede ejecutar instrucciones en el orden que considere 2839 adecuado, siempre que parezca mantenerse la causalidad esperada del 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 2842 núcleo puede colocarlos en la cola en cualquier orden que desee, y 2843 continuar su ejecución hasta que se vea obligado a esperar que una 2844 instrucción sea completada. 2845 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, 2848 y el orden en que los otros observadores perciben los efectos en el sistema 2849 que sucedan por esto. 2850 2851 [!] Las barreras de memoria _no_ son necesarias dentro de una CPU 2852 determinada, ya que las CPU siempre ven sus propias cargas y stores como si 2853 hubieran sucedido en el orden del programa. 2854 2855 [!] Los accesos a MMIO u otros dispositivos pueden pasar por alto el 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 2859 CPU. 2860 2861 2862 COHERENCIA DE CACHÉ FRENTE A DMA 2863 --------------------------------- 2864 2865 No todos los sistemas mantienen coherencia de caché con respecto a los 2866 dispositivos que realizan DMA. En tales casos, un dispositivo que intente 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 2869 se hayan vuelto a escribir en la RAM todavía. Para hacer frente a esto, la 2870 parte apropiada del kernel debe vaciar los bits superpuestos de caché en 2871 cada CPU (y tal vez también invalidarlos). 2872 2873 Además, los datos enviados por DMA a RAM, por un dispositivo, pueden ser 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 2879 y se vuelve a cargar. Para hacer frente a esto, la parte apropiada del 2880 kernel debe invalidar los bits superpuestos del caché en cada CPU. 2881 2882 Consulte Documentation/core-api/cachetlb.rst para obtener más información 2883 sobre administración de la memoria caché. 2884 2885 2886 COHERENCIA DE CACHÉ FRENTE A MMIO 2887 --------------------------------- 2888 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 2892 ventana habitual dirigida a RAM. 2893 2894 Entre dichas propiedades, suele existir el hecho de que tales accesos 2895 eluden el almacenamiento en caché por completo e ir directamente a los 2896 buses del dispositivo. Esto significa que los accesos MMIO pueden, en 2897 efecto, superar los accesos a la memoria caché que se emitieron 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. 2901 2902 2903 ======================= 2904 COSAS QUE HACEN LAS CPU 2905 ======================= 2906 2907 Un programador podría dar por sentado que la CPU realizará las operaciones 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: 2910 2911 a = READ_ONCE(*A); 2912 WRITE_ONCE(*B, b); 2913 c = READ_ONCE(*C); 2914 d = READ_ONCE(*D); 2915 WRITE_ONCE(*E, e); 2916 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: 2920 2921 LOAD *A, STORE *B, LOAD *C, LOAD *D, STORE *E. 2922 2923 La realidad es, por supuesto, mucho más intrincada. Para muchas CPU y 2924 compiladores, la anterior suposición no se sostiene porque: 2925 2926 (*) es más probable que las cargas deban completarse de inmediato para 2927 permitir progreso en la ejecución, mientras que los stores a menudo se 2928 pueden aplazar sin problema; 2929 2930 (*) las cargas se pueden hacer especulativamente, y el resultado es 2931 descartado si resulta innecesario; 2932 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; 2936 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; 2939 2940 (*) las cargas y los stores se pueden combinar para mejorar el rendimiento 2941 cuando se habla con memoria o hardware de E/S, que puede realizar 2942 accesos por lotes a ubicaciones adyacentes, reduciendo así los costes 2943 de configuración de transacciones (la memoria y los dispositivos PCI 2944 pueden ambos pueden hacer esto); y 2945 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 2949 coherencia se propague en orden a otras CPU. 2950 2951 Entonces, digamos que lo que otra CPU podría observar en el fragmento de 2952 código anterior es: 2953 2954 LOAD *A, ..., LOAD {*C,*D}, STORE *E, STORE *B 2955 2956 (Donde "LOAD {*C,*D}" es una carga combinada) 2957 2958 2959 Sin embargo, se garantiza que una CPU es autoconsistente: verá que sus 2960 _propios_ accesos parecen estar correctamente ordenados, sin necesidad de 2961 barrera de memoria. Por ejemplo con el siguiente código: 2962 2963 U = READ_ONCE(*A); 2964 WRITE_ONCE(*A, V); 2965 WRITE_ONCE(*A, W); 2966 X = READ_ONCE(*A); 2967 WRITE_ONCE(*A, Y); 2968 Z = READ_ONCE(*A); 2969 2970 y asumiendo que no hay intervención de una influencia externa, se puede 2971 suponer que el resultado final se parecerá a: 2972 2973 U == el valor original de *A 2974 X == W 2975 Z == Y 2976 *A == Y 2977 2978 El código anterior puede hacer que la CPU genere la secuencia completa de 2979 accesos de memoria: 2980 2981 U=LOAD *A, STORE *A=V, STORE *A=W, X=LOAD *A, STORE *A=Y, Z=LOAD *A 2982 2983 en ese orden, pero, sin intervención, la secuencia puede contener casi 2984 cualquier combinación de elementos combinados o descartados, siempre que la 2985 perspectiva del programa del mundo siga siendo consistente. Tenga en cuenta 2986 que READ_ONCE() y WRITE_ONCE() -no- son opcionales en el ejemplo anterior, 2987 ya que hay arquitecturas donde una CPU determinada podría reordenar cargas 2988 sucesivas en la misma ubicación. En tales arquitecturas, READ_ONCE() y 2989 WRITE_ONCE() hacen lo que sea necesario para evitar esto, por ejemplo, en 2990 Itanium los casts volátiles utilizados por READ_ONCE() y WRITE_ONCE() hacen 2991 que GCC emita las instrucciones especiales ld.acq y st.rel 2992 (respectivamente) que impiden dicha reordenación. 2993 2994 El compilador también puede combinar, descartar o diferir elementos de la 2995 secuencia antes incluso de que la CPU los vea. 2996 2997 Por ejemplo: 2998 2999 *A = V; 3000 *A = W; 3001 3002 puede reducirse a: 3003 3004 *A = W; 3005 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: 3008 3009 *A = Y; 3010 Z = *A; 3011 3012 puede, sin una barrera de memoria o un READ_ONCE() y WRITE_ONCE(), esto 3013 sea reducido a: 3014 3015 *A = Y; 3016 Z = Y; 3017 3018 y la operación LOAD nunca aparezca fuera de la CPU. 3019 3020 3021 Y LUEGO ESTÁ EL ALFA 3022 -------------------- 3023 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 3030 cambio en el puntero, frente a que los nuevos datos se produzcan en el 3031 orden correcto. 3032 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. 3036 3037 3038 GUESTS DE MÁQUINAS VIRTUALES 3039 ----------------------------- 3040 3041 Los "guests" (invitados) que se ejecutan en máquinas virtuales pueden verse 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. 3046 3047 Para hacer frente a este caso de manera óptima, están disponibles macros de 3048 bajo nivel virt_mb() etc. Estas tienen el mismo efecto que smp_mb(), etc. 3049 cuando SMP está habilitado, pero generan código idéntico para sistemas SMP 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) 3052 anfitrión. 3053 3054 Estos son equivalentes a sus contrapartes smp_mb() etc. en todos los demás 3055 aspectos, en particular, no controlan los efectos MMIO: para controlar los 3056 efectos MMIO, utilice barreras obligatorias. 3057 3058 3059 ================ 3060 EJEMPLOS DE USOS 3061 ================ 3062 3063 BUFFERS CIRCULARES 3064 ------------------ 3065 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 3068 con el consumidor. Vea: 3069 3070 Documentation/core-api/circular-buffers.rst 3071 3072 para más detalles. 3073 3074 3075 =========== 3076 REFERENCIAS 3077 =========== 3078 3079 Alpha AXP Architecture Reference Manual, Segunda Edición (por Sites & Witek, 3080 Digital Press) 3081 Capítulo 5.2: Physical Address Space Characteristics 3082 Capítulo 5.4: Caches and Write Buffers 3083 Capítulo 5.5: Data Sharing 3084 Capítulo 5.6: Read/Write Ordering 3085 3086 AMD64 Architecture Programmer's Manual Volumen 2: System Programming 3087 Capítulo 7.1: Memory-Access Ordering 3088 Capítulo 7.4: Buffering and Combining Memory Writes 3089 3090 ARM Architecture Reference Manual (ARMv8, for ARMv8-A architecture profile) 3091 Capítulo B2: The AArch64 Application Level Memory Model 3092 3093 IA-32 Intel Architecture Software Developer's Manual, Volumen 3: 3094 System Programming Guide 3095 Capítulo 7.1: Locked Atomic Operations 3096 Capítulo 7.2: Memory Ordering 3097 Capítulo 7.4: Serializing Instructions 3098 3099 The SPARC Architecture Manual, Version 9 3100 Capítulo 8: Memory Models 3101 Appendix D: Formal Specification of the Memory Models 3102 Appendix J: Programming with the Memory Models 3103 3104 Storage in the PowerPC (por Stone and Fitzgerald) 3105 3106 UltraSPARC Programmer Reference Manual 3107 Capítulo 5: Memory Accesses and Cacheability 3108 Capítulo 15: Sparc-V9 Memory Models 3109 3110 UltraSPARC III Cu User's Manual 3111 Capítulo 9: Memory Models 3112 3113 UltraSPARC IIIi Processor User's Manual 3114 Capítulo 8: Memory Models 3115 3116 UltraSPARC Architecture 2005 3117 Capítulo 9: Memory 3118 Appendix D: Formal Specifications of the Memory Models 3119 3120 UltraSPARC T1 Supplement to the UltraSPARC Architecture 2005 3121 Capítulo 8: Memory Models 3122 Appendix F: Caches and Cache Coherency 3123 3124 Solaris Internals, Core Kernel Architecture, p63-68: 3125 Capítulo 3.3: Hardware Considerations for Locks and 3126 Synchronization 3127 3128 Unix Systems for Modern Architectures, Symmetric Multiprocessing and Caching 3129 for Kernel Programmers: 3130 Capítulo 13: Other Memory Models 3131 3132 Intel Itanium Architecture Software Developer's Manual: Volumen 1: 3133 Sección 2.6: Speculation 3134 Sección 4.4: Memory Access
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.