Capítulo 4. Operación del Controlador

4.1. buffers de Anillo

El Tulip puede usar buffers de anillo o lista de descriptores Tx y Rx. Este controlador usa anillos estáticamente asignados de descriptores Rx y Tx, establecidos en tiempo de compilación por RX/TX_RING_SIZE. Esta versión del controlador asigna skbuffs para los buffers de anillo Rx en tiempo de open() y pasa el campo skb-data al Tulip cuando recibe los buffers de datos. Cuando un frame que llega es menor que RX_COPYBREAK bytes de grande, un nuevo skbuff es asignado y el frame es copiado en el nuevo skbuff. Cuando el frame que llega es más grande, el skbuff es pasado directamente a la pila de protocolos y reemplazado por un skbuff nuevamente asignado.

El valor RX_COPYBREAK es escogido para equilibrar la memoria gastada usando un skbuff lleno para los frames pequeños vs. los costes de copiado para los frames grandes. Para los frames pequeños los costes de copiado son insignificantes (considerando que estamos precargando la caché con inmediatamente con información útil de la cabecera). Para frames grandes los costes de copiado no son triviales, y la copia más grande quizás borre datos útiles de la caché. Un aspecto sutil de esta elección es que el Tulip sólo recibe en buffers de palabras grandes (64 bits) alineadas, esto es, la cabecera IP con un desplazamiento de 14 no es una palabra grande alineada para un procesamiento más amplio. Los frames copiados son puestos en el nuevo skbuff con un desplazamiento de "+2", entonces copiando tiene el efecto beneficioso de alinear la cabecera IP y precargar la caché.