From: Patrick Fu <patrick.fu@intel.com>
To: dev@dpdk.org, maxime.coquelin@redhat.com, chenbo.xia@intel.com
Cc: zhihong.wang@intel.com, cheng1.jiang@intel.com, patrick.fu@intel.com
Subject: [dpdk-dev] [PATCH v3 2/4] vhost: dynamically allocate async memory
Date: Tue, 29 Sep 2020 17:29:53 +0800 [thread overview]
Message-ID: <20200929092955.2848419-3-patrick.fu@intel.com> (raw)
In-Reply-To: <20200929092955.2848419-1-patrick.fu@intel.com>
Allocate async internal memory buffer by rte_malloc(), replacing array
declaration inside vq structure. Dynamic allocation can help to save
memory footprint when async path is not registered.
Signed-off-by: Patrick Fu <patrick.fu@intel.com>
---
lib/librte_vhost/vhost.c | 69 ++++++++++++++++++++++++++--------------
lib/librte_vhost/vhost.h | 4 +--
2 files changed, 47 insertions(+), 26 deletions(-)
diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
index eca507836..05b578c2f 100644
--- a/lib/librte_vhost/vhost.c
+++ b/lib/librte_vhost/vhost.c
@@ -324,6 +324,24 @@ cleanup_device(struct virtio_net *dev, int destroy)
}
}
+static void
+vhost_free_async_mem(struct vhost_virtqueue *vq)
+{
+ if (vq->async_pkts_pending)
+ rte_free(vq->async_pkts_pending);
+ if (vq->async_pkts_info)
+ rte_free(vq->async_pkts_info);
+ if (vq->it_pool)
+ rte_free(vq->it_pool);
+ if (vq->vec_pool)
+ rte_free(vq->vec_pool);
+
+ vq->async_pkts_pending = NULL;
+ vq->async_pkts_info = NULL;
+ vq->it_pool = NULL;
+ vq->vec_pool = NULL;
+}
+
void
free_vq(struct virtio_net *dev, struct vhost_virtqueue *vq)
{
@@ -331,10 +349,7 @@ free_vq(struct virtio_net *dev, struct vhost_virtqueue *vq)
rte_free(vq->shadow_used_packed);
else {
rte_free(vq->shadow_used_split);
- if (vq->async_pkts_pending)
- rte_free(vq->async_pkts_pending);
- if (vq->async_pkts_info)
- rte_free(vq->async_pkts_info);
+ vhost_free_async_mem(vq);
}
rte_free(vq->batch_copy_elems);
rte_mempool_free(vq->iotlb_pool);
@@ -1538,6 +1553,7 @@ int rte_vhost_async_channel_register(int vid, uint16_t queue_id,
struct vhost_virtqueue *vq;
struct virtio_net *dev = get_device(vid);
struct rte_vhost_async_features f;
+ int node;
if (dev == NULL || ops == NULL)
return -1;
@@ -1570,19 +1586,32 @@ int rte_vhost_async_channel_register(int vid, uint16_t queue_id,
goto reg_out;
}
- vq->async_pkts_pending = rte_malloc(NULL,
+#ifdef RTE_LIBRTE_VHOST_NUMA
+ if (get_mempolicy(&node, NULL, 0, vq, MPOL_F_NODE | MPOL_F_ADDR)) {
+ VHOST_LOG_CONFIG(ERR,
+ "unable to get numa information in async register. "
+ "allocating async buffer memory on the caller thread node\n");
+ node = SOCKET_ID_ANY;
+ }
+#else
+ node = SOCKET_ID_ANY;
+#endif
+
+ vq->async_pkts_pending = rte_malloc_socket(NULL,
vq->size * sizeof(uintptr_t),
- RTE_CACHE_LINE_SIZE);
- vq->async_pkts_info = rte_malloc(NULL,
+ RTE_CACHE_LINE_SIZE, node);
+ vq->async_pkts_info = rte_malloc_socket(NULL,
vq->size * sizeof(struct async_inflight_info),
- RTE_CACHE_LINE_SIZE);
- if (!vq->async_pkts_pending || !vq->async_pkts_info) {
- if (vq->async_pkts_pending)
- rte_free(vq->async_pkts_pending);
-
- if (vq->async_pkts_info)
- rte_free(vq->async_pkts_info);
-
+ RTE_CACHE_LINE_SIZE, node);
+ vq->it_pool = rte_malloc_socket(NULL,
+ VHOST_MAX_ASYNC_IT * sizeof(struct rte_vhost_iov_iter),
+ RTE_CACHE_LINE_SIZE, node);
+ vq->vec_pool = rte_malloc_socket(NULL,
+ VHOST_MAX_ASYNC_VEC * sizeof(struct iovec),
+ RTE_CACHE_LINE_SIZE, node);
+ if (!vq->async_pkts_pending || !vq->async_pkts_info ||
+ !vq->it_pool || !vq->vec_pool) {
+ vhost_free_async_mem(vq);
VHOST_LOG_CONFIG(ERR,
"async register failed: cannot allocate memory for vq data "
"(vid %d, qid: %d)\n", vid, queue_id);
@@ -1630,15 +1659,7 @@ int rte_vhost_async_channel_unregister(int vid, uint16_t queue_id)
goto out;
}
- if (vq->async_pkts_pending) {
- rte_free(vq->async_pkts_pending);
- vq->async_pkts_pending = NULL;
- }
-
- if (vq->async_pkts_info) {
- rte_free(vq->async_pkts_info);
- vq->async_pkts_info = NULL;
- }
+ vhost_free_async_mem(vq);
vq->async_ops.transfer_data = NULL;
vq->async_ops.check_completed_copies = NULL;
diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h
index 155a832c1..f0ee00c73 100644
--- a/lib/librte_vhost/vhost.h
+++ b/lib/librte_vhost/vhost.h
@@ -218,8 +218,8 @@ struct vhost_virtqueue {
/* operation callbacks for async dma */
struct rte_vhost_async_channel_ops async_ops;
- struct rte_vhost_iov_iter it_pool[VHOST_MAX_ASYNC_IT];
- struct iovec vec_pool[VHOST_MAX_ASYNC_VEC];
+ struct rte_vhost_iov_iter *it_pool;
+ struct iovec *vec_pool;
/* async data transfer status */
uintptr_t **async_pkts_pending;
--
2.18.4
next prev parent reply other threads:[~2020-09-29 9:38 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-11 1:53 [dpdk-dev] [PATCH v1 0/4] optimize async data path Patrick Fu
2020-09-11 1:53 ` [dpdk-dev] [PATCH v1 1/4] vhost: simplify async copy completion Patrick Fu
2020-09-23 9:07 ` Maxime Coquelin
2020-09-11 1:53 ` [dpdk-dev] [PATCH v1 2/4] vhost: dynamically alloc async memory Patrick Fu
2020-09-23 9:15 ` Maxime Coquelin
2020-09-29 5:55 ` Fu, Patrick
2020-09-11 1:53 ` [dpdk-dev] [PATCH v1 3/4] vhost: fix async vec buf overrun Patrick Fu
2020-09-23 9:21 ` Maxime Coquelin
2020-09-29 2:23 ` Fu, Patrick
2020-09-11 1:53 ` [dpdk-dev] [PATCH v1 4/4] vhost: fix async register/unregister deadlock Patrick Fu
2020-09-29 6:29 ` [dpdk-dev] [PATCH v2 0/4] optimize async data path Patrick Fu
2020-09-29 6:29 ` [dpdk-dev] [PATCH v2 1/4] vhost: simplify async copy completion Patrick Fu
2020-09-29 6:29 ` [dpdk-dev] [PATCH v2 2/4] vhost: dynamically allocate async memory Patrick Fu
2020-09-29 6:29 ` [dpdk-dev] [PATCH v2 3/4] vhost: fix async vector buffer overrun Patrick Fu
2020-09-29 6:29 ` [dpdk-dev] [PATCH v2 4/4] vhost: fix async register/unregister deadlock Patrick Fu
2020-09-29 9:29 ` [dpdk-dev] [PATCH v3 0/4] optimize async data path Patrick Fu
2020-09-29 9:29 ` [dpdk-dev] [PATCH v3 1/4] vhost: simplify async copy completion Patrick Fu
2020-10-05 13:46 ` Maxime Coquelin
2020-10-09 11:16 ` Fu, Patrick
2020-09-29 9:29 ` Patrick Fu [this message]
2020-10-05 13:50 ` [dpdk-dev] [PATCH v3 2/4] vhost: dynamically allocate async memory Maxime Coquelin
2020-09-29 9:29 ` [dpdk-dev] [PATCH v3 3/4] vhost: fix async vector buffer overrun Patrick Fu
2020-10-05 14:19 ` Maxime Coquelin
2020-09-29 9:29 ` [dpdk-dev] [PATCH v3 4/4] vhost: fix async register/unregister deadlock Patrick Fu
2020-10-05 14:25 ` Maxime Coquelin
2020-10-09 10:54 ` Fu, Patrick
2020-10-13 1:45 ` [dpdk-dev] [PATCH v4 0/4] optimize async data path Patrick Fu
2020-10-13 1:45 ` [dpdk-dev] [PATCH v4 1/4] vhost: simplify async copy completion Patrick Fu
2020-10-14 9:28 ` Maxime Coquelin
2020-10-13 1:45 ` [dpdk-dev] [PATCH v4 2/4] vhost: dynamically allocate async memory Patrick Fu
2020-10-14 9:30 ` Maxime Coquelin
2020-10-13 1:45 ` [dpdk-dev] [PATCH v4 3/4] vhost: fix async vector buffer overrun Patrick Fu
2020-10-14 9:33 ` Maxime Coquelin
2020-10-13 1:45 ` [dpdk-dev] [PATCH v4 4/4] vhost: fix async unregister deadlock Patrick Fu
2020-10-14 9:34 ` Maxime Coquelin
2020-10-15 15:40 ` [dpdk-dev] [PATCH v4 0/4] optimize async data path Maxime Coquelin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200929092955.2848419-3-patrick.fu@intel.com \
--to=patrick.fu@intel.com \
--cc=chenbo.xia@intel.com \
--cc=cheng1.jiang@intel.com \
--cc=dev@dpdk.org \
--cc=maxime.coquelin@redhat.com \
--cc=zhihong.wang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.