From patchwork Tue Jun 29 16:11:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 94989 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id C9BE6A0C3F; Tue, 29 Jun 2021 18:11:53 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3C33A411CB; Tue, 29 Jun 2021 18:11:50 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id CB8BC40E01 for ; Tue, 29 Jun 2021 18:11:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1624983107; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cP+XjcLIDCf8ElNwaeEu6XLhEofcNtQu2qhSsbWNAXs=; b=M6l77DMeC9MZu4kj2CtQKG2xZWE/dV7VmLsB/+Z03OgnA5aazAArk3J5t7X2CRhaEtX64e YIqCVxlIaFEFuTjTi0VunpSbtclLzuSbPYsOpr8RbfNgZOkdtgv0BX7DDp37Z7HAOR1fKj 4uITu/W3KvLfn6FEV7IxE8XnmVRGFx8= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-2-6PtiYmf1P4WBacd0AcjFOQ-1; Tue, 29 Jun 2021 12:11:45 -0400 X-MC-Unique: 6PtiYmf1P4WBacd0AcjFOQ-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id EDD86A0CB7; Tue, 29 Jun 2021 16:11:44 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id B31295C1D0; Tue, 29 Jun 2021 16:11:43 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, david.marchand@redhat.com Cc: Maxime Coquelin , stable@dpdk.org Date: Tue, 29 Jun 2021 18:11:27 +0200 Message-Id: <20210629161133.79472-2-maxime.coquelin@redhat.com> In-Reply-To: <20210629161133.79472-1-maxime.coquelin@redhat.com> References: <20210629161133.79472-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v7 1/7] vhost: fix missing memory table NUMA realloc X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" When the guest allocates virtqueues on a different NUMA node than the one the Vhost metadata are allocated, both the Vhost device struct and the virtqueues struct are reallocated. However, reallocating the Vhost memory table was missing, which likely causes at least one cross-NUMA accesses for every burst of packets. This patch reallocates this table on the same NUMA node as the other metadata. Fixes: 552e8fd3d2b4 ("vhost: simplify memory regions handling") Cc: stable@dpdk.org Reported-by: David Marchand Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- lib/vhost/vhost_user.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index 8f0eba6412..b5a84f3dcd 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -473,8 +473,8 @@ vhost_user_set_vring_num(struct virtio_net **pdev, } /* - * Reallocate virtio_dev and vhost_virtqueue data structure to make them on the - * same numa node as the memory of vring descriptor. + * Reallocate virtio_dev, vhost_virtqueue and related data structures to + * make them on the same numa node as the memory of vring descriptor. */ #ifdef RTE_LIBRTE_VHOST_NUMA static struct virtio_net* @@ -557,6 +557,9 @@ numa_realloc(struct virtio_net *dev, int index) goto out; } if (oldnode != newnode) { + struct rte_vhost_memory *old_mem; + ssize_t mem_size; + VHOST_LOG_CONFIG(INFO, "reallocate dev from %d to %d node\n", oldnode, newnode); @@ -568,6 +571,18 @@ numa_realloc(struct virtio_net *dev, int index) memcpy(dev, old_dev, sizeof(*dev)); rte_free(old_dev); + + mem_size = sizeof(struct rte_vhost_memory) + + sizeof(struct rte_vhost_mem_region) * dev->mem->nregions; + old_mem = dev->mem; + dev->mem = rte_malloc_socket(NULL, mem_size, 0, newnode); + if (!dev->mem) { + dev->mem = old_mem; + goto out; + } + + memcpy(dev->mem, old_mem, mem_size); + rte_free(old_mem); } out: From patchwork Tue Jun 29 16:11:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 94990 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8EF21A0C3F; Tue, 29 Jun 2021 18:12:01 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 77885411DD; Tue, 29 Jun 2021 18:11:51 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mails.dpdk.org (Postfix) with ESMTP id 2721D411C7 for ; Tue, 29 Jun 2021 18:11:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1624983109; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=z744OsChCa0kJWTigKK4nJUwmyVfah9TWou/0Hr6484=; b=TR/W4AsrBhXh546xFboXocv/bEbh4karQoXLxCkaRA/D4YV8Kafln4Cnc/t+ywMU/5bVhW LcG9o7vuXk2V/v7x8G8AzqB5Bs9xx7mIdskE+FsdrnXAQVKbSuQCHM22Y8pt86zqTO82Yt WvGip/rg5FjH0iJHlzW0/VvUVQy3Tj8= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-541-UI35MkUfMhCDdWkWarqGEg-1; Tue, 29 Jun 2021 12:11:47 -0400 X-MC-Unique: UI35MkUfMhCDdWkWarqGEg-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8D1AE100C609; Tue, 29 Jun 2021 16:11:46 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id 501DD5C1D0; Tue, 29 Jun 2021 16:11:45 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, david.marchand@redhat.com Cc: Maxime Coquelin , stable@dpdk.org Date: Tue, 29 Jun 2021 18:11:28 +0200 Message-Id: <20210629161133.79472-3-maxime.coquelin@redhat.com> In-Reply-To: <20210629161133.79472-1-maxime.coquelin@redhat.com> References: <20210629161133.79472-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v7 2/7] vhost: fix missing guest pages table NUMA realloc X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" When the guest allocates virtqueues on a different NUMA node than the one the Vhost metadata are allocated, both the Vhost device struct and the virtqueues struct are reallocated. However, reallocating the guest pages table was missing, which likely causes at least one cross-NUMA accesses for every burst of packets. This patch reallocates this table on the same NUMA node as the other metadata. Fixes: e246896178e6 ("vhost: get guest/host physical address mappings") Cc: stable@dpdk.org Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- lib/vhost/vhost_user.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index b5a84f3dcd..5fb055ea2e 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -558,7 +558,8 @@ numa_realloc(struct virtio_net *dev, int index) } if (oldnode != newnode) { struct rte_vhost_memory *old_mem; - ssize_t mem_size; + struct guest_page *old_gp; + ssize_t mem_size, gp_size; VHOST_LOG_CONFIG(INFO, "reallocate dev from %d to %d node\n", @@ -583,6 +584,17 @@ numa_realloc(struct virtio_net *dev, int index) memcpy(dev->mem, old_mem, mem_size); rte_free(old_mem); + + gp_size = dev->max_guest_pages * sizeof(*dev->guest_pages); + old_gp = dev->guest_pages; + dev->guest_pages = rte_malloc_socket(NULL, gp_size, RTE_CACHE_LINE_SIZE, newnode); + if (!dev->guest_pages) { + dev->guest_pages = old_gp; + goto out; + } + + memcpy(dev->guest_pages, old_gp, gp_size); + rte_free(old_gp); } out: From patchwork Tue Jun 29 16:11:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 94991 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E938BA0C3F; Tue, 29 Jun 2021 18:12:07 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8DC62411C9; Tue, 29 Jun 2021 18:11:54 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mails.dpdk.org (Postfix) with ESMTP id 3BE56411D2 for ; Tue, 29 Jun 2021 18:11:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1624983110; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4nA/YdQzawgs4cnJ0LJABUiVp395zGgXIjBbifv+O5A=; b=GlqF+B0RINa+fOVtY5e80HRNUokNz5ivBKFvY5onTqNw1ke1tDIrx48dNQ08ovmyfhVEnv 9vX8EZpc1ZgNqutlIpaEdRwmjGTb2OLEOplxWaYmCG4ds8fQDHh+Gp28dZ2+jDEUqXEbSN RtVA9WmNf89r925kDixScWnZmltyNtY= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-263-TzhTpWCcO1aptPastIaYMw-1; Tue, 29 Jun 2021 12:11:49 -0400 X-MC-Unique: TzhTpWCcO1aptPastIaYMw-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F39061835AC7; Tue, 29 Jun 2021 16:11:47 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id E0FBA5C1D0; Tue, 29 Jun 2021 16:11:46 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Tue, 29 Jun 2021 18:11:29 +0200 Message-Id: <20210629161133.79472-4-maxime.coquelin@redhat.com> In-Reply-To: <20210629161133.79472-1-maxime.coquelin@redhat.com> References: <20210629161133.79472-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v7 3/7] vhost: fix missing cache logging NUMA realloc X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" When the guest allocates virtqueues on a different NUMA node than the one the Vhost metadata are allocated, both the Vhost device struct and the virtqueues struct are reallocated. However, reallocating the log cache on the new NUMA node was not done. This patch fixes this by reallocating it if it has been allocated already, which means a live-migration is on-going. Fixes: 1818a63147fb ("vhost: move dirty logging cache out of virtqueue") Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- lib/vhost/vhost_user.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index 5fb055ea2e..82adf80fe5 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -545,6 +545,16 @@ numa_realloc(struct virtio_net *dev, int index) vq->batch_copy_elems = new_batch_copy_elems; } + if (vq->log_cache) { + struct log_cache_entry *log_cache; + + log_cache = rte_realloc_socket(vq->log_cache, + sizeof(struct log_cache_entry) * VHOST_LOG_CACHE_NR, + 0, newnode); + if (log_cache) + vq->log_cache = log_cache; + } + rte_free(old_vq); } From patchwork Tue Jun 29 16:11:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 94992 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id F3063A0C3F; Tue, 29 Jun 2021 18:12:14 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AFFAD411EB; Tue, 29 Jun 2021 18:11:56 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 9025A411D4 for ; Tue, 29 Jun 2021 18:11:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1624983114; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=a92PJGDpE6NOX935b5es9O86+faHrPTzj480GRujjQs=; b=Xeb1mBR/AAwMp+wE5NG3IMPdB8JuNC9dNKSkCI0ci8nj3uC0U/B/+zttmy9uACMKzmJ/mn Y/HTzJj21fueWac4P6l3Jy63XApBNuLhpn2weyplxb8M9h0/VBcpm2U1F05Rv64FKPZIcg RivMFgi4xDbr018ctLWoSzaCl8BPx7k= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-508-V7XDu5lXOFu5UdfoM1Ua9A-1; Tue, 29 Jun 2021 12:11:50 -0400 X-MC-Unique: V7XDu5lXOFu5UdfoM1Ua9A-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 939F7802935; Tue, 29 Jun 2021 16:11:49 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id 57F525C1D0; Tue, 29 Jun 2021 16:11:48 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, david.marchand@redhat.com Cc: Maxime Coquelin , stable@dpdk.org Date: Tue, 29 Jun 2021 18:11:30 +0200 Message-Id: <20210629161133.79472-5-maxime.coquelin@redhat.com> In-Reply-To: <20210629161133.79472-1-maxime.coquelin@redhat.com> References: <20210629161133.79472-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v7 4/7] vhost: fix NUMA reallocation with multiqueue X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" Since the Vhost-user device initialization has been reworked, enabling the application to start using the device as soon as the first queue pair is ready, NUMA reallocation no more happened on queue pairs other than the first one since numa_realloc() was returning early if the device was running. This patch fixes this issue by only preventing the device metadata to be allocated if the device is running. For the virtqueues, a vring state change notification is sent to notify the application of its disablement. Since the callback is supposed to be blocking, it is safe to reallocate it afterwards. Fixes: d0fcc38f5fa4 ("vhost: improve device readiness notifications") Cc: stable@dpdk.org Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- lib/vhost/vhost_user.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index 82adf80fe5..51b96a0716 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -488,12 +488,16 @@ numa_realloc(struct virtio_net *dev, int index) struct batch_copy_elem *new_batch_copy_elems; int ret; - if (dev->flags & VIRTIO_DEV_RUNNING) - return dev; - old_dev = dev; vq = old_vq = dev->virtqueue[index]; + /* + * If VQ is ready, it is too late to reallocate, it certainly already + * happened anyway on VHOST_USER_SET_VRING_ADRR. + */ + if (vq->ready) + return dev; + ret = get_mempolicy(&newnode, NULL, 0, old_vq->desc, MPOL_F_NODE | MPOL_F_ADDR); @@ -558,6 +562,9 @@ numa_realloc(struct virtio_net *dev, int index) rte_free(old_vq); } + if (dev->flags & VIRTIO_DEV_RUNNING) + goto out; + /* check if we need to reallocate dev */ ret = get_mempolicy(&oldnode, NULL, 0, old_dev, MPOL_F_NODE | MPOL_F_ADDR); From patchwork Tue Jun 29 16:11:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 94993 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 93FEAA0C3F; Tue, 29 Jun 2021 18:12:20 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CDA79411F4; Tue, 29 Jun 2021 18:11:59 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 19DF2411E9 for ; Tue, 29 Jun 2021 18:11:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1624983115; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=f5bOnp1vlCmWa2AzfwevRaqxLun3aNknzi3SGIHIp4s=; b=TKv/U1MenwJUPe2KcLO6WZV2ZXonFK2nBucZNYz1qmA79sJjMXI+SE9qEyszAB3vjuFZHj JtvyLQLVznPzbELquP3QLKgxihzgCOiAy65TcrmS1fKAUcZHmJoJq57VPAOI3VNv4VHJxE 8q8mncaOi9Fv3E8vZCiNKqwcMajlEnQ= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-20-56t_FlI2PT-jp9BJJgvmHw-1; Tue, 29 Jun 2021 12:11:51 -0400 X-MC-Unique: 56t_FlI2PT-jp9BJJgvmHw-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F1242800D62; Tue, 29 Jun 2021 16:11:50 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id E8CA75C1D0; Tue, 29 Jun 2021 16:11:49 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Tue, 29 Jun 2021 18:11:31 +0200 Message-Id: <20210629161133.79472-6-maxime.coquelin@redhat.com> In-Reply-To: <20210629161133.79472-1-maxime.coquelin@redhat.com> References: <20210629161133.79472-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v7 5/7] vhost: improve NUMA reallocation X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" This patch improves the numa_realloc() function by making use of rte_realloc_socket(), which takes care of the memory copy and freeing of the old data. Suggested-by: David Marchand Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- lib/vhost/vhost_user.c | 186 ++++++++++++++++++----------------------- 1 file changed, 81 insertions(+), 105 deletions(-) diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index 51b96a0716..d6ec4000c3 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -480,16 +480,17 @@ vhost_user_set_vring_num(struct virtio_net **pdev, static struct virtio_net* numa_realloc(struct virtio_net *dev, int index) { - int oldnode, newnode; + int node, dev_node; struct virtio_net *old_dev; - struct vhost_virtqueue *old_vq, *vq; - struct vring_used_elem *new_shadow_used_split; - struct vring_used_elem_packed *new_shadow_used_packed; - struct batch_copy_elem *new_batch_copy_elems; + struct vhost_virtqueue *vq; + struct batch_copy_elem *bce; + struct guest_page *gp; + struct rte_vhost_memory *mem; + size_t mem_size; int ret; old_dev = dev; - vq = old_vq = dev->virtqueue[index]; + vq = dev->virtqueue[index]; /* * If VQ is ready, it is too late to reallocate, it certainly already @@ -498,128 +499,103 @@ numa_realloc(struct virtio_net *dev, int index) if (vq->ready) return dev; - ret = get_mempolicy(&newnode, NULL, 0, old_vq->desc, - MPOL_F_NODE | MPOL_F_ADDR); - - /* check if we need to reallocate vq */ - ret |= get_mempolicy(&oldnode, NULL, 0, old_vq, - MPOL_F_NODE | MPOL_F_ADDR); + ret = get_mempolicy(&node, NULL, 0, vq->desc, MPOL_F_NODE | MPOL_F_ADDR); if (ret) { - VHOST_LOG_CONFIG(ERR, - "Unable to get vq numa information.\n"); + VHOST_LOG_CONFIG(ERR, "Unable to get virtqueue %d numa information.\n", index); return dev; } - if (oldnode != newnode) { - VHOST_LOG_CONFIG(INFO, - "reallocate vq from %d to %d node\n", oldnode, newnode); - vq = rte_malloc_socket(NULL, sizeof(*vq), 0, newnode); - if (!vq) - return dev; - memcpy(vq, old_vq, sizeof(*vq)); + vq = rte_realloc_socket(vq, sizeof(*vq), 0, node); + if (!vq) { + VHOST_LOG_CONFIG(ERR, "Failed to realloc virtqueue %d on node %d\n", + index, node); + return dev; + } - if (vq_is_packed(dev)) { - new_shadow_used_packed = rte_malloc_socket(NULL, - vq->size * - sizeof(struct vring_used_elem_packed), - RTE_CACHE_LINE_SIZE, - newnode); - if (new_shadow_used_packed) { - rte_free(vq->shadow_used_packed); - vq->shadow_used_packed = new_shadow_used_packed; - } - } else { - new_shadow_used_split = rte_malloc_socket(NULL, - vq->size * - sizeof(struct vring_used_elem), - RTE_CACHE_LINE_SIZE, - newnode); - if (new_shadow_used_split) { - rte_free(vq->shadow_used_split); - vq->shadow_used_split = new_shadow_used_split; - } + if (vq != dev->virtqueue[index]) { + VHOST_LOG_CONFIG(INFO, "reallocated virtqueue on node %d\n", node); + dev->virtqueue[index] = vq; + vhost_user_iotlb_init(dev, index); + } + + if (vq_is_packed(dev)) { + struct vring_used_elem_packed *sup; + + sup = rte_realloc_socket(vq->shadow_used_packed, vq->size * sizeof(*sup), + RTE_CACHE_LINE_SIZE, node); + if (!sup) { + VHOST_LOG_CONFIG(ERR, "Failed to realloc shadow packed on node %d\n", node); + return dev; } + vq->shadow_used_packed = sup; + } else { + struct vring_used_elem *sus; - new_batch_copy_elems = rte_malloc_socket(NULL, - vq->size * sizeof(struct batch_copy_elem), - RTE_CACHE_LINE_SIZE, - newnode); - if (new_batch_copy_elems) { - rte_free(vq->batch_copy_elems); - vq->batch_copy_elems = new_batch_copy_elems; + sus = rte_realloc_socket(vq->shadow_used_split, vq->size * sizeof(*sus), + RTE_CACHE_LINE_SIZE, node); + if (!sus) { + VHOST_LOG_CONFIG(ERR, "Failed to realloc shadow split on node %d\n", node); + return dev; } + vq->shadow_used_split = sus; + } - if (vq->log_cache) { - struct log_cache_entry *log_cache; + bce = rte_realloc_socket(vq->batch_copy_elems, vq->size * sizeof(*bce), + RTE_CACHE_LINE_SIZE, node); + if (!bce) { + VHOST_LOG_CONFIG(ERR, "Failed to realloc batch copy elem on node %d\n", node); + return dev; + } + vq->batch_copy_elems = bce; - log_cache = rte_realloc_socket(vq->log_cache, - sizeof(struct log_cache_entry) * VHOST_LOG_CACHE_NR, - 0, newnode); - if (log_cache) - vq->log_cache = log_cache; - } + if (vq->log_cache) { + struct log_cache_entry *lc; - rte_free(old_vq); + lc = rte_realloc_socket(vq->log_cache, sizeof(*lc) * VHOST_LOG_CACHE_NR, 0, node); + if (!lc) { + VHOST_LOG_CONFIG(ERR, "Failed to realloc log cache on node %d\n", node); + return dev; + } + vq->log_cache = lc; } if (dev->flags & VIRTIO_DEV_RUNNING) - goto out; + return dev; - /* check if we need to reallocate dev */ - ret = get_mempolicy(&oldnode, NULL, 0, old_dev, - MPOL_F_NODE | MPOL_F_ADDR); + ret = get_mempolicy(&dev_node, NULL, 0, dev, MPOL_F_NODE | MPOL_F_ADDR); if (ret) { - VHOST_LOG_CONFIG(ERR, - "Unable to get dev numa information.\n"); - goto out; + VHOST_LOG_CONFIG(ERR, "Unable to get Virtio dev %d numa information.\n", dev->vid); + return dev; } - if (oldnode != newnode) { - struct rte_vhost_memory *old_mem; - struct guest_page *old_gp; - ssize_t mem_size, gp_size; - - VHOST_LOG_CONFIG(INFO, - "reallocate dev from %d to %d node\n", - oldnode, newnode); - dev = rte_malloc_socket(NULL, sizeof(*dev), 0, newnode); - if (!dev) { - dev = old_dev; - goto out; - } - - memcpy(dev, old_dev, sizeof(*dev)); - rte_free(old_dev); - - mem_size = sizeof(struct rte_vhost_memory) + - sizeof(struct rte_vhost_mem_region) * dev->mem->nregions; - old_mem = dev->mem; - dev->mem = rte_malloc_socket(NULL, mem_size, 0, newnode); - if (!dev->mem) { - dev->mem = old_mem; - goto out; - } - - memcpy(dev->mem, old_mem, mem_size); - rte_free(old_mem); - gp_size = dev->max_guest_pages * sizeof(*dev->guest_pages); - old_gp = dev->guest_pages; - dev->guest_pages = rte_malloc_socket(NULL, gp_size, RTE_CACHE_LINE_SIZE, newnode); - if (!dev->guest_pages) { - dev->guest_pages = old_gp; - goto out; - } + if (dev_node == node) + return dev; - memcpy(dev->guest_pages, old_gp, gp_size); - rte_free(old_gp); + dev = rte_realloc_socket(old_dev, sizeof(*dev), 0, node); + if (!dev) { + VHOST_LOG_CONFIG(ERR, "Failed to realloc dev on node %d\n", node); + return old_dev; } -out: - dev->virtqueue[index] = vq; + VHOST_LOG_CONFIG(INFO, "reallocated device on node %d\n", node); vhost_devices[dev->vid] = dev; - if (old_vq != vq) - vhost_user_iotlb_init(dev, index); + mem_size = sizeof(struct rte_vhost_memory) + + sizeof(struct rte_vhost_mem_region) * dev->mem->nregions; + mem = rte_realloc_socket(dev->mem, mem_size, 0, node); + if (!mem) { + VHOST_LOG_CONFIG(ERR, "Failed to realloc mem table on node %d\n", node); + return dev; + } + dev->mem = mem; + + gp = rte_realloc_socket(dev->guest_pages, dev->max_guest_pages * sizeof(*gp), + RTE_CACHE_LINE_SIZE, node); + if (!gp) { + VHOST_LOG_CONFIG(ERR, "Failed to realloc guest pages on node %d\n", node); + return dev; + } + dev->guest_pages = gp; return dev; } From patchwork Tue Jun 29 16:11:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 94995 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id E067AA0C3F; Tue, 29 Jun 2021 18:12:32 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0444041207; Tue, 29 Jun 2021 18:12:02 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mails.dpdk.org (Postfix) with ESMTP id 0289E411F2 for ; Tue, 29 Jun 2021 18:11:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1624983117; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Z9QtokOZEakyrBN2qXtE6pOpzvmAV/32F6/KtWt2VaE=; b=MpYxtyatTQ6KaaKp7zQGpmQOM16EjlscPj91htESUUqg65la9liapgdncH0KJr3QFxTCD+ YTJY++7FVQjwfOB2LvqlKIUcqRDCVntPnHQnwnduUIVaDy321GHNEVJq8qtwb74PnbNRaO 93MEX7xB+I82p2eSpWAxdnTbm/g/4b0= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-573--4OLgPXbOnyuYwkobd1sIw-1; Tue, 29 Jun 2021 12:11:53 -0400 X-MC-Unique: -4OLgPXbOnyuYwkobd1sIw-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 5FD3C1835AC3; Tue, 29 Jun 2021 16:11:52 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id 487A65C1D1; Tue, 29 Jun 2021 16:11:51 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Tue, 29 Jun 2021 18:11:32 +0200 Message-Id: <20210629161133.79472-7-maxime.coquelin@redhat.com> In-Reply-To: <20210629161133.79472-1-maxime.coquelin@redhat.com> References: <20210629161133.79472-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v7 6/7] vhost: allocate all data on same node as virtqueue X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" This patch saves the NUMA node the virtqueue is allocated on at init time, in order to allocate all other data on the same node. While most of the data are allocated before numa_realloc() is called and so the data will be reallocated properly, some data like the log cache are most likely allocated after. For the virtio device metadata, we decide to allocate them on the same node as the VQ 0. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- lib/vhost/vhost.c | 34 ++++++++++++++++------------------ lib/vhost/vhost.h | 1 + lib/vhost/vhost_user.c | 41 ++++++++++++++++++++++++++++------------- 3 files changed, 45 insertions(+), 31 deletions(-) diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index c96f6335c8..0000cd3297 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -261,7 +261,7 @@ vhost_alloc_copy_ind_table(struct virtio_net *dev, struct vhost_virtqueue *vq, uint64_t src, dst; uint64_t len, remain = desc_len; - idesc = rte_malloc(__func__, desc_len, 0); + idesc = rte_malloc_socket(__func__, desc_len, 0, vq->numa_node); if (unlikely(!idesc)) return NULL; @@ -549,6 +549,7 @@ static void init_vring_queue(struct virtio_net *dev, uint32_t vring_idx) { struct vhost_virtqueue *vq; + int numa_node = SOCKET_ID_ANY; if (vring_idx >= VHOST_MAX_VRING) { VHOST_LOG_CONFIG(ERR, @@ -570,6 +571,15 @@ init_vring_queue(struct virtio_net *dev, uint32_t vring_idx) vq->callfd = VIRTIO_UNINITIALIZED_EVENTFD; vq->notif_enable = VIRTIO_UNINITIALIZED_NOTIF; +#ifdef RTE_LIBRTE_VHOST_NUMA + if (get_mempolicy(&numa_node, NULL, 0, vq, MPOL_F_NODE | MPOL_F_ADDR)) { + VHOST_LOG_CONFIG(ERR, "(%d) failed to query numa node: %s\n", + dev->vid, rte_strerror(errno)); + numa_node = SOCKET_ID_ANY; + } +#endif + vq->numa_node = numa_node; + vhost_user_iotlb_init(dev, vring_idx); } @@ -1616,7 +1626,6 @@ 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; @@ -1651,20 +1660,9 @@ int rte_vhost_async_channel_register(int vid, uint16_t queue_id, goto reg_out; } -#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_info = rte_malloc_socket(NULL, vq->size * sizeof(struct async_inflight_info), - RTE_CACHE_LINE_SIZE, node); + RTE_CACHE_LINE_SIZE, vq->numa_node); if (!vq->async_pkts_info) { vhost_free_async_mem(vq); VHOST_LOG_CONFIG(ERR, @@ -1675,7 +1673,7 @@ int rte_vhost_async_channel_register(int vid, uint16_t queue_id, vq->it_pool = rte_malloc_socket(NULL, VHOST_MAX_ASYNC_IT * sizeof(struct rte_vhost_iov_iter), - RTE_CACHE_LINE_SIZE, node); + RTE_CACHE_LINE_SIZE, vq->numa_node); if (!vq->it_pool) { vhost_free_async_mem(vq); VHOST_LOG_CONFIG(ERR, @@ -1686,7 +1684,7 @@ int rte_vhost_async_channel_register(int vid, uint16_t queue_id, vq->vec_pool = rte_malloc_socket(NULL, VHOST_MAX_ASYNC_VEC * sizeof(struct iovec), - RTE_CACHE_LINE_SIZE, node); + RTE_CACHE_LINE_SIZE, vq->numa_node); if (!vq->vec_pool) { vhost_free_async_mem(vq); VHOST_LOG_CONFIG(ERR, @@ -1698,7 +1696,7 @@ int rte_vhost_async_channel_register(int vid, uint16_t queue_id, if (vq_is_packed(dev)) { vq->async_buffers_packed = rte_malloc_socket(NULL, vq->size * sizeof(struct vring_used_elem_packed), - RTE_CACHE_LINE_SIZE, node); + RTE_CACHE_LINE_SIZE, vq->numa_node); if (!vq->async_buffers_packed) { vhost_free_async_mem(vq); VHOST_LOG_CONFIG(ERR, @@ -1709,7 +1707,7 @@ int rte_vhost_async_channel_register(int vid, uint16_t queue_id, } else { vq->async_descs_split = rte_malloc_socket(NULL, vq->size * sizeof(struct vring_used_elem), - RTE_CACHE_LINE_SIZE, node); + RTE_CACHE_LINE_SIZE, vq->numa_node); if (!vq->async_descs_split) { vhost_free_async_mem(vq); VHOST_LOG_CONFIG(ERR, diff --git a/lib/vhost/vhost.h b/lib/vhost/vhost.h index 8078ddff79..8ffe387556 100644 --- a/lib/vhost/vhost.h +++ b/lib/vhost/vhost.h @@ -164,6 +164,7 @@ struct vhost_virtqueue { uint16_t batch_copy_nb_elems; struct batch_copy_elem *batch_copy_elems; + int numa_node; bool used_wrap_counter; bool avail_wrap_counter; diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index d6ec4000c3..d8ec087dfc 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -433,10 +433,10 @@ vhost_user_set_vring_num(struct virtio_net **pdev, if (vq_is_packed(dev)) { if (vq->shadow_used_packed) rte_free(vq->shadow_used_packed); - vq->shadow_used_packed = rte_malloc(NULL, + vq->shadow_used_packed = rte_malloc_socket(NULL, vq->size * sizeof(struct vring_used_elem_packed), - RTE_CACHE_LINE_SIZE); + RTE_CACHE_LINE_SIZE, vq->numa_node); if (!vq->shadow_used_packed) { VHOST_LOG_CONFIG(ERR, "failed to allocate memory for shadow used ring.\n"); @@ -447,9 +447,9 @@ vhost_user_set_vring_num(struct virtio_net **pdev, if (vq->shadow_used_split) rte_free(vq->shadow_used_split); - vq->shadow_used_split = rte_malloc(NULL, + vq->shadow_used_split = rte_malloc_socket(NULL, vq->size * sizeof(struct vring_used_elem), - RTE_CACHE_LINE_SIZE); + RTE_CACHE_LINE_SIZE, vq->numa_node); if (!vq->shadow_used_split) { VHOST_LOG_CONFIG(ERR, @@ -460,9 +460,9 @@ vhost_user_set_vring_num(struct virtio_net **pdev, if (vq->batch_copy_elems) rte_free(vq->batch_copy_elems); - vq->batch_copy_elems = rte_malloc(NULL, + vq->batch_copy_elems = rte_malloc_socket(NULL, vq->size * sizeof(struct batch_copy_elem), - RTE_CACHE_LINE_SIZE); + RTE_CACHE_LINE_SIZE, vq->numa_node); if (!vq->batch_copy_elems) { VHOST_LOG_CONFIG(ERR, "failed to allocate memory for batching copy.\n"); @@ -505,6 +505,9 @@ numa_realloc(struct virtio_net *dev, int index) return dev; } + if (node == vq->numa_node) + goto out_dev_realloc; + vq = rte_realloc_socket(vq, sizeof(*vq), 0, node); if (!vq) { VHOST_LOG_CONFIG(ERR, "Failed to realloc virtqueue %d on node %d\n", @@ -559,6 +562,10 @@ numa_realloc(struct virtio_net *dev, int index) vq->log_cache = lc; } + vq->numa_node = node; + +out_dev_realloc: + if (dev->flags & VIRTIO_DEV_RUNNING) return dev; @@ -1213,7 +1220,7 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg, struct virtio_net *dev = *pdev; struct VhostUserMemory *memory = &msg->payload.memory; struct rte_vhost_mem_region *reg; - + int numa_node = SOCKET_ID_ANY; uint64_t mmap_offset; uint32_t i; @@ -1253,13 +1260,21 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg, for (i = 0; i < dev->nr_vring; i++) vhost_user_iotlb_flush_all(dev->virtqueue[i]); + /* + * If VQ 0 has already been allocated, try to allocate on the same + * NUMA node. It can be reallocated later in numa_realloc(). + */ + if (dev->nr_vring > 0) + numa_node = dev->virtqueue[0]->numa_node; + dev->nr_guest_pages = 0; if (dev->guest_pages == NULL) { dev->max_guest_pages = 8; - dev->guest_pages = rte_zmalloc(NULL, + dev->guest_pages = rte_zmalloc_socket(NULL, dev->max_guest_pages * sizeof(struct guest_page), - RTE_CACHE_LINE_SIZE); + RTE_CACHE_LINE_SIZE, + numa_node); if (dev->guest_pages == NULL) { VHOST_LOG_CONFIG(ERR, "(%d) failed to allocate memory " @@ -1269,8 +1284,8 @@ vhost_user_set_mem_table(struct virtio_net **pdev, struct VhostUserMsg *msg, } } - dev->mem = rte_zmalloc("vhost-mem-table", sizeof(struct rte_vhost_memory) + - sizeof(struct rte_vhost_mem_region) * memory->nregions, 0); + dev->mem = rte_zmalloc_socket("vhost-mem-table", sizeof(struct rte_vhost_memory) + + sizeof(struct rte_vhost_mem_region) * memory->nregions, 0, numa_node); if (dev->mem == NULL) { VHOST_LOG_CONFIG(ERR, "(%d) failed to allocate memory for dev->mem\n", @@ -2193,9 +2208,9 @@ vhost_user_set_log_base(struct virtio_net **pdev, struct VhostUserMsg *msg, rte_free(vq->log_cache); vq->log_cache = NULL; vq->log_cache_nb_elem = 0; - vq->log_cache = rte_zmalloc("vq log cache", + vq->log_cache = rte_malloc_socket("vq log cache", sizeof(struct log_cache_entry) * VHOST_LOG_CACHE_NR, - 0); + 0, vq->numa_node); /* * If log cache alloc fail, don't fail migration, but no * caching will be done, which will impact performance From patchwork Tue Jun 29 16:11:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 94994 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A4B68A0C3F; Tue, 29 Jun 2021 18:12:26 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E9EAB411FE; Tue, 29 Jun 2021 18:12:00 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mails.dpdk.org (Postfix) with ESMTP id ED56C411F2 for ; Tue, 29 Jun 2021 18:11:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1624983116; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LM6KYP8q6YDCNxJB1oOR81fqYt98ssJCI9+6jEULtEI=; b=O6I8yWU/Ea7i88V/1SZmzkzKOUPGgHy88FF+tFyppxF38IYOa1QhndF7PWsiVIPo43jIBQ IcMoeONx7QFfO/1DmLUUPdd/lvSn0Ow8VcdKoAw3N1ezgrfTyi7fGHGSvPQmmTavjwL2W8 8oTarNjkSO/hBkbB+iAAaOeweqFtfrE= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-15-co_3bGRePqOrKLzrKqGBhQ-1; Tue, 29 Jun 2021 12:11:54 -0400 X-MC-Unique: co_3bGRePqOrKLzrKqGBhQ-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BBBAE1023F41; Tue, 29 Jun 2021 16:11:53 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id B16425C1D0; Tue, 29 Jun 2021 16:11:52 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Tue, 29 Jun 2021 18:11:33 +0200 Message-Id: <20210629161133.79472-8-maxime.coquelin@redhat.com> In-Reply-To: <20210629161133.79472-1-maxime.coquelin@redhat.com> References: <20210629161133.79472-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v7 7/7] vhost: convert inflight data to DPDK allocation API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" Inflight metadata are allocated using glibc's calloc. This patch converts them to rte_zmalloc_socket to take care of the NUMA affinity. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- lib/vhost/vhost.c | 4 +-- lib/vhost/vhost_user.c | 71 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index 0000cd3297..53a470f547 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -312,10 +312,10 @@ cleanup_vq_inflight(struct virtio_net *dev, struct vhost_virtqueue *vq) if (vq->resubmit_inflight) { if (vq->resubmit_inflight->resubmit_list) { - free(vq->resubmit_inflight->resubmit_list); + rte_free(vq->resubmit_inflight->resubmit_list); vq->resubmit_inflight->resubmit_list = NULL; } - free(vq->resubmit_inflight); + rte_free(vq->resubmit_inflight); vq->resubmit_inflight = NULL; } } diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c index d8ec087dfc..67935c4ccc 100644 --- a/lib/vhost/vhost_user.c +++ b/lib/vhost/vhost_user.c @@ -188,7 +188,7 @@ vhost_backend_cleanup(struct virtio_net *dev) dev->inflight_info->fd = -1; } - free(dev->inflight_info); + rte_free(dev->inflight_info); dev->inflight_info = NULL; } @@ -562,6 +562,31 @@ numa_realloc(struct virtio_net *dev, int index) vq->log_cache = lc; } + if (vq->resubmit_inflight) { + struct rte_vhost_resubmit_info *ri; + + ri = rte_realloc_socket(vq->resubmit_inflight, sizeof(*ri), 0, node); + if (!ri) { + VHOST_LOG_CONFIG(ERR, "Failed to realloc resubmit inflight on node %d\n", + node); + return dev; + } + vq->resubmit_inflight = ri; + + if (ri->resubmit_list) { + struct rte_vhost_resubmit_desc *rd; + + rd = rte_realloc_socket(ri->resubmit_list, sizeof(*rd) * ri->resubmit_num, + 0, node); + if (!rd) { + VHOST_LOG_CONFIG(ERR, "Failed to realloc resubmit list on node %d\n", + node); + return dev; + } + ri->resubmit_list = rd; + } + } + vq->numa_node = node; out_dev_realloc: @@ -1491,6 +1516,7 @@ vhost_user_get_inflight_fd(struct virtio_net **pdev, uint16_t num_queues, queue_size; struct virtio_net *dev = *pdev; int fd, i, j; + int numa_node = SOCKET_ID_ANY; void *addr; if (msg->size != sizeof(msg->payload.inflight)) { @@ -1500,9 +1526,16 @@ vhost_user_get_inflight_fd(struct virtio_net **pdev, return RTE_VHOST_MSG_RESULT_ERR; } + /* + * If VQ 0 has already been allocated, try to allocate on the same + * NUMA node. It can be reallocated later in numa_realloc(). + */ + if (dev->nr_vring > 0) + numa_node = dev->virtqueue[0]->numa_node; + if (dev->inflight_info == NULL) { - dev->inflight_info = calloc(1, - sizeof(struct inflight_mem_info)); + dev->inflight_info = rte_zmalloc_socket("inflight_info", + sizeof(struct inflight_mem_info), 0, numa_node); if (!dev->inflight_info) { VHOST_LOG_CONFIG(ERR, "failed to alloc dev inflight area\n"); @@ -1585,6 +1618,7 @@ vhost_user_set_inflight_fd(struct virtio_net **pdev, VhostUserMsg *msg, struct vhost_virtqueue *vq; void *addr; int fd, i; + int numa_node = SOCKET_ID_ANY; fd = msg->fds[0]; if (msg->size != sizeof(msg->payload.inflight) || fd < 0) { @@ -1618,9 +1652,16 @@ vhost_user_set_inflight_fd(struct virtio_net **pdev, VhostUserMsg *msg, "set_inflight_fd pervq_inflight_size: %d\n", pervq_inflight_size); + /* + * If VQ 0 has already been allocated, try to allocate on the same + * NUMA node. It can be reallocated later in numa_realloc(). + */ + if (dev->nr_vring > 0) + numa_node = dev->virtqueue[0]->numa_node; + if (!dev->inflight_info) { - dev->inflight_info = calloc(1, - sizeof(struct inflight_mem_info)); + dev->inflight_info = rte_zmalloc_socket("inflight_info", + sizeof(struct inflight_mem_info), 0, numa_node); if (dev->inflight_info == NULL) { VHOST_LOG_CONFIG(ERR, "failed to alloc dev inflight area\n"); @@ -1779,19 +1820,21 @@ vhost_check_queue_inflights_split(struct virtio_net *dev, vq->last_avail_idx += resubmit_num; if (resubmit_num) { - resubmit = calloc(1, sizeof(struct rte_vhost_resubmit_info)); + resubmit = rte_zmalloc_socket("resubmit", sizeof(struct rte_vhost_resubmit_info), + 0, vq->numa_node); if (!resubmit) { VHOST_LOG_CONFIG(ERR, "failed to allocate memory for resubmit info.\n"); return RTE_VHOST_MSG_RESULT_ERR; } - resubmit->resubmit_list = calloc(resubmit_num, - sizeof(struct rte_vhost_resubmit_desc)); + resubmit->resubmit_list = rte_zmalloc_socket("resubmit_list", + resubmit_num * sizeof(struct rte_vhost_resubmit_desc), + 0, vq->numa_node); if (!resubmit->resubmit_list) { VHOST_LOG_CONFIG(ERR, "failed to allocate memory for inflight desc.\n"); - free(resubmit); + rte_free(resubmit); return RTE_VHOST_MSG_RESULT_ERR; } @@ -1873,19 +1916,21 @@ vhost_check_queue_inflights_packed(struct virtio_net *dev, } if (resubmit_num) { - resubmit = calloc(1, sizeof(struct rte_vhost_resubmit_info)); + resubmit = rte_zmalloc_socket("resubmit", sizeof(struct rte_vhost_resubmit_info), + 0, vq->numa_node); if (resubmit == NULL) { VHOST_LOG_CONFIG(ERR, "failed to allocate memory for resubmit info.\n"); return RTE_VHOST_MSG_RESULT_ERR; } - resubmit->resubmit_list = calloc(resubmit_num, - sizeof(struct rte_vhost_resubmit_desc)); + resubmit->resubmit_list = rte_zmalloc_socket("resubmit_list", + resubmit_num * sizeof(struct rte_vhost_resubmit_desc), + 0, vq->numa_node); if (resubmit->resubmit_list == NULL) { VHOST_LOG_CONFIG(ERR, "failed to allocate memory for resubmit desc.\n"); - free(resubmit); + rte_free(resubmit); return RTE_VHOST_MSG_RESULT_ERR; }