| From ec72823546e39cd486360f44db16cf47f7e8f59e Mon Sep 17 00:00:00 2001 |
| From: Henning Schild <henning.schild@siemens.com> |
| Date: Mon, 18 Sep 2017 18:02:08 +0200 |
| Subject: [PATCH] ivshmem-net: fill in and check used descriptor chain len |
| |
| We are using chains of len==1 make that explicit and expect that from |
| the remote. |
| |
| Signed-off-by: Henning Schild <henning.schild@siemens.com> |
| Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> |
| (cherry picked from commit f958c360044184f58605815d428b83fe4329cafd) |
| --- |
| drivers/net/ivshmem-net.c | 14 ++++++++------ |
| 1 file changed, 8 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/net/ivshmem-net.c |
| +++ b/drivers/net/ivshmem-net.c |
| @@ -335,10 +335,10 @@ static void ivshm_net_tx_clean(struct ne |
| { |
| struct ivshm_net *in = netdev_priv(ndev); |
| struct ivshm_net_queue *tx = &in->tx; |
| + struct vring_used_elem *used; |
| struct vring *vr = &tx->vr; |
| struct vring_desc *desc; |
| struct vring_desc *fdesc; |
| - unsigned int used; |
| unsigned int num; |
| u16 used_idx; |
| u16 last; |
| @@ -358,13 +358,14 @@ static void ivshm_net_tx_clean(struct ne |
| u32 len; |
| u32 tail; |
| |
| - used = vr->used->ring[last & (vr->num - 1)].id; |
| - if (used >= vr->num) { |
| - netdev_err(ndev, "invalid tx used %d\n", used); |
| + used = vr->used->ring + (last % vr->num); |
| + if (used->id >= vr->num || used->len != 1) { |
| + netdev_err(ndev, "invalid tx used->id %d ->len %d\n", |
| + used->id, used->len); |
| break; |
| } |
| |
| - desc = &vr->desc[used]; |
| + desc = &vr->desc[used->id]; |
| |
| data = ivshm_net_desc_data(in, &in->tx, desc, &len); |
| if (!data) { |
| @@ -383,7 +384,7 @@ static void ivshm_net_tx_clean(struct ne |
| else |
| desc->next = fhead; |
| |
| - fhead = used; |
| + fhead = used->id; |
| last++; |
| num++; |
| } |
| @@ -433,6 +434,7 @@ static void ivshm_net_rx_finish(struct i |
| |
| used = rx->last_used_idx++ & (vr->num - 1); |
| vr->used->ring[used].id = desc_id; |
| + vr->used->ring[used].len = 1; |
| |
| virt_store_release(&vr->used->idx, rx->last_used_idx); |
| } |