sky2: rx allocation threshold change
When using larger MTU's sky2 driver changes from allocating one data area, to using multiple pages. The threshold for this was based on a heuristic where the cost of a single allocation is bigger than one page. Since the allocator has changed, this heuristic is now incorrect; instead just make the threshold be when the total size of the allocation is greater than one page. Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
committed by
David S. Miller
parent
f03b865491
commit
5f06eba4dc
@@ -1234,7 +1234,7 @@ static int sky2_rx_start(struct sky2_port *sky2)
|
|||||||
struct sky2_hw *hw = sky2->hw;
|
struct sky2_hw *hw = sky2->hw;
|
||||||
struct rx_ring_info *re;
|
struct rx_ring_info *re;
|
||||||
unsigned rxq = rxqaddr[sky2->port];
|
unsigned rxq = rxqaddr[sky2->port];
|
||||||
unsigned i, size, space, thresh;
|
unsigned i, size, thresh;
|
||||||
|
|
||||||
sky2->rx_put = sky2->rx_next = 0;
|
sky2->rx_put = sky2->rx_next = 0;
|
||||||
sky2_qset(hw, rxq);
|
sky2_qset(hw, rxq);
|
||||||
@@ -1261,28 +1261,18 @@ static int sky2_rx_start(struct sky2_port *sky2)
|
|||||||
/* Stopping point for hardware truncation */
|
/* Stopping point for hardware truncation */
|
||||||
thresh = (size - 8) / sizeof(u32);
|
thresh = (size - 8) / sizeof(u32);
|
||||||
|
|
||||||
/* Account for overhead of skb - to avoid order > 0 allocation */
|
sky2->rx_nfrags = size >> PAGE_SHIFT;
|
||||||
space = SKB_DATA_ALIGN(size) + NET_SKB_PAD
|
|
||||||
+ sizeof(struct skb_shared_info);
|
|
||||||
|
|
||||||
sky2->rx_nfrags = space >> PAGE_SHIFT;
|
|
||||||
BUG_ON(sky2->rx_nfrags > ARRAY_SIZE(re->frag_addr));
|
BUG_ON(sky2->rx_nfrags > ARRAY_SIZE(re->frag_addr));
|
||||||
|
|
||||||
if (sky2->rx_nfrags != 0) {
|
/* Compute residue after pages */
|
||||||
/* Compute residue after pages */
|
size -= sky2->rx_nfrags << PAGE_SHIFT;
|
||||||
space = sky2->rx_nfrags << PAGE_SHIFT;
|
|
||||||
|
|
||||||
if (space < size)
|
/* Optimize to handle small packets and headers */
|
||||||
size -= space;
|
if (size < copybreak)
|
||||||
else
|
size = copybreak;
|
||||||
size = 0;
|
if (size < ETH_HLEN)
|
||||||
|
size = ETH_HLEN;
|
||||||
|
|
||||||
/* Optimize to handle small packets and headers */
|
|
||||||
if (size < copybreak)
|
|
||||||
size = copybreak;
|
|
||||||
if (size < ETH_HLEN)
|
|
||||||
size = ETH_HLEN;
|
|
||||||
}
|
|
||||||
sky2->rx_data_size = size;
|
sky2->rx_data_size = size;
|
||||||
|
|
||||||
/* Fill Rx ring */
|
/* Fill Rx ring */
|
||||||
|
Reference in New Issue
Block a user