Skip to content

Commit

Permalink
vxge: Fix starvation of receive ring controller when blasted by short…
Browse files Browse the repository at this point in the history
… packets.

- Fix starvation of receive ring controller when blasted by short packets. This was because the driver was posting 64 rxds initially while the ring controller
was expecting to read 256 replenished rxds. While the driver was coming up,
the internal rxd memory filled up the 64 buffers provided and the ring
controller was left waiting for the remaining 192 rxds to complete the write
back of completed rxds to the host and generation of an interrupt.

Signed-off-by: Sreenivasa Honnur <sreenivasa.honnur@neterion.com>
Signed-off-by: Ramkrishna Vepa <ram.vepa@neterion.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Sreenivasa Honnur authored and David S. Miller committed Mar 29, 2010
1 parent 18dec74 commit 3363276
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 13 deletions.
14 changes: 4 additions & 10 deletions drivers/net/vxge/vxge-config.c
Original file line number Diff line number Diff line change
Expand Up @@ -1217,14 +1217,13 @@ __vxge_hw_ring_mempool_item_alloc(struct vxge_hw_mempool *mempoolh,
}

/*
* __vxge_hw_ring_initial_replenish - Initial replenish of RxDs
* __vxge_hw_ring_replenish - Initial replenish of RxDs
* This function replenishes the RxDs from reserve array to work array
*/
enum vxge_hw_status
vxge_hw_ring_replenish(struct __vxge_hw_ring *ring, u16 min_flag)
vxge_hw_ring_replenish(struct __vxge_hw_ring *ring)
{
void *rxd;
int i = 0;
struct __vxge_hw_channel *channel;
enum vxge_hw_status status = VXGE_HW_OK;

Expand All @@ -1245,11 +1244,6 @@ vxge_hw_ring_replenish(struct __vxge_hw_ring *ring, u16 min_flag)
}

vxge_hw_ring_rxd_post(ring, rxd);
if (min_flag) {
i++;
if (i == VXGE_HW_RING_MIN_BUFF_ALLOCATION)
break;
}
}
status = VXGE_HW_OK;
exit:
Expand Down Expand Up @@ -1354,7 +1348,7 @@ __vxge_hw_ring_create(struct __vxge_hw_vpath_handle *vp,
* Currently we don't have a case when the 1) is done without the 2).
*/
if (ring->rxd_init) {
status = vxge_hw_ring_replenish(ring, 1);
status = vxge_hw_ring_replenish(ring);
if (status != VXGE_HW_OK) {
__vxge_hw_ring_delete(vp);
goto exit;
Expand Down Expand Up @@ -1416,7 +1410,7 @@ enum vxge_hw_status __vxge_hw_ring_reset(struct __vxge_hw_ring *ring)
goto exit;

if (ring->rxd_init) {
status = vxge_hw_ring_replenish(ring, 1);
status = vxge_hw_ring_replenish(ring);
if (status != VXGE_HW_OK)
goto exit;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/vxge/vxge-main.c
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ vxge_rx_1b_compl(struct __vxge_hw_ring *ringh, void *dtr,
ring->ndev->name, __func__, __LINE__);
ring->pkts_processed = 0;

vxge_hw_ring_replenish(ringh, 0);
vxge_hw_ring_replenish(ringh);

do {
prefetch((char *)dtr + L1_CACHE_BYTES);
Expand Down
3 changes: 1 addition & 2 deletions drivers/net/vxge/vxge-traffic.h
Original file line number Diff line number Diff line change
Expand Up @@ -1955,7 +1955,7 @@ vxge_hw_ring_rxd_post_post(
void *rxdh);

enum vxge_hw_status
vxge_hw_ring_replenish(struct __vxge_hw_ring *ring_handle, u16 min_flag);
vxge_hw_ring_replenish(struct __vxge_hw_ring *ring_handle);

void
vxge_hw_ring_rxd_post_post_wmb(
Expand Down Expand Up @@ -2087,7 +2087,6 @@ void vxge_hw_fifo_txdl_free(

#define VXGE_HW_RING_NEXT_BLOCK_POINTER_OFFSET (VXGE_HW_BLOCK_SIZE-8)
#define VXGE_HW_RING_MEMBLOCK_IDX_OFFSET (VXGE_HW_BLOCK_SIZE-16)
#define VXGE_HW_RING_MIN_BUFF_ALLOCATION 64

/*
* struct __vxge_hw_ring_rxd_priv - Receive descriptor HW-private data.
Expand Down

0 comments on commit 3363276

Please sign in to comment.