summaryrefslogtreecommitdiff
path: root/drivers/net/ivshmem-net.c
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2017-01-03 08:50:01 +0100
committerLeonard Crestez <leonard.crestez@nxp.com>2018-08-24 12:41:33 +0300
commit8d0059d74819cc57ed73835cad6a8f7b82744402 (patch)
treeb5c02c04438de7ca0b1e2c2700c420f1e766b9fd /drivers/net/ivshmem-net.c
parent267d8295ef98ce8346b54b0a57664c71d82c52b6 (diff)
ivshmem-net: Switch to relative descriptor addresses
Make sure that we do not depend on identity-mapped shared memory regions. This also fixes an off-by-one in the range check of ivshm_net_desc_data. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> (cherry picked from commit 426eccbb2dba3b44b3e24e374ab46a0c5f32b65d)
Diffstat (limited to 'drivers/net/ivshmem-net.c')
-rw-r--r--drivers/net/ivshmem-net.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/ivshmem-net.c b/drivers/net/ivshmem-net.c
index 9f307ec4d677..0e770ca293a4 100644
--- a/drivers/net/ivshmem-net.c
+++ b/drivers/net/ivshmem-net.c
@@ -123,14 +123,14 @@ static void *ivshm_net_desc_data(struct ivshm_net *in,
struct vring_desc *desc,
u32 *len)
{
- u64 addr = READ_ONCE(desc->addr);
+ u64 offs = READ_ONCE(desc->addr);
u32 dlen = READ_ONCE(desc->len);
void *data;
- if (addr < in->shmaddr || desc->addr > in->shmaddr + in->shmlen)
+ if (offs >= in->shmlen)
return NULL;
- data = in->shm + (addr - in->shmaddr);
+ data = in->shm + offs;
if (data < q->data || data >= q->end)
return NULL;
@@ -317,7 +317,7 @@ static int ivshm_net_tx_frame(struct net_device *ndev, struct sk_buff *skb)
buf = tx->data + head;
skb_copy_and_csum_dev(skb, buf);
- desc->addr = in->shmaddr + (buf - in->shm);
+ desc->addr = buf - in->shm;
desc->len = skb->len;
avail = tx->last_avail_idx++ & (vr->num - 1);