]>
Commit | Line | Data |
---|---|---|
a65d4bac GKH |
1 | From foo@baz Sat Jul 28 10:25:26 CEST 2018 |
2 | From: Juergen Gross <jgross@suse.com> | |
3 | Date: Tue, 12 Jun 2018 08:57:53 +0200 | |
4 | Subject: xen/netfront: raise max number of slots in xennet_get_responses() | |
5 | ||
6 | From: Juergen Gross <jgross@suse.com> | |
7 | ||
8 | [ Upstream commit 57f230ab04d2910a06d17d988f1c4d7586a59113 ] | |
9 | ||
10 | The max number of slots used in xennet_get_responses() is set to | |
11 | MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD). | |
12 | ||
13 | In old kernel-xen MAX_SKB_FRAGS was 18, while nowadays it is 17. This | |
14 | difference is resulting in frequent messages "too many slots" and a | |
15 | reduced network throughput for some workloads (factor 10 below that of | |
16 | a kernel-xen based guest). | |
17 | ||
18 | Replacing MAX_SKB_FRAGS by XEN_NETIF_NR_SLOTS_MIN for calculation of | |
19 | the max number of slots to use solves that problem (tests showed no | |
20 | more messages "too many slots" and throughput was as high as with the | |
21 | kernel-xen based guest system). | |
22 | ||
23 | Replace MAX_SKB_FRAGS-2 by XEN_NETIF_NR_SLOTS_MIN-1 in | |
24 | netfront_tx_slot_available() for making it clearer what is really being | |
25 | tested without actually modifying the tested value. | |
26 | ||
27 | Signed-off-by: Juergen Gross <jgross@suse.com> | |
28 | Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> | |
29 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
30 | Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> | |
31 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
32 | --- | |
33 | drivers/net/xen-netfront.c | 4 ++-- | |
34 | 1 file changed, 2 insertions(+), 2 deletions(-) | |
35 | ||
36 | --- a/drivers/net/xen-netfront.c | |
37 | +++ b/drivers/net/xen-netfront.c | |
38 | @@ -239,7 +239,7 @@ static void rx_refill_timeout(unsigned l | |
39 | static int netfront_tx_slot_available(struct netfront_queue *queue) | |
40 | { | |
41 | return (queue->tx.req_prod_pvt - queue->tx.rsp_cons) < | |
42 | - (NET_TX_RING_SIZE - MAX_SKB_FRAGS - 2); | |
43 | + (NET_TX_RING_SIZE - XEN_NETIF_NR_SLOTS_MIN - 1); | |
44 | } | |
45 | ||
46 | static void xennet_maybe_wake_tx(struct netfront_queue *queue) | |
47 | @@ -790,7 +790,7 @@ static int xennet_get_responses(struct n | |
48 | RING_IDX cons = queue->rx.rsp_cons; | |
49 | struct sk_buff *skb = xennet_get_rx_skb(queue, cons); | |
50 | grant_ref_t ref = xennet_get_rx_ref(queue, cons); | |
51 | - int max = MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD); | |
52 | + int max = XEN_NETIF_NR_SLOTS_MIN + (rx->status <= RX_COPY_THRESHOLD); | |
53 | int slots = 1; | |
54 | int err = 0; | |
55 | unsigned long ret; |