Commit 5f06eba4 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by David S. Miller

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: default avatarStephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent f03b8654
...@@ -1234,7 +1234,7 @@ static int sky2_rx_start(struct sky2_port *sky2) ...@@ -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) ...@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment