Commit 2419fe7e authored by David Vrabel's avatar David Vrabel Committed by Luis Henriques

xen-netback: use RING_COPY_REQUEST() throughout

commit 68a33bfd upstream.

Instead of open-coding memcpy()s and directly accessing Tx and Rx
requests, use the new RING_COPY_REQUEST() that ensures the local copy
is correct.

This is more than is strictly necessary for guest Rx requests since
only the id and gref fields are used and it is harmless if the
frontend modifies these.

This is part of XSA155.
Reviewed-by: default avatarWei Liu <wei.liu2@citrix.com>
Signed-off-by: default avatarDavid Vrabel <david.vrabel@citrix.com>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
parent 78db97a5
...@@ -221,18 +221,18 @@ static struct xenvif_rx_meta *get_next_rx_buffer(struct xenvif_queue *queue, ...@@ -221,18 +221,18 @@ static struct xenvif_rx_meta *get_next_rx_buffer(struct xenvif_queue *queue,
struct netrx_pending_operations *npo) struct netrx_pending_operations *npo)
{ {
struct xenvif_rx_meta *meta; struct xenvif_rx_meta *meta;
struct xen_netif_rx_request *req; struct xen_netif_rx_request req;
req = RING_GET_REQUEST(&queue->rx, queue->rx.req_cons++); RING_COPY_REQUEST(&queue->rx, queue->rx.req_cons++, &req);
meta = npo->meta + npo->meta_prod++; meta = npo->meta + npo->meta_prod++;
meta->gso_type = XEN_NETIF_GSO_TYPE_NONE; meta->gso_type = XEN_NETIF_GSO_TYPE_NONE;
meta->gso_size = 0; meta->gso_size = 0;
meta->size = 0; meta->size = 0;
meta->id = req->id; meta->id = req.id;
npo->copy_off = 0; npo->copy_off = 0;
npo->copy_gref = req->gref; npo->copy_gref = req.gref;
return meta; return meta;
} }
...@@ -390,7 +390,7 @@ static int xenvif_gop_skb(struct sk_buff *skb, ...@@ -390,7 +390,7 @@ static int xenvif_gop_skb(struct sk_buff *skb,
struct xenvif *vif = netdev_priv(skb->dev); struct xenvif *vif = netdev_priv(skb->dev);
int nr_frags = skb_shinfo(skb)->nr_frags; int nr_frags = skb_shinfo(skb)->nr_frags;
int i; int i;
struct xen_netif_rx_request *req; struct xen_netif_rx_request req;
struct xenvif_rx_meta *meta; struct xenvif_rx_meta *meta;
unsigned char *data; unsigned char *data;
int head = 1; int head = 1;
...@@ -411,15 +411,15 @@ static int xenvif_gop_skb(struct sk_buff *skb, ...@@ -411,15 +411,15 @@ static int xenvif_gop_skb(struct sk_buff *skb,
/* Set up a GSO prefix descriptor, if necessary */ /* Set up a GSO prefix descriptor, if necessary */
if ((1 << gso_type) & vif->gso_prefix_mask) { if ((1 << gso_type) & vif->gso_prefix_mask) {
req = RING_GET_REQUEST(&queue->rx, queue->rx.req_cons++); RING_COPY_REQUEST(&queue->rx, queue->rx.req_cons++, &req);
meta = npo->meta + npo->meta_prod++; meta = npo->meta + npo->meta_prod++;
meta->gso_type = gso_type; meta->gso_type = gso_type;
meta->gso_size = skb_shinfo(skb)->gso_size; meta->gso_size = skb_shinfo(skb)->gso_size;
meta->size = 0; meta->size = 0;
meta->id = req->id; meta->id = req.id;
} }
req = RING_GET_REQUEST(&queue->rx, queue->rx.req_cons++); RING_COPY_REQUEST(&queue->rx, queue->rx.req_cons++, &req);
meta = npo->meta + npo->meta_prod++; meta = npo->meta + npo->meta_prod++;
if ((1 << gso_type) & vif->gso_mask) { if ((1 << gso_type) & vif->gso_mask) {
...@@ -431,9 +431,9 @@ static int xenvif_gop_skb(struct sk_buff *skb, ...@@ -431,9 +431,9 @@ static int xenvif_gop_skb(struct sk_buff *skb,
} }
meta->size = 0; meta->size = 0;
meta->id = req->id; meta->id = req.id;
npo->copy_off = 0; npo->copy_off = 0;
npo->copy_gref = req->gref; npo->copy_gref = req.gref;
data = skb->data; data = skb->data;
while (data < skb_tail_pointer(skb)) { while (data < skb_tail_pointer(skb)) {
...@@ -784,7 +784,7 @@ static void xenvif_tx_err(struct xenvif_queue *queue, ...@@ -784,7 +784,7 @@ static void xenvif_tx_err(struct xenvif_queue *queue,
spin_unlock_irqrestore(&queue->response_lock, flags); spin_unlock_irqrestore(&queue->response_lock, flags);
if (cons == end) if (cons == end)
break; break;
txp = RING_GET_REQUEST(&queue->tx, cons++); RING_COPY_REQUEST(&queue->tx, cons++, txp);
} while (1); } while (1);
queue->tx.req_cons = cons; queue->tx.req_cons = cons;
} }
...@@ -851,8 +851,7 @@ static int xenvif_count_requests(struct xenvif_queue *queue, ...@@ -851,8 +851,7 @@ static int xenvif_count_requests(struct xenvif_queue *queue,
if (drop_err) if (drop_err)
txp = &dropped_tx; txp = &dropped_tx;
memcpy(txp, RING_GET_REQUEST(&queue->tx, cons + slots), RING_COPY_REQUEST(&queue->tx, cons + slots, txp);
sizeof(*txp));
/* If the guest submitted a frame >= 64 KiB then /* If the guest submitted a frame >= 64 KiB then
* first->size overflowed and following slots will * first->size overflowed and following slots will
...@@ -1204,8 +1203,7 @@ static int xenvif_get_extras(struct xenvif_queue *queue, ...@@ -1204,8 +1203,7 @@ static int xenvif_get_extras(struct xenvif_queue *queue,
return -EBADR; return -EBADR;
} }
memcpy(&extra, RING_GET_REQUEST(&queue->tx, cons), RING_COPY_REQUEST(&queue->tx, cons, &extra);
sizeof(extra));
if (unlikely(!extra.type || if (unlikely(!extra.type ||
extra.type >= XEN_NETIF_EXTRA_TYPE_MAX)) { extra.type >= XEN_NETIF_EXTRA_TYPE_MAX)) {
queue->tx.req_cons = ++cons; queue->tx.req_cons = ++cons;
...@@ -1341,7 +1339,7 @@ static void xenvif_tx_build_gops(struct xenvif_queue *queue, ...@@ -1341,7 +1339,7 @@ static void xenvif_tx_build_gops(struct xenvif_queue *queue,
idx = queue->tx.req_cons; idx = queue->tx.req_cons;
rmb(); /* Ensure that we see the request before we copy it. */ rmb(); /* Ensure that we see the request before we copy it. */
memcpy(&txreq, RING_GET_REQUEST(&queue->tx, idx), sizeof(txreq)); RING_COPY_REQUEST(&queue->tx, idx, &txreq);
/* Credit-based scheduling. */ /* Credit-based scheduling. */
if (txreq.size > queue->remaining_credit && if (txreq.size > queue->remaining_credit &&
......
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