|
@@ -890,9 +890,9 @@ static int xennet_set_skb_gso(struct sk_buff *skb,
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static RING_IDX xennet_fill_frags(struct netfront_queue *queue,
|
|
|
|
|
- struct sk_buff *skb,
|
|
|
|
|
- struct sk_buff_head *list)
|
|
|
|
|
|
|
+static int xennet_fill_frags(struct netfront_queue *queue,
|
|
|
|
|
+ struct sk_buff *skb,
|
|
|
|
|
+ struct sk_buff_head *list)
|
|
|
{
|
|
{
|
|
|
RING_IDX cons = queue->rx.rsp_cons;
|
|
RING_IDX cons = queue->rx.rsp_cons;
|
|
|
struct sk_buff *nskb;
|
|
struct sk_buff *nskb;
|
|
@@ -911,7 +911,7 @@ static RING_IDX xennet_fill_frags(struct netfront_queue *queue,
|
|
|
if (unlikely(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS)) {
|
|
if (unlikely(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS)) {
|
|
|
queue->rx.rsp_cons = ++cons + skb_queue_len(list);
|
|
queue->rx.rsp_cons = ++cons + skb_queue_len(list);
|
|
|
kfree_skb(nskb);
|
|
kfree_skb(nskb);
|
|
|
- return ~0U;
|
|
|
|
|
|
|
+ return -ENOENT;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
|
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
|
@@ -922,7 +922,9 @@ static RING_IDX xennet_fill_frags(struct netfront_queue *queue,
|
|
|
kfree_skb(nskb);
|
|
kfree_skb(nskb);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return cons;
|
|
|
|
|
|
|
+ queue->rx.rsp_cons = cons;
|
|
|
|
|
+
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static int checksum_setup(struct net_device *dev, struct sk_buff *skb)
|
|
static int checksum_setup(struct net_device *dev, struct sk_buff *skb)
|
|
@@ -1048,8 +1050,7 @@ err:
|
|
|
skb->data_len = rx->status;
|
|
skb->data_len = rx->status;
|
|
|
skb->len += rx->status;
|
|
skb->len += rx->status;
|
|
|
|
|
|
|
|
- i = xennet_fill_frags(queue, skb, &tmpq);
|
|
|
|
|
- if (unlikely(i == ~0U))
|
|
|
|
|
|
|
+ if (unlikely(xennet_fill_frags(queue, skb, &tmpq)))
|
|
|
goto err;
|
|
goto err;
|
|
|
|
|
|
|
|
if (rx->flags & XEN_NETRXF_csum_blank)
|
|
if (rx->flags & XEN_NETRXF_csum_blank)
|
|
@@ -1059,7 +1060,7 @@ err:
|
|
|
|
|
|
|
|
__skb_queue_tail(&rxq, skb);
|
|
__skb_queue_tail(&rxq, skb);
|
|
|
|
|
|
|
|
- queue->rx.rsp_cons = ++i;
|
|
|
|
|
|
|
+ i = ++queue->rx.rsp_cons;
|
|
|
work_done++;
|
|
work_done++;
|
|
|
}
|
|
}
|
|
|
|
|
|