Samuel Thibault
2007-Nov-23 17:19 UTC
[Xen-devel] [PATCH] [Mini-OS] Fix netfront xmit overflow
Fix xmit overflow by making netfront_xmit sleep until network_tx_buf_gc() frees an xmit request. Signed-off-by: Samuel Thibault <samuel.thibault@citrix.com> --- Note: depends on callback-safe semaphores. diff -r dc9246357cdb extras/mini-os/netfront.c --- a/extras/mini-os/netfront.c Fri Nov 23 16:42:44 2007 +0000 +++ b/extras/mini-os/netfront.c Fri Nov 23 17:15:51 2007 +0000 @@ -13,6 +13,7 @@ #include <gnttab.h> #include <xmalloc.h> #include <time.h> +#include <semaphore.h> void init_rx_buffers(void); @@ -48,6 +49,7 @@ unsigned short rx_freelist[NET_RX_RING_SIZE]; unsigned short tx_freelist[NET_TX_RING_SIZE]; +__DECLARE_SEMAPHORE_GENERIC(tx_sem, NET_TX_RING_SIZE); struct net_buffer { void* page; @@ -188,6 +190,7 @@ buf->gref=GRANT_INVALID_REF; add_id_to_freelist(id,tx_freelist); + up(&tx_sem); } np->tx.rsp_cons = prod; @@ -421,16 +424,23 @@ void netfront_xmit(unsigned char* data,int len) { int flags; + struct net_info* info = &net_info; + struct netif_tx_request *tx; + RING_IDX i; + int notify; + int id; + struct net_buffer* buf; + void* page; + + down(&tx_sem); + local_irq_save(flags); - struct net_info* info = &net_info; - struct netif_tx_request *tx; - RING_IDX i = info->tx.req_prod_pvt; - int notify; - int id = get_id_from_freelist(tx_freelist); - struct net_buffer* buf = &tx_buffers[id]; - void* page = buf->page; + id = get_id_from_freelist(tx_freelist); + buf = &tx_buffers[id]; + page = buf->page; + i = info->tx.req_prod_pvt; tx = RING_GET_REQUEST(&info->tx, i); memcpy(page,data,len); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel