From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6AE04A2EFC for ; Tue, 17 Sep 2019 21:03:56 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3FFC71BF01; Tue, 17 Sep 2019 21:03:56 +0200 (CEST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 6F3211BEEB for ; Tue, 17 Sep 2019 21:03:53 +0200 (CEST) Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8B03B3C92D for ; Tue, 17 Sep 2019 19:03:52 +0000 (UTC) Received: by mail-wr1-f71.google.com with SMTP id q10so1624457wro.22 for ; Tue, 17 Sep 2019 12:03:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:openpgp:autocrypt :message-id:date:user-agent:mime-version:in-reply-to :content-language:content-transfer-encoding; bh=G2G9VTr+DjY0iv5mIZGgX9hFtjHnQLrdgr4UvTdvxkg=; b=jbpxPGxFLe2FcUSW1+eZhOcL2bpdcyMklQ4esDw7xKnKnxpQXxq3JNjvsYb/DGjPM8 aN1vdAJriYyA3ygEWXVFLo4PZaHVqkhSl4ljH2V+o2TN2YMaPZF8crQdETpG3qCA9JjK HEY6EUi4x0ERUlgYVGrNgGyDx45Vhlub90mt9cjl/RNRAEuK3BiiOkKJQ3eFLFygDit3 A8zJZld2BRjw+8NGDUOapwKeqjloX1qOfQHRF4cVNO/cqpGfSjZfSMNF/9eX6uVtaQiU xFZ63j6xCZN+798y5wo+9KwoUIQIpyJ4tld2yFNTcTcVNsbBwqw8QtlkBG3Owbd90qD7 KeEg== X-Gm-Message-State: APjAAAUuk5DJaEIZAPXgUaiqTZZ+KBmrLN7jyHv8hjJ942kSoJHLPpPB 2S/xOtt6dhpsGUNez7flH+bGxCAik2UfzTGba2teW7fPzHIA6HsNOqov+ESv1aa0UJpXfDyBuC1 PVM1iHDQ= X-Received: by 2002:a5d:49c2:: with SMTP id t2mr84252wrs.351.1568747031261; Tue, 17 Sep 2019 12:03:51 -0700 (PDT) X-Google-Smtp-Source: APXvYqzxxpy5iCCWO0w/D3EahD2BNABC457BWeILfLOiy5Kwi+sQMS6BY5OQ7oFi2qft1+jvKbdGBg== X-Received: by 2002:a5d:49c2:: with SMTP id t2mr84238wrs.351.1568747030992; Tue, 17 Sep 2019 12:03:50 -0700 (PDT) Received: from amorenoz.users.ipa.redhat.com (static.169.4.0.81.ibercom.com. [81.0.4.169]) by smtp.gmail.com with ESMTPSA id z4sm3387032wrh.93.2019.09.17.12.03.50 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 17 Sep 2019 12:03:50 -0700 (PDT) To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, stable@dpdk.org, zhihong.wang@intel.com, tiwei.bie@intel.com References: <20190906125020.23276-1-amorenoz@redhat.com> From: Adrian Moreno Openpgp: preference=signencrypt Autocrypt: addr=amorenoz@redhat.com; prefer-encrypt=mutual; keydata= mQENBF1syNUBCADQ9dk3fDMxOZ/+OQpmbanpodYxEv8IRtDz8PXw8YX7UyGfozOpLjQ8Fftj ZxuubYNbt2QVbSgviFilFdNWu2eTnN/JaGtfhmTOLPVoakkPHZF8lbgImMoch7L0fH8wN2IM KPxQyPNlX+K9FD5brHsV1lfe1TwAxmhcvLW8yNrVq+9eDIDykxc7tH4exIqXgZroahGxMHKy c8Ti2kJka/t6pDfRaY0J+6J7I1nrn6GXXSMNA45EH8+0N/QlcXhP3rfftnoPeVmpjswzvJqY FNjf/Q5VPLx7RX0Qx+y8mMB2JcChV5Bl7D7x5EUbItj6+Sy7QfOgCtPegk9HSrBCNYaLABEB AAG0I0FkcmlhbiBNb3Jlbm8gPGFtb3Jlbm96QHJlZGhhdC5jb20+iQFUBBMBCAA+FiEEogUD gihhmbOPHy26d5C5fbYeFsUFAl1syNUCGwMFCQHhM4AFCwkIBwIGFQoJCAsCBBYCAwECHgEC F4AACgkQd5C5fbYeFsX7qwgArGHSkX+ILNcujkVzjTG4OtkpJMPFlkn/1PxSEKD0jLuzx14B COzpg/Mqj3Re/QBuOas+ci9bsUA0/2nORtmmEBvzDOJpR5FH1jaGCx8USlY4WM6QqEDNZgTw hsy9KhjFzFjMk+oo3HyItXA+Uq9yrRBTjNBGTXxezMRcMuUZ4MIAfY0IRBglL2BufiuL43jD BvTENNFLoQ/wFV7qkFWSkv+8IjTsxr7M6XUo1QLd29Hn0dvwssN579HL1+BP46i2REpzeBEG L75iVChi+YnIQQNMJ9NYarVabZx4Y1Gn8+7B/1SNArDV+IDgnYgt7E58otoV2Ap310dmtuvE VbxGpbkBDQRdbMjVAQgAqyp9oA7WDu7/Y9T4Ommt69iZx8os7shUIfdgPEy5xrcPn6qGwN1/ HQ4j8nWfBG9uuX1X0RXUZIUEtYTxtED4yaCQMTqDUf9cBAwAA2mYxBfoiNYx8YqxM+sT0/J4 2qmDd+y+20UR4yzHE8AmIbspTzDFIJDAi+jKSR8F355z0sfW7CIMDC4ZWrPsskjEy1YN/U10 r6tRRH1kNyrCSbTG0d9MtcQO58h7DLXuzUhErB+BtG52A04t5cweIJTJC+koV5XPeilzlHnm RFoj0ncruGa9Odns21BNt3cy9wLfK+aUnWuAB1uc6bJGQPiAwjkilz7g7MBRUuIQ2Zt7HGLc SwARAQABiQE8BBgBCAAmFiEEogUDgihhmbOPHy26d5C5fbYeFsUFAl1syNUCGwwFCQHhM4AA CgkQd5C5fbYeFsUlSwf8CH+u/IXaE7WeWxwFkMaORfW8cM4q0xrL3M6yRGuQNW+kMjnrvK9U J9G+L1/5uTRbDQ/4LdoKqize8LjehA+iF6ba4t9Npikh8fLKWgaJfQ/hPhH4C3O5gWPOLTW6 ylGxiuER4CdFwQIoAMMslhFA7G+teeOKBq36E+1+zrybI6Xy1UBSlpDK9j4CtTnMQejjuSQb Qhle+l8VroaUHq869wjAhRHHhqmtJKggI+OvzgQpDIwfHIDypb1BuKydi2W6cVYEALUYyCLS dTBDhzj8zR5tPCsga8J7+TclQzkWOiI2C6ZtiWrMsL/Uym3uXk5nsoc7lSj7yLd/MrBRhYfP JQ== Message-ID: <0111463e-7e83-0f9e-8188-a2367112c9fb@redhat.com> Date: Tue, 17 Sep 2019 21:03:49 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20190906125020.23276-1-amorenoz@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Subject: Re: [dpdk-stable] [PATCH] vhost: fix vring memory partially mapped X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" Adding relevant maintainers. Sorry for the slip Adrian On 9/6/19 2:50 PM, Adrian Moreno wrote: > Only the mapping of the vring addresses is being ensured. This causes > errors when the vring size is larger than the IOTLB page size. E.g: > queue sizes > 256 for 4K IOTLB pages > > Ensure the entire vring memory range gets mapped. Refactor duplicated > code for for IOTLB UPDATE and IOTLB INVALIDATE and add packed virtqueue > support. > > Fixes: 09927b524969 ("vhost: translate ring addresses when IOMMU enabled") > Cc: maxime.coquelin@redhat.com > Cc: stable@dpdk.org > > Signed-off-by: Adrian Moreno > --- > lib/librte_vhost/vhost_user.c | 64 +++++++++++++++++++++-------------- > 1 file changed, 39 insertions(+), 25 deletions(-) > > diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c > index 0b72648a5..168ad9e0f 100644 > --- a/lib/librte_vhost/vhost_user.c > +++ b/lib/librte_vhost/vhost_user.c > @@ -558,11 +558,13 @@ ring_addr_to_vva(struct virtio_net *dev, struct vhost_virtqueue *vq, > { > if (dev->features & (1ULL << VIRTIO_F_IOMMU_PLATFORM)) { > uint64_t vva; > + uint64_t req_size = *size; > > vva = vhost_user_iotlb_cache_find(vq, ra, > size, VHOST_ACCESS_RW); > - if (!vva) > - vhost_user_iotlb_miss(dev, ra, VHOST_ACCESS_RW); > + if (req_size != *size) > + vhost_user_iotlb_miss(dev, (ra + *size), > + VHOST_ACCESS_RW); > > return vva; > } > @@ -1570,54 +1572,66 @@ vhost_user_set_req_fd(struct virtio_net **pdev, struct VhostUserMsg *msg, > } > > static int > -is_vring_iotlb_update(struct vhost_virtqueue *vq, struct vhost_iotlb_msg *imsg) > +is_vring_iotlb_split(struct vhost_virtqueue *vq, struct vhost_iotlb_msg *imsg) > { > struct vhost_vring_addr *ra; > - uint64_t start, end; > + uint64_t start, end, len; > > start = imsg->iova; > end = start + imsg->size; > > ra = &vq->ring_addrs; > - if (ra->desc_user_addr >= start && ra->desc_user_addr < end) > + len = sizeof(struct vring_desc) * vq->size; > + if (ra->desc_user_addr < end && (ra->desc_user_addr + len) > start) > return 1; > - if (ra->avail_user_addr >= start && ra->avail_user_addr < end) > + > + len = sizeof(struct vring_avail) + sizeof(uint16_t) * vq->size; > + if (ra->avail_user_addr < end && (ra->avail_user_addr + len) > start) > return 1; > - if (ra->used_user_addr >= start && ra->used_user_addr < end) > + > + len = sizeof(struct vring_used) + > + sizeof(struct vring_used_elem) * vq->size; > + if (ra->used_user_addr < end && (ra->used_user_addr + len) > start) > return 1; > > return 0; > } > > static int > -is_vring_iotlb_invalidate(struct vhost_virtqueue *vq, > - struct vhost_iotlb_msg *imsg) > +is_vring_iotlb_packed(struct vhost_virtqueue *vq, struct vhost_iotlb_msg *imsg) > { > - uint64_t istart, iend, vstart, vend; > + struct vhost_vring_addr *ra; > + uint64_t start, end, len; > > - istart = imsg->iova; > - iend = istart + imsg->size - 1; > + start = imsg->iova; > + end = start + imsg->size; > > - vstart = (uintptr_t)vq->desc; > - vend = vstart + sizeof(struct vring_desc) * vq->size - 1; > - if (vstart <= iend && istart <= vend) > + ra = &vq->ring_addrs; > + len = sizeof(struct vring_packed_desc) * vq->size; > + if (ra->desc_user_addr < end && (ra->desc_user_addr + len) > start) > return 1; > > - vstart = (uintptr_t)vq->avail; > - vend = vstart + sizeof(struct vring_avail); > - vend += sizeof(uint16_t) * vq->size - 1; > - if (vstart <= iend && istart <= vend) > + len = sizeof(struct vring_packed_desc_event); > + if (ra->avail_user_addr < end && (ra->avail_user_addr + len) > start) > return 1; > > - vstart = (uintptr_t)vq->used; > - vend = vstart + sizeof(struct vring_used); > - vend += sizeof(struct vring_used_elem) * vq->size - 1; > - if (vstart <= iend && istart <= vend) > + len = sizeof(struct vring_packed_desc_event); > + if (ra->used_user_addr < end && (ra->used_user_addr + len) > start) > return 1; > > return 0; > } > > +static int is_vring_iotlb(struct virtio_net *dev, > + struct vhost_virtqueue *vq, > + struct vhost_iotlb_msg *imsg) > +{ > + if (vq_is_packed(dev)) > + return is_vring_iotlb_packed(vq, imsg); > + else > + return is_vring_iotlb_split(vq, imsg); > +} > + > static int > vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg, > int main_fd __rte_unused) > @@ -1640,7 +1654,7 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg, > vhost_user_iotlb_cache_insert(vq, imsg->iova, vva, > len, imsg->perm); > > - if (is_vring_iotlb_update(vq, imsg)) > + if (is_vring_iotlb(dev, vq, imsg)) > *pdev = dev = translate_ring_addresses(dev, i); > } > break; > @@ -1651,7 +1665,7 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg, > vhost_user_iotlb_cache_remove(vq, imsg->iova, > imsg->size); > > - if (is_vring_iotlb_invalidate(vq, imsg)) > + if (is_vring_iotlb(dev, vq, imsg)) > vring_invalidate(dev, vq); > } > break; >