From patchwork Tue Jul 4 09:49:12 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 26347 X-Patchwork-Delegate: yuanhan.liu@linux.intel.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id C71F27CB5; Tue, 4 Jul 2017 11:50:18 +0200 (CEST) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 1DB9D7CA9 for ; Tue, 4 Jul 2017 11:50:17 +0200 (CEST) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 66867C04B321; Tue, 4 Jul 2017 09:50:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 66867C04B321 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=maxime.coquelin@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 66867C04B321 Received: from localhost.localdomain (ovpn-112-47.ams2.redhat.com [10.36.112.47]) by smtp.corp.redhat.com (Postfix) with ESMTP id 593F763F69; Tue, 4 Jul 2017 09:50:08 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, Yuanhan Liu Cc: mst@redhat.com, vkaplans@redhat.com, jasowang@redhat.com, jfreiman@redhat.com, Maxime Coquelin Date: Tue, 4 Jul 2017 11:49:12 +0200 Message-Id: <20170704094922.11405-10-maxime.coquelin@redhat.com> In-Reply-To: <20170704094922.11405-1-maxime.coquelin@redhat.com> References: <20170704094922.11405-1-maxime.coquelin@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 04 Jul 2017 09:50:16 +0000 (UTC) Subject: [dpdk-dev] [RFC 09/19] vhost: implement IOTLB events notification mechanism X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" In case of IOTLB miss, the processing threads wait for the IOTLB events to parse the IOTLB cache and find requested entries. This event is to be raised on IOTLB update as it might match the awaited entry, on IOTLB invalidate to stop the ring if the invalidate matches ring addresses and on vring stop to be able to destroy the ring. Signed-off-by: Maxime Coquelin --- lib/librte_vhost/iotlb.c | 1 + lib/librte_vhost/vhost.c | 16 ++++++++++++++++ lib/librte_vhost/vhost.h | 2 ++ lib/librte_vhost/vhost_user.c | 10 ++++++++++ 4 files changed, 29 insertions(+) diff --git a/lib/librte_vhost/iotlb.c b/lib/librte_vhost/iotlb.c index 02457fa..025d6c6 100644 --- a/lib/librte_vhost/iotlb.c +++ b/lib/librte_vhost/iotlb.c @@ -206,6 +206,7 @@ int vhost_user_iotlb_init(struct virtio_net *dev, int vq_index) socket = 0; rte_rwlock_init(&vq->iotlb_lock); + rte_atomic16_init(&vq->iotlb_event); TAILQ_INIT(&vq->iotlb_list); diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c index 06b8f20..3897f9c 100644 --- a/lib/librte_vhost/vhost.c +++ b/lib/librte_vhost/vhost.c @@ -191,6 +191,17 @@ free_device(struct virtio_net *dev) rte_free(dev); } +void notify_iotlb_event(struct virtio_net *dev) +{ + struct vhost_virtqueue *vq; + uint32_t i; + + for (i = 0; i < dev->nr_vring; i++) { + vq = dev->virtqueue[i]; + rte_atomic16_set(&vq->iotlb_event, 1); + } +} + static void init_vring_queue(struct virtio_net *dev, uint32_t vring_idx) { @@ -313,6 +324,11 @@ vhost_destroy_device(int vid) if (dev->flags & VIRTIO_DEV_RUNNING) { dev->flags &= ~VIRTIO_DEV_RUNNING; + /* + * Unblock processing threads waiting for + * IOTLB updates, if any. + */ + notify_iotlb_event(dev); dev->notify_ops->destroy_device(vid); } diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index 7816a92..3242658 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -119,6 +119,7 @@ struct vhost_virtqueue { rte_rwlock_t iotlb_lock; struct rte_mempool *iotlb_pool; TAILQ_HEAD(, vhost_iotlb_entry) iotlb_list; + rte_atomic16_t iotlb_event; } __rte_cache_aligned; /* Old kernels have no such macros defined */ @@ -350,5 +351,6 @@ struct vhost_device_ops const *vhost_driver_callback_get(const char *path); * TODO: fix it; we have one backend now */ void vhost_backend_cleanup(struct virtio_net *dev); +void notify_iotlb_event(struct virtio_net *dev); #endif /* _VHOST_NET_CDEV_H_ */ diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index 8b4a2b3..6b41fea 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c @@ -145,6 +145,11 @@ vhost_user_reset_owner(struct virtio_net *dev) { if (dev->flags & VIRTIO_DEV_RUNNING) { dev->flags &= ~VIRTIO_DEV_RUNNING; + /* + * Unblock processing threads waiting for + * IOTLB updates, if any. + */ + notify_iotlb_event(dev); dev->notify_ops->destroy_device(dev->vid); } @@ -691,6 +696,11 @@ vhost_user_get_vring_base(struct virtio_net *dev, /* We have to stop the queue (virtio) if it is running. */ if (dev->flags & VIRTIO_DEV_RUNNING) { dev->flags &= ~VIRTIO_DEV_RUNNING; + /* + * Unblock processing threads waiting for + * IOTLB updates, if any. + */ + notify_iotlb_event(dev); dev->notify_ops->destroy_device(dev->vid); }