Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 | .. include:: ../disclaimer-sp.rst :Original: Documentation/process/maintainer-kvm-x86.rst :Translator: Juan Embid <jembid@ucm.es> KVM x86 ======= Prólogo -------- KVM se esfuerza por ser una comunidad acogedora; las contribuciones de los recién llegados son valoradas e incentivadas. Por favor, no se desanime ni se sienta intimidado por la extensión de este documento y las numerosas normas/directrices que contiene. Todos cometemos errores y todos hemos sido principiantes en algún momento. Mientras haga un esfuerzo honesto por seguir las directrices de KVM x86, sea receptivo a los comentarios, y aprenda de los errores que cometa, será recibido con los brazos abiertos, no con antorchas y horcas. TL;DR ----- Las pruebas son obligatorias. Sea coherente con los estilos y patrones establecidos. Árboles ------- KVM x86 se encuentra actualmente en un período de transición de ser parte del árbol principal de KVM, a ser "sólo otra rama de KVM". Como tal, KVM x86 está dividido entre el árbol principal de KVM, ``git.kernel.org/pub/scm/virt/kvm/kvm.git``, y un árbol específico de KVM x86, ``github.com/kvm-x86/linux.git``. Por lo general, las correcciones para el ciclo en curso se aplican directamente al árbol principal de KVM, mientras que todo el desarrollo para el siguiente ciclo se dirige a través del árbol de KVM x86. En el improbable caso de que una corrección para el ciclo actual se dirija a través del árbol KVM x86, se aplicará a la rama ``fixes`` antes de llegar al árbol KVM principal. Tenga en cuenta que se espera que este periodo de transición dure bastante tiempo, es decir, que será el statu quo en un futuro previsible. Ramas ~~~~~ El árbol de KVM x86 está organizado en múltiples ramas por temas. El propósito de utilizar ramas temáticas más específicas es facilitar el control de un área de desarrollo, y para limitar los daños colaterales de errores humanos y/o commits con errores, por ejemplo, borrar el commit HEAD de una rama temática no tiene impacto en los hashes SHA1 de otros commit en en camino, y tener que rechazar una solicitud de pull debido a errores retrasa sólo esa rama temática. Todas las ramas temáticas, excepto ``next`` y ``fixes``, se agrupan en ``next`` a través de un Cthulhu merge en función de las necesidades, es decir, cuando se actualiza una rama temática. Como resultado, los push forzados a ``next`` son comunes. Ciclo de Vida ~~~~~~~~~~~~~ Las correcciones dirigidas a la versión actual, también conocida como mainline, suelen aplicarse directamente al árbol principal de KVM, es decir, no pasan por el árbol x86 de KVM. Los cambios dirigidos a la siguiente versión se dirigen a través del árbol KVM x86. Se envían pull requests (de KVM x86 a KVM main) para cada rama temática de KVM x86, normalmente la semana antes de que Linus abra la ventana de fusión, por ejemplo, la semana siguiente a rc7 para las versiones "normales". Si todo va bien, las ramas temáticas son subidas en el pull request principal de KVM enviado durante la ventana de fusión de Linus. El árbol de KVM x86 no tiene su propia ventana de fusión oficial, pero hay un cierre suave alrededor de rc5 para nuevas características, y un cierre suave alrededor de rc6 para correcciones (para la próxima versión; fíjese más arriba para las correcciones dirigidas a la versión actual). Cronología ~~~~~~~~~~ Normalmente, los envíos se revisan y aplican en orden FIFO, con cierto margen de maniobra en función del tamaño de la serie, los parches que están "calientes en caché", etc. Correcciones, especialmente para la versión actual y/o árboles estables, consiguen saltar la cola. Los parches que se lleven a través de un árbol que no sea KVM (la mayoría de las veces a través del árbol de consejos) y/o que tengan otros acks/revisiones también saltan la cola hasta cierto punto. Tenga en cuenta que la mayor parte de la revisión se realiza entre rc1 y rc6, más o menos. El periodo entre la rc6 y la siguiente rc1 se utiliza para ponerse al día en otras tareas, es decir, la falta de envíos durante este periodo no es inusual. Los pings para obtener una actualización del estado son bienvenidos, pero tenga en cuenta el calendario del ciclo de publicación actual y tenga expectativas realistas. Si está haciendo ping para la aceptación, es decir, no sólo para obtener comentarios o una actualización, por favor haga todo lo posible, dentro de lo razonable, para asegurarse de que sus parches están listos para ser fusionados. Los pings sobre series que rompen la compilación o fallan en las pruebas provocan el descontento de los mantenedores. Desarrollo ----------- Árbol base/Rama ~~~~~~~~~~~~~~~ Las correcciones dirigidas a la versión actual, también conocida como mainline, deben basarse en ``git://git.kernel.org/pub/scm/virt/kvm/kvm.git master``. Tenga en cuenta que las correcciones no garantizan automáticamente la inclusión en la versión actual. No hay una regla única, pero normalmente sólo las correcciones de errores urgentes, críticos y/o introducidos en la versión actual deberían incluirse en la versión actual. Todo lo demás debería basarse en ``kvm-x86/next``, es decir, no hay necesidad de seleccionar una rama temática específica como base. Si hay conflictos y/o dependencias entre ramas, es trabajo del mantenedor resolverlos. La única excepción al uso de ``kvm-x86/next`` como base es si un parche/serie es una serie multi-arquitectura, es decir, tiene modificaciones no triviales en el código común de KVM y/o tiene cambios más que superficiales en el código de otras arquitecturas. Los parches/series multi-arquitectura deberían basarse en un punto común y estable en la historia de KVM, por ejemplo, la versión candidata en la que se basa ``kvm-x86 next``. Si no está seguro de si un parche/serie es realmente multiarquitectura, sea precavido y trátelo como multiarquitectura, es decir, utilice una base común. Estilo del codigo ~~~~~~~~~~~~~~~~~~~~~~ Cuando se trata de estilo, nomenclatura, patrones, etc., la coherencia es la prioridad número uno en KVM x86. Si todo lo demás falla, haga coincidir lo que ya existe. Con algunas advertencias que se enumeran a continuación, siga las recomendaciones de los responsables del árbol de consejos :ref:`maintainer-tip-coding-style`, ya que los parches/series a menudo tocan tanto archivos x86 KVM como no KVM, es decir, llaman la atención de los mantenedores de KVM *y* del árbol de consejos. El uso del abeto inverso, también conocido como árbol de Navidad inverso o árbol XMAS inverso, para las declaraciones de variables no es estrictamente necesario, aunque es preferible. Excepto para unos pocos apuntes especiales, no utilice comentarios kernel-doc para las funciones. La gran mayoría de las funciones "públicas" de KVM no son realmente públicas, ya que están destinadas únicamente al consumo interno de KVM (hay planes para privatizar las cabeceras y exportaciones de KVM para reforzar esto). Comentarios ~~~~~~~~~~~ Escriba los comentarios en modo imperativo y evite los pronombres. Utilice los comentarios para ofrecer una visión general de alto nivel del código y/o para explicar por qué el código hace lo que hace. No reitere lo que el código hace literalmente; deje que el código hable por sí mismo. Si el propio código es inescrutable, los comentarios no servirán de nada. Referencias SDM y APM ~~~~~~~~~~~~~~~~~~~~~~ Gran parte de la base de código de KVM está directamente vinculada al comportamiento de la arquitectura definido en El Manual de Desarrollo de Software (SDM) de Intel y el Manual del Programador de Arquitectura (APM) de AMD. El uso de "SDM de Intel" y "APM de AMD", o incluso sólo "SDM" o "APM", sin contexto adicional es correcto. No haga referencia a secciones específicas, tablas, figuras, etc. por su número, especialmente en los comentarios. En su lugar, si es necesario (véase más abajo), copie y pegue el fragmento correspondiente y haga referencia a las secciones/tablas/figuras por su nombre. Los diseños del SDM y el APM cambian constantemente, por lo que los números/etiquetas no son estables. En general, no haga referencia explícita ni copie-pegue del SDM o APM en los comentarios. Con pocas excepciones, KVM *debe* respetar el comportamiento de la arquitectura, por lo que está implícito que el comportamiento de KVM está emulando el comportamiento de SDM y/o APM. Tenga en cuenta que hacer referencia al SDM/APM en los registros de cambios para justificar el cambio y proporcionar contexto es perfectamente correcto y recomendable. Shortlog ~~~~~~~~ El formato de prefijo más recomendable es ``KVM: <topic>:``, donde ``<topic>`` es uno de los siguientes:: - x86 - x86/mmu - x86/pmu - x86/xen - autocomprobaciones - SVM - nSVM - VMX - nVMX **¡NO use x86/kvm!** ``x86/kvm`` se usa exclusivamente para cambios de Linux virtualizado por KVM, es decir, para arch/x86/kernel/kvm.c. No use nombres de archivos o archivos completos como prefijo de asunto/shortlog. Tenga en cuenta que esto no coincide con las ramas temáticas (las ramas temáticas se preocupan mucho más por los conflictos de código). Todos los nombres distinguen entre mayúsculas y minúsculas. ``KVM: x86:`` es correcto, ``kvm: vmx:`` no lo es. Escriba en mayúsculas la primera palabra de la descripción condensada del parche, pero omita la puntuación final. Por ejemplo:: KVM: x86: Corregir una desviación de puntero nulo en function_xyz() no:: kvm: x86: corregir una desviación de puntero nulo en function_xyz. Si un parche afecta a varios temas, recorra el árbol conceptual hasta encontrar el primer padre común (que suele ser simplemente ``x86``). En caso de duda, ``git log path/to/file`` debería proporcionar una pista razonable. De vez en cuando surgen nuevos temas, pero le rogamos que inicie un debate en la lista si desea proponer la introducción de un nuevo tema, es decir, no se ande con rodeos. Consulte :ref:`the_canonical_patch_format` para obtener más información, con una enmienda: no trate el límite de 70-75 caracteres como un límite absoluto y duro. En su lugar, utilice 75 caracteres como límite firme, pero no duro, y 80 caracteres como límite duro. Es decir, deje que el registro corto sobrepase en algunos caracteres el límite estándar si tiene una buena razón para hacerlo. Registro de cambios ~~~~~~~~~~~~~~~~~~~ Y lo que es más importante, escriba los registros de cambios en modo imperativo y evite los pronombres. Consulte :ref:`describe_changes` para obtener más información, con una recomendación: comience con un breve resumen de los cambios reales y continúe con el contexto y los antecedentes. Nota. Este orden entra en conflicto directo con el enfoque preferido del árbol de sugerencias. Por favor, siga el estilo preferido del árbol de sugerencias cuando envíe parches. que se dirigen principalmente a código arch/x86 que _NO_ es código KVM. KVM x86 prefiere indicar lo que hace un parche antes de entrar en detalles por varias razones. En primer lugar, el código que realmente se está cambiando es posiblemente la información más importante, por lo que esa información debe ser fácil de encontrar. Changelogs que entierran el "qué está cambiando realmente" en una sola línea después de 3+ párrafos de fondo hacen muy difícil encontrar esa información. Para la revisión inicial, se podría argumentar que "lo que está roto" es más importante, pero para hojear los registros y la arqueología git, los detalles escabrosos importan cada vez menos. Por ejemplo, al hacer una serie de "git blame", los detalles de cada cambio a lo largo del camino son inútiles, los detalles sólo importan para el culpable. Proporcionar el "qué ha cambiado" facilita determinar rápidamente si una confirmación puede ser de interés o no. Otra ventaja de decir primero "qué cambia" es que casi siempre es posible decir "qué cambia" en una sola frase. A la inversa, todo menos los errores más simples requieren varias frases o párrafos para describir el problema. Si tanto "qué está cambiando" como "cuál es el fallo" son muy breves, el orden no importa. Pero si uno es más corto (casi siempre el "qué está cambiando"), entonces cubrir el más corto primero es ventajoso porque es menos inconveniente para los lectores/revisores que tienen una preferencia estricta de orden. Por ejemplo, tener que saltarse una frase para llegar al contexto es menos doloroso que tener que saltarse tres párrafos para llegar a "lo que cambia". Arreglos ~~~~~~~~ Si un cambio corrige un error de KVM/kernel, añada una etiqueta Fixes: incluso si el cambio no necesita ser retroportado a kernels estables, e incluso si el cambio corrige un error en una versión anterior. Por el contrario, si es necesario hacer una corrección, etiquete explícitamente el parche con "Cc: stable@vger.kernel" (aunque no es necesario que el correo electrónico incluya Cc: stable); KVM x86 opta por excluirse del backporting Correcciones: por defecto. Algunos parches seleccionados automáticamente se retroportan, pero requieren la aprobación explícita de los mantenedores (busque MANUALSEL). Referencias a Funciones ~~~~~~~~~~~~~~~~~~~~~~~ Cuando se mencione una función en un comentario, registro de cambios o registro abreviado (o en cualquier otro lugar), utilice el formato ``nombre_de_la_función()``. Los paréntesis proporcionan contexto y desambiguan la referencia. Pruebas ~~~~~~~ Como mínimo, *todos* los parches de una serie deben construirse limpiamente para KVM_INTEL=m KVM_AMD=m, y KVM_WERROR=y. Construir todas las combinaciones posibles de Kconfigs no es factible, pero cuantas más mejor. KVM_SMM, KVM_XEN, PROVE_LOCKING, y X86_64 son particularmente interesantes. También es obligatorio ejecutar las autopruebas y las pruebas unitarias de KVM (y, como es obvio, las pruebas deben pasar). La única excepción es para los cambios que tienen una probabilidad insignificante de afectar al comportamiento en tiempo de ejecución, por ejemplo, parches que sólo modificar los comentarios. Siempre que sea posible y pertinente, se recomienda encarecidamente realizar pruebas tanto en Intel como en AMD. Se recomienda arrancar una máquina virtual real, pero no es obligatorio. Para cambios que afecten al código de paginación en la sombra de KVM, es obligatorio ejecutar con TDP (EPT/NPT) deshabilitado. Para cambios que afecten al código MMU común de KVM, se recomienda encarecidamente ejecutar con TDP deshabilitado. Para todos los demás cambios, si el código que se está modificando depende de y/o interactúa con un parámetro del módulo, es obligatorio realizar pruebas con la configuración correspondiente. Tenga en cuenta que las autopruebas de KVM y las pruebas de unidad de KVM tienen fallos conocidos. Si sospecha que un fallo no se debe a sus cambios, verifique que el *exactamente el mismo* fallo se produce con y sin sus cambios. Los cambios que afecten a la documentación de texto reestructurado, es decir, a los archivos .rst, deben generar htmldocs de forma limpia, es decir, sin advertencias ni errores. Si no puede probar completamente un cambio, por ejemplo, por falta de hardware, indique claramente qué nivel de pruebas ha podido realizar, por ejemplo, en la carta de presentación. Novedades ~~~~~~~~~ Con una excepción, las nuevas características *deben* venir con cobertura de pruebas. Las pruebas específicas de KVM no son estrictamente necesarias, por ejemplo, si la cobertura se proporciona mediante la ejecución de una prueba de VM huésped suficientemente habilitada, o ejecutando una autoprueba de kernel relacionada en una VM, pero en todos los casos se prefieren las pruebas KVM dedicadas. Los casos de prueba negativos en particular son obligatorios para la habilitación de nuevas características de hardware, ya que los flujos de errores y excepciones rara vez se ejercitan simplemente ejecutando una VM. La única excepción a esta regla es si KVM está simplemente anunciando soporte para un a través de KVM_GET_SUPPORTED_CPUID, es decir, para instrucciones/funciones que KVM no puede impedir que utilice una VM y para las que no existe una verdadera habilitación. Tenga en cuenta que "nuevas características" no significa sólo "nuevas características de hardware". Las nuevas funcionalidades que no puedan ser validadas usando las pruebas existentes de KVM y/o las pruebas unitarias de KVM deben venir con pruebas. Es más que bienvenido el envío de nuevos desarrollos de características sin pruebas para obtener un feedback temprano, pero tales envíos deben ser etiquetados como RFC, y la carta de presentación debe indicar claramente qué tipo de feedback se solicita/espera. No abuse del proceso de RFC; las RFC no suelen recibir una revisión en profundidad. Corrección de Errores ~~~~~~~~~~~~~~~~~~~~~ Salvo en el caso de fallos "obvios" detectados por inspección, las correcciones deben ir acompañadas de un reproductor del fallo corregido. En muchos casos, el reproductor está implícito, por ejemplo, para errores de compilación y fallos de prueba, pero debe quedar claro para lectores qué es lo que no funciona y cómo verificar la solución. Se concede cierto margen a los errores detectados mediante cargas de trabajo/pruebas no públicas, pero se recomienda encarecidamente que se faciliten pruebas de regresión para dichos errores. En general, las pruebas de regresión son preferibles para cualquier fallo que no sea trivial de encontrar. Por ejemplo, incluso si el error fue encontrado originalmente por un fuzzer como syzkaller, una prueba de regresión dirigida puede estar justificada si el error requiere golpear una condición de carrera de tipo uno en un millón. Recuerde que los fallos de KVM rara vez son urgentes *y* no triviales de reproducir. Pregúntate si un fallo es realmente el fin del mundo antes de publicar una corrección sin un reproductor. Publicación ----------- Enlaces ~~~~~~~ No haga referencia explícita a informes de errores, versiones anteriores de un parche/serie, etc. mediante cabeceras ``In-Reply-To:``. Usar ``In-Reply-To:`` se convierte en un lío para grandes series y/o cuando el número de versiones es alto, y ``In-Reply-To:`` es inútil para cualquiera que no tenga el mensaje original, por ejemplo, si alguien no recibió un Cc en el informe de error o si la lista de destinatarios cambia entre versiones. Para enlazar con un informe de error, una versión anterior o cualquier cosa de interés, utiliza enlaces lore. Para hacer referencia a versiones anteriores, en general no incluya un Enlace: en el registro de cambios, ya que no hay necesidad de registrar la historia en git, es decir, ponga el enlace en la carta de presentación o en la sección que git ignora. Proporcione un Enlace: formal para los informes de errores y/o discusiones que condujeron al parche. El contexto de por qué se hizo un cambio es muy valioso para futuros lectores. Basado en Git ~~~~~~~~~~~~~ Si utilizas la versión 2.9.0 o posterior de git (Googlers, ¡os incluimos a todos!), utilice ``git format-patch`` con el indicador ``--base`` para incluir automáticamente la información del árbol base en los parches generados. Tenga en cuenta que ``--base=auto`` funciona como se espera si y sólo si el upstream de una rama se establece en la rama temática base, por ejemplo, hará lo incorrecto si su upstream se establece en su repositorio personal con fines de copia de seguridad. Una solución "automática" alternativa es derivar los nombres de tus ramas de desarrollo basándose en su KVM x86, e introdúzcalo en ``--base``. Por ejemplo, ``x86/pmu/mi_nombre_de_rama``, y luego escribir un pequeño wrapper para extraer ``pmu`` del nombre de la rama actual para obtener ``--base=x/pmu``, donde ``x`` es el nombre que su repositorio utiliza para rastrear el remoto KVM x86. Tests de Co-Publicación ~~~~~~~~~~~~~~~~~~~~~~~ Las autopruebas de KVM asociadas a cambios de KVM, por ejemplo, pruebas de regresión para correcciones de errores, deben publicarse junto con los cambios de KVM como una única serie. Se aplicarán las reglas estándar del núcleo para la bisección, es decir, los cambios de KVM que provoquen fallos en las pruebas se ordenarán después de las actualizaciones de las autopruebas, y viceversa. Las pruebas que fallan debido a errores de KVM deben ordenarse después de las correcciones de KVM. KVM-unit-tests debería *siempre* publicarse por separado. Las herramientas, por ejemplo b4 am, no saben que KVM-unit-tests es un repositorio separado y se confunden cuando los parches de una serie se aplican en diferentes árboles. Para vincular los parches de KVM-unit-tests a Parches KVM, primero publique los cambios KVM y luego proporcione un enlace lore Link: al parche/serie KVM en el parche(s) KVM-unit-tests. Notificaciones ~~~~~~~~~~~~~~ Cuando se acepte oficialmente un parche/serie, se enviará un correo electrónico de notificación en respuesta a la publicación original (carta de presentación para series de varios parches). La notificación incluirá el árbol y la rama temática, junto con los SHA1 de los commits de los parches aplicados. Si se aplica un subconjunto de parches, se indicará claramente en la notificación. A menos que se indique lo contrario, se sobreentiende que todos los parches del Las series que no han sido aceptadas necesitan más trabajo y deben presentarse en una nueva versión. Si por alguna razón se retira un parche después de haber sido aceptado oficialmente, se enviará una respuesta al correo electrónico de notificación explicando por qué se ha retirado el parche, así como los pasos siguientes. Estabilidad SHA1 ~~~~~~~~~~~~~~~~ Los SHA1 no son 100% estables hasta que llegan al árbol de Linus. Un SHA1 es *normalmente* estable una vez que se ha enviado una notificación, pero ocurren cosas. En la mayoría de los casos, se proporcionará una actualización del correo electrónico de notificación si se aplica un SHA1 del parche. Sin embargo, en algunos escenarios, por ejemplo, si todas las ramas de KVM x86 necesitan ser rebasadas, no se darán notificaciones individuales. Vulnerabilidades ~~~~~~~~~~~~~~~~ Los fallos que pueden ser explotados por la VM (el "guest") para atacar al host (kernel o espacio de usuario), o que pueden ser explotados por una VM anidada a *su* host (L2 atacando a L1), son de particular interés para KVM. Por favor, siga el protocolo para :ref:`securitybugs` si sospecha que un fallo puede provocar una filtración de datos, etc. |