FreeBSD México

Comunidad Mexicana de FreeBSD

DragonFly BSD 4.8

Esta es una traducción del siguiente sitio: https://www.dragonflybsd.org/release48/

 

Versión 4.8.0 liberada el 27 de Marzo de 2017

DragonFly versión 4.8 trae el soporte de arranque EFI en el instalador, mayores mejoras en velocidad en el kernel, un nuevo controlador NVMe, y un nuevo controlador eMMC, y actualizaciones al controlador de video Intel.

Los detalles de todas las consolidaciones entre las ramas 4.6 y 4.8 estan disponibles en los mensajes de consolidación asociados para 4.8RC y 4.8.0.

Puntos de Mayor importancia

Rendimiento de kernel mejorado

Esta liberación localiza las líneas de cache y reduce/elimina el rebote de cache en las globales. Para compilaciones en masa en sistemas con muchos núcleos o multiples-sockets, tenemos cerca de un mejora del 5% y ciertos subsistemas tales como busquedas de namecache y exec()s ven una mejora masiva enfocada. Vea la lista de posts de correo correspondiente con todos los detalles.

Soporte para el arranque eMMC, y PCIe SSDs de movilidad y alto rendimiento

Esta liberación de kernel incluye soporte para el almacenamiento eMMC como el dispositivo de arranque. También soportamos un controlador nuevo NVMe SSD amigable con SMP, y de alto rendimiento (almacenamiento PCIe SSD). Los resultados de las pruebas iniciales estan disponibles.

Soporte EFI

El instalador ahora puede crear una instalación EFI o heredada (de legado). Numerosos ajustes se han realizado a las herramientas del entorno de usuario y al kernel para soportar EFI como un ambiente de arranque principal. El sistema de archivos /boot puede ser colocado ahora ya sea en su propia partición GPT, o en una etiqueta de disco DragonFly dentro de una rebanada/partición GPT.

DragonFly, por defecto crea una partición GPT para todo el DragonFly y coloca la etiqueta DragonFly dentro de ella con todas las particiones DFly estándar, de tal forma que los nombres de disco son mas o menos los mismos de como quedarían en un sistema heredado.

Soporte de gráficos mejorado

El controlador i915 ha sido actualizado para que coincida con la versión encontrada en el kernel Linux 4.6. Los usuarios de procesadores Broadwell y Skylake verán mejoras en este sentido.

Otros cambios que afectan al usuario

  • Kernel está compilado ahora usando la bandera -O2.
  • VKernels ahora usa COW, de tal forma que múltiples vkernels pueden compartir una imagen de disco.
  • powerd() es sensible ahora a cambios de tiempo y temperatura.
  • Módulos de kernel de sistema de archivos no booteable pueden ser cargados en rc.conf en lugar de loader.conf.

Detalles

Sumas de verificación

MD5 (dfly-x86_64-4.8.0_REL.img) = 7936811dc0113bb5a5c607d3bfd71917
MD5 (dfly-x86_64-4.8.0_REL.iso) = e6811893c02e99ca7dd8f3c1d6e92ae3
MD5 (dfly-x86_64-4.8.0_REL.img.bz2) = 0e0a426ea581b9057ef1277b2ba7167d
MD5 (dfly-x86_64-4.8.0_REL.iso.bz2) = 54bd900737a32fab9939ec5fd1fd0d6d

Actualizando

Si tiene un sistema existente 4.6.x y esta corriendo un kernel genérico, el proceso de actualización normal, descrita abajo, funcionará.

Note que las llaves DSA de OpenSSH estan obsoletas ahora. Es posible cambiar su configuración para permitir las llaves DSA de nuevo, pero recomendamos cambiar a la nueva llave cuando sea posible. Si usted solo tiene llaves DSA, cambie a otro tipo antes de actualizar o puede quedarse fuera de su sistema sin posibilidad de entrar. Es posible que pueda usar la opción -oHostKeyAlgorithms=+ssh-dss para poder entrar de todas formas, pero nosotros recomendamos cambiar a llaves RSA lo más pronto posible.

Note que el soporte HPN de OpenSSH ha sido removido. necesitara removerlo de sus configuración de sshd. Esto solo le afecta si usted lo activa específicamente en su configuración.

Cambie su directorio local /usr/src a 4.8:

cd /usr/src
git fetch origin
git branch DragonFly_RELEASE_4_8 origin/DragonFly_RELEASE_4_8
git checkout DragonFly_RELEASE_4_8
git pull

Y entonces recompile: (en /usr/src )

make buildworld
make buildkernel
make installkernel
make installworld
make upgrade

No olvide actualizar  sus paquetes existentes. Paquetes 4.8 ya han sido precompilados y estan disponibles inmediatamente.

pkg upgrade

Todos los cambios desde DragonFly 4.6

Kernel

  • Se creó nuevo código del cache de memoria intermedia (buffer) para eliminar reservaciones dinámicas KVA. En lugar de ello, todo el KVA se reserva al momento del arranque. Lo cual nos protege de IPIs innecesarios y permite una simplificación insignificante del código del cache del buffer.
  • Se agregó la opción vfs.repurpose_enable (bajo pruebas, desactivado por defecto). Esta característica puede ser activada para reducir significativamente el IPI y la administración de carga de Máquinas Virtuales en máquinas donde se realizan grandes cantidades de E/S-Entrada y Salida (I/O) de archivo , por ejemplo desde un disco de estado sólido (SSD) NVMe, por medio de brincarse el mecanismo normal de reciclaje de página VM. Cuando está activado, la característica solo se desencadena bajo cargas muy altas de E/S (I/O). Esto funciona por medio de redirigir el propósito de las páginas VM, delineando un buffer en el lugar (cuando sea posible) de tal forma que no se tenga que efectuar un kremove/kenter en las páginas en la KVA de la memoria de intercambio. El reciclaje normal de página VM (la cual se vería sobrepasada por la carga de E/S (Entrada/Salida) es pasada por alto también.
  • Se cambió el como se procesa el IPIQ, en particular se crea un mecanismo independiente de vector Xinterrupt para invalidaciones de página que ignora (que operará) incluso si una sección crítica es retenida. Se implementó machdep.optimized_invltlb (desactivada por defecto, bajo prueba) la cuál evita enviar IPIs de invalidación tlb a procesadores desocupados.
  • Corrige numerosas condiciones de carrera que pueden ocurrir bajo cargas extremas. La mayoría de los casos de uso no deben disparar nunca ésto pero nuestras computadoras de compilación lo han hecho ocasionalmente. Por ejemplo, hubo dos carreras de instrucción donde el bit de cpu para un pmap podría ser borrado (por dos instrucciones) y causar una IPI TLB ocurriendo al mismo tiempo en otro cpu por el mismo pmap que no se dio cuenta que ese cpu ya estaba usando un pmap. La corrección es desactivar la optimización de recarga de CR3 para el caso del switch LWP->LWP (mismo proceso).
  • Se corrigió un bug del sistema de archivos HAMMER que puede resultar en un error de DATA CRC que este siendo reportado inapropiadamente.
  • Se corrigió una doble escritura disparada por la manera en que HAMMER utiliza la función cluster_write(). Esto mejora significativamente el rendimiento de escritura de HAMMER.
  • Numerosas mejoras y optimizaciones en HAMMER fueron incluidas.
  • Se corrigió un bloqueo duro que puede ocurrir en getpbuf*() debido a una mala interpretación del retorno del valor de una operación atómica.
  • Se corrigió una interrupción de apilado que puede ocurrir en una ventana de 10 instrucciones, potencialmente (pero no encontrada en el exterior) corriendo sobre la pila del kernel hasta rebasarla.
  • Corta IPIs relacionadas con pmap por la mitad para ciertas operaciones de buffer-cache por medio de no molestarse en invalidar el TLB, y por un lado da la vuelta invalidando siempre el TLB cuando entre un nuevo PTE inclusive si el contenido previo era inválido. Esto mejora el rendimiento y también hace la depuración más fácil por medio de eliminar una optimización problemática.
  • Se corrigió un número de condiciones de carrera SMP difíciles de activar, en particular una relacionada a hacer desmontajes simultaneos de diferentes puntos de montaje que la compilación principal puede activar. También una corrección para la condición de carrera para mountctl vs umount.
  • Se reduce el número de operaciones atómicas en la ruta del cambio.
  • Se corrigió una condición de carrera/pánico de namecache la cual podría ocurrir bajo cargas extremas acoplado con mucha actividad mount/umount.
  • Se restringe el muestreo de %rip para root.
  • Se corrigió problema de getpid() en vfork() cuando está en multihílo. En particular vfork()s concurrentes en un programa con hílos de procesamiento puede causar un retorno de PID erroneo por parte de getpid() en el hijo previo al exec.
  • Se corrigió una condición de carrera rara de tsleep/callout cuando el temporizador del callout activa la función tsleep() antes de que tenga su configuración completamente lista.
  • Limpieza de namecache mantiene mensajes en la consola. En particular, reporta el tiempo de espera apropiado en el td_comm del hílo involucrado.
  • Mayor reducción de pruebas de memoria en reducción a cero en el arranque temprano para mejorar tiempos de arranque en sistemas con grandes cantidades de RAM.
  • Se remueve completamente el código de espera de la página de reducción a cero. La reducción a cero de una página en un cpu moderno la opción sobre demanda es mejor por muchas razones, y actualmente puede ser más rápida cuando se combina con los datos de acceso de un cliente en la página, debido a los efectos de cache. Elimina PG_ZERO, debido a que ya no es necesario. Eliminar PG_ZERO también hace que el kernel sea más depurable por eliminar otra posible fuente de contaminación cruzada.
  • Rediseño y finalización de implementación de localización del CPU para las ubicaciones de memoria en el kernel. Se combina con conocimiento NUMA. Esto funciona para estructuras de datos de kernel localizados por cpu o de vida corta. Las dos estan combinadas entre si en nuestra abstracción PQ_L2_SIZE que solían ser código de color de la página de VM. Este código ahora maneja localización de CPU y conocimiento NUMA.
  • Se corrigó muchos problemas de vkernel y mejora significativa en el rendimiento de vkernel.
  • Bajo kern.proc.pathname, un sysctl usado por programas para encontrar la ruta del programa en ejecución. Este sysctl fue implementado originalmente antes de que almacenemos suficientes datos para retornar una ruta completa apropiada.
  • Se sincroniza ACPICA desde Intel (esta es una ocurrencia regular).
  • Se corrigió el ensamble ABI de memcpy() . El ensamble no estaba retornando el argumento original (dst). No corrige ningún problem conocido pero cierra un hueco cuando algunas veces GCC decide llamar a memcpy mientras genera código.
  • Muchas consolidaciones para limpiar advertencias y errores de -O2. El kernel ahora está compilado con -O2 por defecto.
  • Agrega una solución alterna para una rendición impropia en la ruta ACPI (también conocido como código buggiento  ACPI).
  • Se corrigió una condición de carrera STOP/CONT que puede ser activado por  una señal pendiente justo en el momento equivocado.
  • Volcado de pila multihílo y se corrigió un bloqueo relacionado con lo mismo cuando múltiples hílos del mismo proceso tiene una falla de segmento al mismo tiempo.
  • Se corrigió un bloquedo de CAM/VM que puede ocurrir debido a un bug en uiomove_nofault(). Esto puede causar un  ‘un buffer de espera indefinido’ durante paginado/swapeo pesado.
  • Se agregó codigo para detectar y lidiar con IPIs perdidos. Esto es primeramente para vkernels donde algunos hosts pueden perder IPIs. CPUs Reales no se supone que pierdan IPIs.
  • Varias correcciones para clock_gettime().
  • Se removieron mas vestigios del MPLOCK. Todas las rutas críticas han sido despojadas desde hace mucho tiempo de este candado, pero aún hay algunos pocos lugares no críticos restantes que lo usan.
  • Se volvió a trabajar el código para matar procesos de memoria baja y se corrigieron un número de condiciones de carrera que pueden evitar que esta característica funcione.
  • Se corrigió un bloqueo de sistema con VMM y se rediseñó el código VMX.
  • Se corrigió un bloqueo mortal cuando los numvnodes alcanzan a los maxvnodes, lo cual puede ocurrir durante cargas pesadas. También se corrigió una fuga de memoria menor en el kernel cuando ‘df’ o la sincronización del sistema de archivos sobrepasa a un comando umount. También reduce modestamente el cálculo de maxvnodes. Por ejemplo, una máquina con 8GB de RAM ahora configura maxvnodes a 478483 en lugar de  598103.
  • Se corrigió un pánico raro el cuál puede ser activado por vm_object_page_remove() cuando user_yield() es llamado impropiamente mientras mantiene un bloqueo de spin, y entonces decide desagendar.
  • Reduce el tamáño de algunas estructuras del kernel ubicadas dinámicamente. En particular, ubicaciones de tablas hash de nodos-i excesivamente dimensionadas ahora son más pequeñas. Efecta principalmente al sistema de archivos UFS (el cuál DragonFlyBSD no usa mucho).
  • Se agregó un camino alterno para el erratum 793 de AMD.
  • Se corrigió un bloqueo mortal el cual puede ocurrir en llamadas de E/S (I/O) apiladas de cluster_*().
  • Se corrigió un bug donde la carga recursiva del módulo puede tener un bloqueo mortal.
  • Se corrigió un bug chistoso en el código sillyrename (renombrado chistoso) de NFS  (del lado del servidor NFS) el cual podía causar que el código de silly-renamed del servidor nunca eliminara el archivo con renombrado chistoso. Que chistoso!!
  • Se hace un mejor trabajo acomodando configuraciones de high-ncpu + low-memory configurations (Alto proceso en CPU + baja memoria).
  • Se rediseñó los bloqueos de spin compartidos para reducir la cantidad de giro que puede ocurrir cuando multiples cpus adquieren un bloqueo compartido de spin al mismo tiempo.
  • Se revisan las operaciones de namecache para reducir aún más la contención SMP. Esto mejora el rendimiento de componentes simples no conflictivos simultaneos en cuando menos 25x en sistemas con muchos nucleos, y reduce significativamente operaciones vnode y estructuras de montaje ref y unref.
  • Se revisaron otras numerosas estucturas del kernel para mejorar el cache localmente y reducir la linea de reborte de cache.
  • Se corrigió un bug en el código de renombrado de archivo de SMBFS.
  • Se implementó RLIMIT_RSS, un limitador RSS por proceso el cual forzará paginación localizada en una base por proceso. Esta característica puede ser usada para prevenir un proceso de que convierta el resto de la máquina en un cascarón inútil.
  • Se incrementó el máximo espacio de swap soportado. El máximo ahora esta limitado primeramente por la RAM y será en el orden de las decenas de terabytes (si tienes suficiente RAM para las estructuras del soporte de administración). También se incrementó el KVM del kernel de 128G a 511G.
  • Se implementó borrado dinámico pmap (desactivado por defecto). Esto dirige el código pmap para borrar páginas intermedias de la tabla de páginas y de PDs desde el pmap al vuelo. Puede ser util si la memoria esta en un premium, pero note que, si se activa, esto hará más lenta la ejecución de programas los cuales colocan o descolocan memoria a un ritmo alto.
  • Se rediseñó como funcionan los niveles ‘nice’ de usuario, haciendo los valores nice seleccionados más significativos de lo que solían ser.
  • Se agregó un controlador nativo NVME de alto rendimiento para DragonFly, escrito por Matt Dillon. Este controlador usa vectores MSI-X y todas las colas disponibles soportadas por el dispositivo, localización por cpu sin bloqueo o con bloqueo mínimo (no hay conflictos SMP en la mayoría de los casos), y es capaz de IOPS y rendimiento de locura.

Gráficos

  • Se estabilizan Broadwell y Skylake, trae a DragonFly el equivalente DRM de Linux 4.6.
  • Se implementó el API de Linux i2c para hacer el portado de código más fácil.
  • Se corrigieron algunos viejos bugs, incluyendo una orden de inversión de bloqueo, la cual podía congelar la reproducción de video (y el resto del sistema X).
  • Se corrigió un error de prioridad de hilo drm del kernel que permitía a un proceso de usuario el tener mayor prioridad que la del hilo de procesamiento del asistente drm. Esto corrigió la mayoría de los congelamientos temporales reportados en navegadores.
  • Manejo de paso de framebuffer EFI en DRM, mejora de cambios de consola de sistema VT y corrección de bloqueos fatales relacionados. También se tiene el intento del kernel de cambiar de regreso a la consola VT desde X cuando ocurre un pánico.

Trabajo en Red

  • Muchas mejoras a traves de la tarjeta de red.
  • iwm – Corrige un problema causado por lógica invertida. Otras mejoras numerosas que mejoran significativamente el rendimiento.
  • wlan – Soporte para escaneo bg asincrono y otras características agregadas.

Otros controladores

  • nvme – Se agregó a la compilación por defecto del kernel, mas correcciones y mejoras en rendimiento.
  • mmcsd – Se agregó soporte significativo de eMMC a DragonFly.
  • ahci – Algunos ajustes de compatibilidad y más cambios agregados para soportar juegos de chips rotos, en particular multiplicadores de puertos. También implementa FBS (Cambios-Basados en FIS (FIS-Based-Switching)) cuando es soportado por el juego de chips.
  • Se agregó soporte para Trackpoint y Elantech.

Entorno de Usuario

  • Se mejoró systat para colapsar multiples interruptores pertenecientes al mismo controlador, ya que frecuentemente hay demasiados para listar ahora.
  • systat -vm 1 se mejoró y rediseñó  significativamente para reportar información más útil y para desempacar campos para que no corran el uno dentro del otro. Y agregó ‘nvme’ a la coincidencia del dispositivo de bloques. Tambien ajustó el despliegue extendido de vmstats y cambió la forma como ozfod y nzfod son reportados.
  • ‘vmstat 1’ Su salida fue rediseñada. Todos los campos estaban corriendo uno dentro del otro debido a un alto rendimiento de una máquina moderna versus lo que existía hace 30 años.
  • Cambios en la señalización de mount/mountd para reducir escaneos de listas de montaje innecesarias y comando desde operaciones mount_null y mount_tmpfs. Solo importan realmente bajo un uso concurrente pesado, pero el grueso de la compilación crea actualmente esa situación.
  • Se corrigen numerosas fugas fork/exec*() que libc puede activar debido a no usar O_CLOEXEC en modalidad atómica. Se agregó varias características O_CLOEXEC a funciones tales como popen() y mk*stemp*() (add mkostemp() y también mkostemps()). Se corrigió una fuga de descriptor de archivos en popen() cuando corre en un ambiente multihilo.
  • Se vuelve más amable con pthreads en vfork() por medio de dar a los nuevos subprocesos lwp el mismo tipo de TID que aquel que tiene el que llamó el vfork(). Esto permite a pthread soportar funciones para ejecutar en el proceso hijo durante el vfork sin implotar los pthreads.
  • Mucha correcciones de compatibilidad en encabezados para mejorar las compilaciones en dports.
  • Varias correcciones de seguridad de importaciones OpenSSL.
  • Se resincronizó OpenSSH para hacer más sencillo el mantenerlo actualizado.
  • Se separan las banderas C del kernel por medio de compilar el kernel usando KCFLAGS en lugar de CFLAGS.
  • Se eliminaron numerosos controladores ISA antiguos del árbol de código completamente. Ya que ahora DragonFlyBSD es de 64 bits solamente, se puede comenzar a eliminar controladores antiguos que no existen en plataformas de 64-bits.
  • Se introdujo las banderas WORLD_CFLAGS y WORLD_CCOPTLEVEL, por defecto a  -O. Esto hace mucho más fácil compilar todo tu mundo -O2 o lo que sea (p.ej. WORLD_CCOPTLEVEL=2). Sin embargo, desaconsejamos el uso de 3 o mayor. Valores válidos son 0, 1, 2, 3, s, g, y ‘fast’ (rápido).
  • Se ajustó el formateo del STATUS para ps para hacerlo más legible y para eliminar antiguas banderas que ya no son aplicables y que solo crean confusión.
  • Se corrigió la alineación malloc() para pequeñas ubicaciones. El alineamiento mínimo ahora es de 16 para ubicaciones en el rango de 16-128 bytes en lugar de 8. Note que las ubicaciones de un poder-de-2 siempre han sido alineadas naturalmente, pero algunos programas usan múltiplos de (p.ej.) 16, como el ’48’, y asume una alineación de 16-bytes.
  • Se agregó Fortunes (fortunas) rediseñado.
  • powerd – Se agregó administración basada en la temperatura para powerd con una nueva opción -H lotemp:hightemp. Esta característica es extremadamente útil en laptops con pobre ventilación y aquellos BIOS modificados intencionalmente a muy alta temperatura. Powerd ahora detecta cambios en el estado de la energía (la cuál puede cambiar la lista de frecuencias disponibles) y transiciónan apropiadamente el servicio cuando ocurre un cambio de estado de energía.
  • Muchas correcciones de  libthread_xu / pthreads y ajustes para mejorar la compatibilidad de dports.
  • Se agregó características de copia-en-escritura (copy-on-write) al vkernel. Por ejemplo, permite a multiples vkernels usar una sola imagen de disco por medio de tener cada uno modificaciones COW internamente a la ram.
  • /usr/src/secure recableado, se eliminaron conflicots de libmd, libcrypt.

Varias herramientas han sido actualizadas en el sistema base:

  • El compilador ha sido actualizado a GCC 5.4.1.
  • Ahora tenemos un enlazador dorado con LTO.
  • binutils 2.25
  • less 481.
  • OpenSSL / LibRESSL complamente reescritos. La base usa ahora libressl.
  • Multiples actualizaciones de zona de tiempo (timezone).

Estatus de Hammer

Mejoras miscelaneas. Una cosa que no logró incluirse en la liberación fue una mejora en la versión para usar un algoritmo de CRC más veloz con una polinomial diferente. Este trabajo será MFC’d a -release (liberado) una vez que las pruebas esten completas. De cualquier forma, los usuarios no deberían preocuparse mucho sobre esto debido a que la corrección de rendimiento mas seria ESTÁ en la liberación (una corrección al código cluster_write() para escrituras de sistema de archivos).

Estatus de Hammer2

El desarrollo continúa, pero no hay ni una palabra aún de una primera liberación.

Estatus de compilador Clang

Un marco de trabajo de inicio has estado siendo agregado para usar clang como el compilador de base alterno en DragonFly, para reemplazar gcc 4.7. Aún no esta completo. Clang puede ser agregador por supuesto como un paquete.

Estatus de 64-bit

  • Note que DragonFly es un sistema operativo de 64 bits únicamente desde 4.6, y no correrá en un hardware de 32-bits.
  • Soporte para AMD Ryzen esta en la liberación y mas trabajo debe realizarse conforme más desarrollos Ryzen vayan ocurriendo. Hay algunos problemas sobre topología reportada en CPU eso se arreglará y se MFC. Hay algunos problemas de estabilidad que actualmente aguardan una actualización del microcódigo de AMD para resolve/retest. Usuarios Ryzen pueden estar seguros de que estamos trabajando sobre esto!

_________________________

Nos leeremos en el siguiente artículo!

FreeBSD rulez!

Si esta información te resultó útil considera hacer una donación a mis cuentas de BitCoin o LiteCoin:

BTC:   37Eyuc6a9YFw3NYAWriBRdsNztjeUCjeBY

LTC:    LhyHJC2eXVCrwHKX1jnMuSHgSijW3XHX2j

_________________________

 Eric De La Cruz Lugo, es Licenciado en Informática Administrativa (LIA) con especialidad en sistemas, egresado del Instituto Tecnológico y de Estudios Superiores de Occidente (ITESO), ha sido usuario de FreeBSD desde 1993 y de sistemas UNIX desde 1992, y de Linux desde 1997 (actualmente cuenta con certificación Linux+CompTIA) es profesor de asignatura de la Universidad Tecnológica Metropolitana en Mérida, Yucatán, donde administra servidores corriendo con FreeBSD que hospedan aplicaciones administrativas y la plataforma educativa en línea de la división de TIC (Tecnologías de la Información y Comunicación) de la Universidad. También brinda de forma independiente consultoría profesional a empresas e instituciones, e imparte cursos relacionados con UNIX, Linux y desde luego FreeBSD!, forma parte del equipo de traducción al español del sitio bsdcertification.org, así como Proofreader y betatester de artículos de la revista BSDMag editada en Polonia, que se puede leer mensualmente en bsdmag.org,  también es astrónomo amateur y asesor externo del Planetario Arcadio Poveda Ricalde de Mérida, Yucatán y esta felizmente casado con su amada esposa Marisol Alvarez, puede ser alcanzado en: eric@freebsd.mx, eric_delacruz@yahoo.com y en eric@iteso.mx y en twitter: @COSMICBOY123)

No Responses to “DragonFly BSD 4.8”

No comments have been made on this post



Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*