From patchwork Sun Dec 20 21:13:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85525 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id A30E5A09FD; Sun, 20 Dec 2020 22:14:45 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 258F4CB7B; Sun, 20 Dec 2020 22:14:31 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id 0A72FCB7A for ; Sun, 20 Dec 2020 22:14:27 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498866; 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=Wo1TyA2gOdKM+lwK2sOt5nFiulfHbnpjmWdjKymbOdI=; b=OIFt+B2m855b16US0dW8fMhKmXyDtamtsmcEplHiV5kgEsaU4cImoT7v81hM3/XXiZx6ht 8CRa+WAzlsFHNESp6RoW40Sj5MeUApPeAcGizfqManCKC7xCXlxBjEFha/3ejmQnPO6Opv 0ATl+Ma03x5Xdl5KxhYXCVtbEgNjHXE= 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-39-zBTqUbtWOdyKiMAWCRk4CA-1; Sun, 20 Dec 2020 16:14:24 -0500 X-MC-Unique: zBTqUbtWOdyKiMAWCRk4CA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 751C8107ACE3; Sun, 20 Dec 2020 21:14:23 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id DE61360C43; Sun, 20 Dec 2020 21:14:18 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:26 +0100 Message-Id: <20201220211405.313012-2-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 01/40] bus/vdev: add helper to get vdev from eth dev 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" This patch adds an helper macro to get the rte_vdev_device pointer from a rte_eth_dev pointer. This is similar to RTE_ETH_DEV_TO_PCI(). Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia Reviewed-by: David Marchand --- drivers/bus/vdev/rte_bus_vdev.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/bus/vdev/rte_bus_vdev.h b/drivers/bus/vdev/rte_bus_vdev.h index d14eeb41b0..f99a41f825 100644 --- a/drivers/bus/vdev/rte_bus_vdev.h +++ b/drivers/bus/vdev/rte_bus_vdev.h @@ -34,6 +34,8 @@ struct rte_vdev_device { #define RTE_DEV_TO_VDEV_CONST(ptr) \ container_of(ptr, const struct rte_vdev_device, device) +#define RTE_ETH_DEV_TO_VDEV(eth_dev) RTE_DEV_TO_VDEV((eth_dev)->device) + static inline const char * rte_vdev_device_name(const struct rte_vdev_device *dev) { From patchwork Sun Dec 20 21:13:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85526 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8D3B1A09FD; Sun, 20 Dec 2020 22:15:02 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9094FCB9F; Sun, 20 Dec 2020 22:14:33 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id C696BCB7A for ; Sun, 20 Dec 2020 22:14:30 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498869; 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=/1mvEsGzzwRRkMJV0lmnnSt3WE7JUWbgKXDo/Lj3PnE=; b=G8oTFqA4k0TqpMIpQksVwOAEAGoOR0jF2LcKCLSvsRCHpELUgATfh4Aj5JQjglT6RFXCav NJ9y1zqmWjoNfrL87FmheytbTCItYX8IavNXHzAl/n+1It+zeBzCuv+vm/HeXVtaubgXPp GNGy4kFLkFWqJ1muFWjZRN0zWxrDdGo= 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-151-jtpVZa6gOW2NC04tEdtuMA-1; Sun, 20 Dec 2020 16:14:27 -0500 X-MC-Unique: jtpVZa6gOW2NC04tEdtuMA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E3FBB59; Sun, 20 Dec 2020 21:14:25 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id F41C960C43; Sun, 20 Dec 2020 21:14:23 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:27 +0100 Message-Id: <20201220211405.313012-3-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 02/40] net/virtio: Introduce Virtio bus type 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" This patch is preliminary work for introducing a bus layer in Virtio PMD, in order to improve Virtio-user integration. A new bus type is added to provide a unified way to distinguish which bus type is used (PCI modern, PCI legacy or Virtio-user). Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio_ethdev.c | 43 ++++++++++++------------- drivers/net/virtio/virtio_pci.c | 4 +-- drivers/net/virtio/virtio_pci.h | 9 +++++- drivers/net/virtio/virtio_user_ethdev.c | 2 +- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 6c233b75ba..b3086297c0 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -592,9 +592,9 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) * we use virtual address. And we need properly set _offset_, please see * VIRTIO_MBUF_DATA_DMA_ADDR in virtqueue.h for more information. */ - if (!hw->virtio_user_dev) + if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == VIRTIO_BUS_PCI_MODERN) { vq->offset = offsetof(struct rte_mbuf, buf_iova); - else { + } else if (hw->bus_type == VIRTIO_BUS_USER) { vq->vq_ring_mem = (uintptr_t)mz->addr; vq->offset = offsetof(struct rte_mbuf, buf_addr); if (queue_type == VTNET_TQ) @@ -746,13 +746,13 @@ virtio_dev_close(struct rte_eth_dev *dev) virtio_free_queues(hw); #ifdef RTE_VIRTIO_USER - if (hw->virtio_user_dev) + if (hw->bus_type == VIRTIO_BUS_USER) virtio_user_dev_uninit(hw->virtio_user_dev); else #endif if (dev->device) { rte_pci_unmap_device(RTE_ETH_DEV_TO_PCI(dev)); - if (!hw->modern) + if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) rte_pci_ioport_unmap(VTPCI_IO(hw)); } @@ -1299,7 +1299,7 @@ virtio_intr_unmask(struct rte_eth_dev *dev) if (rte_intr_ack(dev->intr_handle) < 0) return -1; - if (!hw->virtio_user_dev) + if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == VIRTIO_BUS_PCI_MODERN) hw->use_msix = vtpci_msix_detect(RTE_ETH_DEV_TO_PCI(dev)); return 0; @@ -1313,7 +1313,7 @@ virtio_intr_enable(struct rte_eth_dev *dev) if (rte_intr_enable(dev->intr_handle) < 0) return -1; - if (!hw->virtio_user_dev) + if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == VIRTIO_BUS_PCI_MODERN) hw->use_msix = vtpci_msix_detect(RTE_ETH_DEV_TO_PCI(dev)); return 0; @@ -1327,7 +1327,7 @@ virtio_intr_disable(struct rte_eth_dev *dev) if (rte_intr_disable(dev->intr_handle) < 0) return -1; - if (!hw->virtio_user_dev) + if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == VIRTIO_BUS_PCI_MODERN) hw->use_msix = vtpci_msix_detect(RTE_ETH_DEV_TO_PCI(dev)); return 0; @@ -1368,13 +1368,13 @@ virtio_negotiate_features(struct virtio_hw *hw, uint64_t req_features) PMD_INIT_LOG(DEBUG, "features after negotiate = %" PRIx64, hw->guest_features); - if (hw->modern && !vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) { + if (hw->bus_type == VIRTIO_BUS_PCI_MODERN && !vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) { PMD_INIT_LOG(ERR, "VIRTIO_F_VERSION_1 features is not enabled."); return -1; } - if (hw->modern || hw->virtio_user_dev) { + if (hw->bus_type == VIRTIO_BUS_PCI_MODERN || hw->bus_type == VIRTIO_BUS_USER) { vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); if (!(vtpci_get_status(hw) & VIRTIO_CONFIG_STATUS_FEATURES_OK)) { PMD_INIT_LOG(ERR, @@ -1709,7 +1709,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) hw->weak_barriers = !vtpci_with_feature(hw, VIRTIO_F_ORDER_PLATFORM); - if (!hw->virtio_user_dev) + if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == VIRTIO_BUS_PCI_MODERN) pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); /* If host does not support both status and MSI-X then disable LSC */ @@ -1856,7 +1856,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) static int virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw) { - if (hw->modern) { + if (hw->bus_type == VIRTIO_BUS_PCI_MODERN) { /* * We don't have to re-parse the PCI config space, since * rte_pci_map_device() makes sure the mapped address @@ -1872,7 +1872,7 @@ virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw) PMD_INIT_LOG(DEBUG, "failed to map pci device!"); return -1; } - } else { + } else if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) { if (rte_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0) return -1; } @@ -1883,15 +1883,14 @@ virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw) static void virtio_set_vtpci_ops(struct virtio_hw *hw) { -#ifdef RTE_VIRTIO_USER - if (hw->virtio_user_dev) + if (hw->bus_type == VIRTIO_BUS_USER) VTPCI_OPS(hw) = &virtio_user_ops; - else -#endif - if (hw->modern) + else if (hw->bus_type == VIRTIO_BUS_PCI_MODERN) VTPCI_OPS(hw) = &modern_ops; - else + else if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) VTPCI_OPS(hw) = &legacy_ops; + + return; } /* @@ -1919,7 +1918,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) eth_dev->rx_descriptor_done = virtio_dev_rx_queue_done; if (rte_eal_process_type() == RTE_PROC_SECONDARY) { - if (!hw->virtio_user_dev) { + if (hw->bus_type != VIRTIO_BUS_USER) { ret = virtio_remap_pci(RTE_ETH_DEV_TO_PCI(eth_dev), hw); if (ret) return ret; @@ -1950,7 +1949,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) /* For virtio_user case the hw->virtio_user_dev is populated by * virtio_user_eth_dev_alloc() before eth_virtio_dev_init() is called. */ - if (!hw->virtio_user_dev) { + if (hw->bus_type != VIRTIO_BUS_USER) { ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw); if (ret) goto err_vtpci_init; @@ -1982,9 +1981,9 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) return 0; err_virtio_init: - if (!hw->virtio_user_dev) { + if (hw->bus_type == VIRTIO_BUS_PCI_MODERN || hw->bus_type == VIRTIO_BUS_PCI_LEGACY) { rte_pci_unmap_device(RTE_ETH_DEV_TO_PCI(eth_dev)); - if (!hw->modern) + if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) rte_pci_ioport_unmap(VTPCI_IO(hw)); } err_vtpci_init: diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index d6b950ee69..1692268f30 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -697,7 +697,7 @@ vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw) if (virtio_read_caps(dev, hw) == 0) { PMD_INIT_LOG(INFO, "modern virtio pci detected."); virtio_hw_internal[hw->port_id].vtpci_ops = &modern_ops; - hw->modern = 1; + hw->bus_type = VIRTIO_BUS_PCI_MODERN; return 0; } @@ -716,7 +716,7 @@ vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw) } virtio_hw_internal[hw->port_id].vtpci_ops = &legacy_ops; - hw->modern = 0; + hw->bus_type = VIRTIO_BUS_PCI_LEGACY; return 0; } diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index ab61e911b8..6388f0a74d 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -243,7 +243,15 @@ struct virtio_pci_ops { struct virtio_net_config; +enum virtio_bus_type { + VIRTIO_BUS_UNKNOWN, + VIRTIO_BUS_PCI_LEGACY, + VIRTIO_BUS_PCI_MODERN, + VIRTIO_BUS_USER, +}; + struct virtio_hw { + enum virtio_bus_type bus_type; struct virtnet_ctl *cvq; uint64_t req_guest_features; uint64_t guest_features; @@ -253,7 +261,6 @@ struct virtio_hw { uint16_t vtnet_hdr_size; uint8_t vlan_strip; uint8_t use_msix; - uint8_t modern; uint8_t use_vec_rx; uint8_t use_vec_tx; uint8_t use_inorder_rx; diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 40345193e6..516d0ee577 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -629,7 +629,7 @@ virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev) * Here just pretend that we support msix. */ hw->use_msix = 1; - hw->modern = 0; + hw->bus_type = VIRTIO_BUS_USER; hw->use_vec_rx = 0; hw->use_vec_tx = 0; hw->use_inorder_rx = 0; From patchwork Sun Dec 20 21:13:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85527 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 30A69A09FD; Sun, 20 Dec 2020 22:15:26 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 89C76CBEC; Sun, 20 Dec 2020 22:14:36 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 8D9CBCBB4 for ; Sun, 20 Dec 2020 22:14:33 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498872; 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=2J6x5jNrL3EzYSmsVEz0FrlmsDvNCgRcI7dI1f5CLW4=; b=VS+TtMQmrdmfJwLj3rEVEHKdjVvYp4WYj7fbKbJ6SUe8hs0QS9PYYtxlbbHdxazfPAj9T6 IxWqr48JOa3yo37nR0MNeoF1UFi7zsyWSHR0wNKcFR5S2KWduBs3ym439nyOeYiSh8cFB1 V/0CpT9oXgj0oaJ17DzthMnA4A442BA= 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-458-EAB1VAJKNOyo4ZMARnv8UA-1; Sun, 20 Dec 2020 16:14:29 -0500 X-MC-Unique: EAB1VAJKNOyo4ZMARnv8UA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 60226800D53; Sun, 20 Dec 2020 21:14:28 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 52B6460C43; Sun, 20 Dec 2020 21:14:26 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:28 +0100 Message-Id: <20201220211405.313012-4-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 03/40] net/virtio: refactor virtio-user device 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" This patch moves the virtio_hw structure into the virtio_user_dev structure, with the goal of making virtio_hw bus-agnostic. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio_ethdev.c | 2 +- drivers/net/virtio/virtio_pci.h | 1 - .../net/virtio/virtio_user/virtio_user_dev.h | 1 + drivers/net/virtio/virtio_user_ethdev.c | 62 ++++++++----------- 4 files changed, 27 insertions(+), 39 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index b3086297c0..3ace25ac80 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -747,7 +747,7 @@ virtio_dev_close(struct rte_eth_dev *dev) #ifdef RTE_VIRTIO_USER if (hw->bus_type == VIRTIO_BUS_USER) - virtio_user_dev_uninit(hw->virtio_user_dev); + virtio_user_dev_uninit(dev->data->dev_private); else #endif if (dev->device) { diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 6388f0a74d..b35a596169 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -277,7 +277,6 @@ struct virtio_hw { uint16_t *notify_base; struct virtio_pci_common_cfg *common_cfg; struct virtio_net_config *dev_cfg; - void *virtio_user_dev; /* * App management thread and virtio interrupt handler thread * both can change device state, this lock is meant to avoid diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index e053897d8f..59f4dd1f24 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -24,6 +24,7 @@ struct virtio_user_queue { }; struct virtio_user_dev { + struct virtio_hw hw; enum virtio_user_backend_type backend_type; /* for vhost_user backend */ int vhostfd; diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 516d0ee577..1f1f63a1a5 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -26,13 +26,13 @@ #include "virtio_user/virtio_user_dev.h" #include "virtio_user/vhost.h" -#define virtio_user_get_dev(hw) \ - ((struct virtio_user_dev *)(hw)->virtio_user_dev) +#define virtio_user_get_dev(hw) container_of(hw, struct virtio_user_dev, hw) static void -virtio_user_reset_queues_packed(struct rte_eth_dev *dev) +virtio_user_reset_queues_packed(struct rte_eth_dev *eth_dev) { - struct virtio_hw *hw = dev->data->dev_private; + struct virtio_user_dev *dev = eth_dev->data->dev_private; + struct virtio_hw *hw = &dev->hw; struct virtnet_rx *rxvq; struct virtnet_tx *txvq; uint16_t i; @@ -48,14 +48,14 @@ virtio_user_reset_queues_packed(struct rte_eth_dev *dev) rte_delay_ms(1); /* Vring reset for each Tx queue and Rx queue. */ - for (i = 0; i < dev->data->nb_rx_queues; i++) { - rxvq = dev->data->rx_queues[i]; + for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { + rxvq = eth_dev->data->rx_queues[i]; virtqueue_rxvq_reset_packed(rxvq->vq); - virtio_dev_rx_queue_setup_finish(dev, i); + virtio_dev_rx_queue_setup_finish(eth_dev, i); } - for (i = 0; i < dev->data->nb_tx_queues; i++) { - txvq = dev->data->tx_queues[i]; + for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { + txvq = eth_dev->data->tx_queues[i]; virtqueue_txvq_reset_packed(txvq->vq); } @@ -69,7 +69,7 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) { int ret, connectfd, old_status; struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id]; - struct virtio_hw *hw = eth_dev->data->dev_private; + struct virtio_hw *hw = &dev->hw; uint64_t protocol_features; connectfd = accept(dev->listenfd, NULL, NULL); @@ -605,21 +605,15 @@ virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev) struct virtio_hw *hw; struct virtio_user_dev *dev; - eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*hw)); + eth_dev = rte_eth_vdev_allocate(vdev, sizeof(*dev)); if (!eth_dev) { PMD_INIT_LOG(ERR, "cannot alloc rte_eth_dev"); return NULL; } data = eth_dev->data; - hw = eth_dev->data->dev_private; - - dev = rte_zmalloc(NULL, sizeof(*dev), 0); - if (!dev) { - PMD_INIT_LOG(ERR, "malloc virtio_user_dev failed"); - rte_eth_dev_release_port(eth_dev); - return NULL; - } + dev = eth_dev->data->dev_private; + hw = &dev->hw; hw->port_id = data->port_id; dev->port_id = data->port_id; @@ -634,17 +628,13 @@ virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev) hw->use_vec_tx = 0; hw->use_inorder_rx = 0; hw->use_inorder_tx = 0; - hw->virtio_user_dev = dev; + return eth_dev; } static void virtio_user_eth_dev_free(struct rte_eth_dev *eth_dev) { - struct rte_eth_dev_data *data = eth_dev->data; - struct virtio_hw *hw = data->dev_private; - - rte_free(hw->virtio_user_dev); rte_eth_dev_release_port(eth_dev); } @@ -653,11 +643,12 @@ virtio_user_eth_dev_free(struct rte_eth_dev *eth_dev) * Returns 0 on success. */ static int -virtio_user_pmd_probe(struct rte_vdev_device *dev) +virtio_user_pmd_probe(struct rte_vdev_device *vdev) { struct rte_kvargs *kvlist = NULL; struct rte_eth_dev *eth_dev; struct virtio_hw *hw; + struct virtio_user_dev *dev; enum virtio_user_backend_type backend_type = VIRTIO_USER_BACKEND_UNKNOWN; uint64_t queues = VIRTIO_USER_DEF_Q_NUM; uint64_t cq = VIRTIO_USER_DEF_CQ_EN; @@ -673,7 +664,7 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev) int ret = -1; if (rte_eal_process_type() == RTE_PROC_SECONDARY) { - const char *name = rte_vdev_device_name(dev); + const char *name = rte_vdev_device_name(vdev); eth_dev = rte_eth_dev_attach_secondary(name); if (!eth_dev) { PMD_INIT_LOG(ERR, "Failed to probe %s", name); @@ -687,12 +678,12 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev) } eth_dev->dev_ops = &virtio_user_secondary_eth_dev_ops; - eth_dev->device = &dev->device; + eth_dev->device = &vdev->device; rte_eth_dev_probing_finish(eth_dev); return 0; } - kvlist = rte_kvargs_parse(rte_vdev_device_args(dev), valid_args); + kvlist = rte_kvargs_parse(rte_vdev_device_args(vdev), valid_args); if (!kvlist) { PMD_INIT_LOG(ERR, "error when parsing param"); goto end; @@ -832,14 +823,15 @@ virtio_user_pmd_probe(struct rte_vdev_device *dev) } } - eth_dev = virtio_user_eth_dev_alloc(dev); + eth_dev = virtio_user_eth_dev_alloc(vdev); if (!eth_dev) { PMD_INIT_LOG(ERR, "virtio_user fails to alloc device"); goto end; } - hw = eth_dev->data->dev_private; - if (virtio_user_dev_init(hw->virtio_user_dev, path, queues, cq, + dev = eth_dev->data->dev_private; + hw = &dev->hw; + if (virtio_user_dev_init(dev, path, queues, cq, queue_size, mac_addr, &ifname, server_mode, mrg_rxbuf, in_order, packed_vq, backend_type) < 0) { PMD_INIT_LOG(ERR, "virtio_user_dev_init fails"); @@ -912,7 +904,6 @@ static int virtio_user_pmd_dma_map(struct rte_vdev_device *vdev, void *addr, const char *name; struct rte_eth_dev *eth_dev; struct virtio_user_dev *dev; - struct virtio_hw *hw; if (!vdev) return -EINVAL; @@ -923,8 +914,7 @@ static int virtio_user_pmd_dma_map(struct rte_vdev_device *vdev, void *addr, if (!eth_dev) return 0; - hw = (struct virtio_hw *)eth_dev->data->dev_private; - dev = hw->virtio_user_dev; + dev = eth_dev->data->dev_private; if (dev->ops->dma_map) return dev->ops->dma_map(dev, addr, iova, len); @@ -938,7 +928,6 @@ static int virtio_user_pmd_dma_unmap(struct rte_vdev_device *vdev, void *addr, const char *name; struct rte_eth_dev *eth_dev; struct virtio_user_dev *dev; - struct virtio_hw *hw; if (!vdev) return -EINVAL; @@ -949,8 +938,7 @@ static int virtio_user_pmd_dma_unmap(struct rte_vdev_device *vdev, void *addr, if (!eth_dev) return 0; - hw = (struct virtio_hw *)eth_dev->data->dev_private; - dev = hw->virtio_user_dev; + dev = eth_dev->data->dev_private; if (dev->ops->dma_unmap) return dev->ops->dma_unmap(dev, addr, iova, len); From patchwork Sun Dec 20 21:13:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85528 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id DAA9BA09FD; Sun, 20 Dec 2020 22:15:43 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 23D21CC33; Sun, 20 Dec 2020 22:14:38 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id C4F86CC17 for ; Sun, 20 Dec 2020 22:14:36 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498875; 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=GE8sXDFwCgMm4cM+z3RdW+AOWsgWfu8GQeJW+RnGi9o=; b=JYyme4J75bvpo75RwsULk/Utk2wjz0OH1+xYnKMv7/3k/IIBQFm7BQKIpbHT506Pm84f5D uw2/TJOQ7N4j4VJE3i47gbzKQWgBELshMvCyn1I62qYkBPf03rKmakpEqC01zXujmd1bfx OWqeocESdKCQe+3dC73Q5NR0CmYYGW0= 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-360-eAW2F1PfMCu-OHqc-FfalQ-1; Sun, 20 Dec 2020 16:14:31 -0500 X-MC-Unique: eAW2F1PfMCu-OHqc-FfalQ-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9C721BBEE0; Sun, 20 Dec 2020 21:14:30 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id CC32560C62; Sun, 20 Dec 2020 21:14:28 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:29 +0100 Message-Id: <20201220211405.313012-5-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 04/40] net/virtio: introduce PCI device metadata 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" This patch initiate refactoring of Virtio PCI, by introducing a new device structure for PCI-specific metadata. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio_ethdev.c | 2 +- drivers/net/virtio/virtio_pci.h | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 3ace25ac80..99a5a1bb88 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -2151,7 +2151,7 @@ static int eth_virtio_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, if (vdpa == 1) return 1; - return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct virtio_hw), + return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct virtio_pci_dev), eth_virtio_dev_init); } diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index b35a596169..8d3dc0e22e 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -289,6 +289,11 @@ struct virtio_hw { struct virtqueue **vqs; }; +struct virtio_pci_dev { + struct virtio_hw hw; +}; + +#define virtio_pci_get_dev(hw) container_of(hw, struct virtio_pci_dev, hw) /* * While virtio_hw is stored in shared memory, this structure stores From patchwork Sun Dec 20 21:13:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85529 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 728C2A09FD; Sun, 20 Dec 2020 22:16:04 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3DEBECB93; Sun, 20 Dec 2020 22:14:50 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 23195CAB9 for ; Sun, 20 Dec 2020 22:14:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498886; 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=SKCCQ+W2/XJlXPsyLSe+XioONCm066zS8C1tH2lLJgE=; b=BX0REF6fo8SPmiyVKViemekAaQPyOFQ4oEXCEs3eOZrLryW894ATHyWXd8v+uQjgodsOmp nZo1Ye76Ah2rID82LzPcG83BDtI9Lcv8n4CS/ysRjsgI+sLyDAL8VM5NFhWW0HRSWuAVay 2gAWkeqlId9O8WWNr3x7ma0HuUu1kTs= 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-306-Mpd4PMXzP02u-jMchx2OWw-1; Sun, 20 Dec 2020 16:14:43 -0500 X-MC-Unique: Mpd4PMXzP02u-jMchx2OWw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id DFE9A800D53; Sun, 20 Dec 2020 21:14:41 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 249A860C43; Sun, 20 Dec 2020 21:14:30 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:30 +0100 Message-Id: <20201220211405.313012-6-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 05/40] net/virtio: move PCI device init in dedicated file 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" Thi patch moves the PCI Ethernet device registration bits in a dedicated patch. In following patches, more code will be moved there, with the goal of making virtio_ethdev.c truely bus-agnostic. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/meson.build | 1 + drivers/net/virtio/virtio_ethdev.c | 114 +------------------ drivers/net/virtio/virtio_ethdev.h | 2 + drivers/net/virtio/virtio_pci_ethdev.c | 148 +++++++++++++++++++++++++ 4 files changed, 156 insertions(+), 109 deletions(-) create mode 100644 drivers/net/virtio/virtio_pci_ethdev.c diff --git a/drivers/net/virtio/meson.build b/drivers/net/virtio/meson.build index eaed46373d..8e0f1a9951 100644 --- a/drivers/net/virtio/meson.build +++ b/drivers/net/virtio/meson.build @@ -2,6 +2,7 @@ # Copyright(c) 2018 Intel Corporation sources += files('virtio_ethdev.c', + 'virtio_pci_ethdev.c', 'virtio_pci.c', 'virtio_rxtx.c', 'virtio_rxtx_simple.c', diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 99a5a1bb88..ca21a019e5 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -38,17 +38,14 @@ #include "virtio_rxtx.h" #include "virtio_user/virtio_user_dev.h" -static int eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev); static int virtio_dev_configure(struct rte_eth_dev *dev); static int virtio_dev_start(struct rte_eth_dev *dev); -static int virtio_dev_stop(struct rte_eth_dev *dev); static int virtio_dev_promiscuous_enable(struct rte_eth_dev *dev); static int virtio_dev_promiscuous_disable(struct rte_eth_dev *dev); static int virtio_dev_allmulticast_enable(struct rte_eth_dev *dev); static int virtio_dev_allmulticast_disable(struct rte_eth_dev *dev); static uint32_t virtio_dev_speed_capa_get(uint32_t speed); static int virtio_dev_devargs_parse(struct rte_devargs *devargs, - int *vdpa, uint32_t *speed, int *vectorized); static int virtio_dev_info_get(struct rte_eth_dev *dev, @@ -89,15 +86,6 @@ static int virtio_dev_queue_stats_mapping_set( static void virtio_notify_peers(struct rte_eth_dev *dev); static void virtio_ack_link_announce(struct rte_eth_dev *dev); -/* - * The set of PCI devices this driver supports - */ -static const struct rte_pci_id pci_id_virtio_map[] = { - { RTE_PCI_DEVICE(VIRTIO_PCI_VENDORID, VIRTIO_PCI_LEGACY_DEVICEID_NET) }, - { RTE_PCI_DEVICE(VIRTIO_PCI_VENDORID, VIRTIO_PCI_MODERN_DEVICEID_NET) }, - { .vendor_id = 0, /* sentinel */ }, -}; - struct rte_virtio_xstats_name_off { char name[RTE_ETH_XSTATS_NAME_SIZE]; unsigned offset; @@ -714,7 +702,7 @@ virtio_alloc_queues(struct rte_eth_dev *dev) static void virtio_queues_unbind_intr(struct rte_eth_dev *dev); -static int +int virtio_dev_close(struct rte_eth_dev *dev) { struct virtio_hw *hw = dev->data->dev_private; @@ -1929,8 +1917,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) return 0; } - ret = virtio_dev_devargs_parse(eth_dev->device->devargs, - NULL, &speed, &vectorized); + ret = virtio_dev_devargs_parse(eth_dev->device->devargs, &speed, &vectorized); if (ret < 0) return ret; hw->speed = speed; @@ -1992,36 +1979,6 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) return ret; } -static int -eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev) -{ - int ret; - PMD_INIT_FUNC_TRACE(); - - if (rte_eal_process_type() == RTE_PROC_SECONDARY) - return 0; - - ret = virtio_dev_stop(eth_dev); - virtio_dev_close(eth_dev); - - PMD_INIT_LOG(DEBUG, "dev_uninit completed"); - - return ret; -} - - -static int vdpa_check_handler(__rte_unused const char *key, - const char *value, void *ret_val) -{ - if (strcmp(value, "1") == 0) - *(int *)ret_val = 1; - else - *(int *)ret_val = 0; - - return 0; -} - - static uint32_t virtio_dev_speed_capa_get(uint32_t speed) { @@ -2059,10 +2016,8 @@ static int vectorized_check_handler(__rte_unused const char *key, } #define VIRTIO_ARG_SPEED "speed" -#define VIRTIO_ARG_VDPA "vdpa" #define VIRTIO_ARG_VECTORIZED "vectorized" - static int link_speed_handler(const char *key __rte_unused, const char *value, void *ret_val) @@ -2081,8 +2036,7 @@ link_speed_handler(const char *key __rte_unused, static int -virtio_dev_devargs_parse(struct rte_devargs *devargs, int *vdpa, - uint32_t *speed, int *vectorized) +virtio_dev_devargs_parse(struct rte_devargs *devargs, uint32_t *speed, int *vectorized) { struct rte_kvargs *kvlist; int ret = 0; @@ -2095,18 +2049,7 @@ virtio_dev_devargs_parse(struct rte_devargs *devargs, int *vdpa, PMD_INIT_LOG(ERR, "error when parsing param"); return 0; } - if (vdpa && rte_kvargs_count(kvlist, VIRTIO_ARG_VDPA) == 1) { - /* vdpa mode selected when there's a key-value pair: - * vdpa=1 - */ - ret = rte_kvargs_process(kvlist, VIRTIO_ARG_VDPA, - vdpa_check_handler, vdpa); - if (ret < 0) { - PMD_INIT_LOG(ERR, "Failed to parse %s", - VIRTIO_ARG_VDPA); - goto exit; - } - } + if (speed && rte_kvargs_count(kvlist, VIRTIO_ARG_SPEED) == 1) { ret = rte_kvargs_process(kvlist, VIRTIO_ARG_SPEED, @@ -2135,52 +2078,7 @@ virtio_dev_devargs_parse(struct rte_devargs *devargs, int *vdpa, return ret; } -static int eth_virtio_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, - struct rte_pci_device *pci_dev) -{ - int vdpa = 0; - int ret = 0; - - ret = virtio_dev_devargs_parse(pci_dev->device.devargs, &vdpa, NULL, - NULL); - if (ret < 0) { - PMD_INIT_LOG(ERR, "devargs parsing is failed"); - return ret; - } - /* virtio pmd skips probe if device needs to work in vdpa mode */ - if (vdpa == 1) - return 1; - - return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct virtio_pci_dev), - eth_virtio_dev_init); -} - -static int eth_virtio_pci_remove(struct rte_pci_device *pci_dev) -{ - int ret; - - ret = rte_eth_dev_pci_generic_remove(pci_dev, eth_virtio_dev_uninit); - /* Port has already been released by close. */ - if (ret == -ENODEV) - ret = 0; - return ret; -} - -static struct rte_pci_driver rte_virtio_pmd = { - .driver = { - .name = "net_virtio", - }, - .id_table = pci_id_virtio_map, - .drv_flags = 0, - .probe = eth_virtio_pci_probe, - .remove = eth_virtio_pci_remove, -}; -RTE_INIT(rte_virtio_pmd_init) -{ - rte_eal_iopl_init(); - rte_pci_register(&rte_virtio_pmd); -} static bool rx_offload_enabled(struct virtio_hw *hw) @@ -2521,7 +2419,7 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev) /* * Stop device: disable interrupt and mark link down */ -static int +int virtio_dev_stop(struct rte_eth_dev *dev) { struct virtio_hw *hw = dev->data->dev_private; @@ -2673,7 +2571,5 @@ __rte_unused uint8_t is_rx) } RTE_PMD_EXPORT_NAME(net_virtio, __COUNTER__); -RTE_PMD_REGISTER_PCI_TABLE(net_virtio, pci_id_virtio_map); -RTE_PMD_REGISTER_KMOD_DEP(net_virtio, "* igb_uio | uio_pci_generic | vfio-pci"); RTE_LOG_REGISTER(virtio_logtype_init, pmd.net.virtio.init, NOTICE); RTE_LOG_REGISTER(virtio_logtype_driver, pmd.net.virtio.driver, NOTICE); diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h index b7d52d497f..13395937c8 100644 --- a/drivers/net/virtio/virtio_ethdev.h +++ b/drivers/net/virtio/virtio_ethdev.h @@ -117,6 +117,8 @@ void virtio_interrupt_handler(void *param); int virtio_dev_pause(struct rte_eth_dev *dev); void virtio_dev_resume(struct rte_eth_dev *dev); +int virtio_dev_stop(struct rte_eth_dev *dev); +int virtio_dev_close(struct rte_eth_dev *dev); int virtio_inject_pkts(struct rte_eth_dev *dev, struct rte_mbuf **tx_pkts, int nb_pkts); diff --git a/drivers/net/virtio/virtio_pci_ethdev.c b/drivers/net/virtio/virtio_pci_ethdev.c new file mode 100644 index 0000000000..9c0935068e --- /dev/null +++ b/drivers/net/virtio/virtio_pci_ethdev.c @@ -0,0 +1,148 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2016 Intel Corporation + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "virtio_ethdev.h" +#include "virtio_pci.h" +#include "virtio_logs.h" + +/* + * The set of PCI devices this driver supports + */ +static const struct rte_pci_id pci_id_virtio_map[] = { + { RTE_PCI_DEVICE(VIRTIO_PCI_VENDORID, VIRTIO_PCI_LEGACY_DEVICEID_NET) }, + { RTE_PCI_DEVICE(VIRTIO_PCI_VENDORID, VIRTIO_PCI_MODERN_DEVICEID_NET) }, + { .vendor_id = 0, /* sentinel */ }, +}; + +static int +eth_virtio_pci_init(struct rte_eth_dev *eth_dev) +{ + return eth_virtio_dev_init(eth_dev); +} + +static int +eth_virtio_pci_uninit(struct rte_eth_dev *eth_dev) +{ + int ret; + PMD_INIT_FUNC_TRACE(); + + if (rte_eal_process_type() == RTE_PROC_SECONDARY) + return 0; + + ret = virtio_dev_stop(eth_dev); + virtio_dev_close(eth_dev); + + PMD_INIT_LOG(DEBUG, "dev_uninit completed"); + + return ret; +} + +static int vdpa_check_handler(__rte_unused const char *key, + const char *value, void *ret_val) +{ + if (strcmp(value, "1") == 0) + *(int *)ret_val = 1; + else + *(int *)ret_val = 0; + + return 0; +} + +#define VIRTIO_ARG_VDPA "vdpa" + +static int +virtio_pci_devargs_parse(struct rte_devargs *devargs, int *vdpa) +{ + struct rte_kvargs *kvlist; + int ret = 0; + + if (devargs == NULL) + return 0; + + kvlist = rte_kvargs_parse(devargs->args, NULL); + if (kvlist == NULL) { + PMD_INIT_LOG(ERR, "error when parsing param"); + return 0; + } + + if (vdpa && rte_kvargs_count(kvlist, VIRTIO_ARG_VDPA) == 1) { + /* vdpa mode selected when there's a key-value pair: + * vdpa=1 + */ + ret = rte_kvargs_process(kvlist, VIRTIO_ARG_VDPA, + vdpa_check_handler, vdpa); + if (ret < 0) + PMD_INIT_LOG(ERR, "Failed to parse %s", VIRTIO_ARG_VDPA); + } + + rte_kvargs_free(kvlist); + + return ret; +} + +static int eth_virtio_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, + struct rte_pci_device *pci_dev) +{ + int vdpa = 0; + int ret = 0; + + ret = virtio_pci_devargs_parse(pci_dev->device.devargs, &vdpa); + if (ret < 0) { + PMD_INIT_LOG(ERR, "devargs parsing is failed"); + return ret; + } + /* virtio pmd skips probe if device needs to work in vdpa mode */ + if (vdpa == 1) + return 1; + + return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct virtio_pci_dev), + eth_virtio_pci_init); +} + +static int eth_virtio_pci_remove(struct rte_pci_device *pci_dev) +{ + int ret; + + ret = rte_eth_dev_pci_generic_remove(pci_dev, eth_virtio_pci_uninit); + /* Port has already been released by close. */ + if (ret == -ENODEV) + ret = 0; + return ret; +} + +static struct rte_pci_driver rte_virtio_pmd = { + .driver = { + .name = "net_virtio", + }, + .id_table = pci_id_virtio_map, + .drv_flags = 0, + .probe = eth_virtio_pci_probe, + .remove = eth_virtio_pci_remove, +}; + +RTE_INIT(rte_virtio_pmd_init) +{ + rte_eal_iopl_init(); + rte_pci_register(&rte_virtio_pmd); +} + +RTE_PMD_REGISTER_PCI_TABLE(net_virtio, pci_id_virtio_map); +RTE_PMD_REGISTER_KMOD_DEP(net_virtio, "* igb_uio | uio_pci_generic | vfio-pci"); From patchwork Sun Dec 20 21:13:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85530 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2C258A09FD; Sun, 20 Dec 2020 22:16:24 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 676F1CC61; Sun, 20 Dec 2020 22:14:53 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id 5DEF7CC61 for ; Sun, 20 Dec 2020 22:14:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498888; 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=ngFaAcl2N4TERxTutj/WmH8Ba0oQ5AekZrjPyGkBbuI=; b=XrCyRiraBrwREq8MQz/7qVys01cYl3BGBd0XiVI6IC0Df/1s9J5F0iQparWGBTTw/gQQvL FDo8Ms6yylCCXyxB5CujChtId6Bzd5SHzSwwty0bpOd5z174FeYwIzl0plAgkAmhbhlJqG uguLtnlXu5u0sYYEIGj5BmDgvHwtpbc= 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-169-hl-uR6tuPf2uzw4aa4tGew-1; Sun, 20 Dec 2020 16:14:45 -0500 X-MC-Unique: hl-uR6tuPf2uzw4aa4tGew-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E1A56801817; Sun, 20 Dec 2020 21:14:43 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4357D60C43; Sun, 20 Dec 2020 21:14:42 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:31 +0100 Message-Id: <20201220211405.313012-7-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 06/40] net/virtio: move PCI specific dev init to PCI ethdev init 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" This patch moves the PCI specific initialization from eth_virtio_dev_init() to eth_virtio_pci_init(). Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia Reviewed-by: David Marchand --- drivers/net/virtio/virtio_ethdev.c | 63 +---------------------- drivers/net/virtio/virtio_pci_ethdev.c | 71 +++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 63 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index ca21a019e5..4032a89396 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1676,7 +1676,6 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) struct virtio_hw *hw = eth_dev->data->dev_private; struct virtio_net_config *config; struct virtio_net_config local_config; - struct rte_pci_device *pci_dev = NULL; int ret; /* Reset the device although not necessary at startup */ @@ -1697,9 +1696,6 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) hw->weak_barriers = !vtpci_with_feature(hw, VIRTIO_F_ORDER_PLATFORM); - if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == VIRTIO_BUS_PCI_MODERN) - pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); - /* If host does not support both status and MSI-X then disable LSC */ if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS) && hw->use_msix != VIRTIO_MSIX_NONE) @@ -1828,45 +1824,9 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) vtpci_reinit_complete(hw); - if (pci_dev) - PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x", - eth_dev->data->port_id, pci_dev->id.vendor_id, - pci_dev->id.device_id); - return 0; } -/* - * Remap the PCI device again (IO port map for legacy device and - * memory map for modern device), so that the secondary process - * could have the PCI initiated correctly. - */ -static int -virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw) -{ - if (hw->bus_type == VIRTIO_BUS_PCI_MODERN) { - /* - * We don't have to re-parse the PCI config space, since - * rte_pci_map_device() makes sure the mapped address - * in secondary process would equal to the one mapped in - * the primary process: error will be returned if that - * requirement is not met. - * - * That said, we could simply reuse all cap pointers - * (such as dev_cfg, common_cfg, etc.) parsed from the - * primary process, which is stored in shared memory. - */ - if (rte_pci_map_device(pci_dev)) { - PMD_INIT_LOG(DEBUG, "failed to map pci device!"); - return -1; - } - } else if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) { - if (rte_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0) - return -1; - } - - return 0; -} static void virtio_set_vtpci_ops(struct virtio_hw *hw) @@ -1906,17 +1866,11 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) eth_dev->rx_descriptor_done = virtio_dev_rx_queue_done; if (rte_eal_process_type() == RTE_PROC_SECONDARY) { - if (hw->bus_type != VIRTIO_BUS_USER) { - ret = virtio_remap_pci(RTE_ETH_DEV_TO_PCI(eth_dev), hw); - if (ret) - return ret; - } - virtio_set_vtpci_ops(hw); set_rxtx_funcs(eth_dev); - return 0; } + ret = virtio_dev_devargs_parse(eth_dev->device->devargs, &speed, &vectorized); if (ret < 0) return ret; @@ -1933,15 +1887,6 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) } hw->port_id = eth_dev->data->port_id; - /* For virtio_user case the hw->virtio_user_dev is populated by - * virtio_user_eth_dev_alloc() before eth_virtio_dev_init() is called. - */ - if (hw->bus_type != VIRTIO_BUS_USER) { - ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw); - if (ret) - goto err_vtpci_init; - } - rte_spinlock_init(&hw->state_lock); /* reset device and negotiate default features */ @@ -1968,12 +1913,6 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) return 0; err_virtio_init: - if (hw->bus_type == VIRTIO_BUS_PCI_MODERN || hw->bus_type == VIRTIO_BUS_PCI_LEGACY) { - rte_pci_unmap_device(RTE_ETH_DEV_TO_PCI(eth_dev)); - if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) - rte_pci_ioport_unmap(VTPCI_IO(hw)); - } -err_vtpci_init: rte_free(eth_dev->data->mac_addrs); eth_dev->data->mac_addrs = NULL; return ret; diff --git a/drivers/net/virtio/virtio_pci_ethdev.c b/drivers/net/virtio/virtio_pci_ethdev.c index 9c0935068e..d6cbe582d2 100644 --- a/drivers/net/virtio/virtio_pci_ethdev.c +++ b/drivers/net/virtio/virtio_pci_ethdev.c @@ -32,10 +32,79 @@ static const struct rte_pci_id pci_id_virtio_map[] = { { .vendor_id = 0, /* sentinel */ }, }; + +/* + * Remap the PCI device again (IO port map for legacy device and + * memory map for modern device), so that the secondary process + * could have the PCI initiated correctly. + */ +static int +virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw) +{ + if (hw->bus_type == VIRTIO_BUS_PCI_MODERN) { + /* + * We don't have to re-parse the PCI config space, since + * rte_pci_map_device() makes sure the mapped address + * in secondary process would equal to the one mapped in + * the primary process: error will be returned if that + * requirement is not met. + * + * That said, we could simply reuse all cap pointers + * (such as dev_cfg, common_cfg, etc.) parsed from the + * primary process, which is stored in shared memory. + */ + if (rte_pci_map_device(pci_dev)) { + PMD_INIT_LOG(DEBUG, "failed to map pci device!"); + return -1; + } + } else if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) { + if (rte_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0) + return -1; + } + + return 0; +} + static int eth_virtio_pci_init(struct rte_eth_dev *eth_dev) { - return eth_virtio_dev_init(eth_dev); + struct virtio_pci_dev *dev = eth_dev->data->dev_private; + struct virtio_hw *hw = &dev->hw; + struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); + int ret; + + if (rte_eal_process_type() == RTE_PROC_PRIMARY) { + ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw); + if (ret) { + PMD_INIT_LOG(ERR, "Failed to init PCI device\n"); + return -1; + } + } else { + ret = virtio_remap_pci(RTE_ETH_DEV_TO_PCI(eth_dev), hw); + if (ret < 0) { + PMD_INIT_LOG(ERR, "Failed to remap PCI device\n"); + return -1; + } + } + + ret = eth_virtio_dev_init(eth_dev); + if (ret < 0) { + PMD_INIT_LOG(ERR, "Failed to init virtio device\n"); + goto err_unmap; + } + + PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x", + eth_dev->data->port_id, pci_dev->id.vendor_id, + pci_dev->id.device_id); + + return 0; + +err_unmap: + rte_pci_unmap_device(RTE_ETH_DEV_TO_PCI(eth_dev)); + if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) + rte_pci_ioport_unmap(VTPCI_IO(hw)); + + return ret; } static int From patchwork Sun Dec 20 21:13:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85531 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 406F6A09FD; Sun, 20 Dec 2020 22:16:47 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 44F33CCA4; Sun, 20 Dec 2020 22:14:55 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id 769B3CC64 for ; Sun, 20 Dec 2020 22:14:52 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498890; 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=hDS0HN9mc1mfTLfuC9RWVNb0lJntHMktJrJ6+hQQGL8=; b=i8VYV9LZcBPXM32wWqlgDJE1E159bZx3Exp+fgEmdlX4siGi7pdxoPmyq58bQgjoNj4E+M ge/FWFM6tNuayVrkEIQF3kAcdcNFRRPj6cbzWTRFoWiSmSiKKTlJwVBBVJeTPQl3kpT0Xi uP9oQVlVUuW8YhJtGUtMcbmCZOulzeo= 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-305-lGqZQxxeNhCyvNrpiNPqmw-1; Sun, 20 Dec 2020 16:14:47 -0500 X-MC-Unique: lGqZQxxeNhCyvNrpiNPqmw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 01145107ACE6; Sun, 20 Dec 2020 21:14:46 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 48ABD60C43; Sun, 20 Dec 2020 21:14:44 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:32 +0100 Message-Id: <20201220211405.313012-8-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 07/40] net/virtio: move MSIX detection to PCI ethdev 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" There is no point it detecting whether we can use MSIX every time the interrupt is enabled/disabled/masked. Let's do it once for all at PCI device init time. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio_ethdev.c | 15 --------------- drivers/net/virtio/virtio_pci.c | 5 ++++- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 4032a89396..67f6be3fa8 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1282,42 +1282,27 @@ virtio_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) static int virtio_intr_unmask(struct rte_eth_dev *dev) { - struct virtio_hw *hw = dev->data->dev_private; - if (rte_intr_ack(dev->intr_handle) < 0) return -1; - if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == VIRTIO_BUS_PCI_MODERN) - hw->use_msix = vtpci_msix_detect(RTE_ETH_DEV_TO_PCI(dev)); - return 0; } static int virtio_intr_enable(struct rte_eth_dev *dev) { - struct virtio_hw *hw = dev->data->dev_private; - if (rte_intr_enable(dev->intr_handle) < 0) return -1; - if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == VIRTIO_BUS_PCI_MODERN) - hw->use_msix = vtpci_msix_detect(RTE_ETH_DEV_TO_PCI(dev)); - return 0; } static int virtio_intr_disable(struct rte_eth_dev *dev) { - struct virtio_hw *hw = dev->data->dev_private; - if (rte_intr_disable(dev->intr_handle) < 0) return -1; - if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == VIRTIO_BUS_PCI_MODERN) - hw->use_msix = vtpci_msix_detect(RTE_ETH_DEV_TO_PCI(dev)); - return 0; } diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 1692268f30..8605254e53 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -698,7 +698,7 @@ vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw) PMD_INIT_LOG(INFO, "modern virtio pci detected."); virtio_hw_internal[hw->port_id].vtpci_ops = &modern_ops; hw->bus_type = VIRTIO_BUS_PCI_MODERN; - return 0; + goto msix_detect; } PMD_INIT_LOG(INFO, "trying with legacy virtio pci."); @@ -718,6 +718,9 @@ vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw) virtio_hw_internal[hw->port_id].vtpci_ops = &legacy_ops; hw->bus_type = VIRTIO_BUS_PCI_LEGACY; +msix_detect: + hw->use_msix = vtpci_msix_detect(dev); + return 0; } From patchwork Sun Dec 20 21:13:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85532 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7BC1BA09FD; Sun, 20 Dec 2020 22:17:05 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CB79FCCAD; Sun, 20 Dec 2020 22:14:56 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id CBDFDCC64 for ; Sun, 20 Dec 2020 22:14:52 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498891; 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=KzQuyJ4zT5q3vVbXPXYaTPIKHCtqNVN32SsAQMbxJ0Q=; b=QXewgkyQk3PCXO1qV2Q5lCbOc9j3zHvh6mWp2MuNQO1D7zAjE5AjwOmB1CvsDp9B8087uT vOr40ttN4G5j6xgLslO3gX92EyTGCcHnAnCPFE09DfE07U4L3dema3EV4fLnDVPLQd7UTn WH6HDk/wsa0V7NuNcsD8oyFX+5qYQig= 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-249-qPQ5wzWlNn6wowP0uyH7-w-1; Sun, 20 Dec 2020 16:14:49 -0500 X-MC-Unique: qPQ5wzWlNn6wowP0uyH7-w-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 5764C801817; Sun, 20 Dec 2020 21:14:48 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6392D60C43; Sun, 20 Dec 2020 21:14:46 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:33 +0100 Message-Id: <20201220211405.313012-9-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 08/40] net/virtio: force IOVA as VA mode for Virtio-user 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" At least Vhost-user backend of Virtio-user PMD requires IOVA as VA mode. Until now, it was implemented as a hack by forcing to use mbuf's buf_addr field instead of buf_iova. This patcv removes all this logic and just fails probing if IOVA as VA mode is not selected. It simplifies the code overall, and removes some bus-specific logic from generic virtio_ethdev.c. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio_ethdev.c | 15 --------- drivers/net/virtio/virtio_rxtx.c | 34 +++++++++------------ drivers/net/virtio/virtio_rxtx_packed_avx.c | 10 +++--- drivers/net/virtio/virtio_rxtx_simple.h | 3 +- drivers/net/virtio/virtio_user_ethdev.c | 11 +++++++ drivers/net/virtio/virtqueue.h | 25 +-------------- 6 files changed, 32 insertions(+), 66 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 67f6be3fa8..13e2ec998a 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -576,21 +576,6 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) hw->cvq = cvq; } - /* For virtio_user case (that is when hw->virtio_user_dev is not NULL), - * we use virtual address. And we need properly set _offset_, please see - * VIRTIO_MBUF_DATA_DMA_ADDR in virtqueue.h for more information. - */ - if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY || hw->bus_type == VIRTIO_BUS_PCI_MODERN) { - vq->offset = offsetof(struct rte_mbuf, buf_iova); - } else if (hw->bus_type == VIRTIO_BUS_USER) { - vq->vq_ring_mem = (uintptr_t)mz->addr; - vq->offset = offsetof(struct rte_mbuf, buf_addr); - if (queue_type == VTNET_TQ) - txvq->virtio_net_hdr_mem = (uintptr_t)hdr_mz->addr; - else if (queue_type == VTNET_CQ) - cvq->virtio_net_hdr_mem = (uintptr_t)hdr_mz->addr; - } - if (queue_type == VTNET_TQ) { struct virtio_tx_region *txr; unsigned int i; diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c index 77934e8c58..93fe856cbd 100644 --- a/drivers/net/virtio/virtio_rxtx.c +++ b/drivers/net/virtio/virtio_rxtx.c @@ -271,13 +271,10 @@ virtqueue_enqueue_refill_inorder(struct virtqueue *vq, dxp->cookie = (void *)cookies[i]; dxp->ndescs = 1; - start_dp[idx].addr = - VIRTIO_MBUF_ADDR(cookies[i], vq) + - RTE_PKTMBUF_HEADROOM - hw->vtnet_hdr_size; - start_dp[idx].len = - cookies[i]->buf_len - - RTE_PKTMBUF_HEADROOM + - hw->vtnet_hdr_size; + start_dp[idx].addr = cookies[i]->buf_iova + + RTE_PKTMBUF_HEADROOM - hw->vtnet_hdr_size; + start_dp[idx].len = cookies[i]->buf_len - + RTE_PKTMBUF_HEADROOM + hw->vtnet_hdr_size; start_dp[idx].flags = VRING_DESC_F_WRITE; vq_update_avail_ring(vq, idx); @@ -313,12 +310,10 @@ virtqueue_enqueue_recv_refill(struct virtqueue *vq, struct rte_mbuf **cookie, dxp->cookie = (void *)cookie[i]; dxp->ndescs = 1; - start_dp[idx].addr = - VIRTIO_MBUF_ADDR(cookie[i], vq) + + start_dp[idx].addr = cookie[i]->buf_iova + RTE_PKTMBUF_HEADROOM - hw->vtnet_hdr_size; - start_dp[idx].len = - cookie[i]->buf_len - RTE_PKTMBUF_HEADROOM + - hw->vtnet_hdr_size; + start_dp[idx].len = cookie[i]->buf_len - + RTE_PKTMBUF_HEADROOM + hw->vtnet_hdr_size; start_dp[idx].flags = VRING_DESC_F_WRITE; vq->vq_desc_head_idx = start_dp[idx].next; vq_update_avail_ring(vq, idx); @@ -355,10 +350,10 @@ virtqueue_enqueue_recv_refill_packed(struct virtqueue *vq, dxp->cookie = (void *)cookie[i]; dxp->ndescs = 1; - start_dp[idx].addr = VIRTIO_MBUF_ADDR(cookie[i], vq) + - RTE_PKTMBUF_HEADROOM - hw->vtnet_hdr_size; - start_dp[idx].len = cookie[i]->buf_len - RTE_PKTMBUF_HEADROOM - + hw->vtnet_hdr_size; + start_dp[idx].addr = cookie[i]->buf_iova + + RTE_PKTMBUF_HEADROOM - hw->vtnet_hdr_size; + start_dp[idx].len = cookie[i]->buf_len - + RTE_PKTMBUF_HEADROOM + hw->vtnet_hdr_size; vq->vq_desc_head_idx = dxp->next; if (vq->vq_desc_head_idx == VQ_RING_DESC_CHAIN_END) @@ -455,8 +450,7 @@ virtqueue_enqueue_xmit_inorder(struct virtnet_tx *txvq, else virtqueue_xmit_offload(hdr, cookies[i], true); - start_dp[idx].addr = - VIRTIO_MBUF_DATA_DMA_ADDR(cookies[i], vq) - head_size; + start_dp[idx].addr = rte_mbuf_data_iova(cookies[i]) - head_size; start_dp[idx].len = cookies[i]->data_len + head_size; start_dp[idx].flags = 0; @@ -503,7 +497,7 @@ virtqueue_enqueue_xmit_packed_fast(struct virtnet_tx *txvq, else virtqueue_xmit_offload(hdr, cookie, true); - dp->addr = VIRTIO_MBUF_DATA_DMA_ADDR(cookie, vq) - head_size; + dp->addr = rte_mbuf_data_iova(cookie) - head_size; dp->len = cookie->data_len + head_size; dp->id = id; @@ -590,7 +584,7 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, virtqueue_xmit_offload(hdr, cookie, vq->hw->has_tx_offload); do { - start_dp[idx].addr = VIRTIO_MBUF_DATA_DMA_ADDR(cookie, vq); + start_dp[idx].addr = rte_mbuf_data_iova(cookie); start_dp[idx].len = cookie->data_len; if (prepend_header) { start_dp[idx].addr -= head_size; diff --git a/drivers/net/virtio/virtio_rxtx_packed_avx.c b/drivers/net/virtio/virtio_rxtx_packed_avx.c index 9bc62719ee..a6a49ec439 100644 --- a/drivers/net/virtio/virtio_rxtx_packed_avx.c +++ b/drivers/net/virtio/virtio_rxtx_packed_avx.c @@ -133,13 +133,13 @@ virtqueue_enqueue_batch_packed_vec(struct virtnet_tx *txvq, } __m512i descs_base = _mm512_set_epi64(tx_pkts[3]->data_len, - VIRTIO_MBUF_ADDR(tx_pkts[3], vq), + tx_pkts[3]->buf_iova, tx_pkts[2]->data_len, - VIRTIO_MBUF_ADDR(tx_pkts[2], vq), + tx_pkts[2]->buf_iova, tx_pkts[1]->data_len, - VIRTIO_MBUF_ADDR(tx_pkts[1], vq), + tx_pkts[1]->buf_iova, tx_pkts[0]->data_len, - VIRTIO_MBUF_ADDR(tx_pkts[0], vq)); + tx_pkts[0]->buf_iova); /* id offset and data offset */ __m512i data_offsets = _mm512_set_epi64((uint64_t)3 << ID_BITS_OFFSET, @@ -536,7 +536,7 @@ virtio_recv_refill_packed_vec(struct virtnet_rx *rxvq, dxp = &vq->vq_descx[idx + i]; dxp->cookie = (void *)cookie[total_num + i]; - addr = VIRTIO_MBUF_ADDR(cookie[total_num + i], vq) + + addr = cookie[total_num + i]->buf_iova + RTE_PKTMBUF_HEADROOM - hw->vtnet_hdr_size; start_dp[idx + i].addr = addr; start_dp[idx + i].len = cookie[total_num + i]->buf_len diff --git a/drivers/net/virtio/virtio_rxtx_simple.h b/drivers/net/virtio/virtio_rxtx_simple.h index 3d1296a23c..f2a5aedf97 100644 --- a/drivers/net/virtio/virtio_rxtx_simple.h +++ b/drivers/net/virtio/virtio_rxtx_simple.h @@ -43,8 +43,7 @@ virtio_rxq_rearm_vec(struct virtnet_rx *rxvq) p = (uintptr_t)&sw_ring[i]->rearm_data; *(uint64_t *)p = rxvq->mbuf_initializer; - start_dp[i].addr = - VIRTIO_MBUF_ADDR(sw_ring[i], vq) + + start_dp[i].addr = sw_ring[i]->buf_iova + RTE_PKTMBUF_HEADROOM - vq->hw->vtnet_hdr_size; start_dp[i].len = sw_ring[i]->buf_len - RTE_PKTMBUF_HEADROOM + vq->hw->vtnet_hdr_size; diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 1f1f63a1a5..f4775ff141 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -663,6 +663,17 @@ virtio_user_pmd_probe(struct rte_vdev_device *vdev) char *mac_addr = NULL; int ret = -1; + /* + * ToDo 1: Implement detection mechanism at vdev bus level as PCI, but + * it implies API breakage. + * ToDo 2: Check if all backends have this requirement. Likely + * Vhost-vDPA and Vhost-Kernel are fine with PA IOVA mode. + */ + if (rte_eal_iova_mode() != RTE_IOVA_VA) { + PMD_INIT_LOG(ERR, "Probing failed, only VA IOVA mode supported\n"); + return -1; + } + if (rte_eal_process_type() == RTE_PROC_SECONDARY) { const char *name = rte_vdev_device_name(vdev); eth_dev = rte_eth_dev_attach_secondary(name); diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index 42c4c9882f..e4a1393816 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -114,29 +114,6 @@ virtqueue_store_flags_packed(struct vring_packed_desc *dp, #define VIRTQUEUE_MAX_NAME_SZ 32 -#ifdef RTE_VIRTIO_USER -/** - * Return the physical address (or virtual address in case of - * virtio-user) of mbuf data buffer. - * - * The address is firstly casted to the word size (sizeof(uintptr_t)) - * before casting it to uint64_t. This is to make it work with different - * combination of word size (64 bit and 32 bit) and virtio device - * (virtio-pci and virtio-user). - */ -#define VIRTIO_MBUF_ADDR(mb, vq) \ - ((uint64_t)(*(uintptr_t *)((uintptr_t)(mb) + (vq)->offset))) -#else -#define VIRTIO_MBUF_ADDR(mb, vq) ((mb)->buf_iova) -#endif - -/** - * Return the physical address (or virtual address in case of - * virtio-user) of mbuf data buffer, taking care of mbuf data offset - */ -#define VIRTIO_MBUF_DATA_DMA_ADDR(mb, vq) \ - (VIRTIO_MBUF_ADDR(mb, vq) + (mb)->data_off) - #define VTNET_SQ_RQ_QUEUE_IDX 0 #define VTNET_SQ_TQ_QUEUE_IDX 1 #define VTNET_SQ_CQ_QUEUE_IDX 2 @@ -764,7 +741,7 @@ virtqueue_enqueue_xmit_packed(struct virtnet_tx *txvq, struct rte_mbuf *cookie, do { uint16_t flags; - start_dp[idx].addr = VIRTIO_MBUF_DATA_DMA_ADDR(cookie, vq); + start_dp[idx].addr = rte_mbuf_data_iova(cookie); start_dp[idx].len = cookie->data_len; if (prepend_header) { start_dp[idx].addr -= head_size; From patchwork Sun Dec 20 21:13:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85533 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 17BB7A09FD; Sun, 20 Dec 2020 22:17:24 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 72B9DCCB9; Sun, 20 Dec 2020 22:14:58 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id E1B93CCB3 for ; Sun, 20 Dec 2020 22:14:56 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498895; 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=sF6x6hJOhWZuYF5kD5M/pMBZt5AT9HUa+wCZwCrLzi4=; b=L24xP0vZ9dvII4SguAKTpw7/xdAwfCQ+yXlbUJcbfWpa/TYFTDUCBIVRJoCayY3JtgDLbY p5jBGw/pM83WMseoPAYGTvgOS9gzX3Md6sNiP6tt3qgjw7OECwEYQ6ooUkhEF0+nOKlQ1x /aOYrt5p2drrgeJFuTNyEavsPoyJPXI= 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-472-qjt6fj2XO4u8FQNB9U55aQ-1; Sun, 20 Dec 2020 16:14:51 -0500 X-MC-Unique: qjt6fj2XO4u8FQNB9U55aQ-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9573359; Sun, 20 Dec 2020 21:14:50 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id B29BC60C43; Sun, 20 Dec 2020 21:14:48 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:34 +0100 Message-Id: <20201220211405.313012-10-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 09/40] net/virtio: store PCI type in Virtio device metadata 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" Going further in making the Virtio ethdev layer bus agnostic, this patch adds a boolean in the Virtio PCI device metadata. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia Reviewed-by: David Marchand --- drivers/net/virtio/virtio_pci.c | 20 ++++++++++++-------- drivers/net/virtio/virtio_pci.h | 3 ++- drivers/net/virtio/virtio_pci_ethdev.c | 12 +++++++----- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 8605254e53..7f0c066968 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -687,26 +687,29 @@ virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw) * Return 0 on success. */ int -vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw) +vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev) { + struct virtio_hw *hw = &dev->hw; + /* * Try if we can succeed reading virtio pci caps, which exists * only on modern pci device. If failed, we fallback to legacy * virtio handling. */ - if (virtio_read_caps(dev, hw) == 0) { + if (virtio_read_caps(pci_dev, hw) == 0) { PMD_INIT_LOG(INFO, "modern virtio pci detected."); virtio_hw_internal[hw->port_id].vtpci_ops = &modern_ops; hw->bus_type = VIRTIO_BUS_PCI_MODERN; + dev->modern = true; goto msix_detect; } PMD_INIT_LOG(INFO, "trying with legacy virtio pci."); - if (rte_pci_ioport_map(dev, 0, VTPCI_IO(hw)) < 0) { - rte_pci_unmap_device(dev); - if (dev->kdrv == RTE_PCI_KDRV_UNKNOWN && - (!dev->device.devargs || - dev->device.devargs->bus != + if (rte_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0) { + rte_pci_unmap_device(pci_dev); + if (pci_dev->kdrv == RTE_PCI_KDRV_UNKNOWN && + (!pci_dev->device.devargs || + pci_dev->device.devargs->bus != rte_bus_find_by_name("pci"))) { PMD_INIT_LOG(INFO, "skip kernel managed virtio device."); @@ -717,9 +720,10 @@ vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw) virtio_hw_internal[hw->port_id].vtpci_ops = &legacy_ops; hw->bus_type = VIRTIO_BUS_PCI_LEGACY; + dev->modern = false; msix_detect: - hw->use_msix = vtpci_msix_detect(dev); + hw->use_msix = vtpci_msix_detect(pci_dev); return 0; } diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 8d3dc0e22e..3e245ed630 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -291,6 +291,7 @@ struct virtio_hw { struct virtio_pci_dev { struct virtio_hw hw; + bool modern; }; #define virtio_pci_get_dev(hw) container_of(hw, struct virtio_pci_dev, hw) @@ -367,7 +368,7 @@ vtpci_packed_queue(struct virtio_hw *hw) /* * Function declaration from virtio_pci.c */ -int vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw); +int vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev); void vtpci_reset(struct virtio_hw *); void vtpci_reinit_complete(struct virtio_hw *); diff --git a/drivers/net/virtio/virtio_pci_ethdev.c b/drivers/net/virtio/virtio_pci_ethdev.c index d6cbe582d2..f513381707 100644 --- a/drivers/net/virtio/virtio_pci_ethdev.c +++ b/drivers/net/virtio/virtio_pci_ethdev.c @@ -39,9 +39,11 @@ static const struct rte_pci_id pci_id_virtio_map[] = { * could have the PCI initiated correctly. */ static int -virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw) +virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev) { - if (hw->bus_type == VIRTIO_BUS_PCI_MODERN) { + struct virtio_hw *hw = &dev->hw; + + if (dev->modern) { /* * We don't have to re-parse the PCI config space, since * rte_pci_map_device() makes sure the mapped address @@ -57,7 +59,7 @@ virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw) PMD_INIT_LOG(DEBUG, "failed to map pci device!"); return -1; } - } else if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) { + } else { if (rte_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0) return -1; } @@ -74,13 +76,13 @@ eth_virtio_pci_init(struct rte_eth_dev *eth_dev) int ret; if (rte_eal_process_type() == RTE_PROC_PRIMARY) { - ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), hw); + ret = vtpci_init(RTE_ETH_DEV_TO_PCI(eth_dev), dev); if (ret) { PMD_INIT_LOG(ERR, "Failed to init PCI device\n"); return -1; } } else { - ret = virtio_remap_pci(RTE_ETH_DEV_TO_PCI(eth_dev), hw); + ret = virtio_remap_pci(RTE_ETH_DEV_TO_PCI(eth_dev), dev); if (ret < 0) { PMD_INIT_LOG(ERR, "Failed to remap PCI device\n"); return -1; From patchwork Sun Dec 20 21:13:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85534 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id A7896A09FD; Sun, 20 Dec 2020 22:17:42 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EE658CCE0; Sun, 20 Dec 2020 22:15:00 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id 52955CCDC for ; Sun, 20 Dec 2020 22:14:59 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498897; 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=29h30Bv2jf7yyIjVWL7Wkvjbzlh8/UbgT/uZPBufVhE=; b=dw8uXkXPBPDIPHujSTFMfh/wHui0RoKqpdTe4rrNzCQhgZqa9IXdgWD7mv7Qzve5CGncKI /45G/k03WamRgRH2hq/1Qz03NtSSeN0cK6MckYc2sCrHXe8iISrHXgsVgIxnA1Pr3WDPa6 HU0Tneqj9pnWlpDzKuQv6Km5YnoUagI= 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-465-pqcsZrbdMZOEh5S3FZQskg-1; Sun, 20 Dec 2020 16:14:54 -0500 X-MC-Unique: pqcsZrbdMZOEh5S3FZQskg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D3088107ACE3; Sun, 20 Dec 2020 21:14:52 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id F017D60C43; Sun, 20 Dec 2020 21:14:50 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:35 +0100 Message-Id: <20201220211405.313012-11-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 10/40] net/virtio: add callback for device closing 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" This patch introduces a new callback for device closing, making virtio_dev_close() bus-agnostic. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia Reviewed-by: David Marchand --- drivers/net/virtio/meson.build | 2 -- drivers/net/virtio/virtio_ethdev.c | 13 +------------ drivers/net/virtio/virtio_pci.c | 25 +++++++++++++++++++++++++ drivers/net/virtio/virtio_pci.h | 2 ++ drivers/net/virtio/virtio_user_ethdev.c | 11 +++++++++++ 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/drivers/net/virtio/meson.build b/drivers/net/virtio/meson.build index 8e0f1a9951..0b62418f33 100644 --- a/drivers/net/virtio/meson.build +++ b/drivers/net/virtio/meson.build @@ -37,8 +37,6 @@ elif arch_subdir == 'arm' and host_machine.cpu_family().startswith('aarch64') endif if is_linux - dpdk_conf.set('RTE_VIRTIO_USER', 1) - sources += files('virtio_user_ethdev.c', 'virtio_user/vhost_kernel.c', 'virtio_user/vhost_kernel_tap.c', diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 13e2ec998a..00aa38e4ef 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -718,18 +718,7 @@ virtio_dev_close(struct rte_eth_dev *dev) virtio_dev_free_mbufs(dev); virtio_free_queues(hw); -#ifdef RTE_VIRTIO_USER - if (hw->bus_type == VIRTIO_BUS_USER) - virtio_user_dev_uninit(dev->data->dev_private); - else -#endif - if (dev->device) { - rte_pci_unmap_device(RTE_ETH_DEV_TO_PCI(dev)); - if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) - rte_pci_ioport_unmap(VTPCI_IO(hw)); - } - - return 0; + return VTPCI_OPS(hw)->dev_close(hw); } static int diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 7f0c066968..599d8afa6b 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -241,6 +241,17 @@ legacy_notify_queue(struct virtio_hw *hw, struct virtqueue *vq) VIRTIO_PCI_QUEUE_NOTIFY); } +static int +legacy_dev_close(struct virtio_hw *hw) +{ + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + rte_pci_unmap_device(dev->pci_dev); + rte_pci_ioport_unmap(VTPCI_IO(hw)); + + return 0; +} + const struct virtio_pci_ops legacy_ops = { .read_dev_cfg = legacy_read_dev_config, .write_dev_cfg = legacy_write_dev_config, @@ -255,6 +266,7 @@ const struct virtio_pci_ops legacy_ops = { .setup_queue = legacy_setup_queue, .del_queue = legacy_del_queue, .notify_queue = legacy_notify_queue, + .dev_close = legacy_dev_close, }; static inline void @@ -446,6 +458,16 @@ modern_notify_queue(struct virtio_hw *hw, struct virtqueue *vq) rte_write32(notify_data, vq->notify_addr); } +static int +modern_dev_close(struct virtio_hw *hw) +{ + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + rte_pci_unmap_device(dev->pci_dev); + + return 0; +} + const struct virtio_pci_ops modern_ops = { .read_dev_cfg = modern_read_dev_config, .write_dev_cfg = modern_write_dev_config, @@ -460,6 +482,7 @@ const struct virtio_pci_ops modern_ops = { .setup_queue = modern_setup_queue, .del_queue = modern_del_queue, .notify_queue = modern_notify_queue, + .dev_close = modern_dev_close, }; @@ -691,6 +714,8 @@ vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev) { struct virtio_hw *hw = &dev->hw; + dev->pci_dev = pci_dev; + /* * Try if we can succeed reading virtio pci caps, which exists * only on modern pci device. If failed, we fallback to legacy diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 3e245ed630..4f7d0e479e 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -239,6 +239,7 @@ struct virtio_pci_ops { int (*setup_queue)(struct virtio_hw *hw, struct virtqueue *vq); void (*del_queue)(struct virtio_hw *hw, struct virtqueue *vq); void (*notify_queue)(struct virtio_hw *hw, struct virtqueue *vq); + int (*dev_close)(struct virtio_hw *hw); }; struct virtio_net_config; @@ -291,6 +292,7 @@ struct virtio_hw { struct virtio_pci_dev { struct virtio_hw hw; + struct rte_pci_device *pci_dev; bool modern; }; diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index f4775ff141..f9a2dbae71 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -462,6 +462,16 @@ virtio_user_notify_queue(struct virtio_hw *hw, struct virtqueue *vq) strerror(errno)); } +static int +virtio_user_dev_close(struct virtio_hw *hw) +{ + struct virtio_user_dev *dev = virtio_user_get_dev(hw); + + virtio_user_dev_uninit(dev); + + return 0; +} + const struct virtio_pci_ops virtio_user_ops = { .read_dev_cfg = virtio_user_read_dev_config, .write_dev_cfg = virtio_user_write_dev_config, @@ -476,6 +486,7 @@ const struct virtio_pci_ops virtio_user_ops = { .setup_queue = virtio_user_setup_queue, .del_queue = virtio_user_del_queue, .notify_queue = virtio_user_notify_queue, + .dev_close = virtio_user_dev_close, }; static const char *valid_args[] = { From patchwork Sun Dec 20 21:13:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85535 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9BD65A09FD; Sun, 20 Dec 2020 22:18:04 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 61F20CC75; Sun, 20 Dec 2020 22:15:07 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id AE555CD13 for ; Sun, 20 Dec 2020 22:15:05 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498904; 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=VVJaj7aHVOWkLCWI9xPgVkgKKABFwFHfrQKBmboFG+A=; b=K9ZmD/YG+9DatZuuygfJ6Rg0qw+ZcyAFTjOCQlDnbfBOYZmrmz/MsL4v4KWBSBTJP4dIDg /lAx/djnksa+xZPCs3LygDexMf56SRAiNu7jYzsI2JS8SBpIgumYIaGk2EjaNQ+M4FY+Fb Nz5m6Wg/7CGEAvrEcE0yAJ6qYI/j1Zo= 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-547-00vdfEcNOkmgQcjv3DJ2UA-1; Sun, 20 Dec 2020 16:15:02 -0500 X-MC-Unique: 00vdfEcNOkmgQcjv3DJ2UA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 40288BBEE1; Sun, 20 Dec 2020 21:15:01 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 41B4F60C43; Sun, 20 Dec 2020 21:14:53 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:36 +0100 Message-Id: <20201220211405.313012-12-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 11/40] net/virtio: validate features at bus level 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" This patch provides a new callback for the bus type to validate negotiated features are compatible with it. Only user for now is PCI modern bus type, which implies that the device supports Virtio 1.0+. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio_ethdev.c | 11 +++++------ drivers/net/virtio/virtio_pci.c | 19 +++++++++++++++++++ drivers/net/virtio/virtio_pci.h | 1 + drivers/net/virtio/virtio_user_ethdev.c | 7 +++++++ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 00aa38e4ef..91a93b2b6e 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1315,17 +1315,16 @@ virtio_negotiate_features(struct virtio_hw *hw, uint64_t req_features) PMD_INIT_LOG(DEBUG, "features after negotiate = %" PRIx64, hw->guest_features); - if (hw->bus_type == VIRTIO_BUS_PCI_MODERN && !vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) { - PMD_INIT_LOG(ERR, - "VIRTIO_F_VERSION_1 features is not enabled."); + if (VTPCI_OPS(hw)->features_ok(hw) < 0) { + PMD_INIT_LOG(ERR, "Features not OK at bus level\n"); return -1; } - if (hw->bus_type == VIRTIO_BUS_PCI_MODERN || hw->bus_type == VIRTIO_BUS_USER) { + if (vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) { vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); + if (!(vtpci_get_status(hw) & VIRTIO_CONFIG_STATUS_FEATURES_OK)) { - PMD_INIT_LOG(ERR, - "failed to set FEATURES_OK status!"); + PMD_INIT_LOG(ERR, "Failed to set FEATURES_OK status!"); return -1; } } diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 599d8afa6b..3de7980b4f 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -151,6 +151,12 @@ legacy_set_features(struct virtio_hw *hw, uint64_t features) VIRTIO_PCI_GUEST_FEATURES); } +static int +legacy_features_ok(struct virtio_hw *hw __rte_unused) +{ + return 0; +} + static uint8_t legacy_get_status(struct virtio_hw *hw) { @@ -259,6 +265,7 @@ const struct virtio_pci_ops legacy_ops = { .set_status = legacy_set_status, .get_features = legacy_get_features, .set_features = legacy_set_features, + .features_ok = legacy_features_ok, .get_isr = legacy_get_isr, .set_config_irq = legacy_set_config_irq, .set_queue_irq = legacy_set_queue_irq, @@ -332,6 +339,17 @@ modern_set_features(struct virtio_hw *hw, uint64_t features) &hw->common_cfg->guest_feature); } +static int +modern_features_ok(struct virtio_hw *hw) +{ + if (!vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) { + PMD_INIT_LOG(ERR, "Version 1+ required with modern devices\n"); + return -1; + } + + return 0; +} + static uint8_t modern_get_status(struct virtio_hw *hw) { @@ -475,6 +493,7 @@ const struct virtio_pci_ops modern_ops = { .set_status = modern_set_status, .get_features = modern_get_features, .set_features = modern_set_features, + .features_ok = modern_features_ok, .get_isr = modern_get_isr, .set_config_irq = modern_set_config_irq, .set_queue_irq = modern_set_queue_irq, diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 4f7d0e479e..22c21e6896 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -227,6 +227,7 @@ struct virtio_pci_ops { uint64_t (*get_features)(struct virtio_hw *hw); void (*set_features)(struct virtio_hw *hw, uint64_t features); + int (*features_ok)(struct virtio_hw *hw); uint8_t (*get_isr)(struct virtio_hw *hw); diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index f9a2dbae71..c93e0e43f5 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -327,6 +327,12 @@ virtio_user_set_features(struct virtio_hw *hw, uint64_t features) dev->features = features & dev->device_features; } +static int +virtio_user_features_ok(struct virtio_hw *hw __rte_unused) +{ + return 0; +} + static uint8_t virtio_user_get_isr(struct virtio_hw *hw __rte_unused) { @@ -479,6 +485,7 @@ const struct virtio_pci_ops virtio_user_ops = { .set_status = virtio_user_set_status, .get_features = virtio_user_get_features, .set_features = virtio_user_set_features, + .features_ok = virtio_user_features_ok, .get_isr = virtio_user_get_isr, .set_config_irq = virtio_user_set_config_irq, .set_queue_irq = virtio_user_set_queue_irq, From patchwork Sun Dec 20 21:13:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85536 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9B33DA09FD; Sun, 20 Dec 2020 22:18:22 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EA21ECD16; Sun, 20 Dec 2020 22:15:11 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id D7C15CC74 for ; Sun, 20 Dec 2020 22:15:09 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498908; 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=DwW2htdCXAr64FS7g+J96A08DIWwyUQwGtjbXucUm7c=; b=TRVgA5ip4MaHhxQc/wRWmM1DjmKJX6HkWBAyNZrLg7viis/nC4OROJ1jpqkEDbmLauOlcJ sMuc2e8xKj8Eq50c9Vs++sZ2NBqbK01Le8JbylMlnUSQo2AeRSZZPcQpgzIHivfNctMa4Y b3+BkR71E/V5Fgl38csyRdDM/O713cg= 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-579-ydOrWwqsOc-xevHp5ASHXQ-1; Sun, 20 Dec 2020 16:15:06 -0500 X-MC-Unique: ydOrWwqsOc-xevHp5ASHXQ-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7134C800D55; Sun, 20 Dec 2020 21:15:05 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9C2F660C43; Sun, 20 Dec 2020 21:15:01 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:37 +0100 Message-Id: <20201220211405.313012-13-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 12/40] net/virtio: remove bus type enum 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" Bus type awareness at the generic ethdev level is no more needed as previous patches have made it bus-agnostic. This patch removes it from struct virtio_hw. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia Reviewed-by: David Marchand --- drivers/net/virtio/virtio_ethdev.c | 15 --------------- drivers/net/virtio/virtio_pci.c | 2 -- drivers/net/virtio/virtio_pci.h | 8 -------- drivers/net/virtio/virtio_pci_ethdev.c | 7 ++++++- drivers/net/virtio/virtio_user_ethdev.c | 5 ++++- 5 files changed, 10 insertions(+), 27 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 91a93b2b6e..86d8930e78 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1785,20 +1785,6 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) return 0; } - -static void -virtio_set_vtpci_ops(struct virtio_hw *hw) -{ - if (hw->bus_type == VIRTIO_BUS_USER) - VTPCI_OPS(hw) = &virtio_user_ops; - else if (hw->bus_type == VIRTIO_BUS_PCI_MODERN) - VTPCI_OPS(hw) = &modern_ops; - else if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) - VTPCI_OPS(hw) = &legacy_ops; - - return; -} - /* * This function is based on probe() function in virtio_pci.c * It returns 0 on success. @@ -1824,7 +1810,6 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) eth_dev->rx_descriptor_done = virtio_dev_rx_queue_done; if (rte_eal_process_type() == RTE_PROC_SECONDARY) { - virtio_set_vtpci_ops(hw); set_rxtx_funcs(eth_dev); return 0; } diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 3de7980b4f..f9331e37d7 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -743,7 +743,6 @@ vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev) if (virtio_read_caps(pci_dev, hw) == 0) { PMD_INIT_LOG(INFO, "modern virtio pci detected."); virtio_hw_internal[hw->port_id].vtpci_ops = &modern_ops; - hw->bus_type = VIRTIO_BUS_PCI_MODERN; dev->modern = true; goto msix_detect; } @@ -763,7 +762,6 @@ vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev) } virtio_hw_internal[hw->port_id].vtpci_ops = &legacy_ops; - hw->bus_type = VIRTIO_BUS_PCI_LEGACY; dev->modern = false; msix_detect: diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 22c21e6896..a60edc4a93 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -245,15 +245,7 @@ struct virtio_pci_ops { struct virtio_net_config; -enum virtio_bus_type { - VIRTIO_BUS_UNKNOWN, - VIRTIO_BUS_PCI_LEGACY, - VIRTIO_BUS_PCI_MODERN, - VIRTIO_BUS_USER, -}; - struct virtio_hw { - enum virtio_bus_type bus_type; struct virtnet_ctl *cvq; uint64_t req_guest_features; uint64_t guest_features; diff --git a/drivers/net/virtio/virtio_pci_ethdev.c b/drivers/net/virtio/virtio_pci_ethdev.c index f513381707..a6d5e2e158 100644 --- a/drivers/net/virtio/virtio_pci_ethdev.c +++ b/drivers/net/virtio/virtio_pci_ethdev.c @@ -82,6 +82,11 @@ eth_virtio_pci_init(struct rte_eth_dev *eth_dev) return -1; } } else { + if (dev->modern) + VTPCI_OPS(hw) = &modern_ops; + else + VTPCI_OPS(hw) = &legacy_ops; + ret = virtio_remap_pci(RTE_ETH_DEV_TO_PCI(eth_dev), dev); if (ret < 0) { PMD_INIT_LOG(ERR, "Failed to remap PCI device\n"); @@ -103,7 +108,7 @@ eth_virtio_pci_init(struct rte_eth_dev *eth_dev) err_unmap: rte_pci_unmap_device(RTE_ETH_DEV_TO_PCI(eth_dev)); - if (hw->bus_type == VIRTIO_BUS_PCI_LEGACY) + if (!dev->modern) rte_pci_ioport_unmap(VTPCI_IO(hw)); return ret; diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index c93e0e43f5..1420db32be 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -641,7 +641,6 @@ virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev) * Here just pretend that we support msix. */ hw->use_msix = 1; - hw->bus_type = VIRTIO_BUS_USER; hw->use_vec_rx = 0; hw->use_vec_tx = 0; hw->use_inorder_rx = 0; @@ -700,6 +699,10 @@ virtio_user_pmd_probe(struct rte_vdev_device *vdev) return -1; } + dev = eth_dev->data->dev_private; + hw = &dev->hw; + VTPCI_OPS(hw) = &virtio_user_ops; + if (eth_virtio_dev_init(eth_dev) < 0) { PMD_INIT_LOG(ERR, "eth_virtio_dev_init fails"); rte_eth_dev_release_port(eth_dev); From patchwork Sun Dec 20 21:13:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85537 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5C880A09FD; Sun, 20 Dec 2020 22:18:40 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1DB25CD2D; Sun, 20 Dec 2020 22:15:13 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 0E35CCD25 for ; Sun, 20 Dec 2020 22:15:11 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498910; 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=8QNHCmszE1CECd69yinvjTJG4GNJ3VJ+jeWWxHnJjgE=; b=DPNuglp3YfvgEzmF5QgVTJeigVentXiCX5OIJN0nZRDUkvB9wS9xcJzopIr/KAYOl0Gudn AIENdPjxMDVNwoa45FvqmqPCa5jE4JhCfKosAMeXF7zuHc+8nFIDaYo01GqD9mnIiDlfF7 9g3bqScuqoH/6h54o91txzjg5+83NdI= 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-18-0PAeColfPaKtVhA8Vw2vDA-1; Sun, 20 Dec 2020 16:15:08 -0500 X-MC-Unique: 0PAeColfPaKtVhA8Vw2vDA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AEDDE10054FF; Sun, 20 Dec 2020 21:15:07 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id CEC8B60C62; Sun, 20 Dec 2020 21:15:05 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:38 +0100 Message-Id: <20201220211405.313012-14-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 13/40] net/virtio: move PCI-specific fields to PCI device 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" This patch moves the fields from virtio_hw structure that are PCI-specific to virtio_pci_dev_struct. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia Reviewed-by: David Marchand --- drivers/net/virtio/virtio_pci.c | 139 ++++++++++++++++++-------------- drivers/net/virtio/virtio_pci.h | 10 +-- 2 files changed, 85 insertions(+), 64 deletions(-) diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index f9331e37d7..8c62507a0a 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -287,18 +287,19 @@ static void modern_read_dev_config(struct virtio_hw *hw, size_t offset, void *dst, int length) { + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); int i; uint8_t *p; uint8_t old_gen, new_gen; do { - old_gen = rte_read8(&hw->common_cfg->config_generation); + old_gen = rte_read8(&dev->common_cfg->config_generation); p = dst; for (i = 0; i < length; i++) - *p++ = rte_read8((uint8_t *)hw->dev_cfg + offset + i); + *p++ = rte_read8((uint8_t *)dev->dev_cfg + offset + i); - new_gen = rte_read8(&hw->common_cfg->config_generation); + new_gen = rte_read8(&dev->common_cfg->config_generation); } while (old_gen != new_gen); } @@ -306,23 +307,25 @@ static void modern_write_dev_config(struct virtio_hw *hw, size_t offset, const void *src, int length) { + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); int i; const uint8_t *p = src; for (i = 0; i < length; i++) - rte_write8((*p++), (((uint8_t *)hw->dev_cfg) + offset + i)); + rte_write8((*p++), (((uint8_t *)dev->dev_cfg) + offset + i)); } static uint64_t modern_get_features(struct virtio_hw *hw) { + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); uint32_t features_lo, features_hi; - rte_write32(0, &hw->common_cfg->device_feature_select); - features_lo = rte_read32(&hw->common_cfg->device_feature); + rte_write32(0, &dev->common_cfg->device_feature_select); + features_lo = rte_read32(&dev->common_cfg->device_feature); - rte_write32(1, &hw->common_cfg->device_feature_select); - features_hi = rte_read32(&hw->common_cfg->device_feature); + rte_write32(1, &dev->common_cfg->device_feature_select); + features_hi = rte_read32(&dev->common_cfg->device_feature); return ((uint64_t)features_hi << 32) | features_lo; } @@ -330,13 +333,15 @@ modern_get_features(struct virtio_hw *hw) static void modern_set_features(struct virtio_hw *hw, uint64_t features) { - rte_write32(0, &hw->common_cfg->guest_feature_select); + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + rte_write32(0, &dev->common_cfg->guest_feature_select); rte_write32(features & ((1ULL << 32) - 1), - &hw->common_cfg->guest_feature); + &dev->common_cfg->guest_feature); - rte_write32(1, &hw->common_cfg->guest_feature_select); + rte_write32(1, &dev->common_cfg->guest_feature_select); rte_write32(features >> 32, - &hw->common_cfg->guest_feature); + &dev->common_cfg->guest_feature); } static int @@ -353,46 +358,59 @@ modern_features_ok(struct virtio_hw *hw) static uint8_t modern_get_status(struct virtio_hw *hw) { - return rte_read8(&hw->common_cfg->device_status); + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + return rte_read8(&dev->common_cfg->device_status); } static void modern_set_status(struct virtio_hw *hw, uint8_t status) { - rte_write8(status, &hw->common_cfg->device_status); + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + rte_write8(status, &dev->common_cfg->device_status); } static uint8_t modern_get_isr(struct virtio_hw *hw) { - return rte_read8(hw->isr); + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + return rte_read8(dev->isr); } static uint16_t modern_set_config_irq(struct virtio_hw *hw, uint16_t vec) { - rte_write16(vec, &hw->common_cfg->msix_config); - return rte_read16(&hw->common_cfg->msix_config); + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + rte_write16(vec, &dev->common_cfg->msix_config); + return rte_read16(&dev->common_cfg->msix_config); } static uint16_t modern_set_queue_irq(struct virtio_hw *hw, struct virtqueue *vq, uint16_t vec) { - rte_write16(vq->vq_queue_index, &hw->common_cfg->queue_select); - rte_write16(vec, &hw->common_cfg->queue_msix_vector); - return rte_read16(&hw->common_cfg->queue_msix_vector); + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + rte_write16(vq->vq_queue_index, &dev->common_cfg->queue_select); + rte_write16(vec, &dev->common_cfg->queue_msix_vector); + return rte_read16(&dev->common_cfg->queue_msix_vector); } static uint16_t modern_get_queue_num(struct virtio_hw *hw, uint16_t queue_id) { - rte_write16(queue_id, &hw->common_cfg->queue_select); - return rte_read16(&hw->common_cfg->queue_size); + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + rte_write16(queue_id, &dev->common_cfg->queue_select); + return rte_read16(&dev->common_cfg->queue_size); } static int modern_setup_queue(struct virtio_hw *hw, struct virtqueue *vq) { + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); uint64_t desc_addr, avail_addr, used_addr; uint16_t notify_off; @@ -405,20 +423,20 @@ modern_setup_queue(struct virtio_hw *hw, struct virtqueue *vq) ring[vq->vq_nentries]), VIRTIO_PCI_VRING_ALIGN); - rte_write16(vq->vq_queue_index, &hw->common_cfg->queue_select); + rte_write16(vq->vq_queue_index, &dev->common_cfg->queue_select); - io_write64_twopart(desc_addr, &hw->common_cfg->queue_desc_lo, - &hw->common_cfg->queue_desc_hi); - io_write64_twopart(avail_addr, &hw->common_cfg->queue_avail_lo, - &hw->common_cfg->queue_avail_hi); - io_write64_twopart(used_addr, &hw->common_cfg->queue_used_lo, - &hw->common_cfg->queue_used_hi); + io_write64_twopart(desc_addr, &dev->common_cfg->queue_desc_lo, + &dev->common_cfg->queue_desc_hi); + io_write64_twopart(avail_addr, &dev->common_cfg->queue_avail_lo, + &dev->common_cfg->queue_avail_hi); + io_write64_twopart(used_addr, &dev->common_cfg->queue_used_lo, + &dev->common_cfg->queue_used_hi); - notify_off = rte_read16(&hw->common_cfg->queue_notify_off); - vq->notify_addr = (void *)((uint8_t *)hw->notify_base + - notify_off * hw->notify_off_multiplier); + notify_off = rte_read16(&dev->common_cfg->queue_notify_off); + vq->notify_addr = (void *)((uint8_t *)dev->notify_base + + notify_off * dev->notify_off_multiplier); - rte_write16(1, &hw->common_cfg->queue_enable); + rte_write16(1, &dev->common_cfg->queue_enable); PMD_INIT_LOG(DEBUG, "queue %u addresses:", vq->vq_queue_index); PMD_INIT_LOG(DEBUG, "\t desc_addr: %" PRIx64, desc_addr); @@ -433,16 +451,18 @@ modern_setup_queue(struct virtio_hw *hw, struct virtqueue *vq) static void modern_del_queue(struct virtio_hw *hw, struct virtqueue *vq) { - rte_write16(vq->vq_queue_index, &hw->common_cfg->queue_select); + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + rte_write16(vq->vq_queue_index, &dev->common_cfg->queue_select); - io_write64_twopart(0, &hw->common_cfg->queue_desc_lo, - &hw->common_cfg->queue_desc_hi); - io_write64_twopart(0, &hw->common_cfg->queue_avail_lo, - &hw->common_cfg->queue_avail_hi); - io_write64_twopart(0, &hw->common_cfg->queue_used_lo, - &hw->common_cfg->queue_used_hi); + io_write64_twopart(0, &dev->common_cfg->queue_desc_lo, + &dev->common_cfg->queue_desc_hi); + io_write64_twopart(0, &dev->common_cfg->queue_avail_lo, + &dev->common_cfg->queue_avail_hi); + io_write64_twopart(0, &dev->common_cfg->queue_used_lo, + &dev->common_cfg->queue_used_hi); - rte_write16(0, &hw->common_cfg->queue_enable); + rte_write16(0, &dev->common_cfg->queue_enable); } static void @@ -607,18 +627,19 @@ get_cfg_addr(struct rte_pci_device *dev, struct virtio_pci_cap *cap) #define PCI_MSIX_ENABLE 0x8000 static int -virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw) +virtio_read_caps(struct rte_pci_device *pci_dev, struct virtio_hw *hw) { + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); uint8_t pos; struct virtio_pci_cap cap; int ret; - if (rte_pci_map_device(dev)) { + if (rte_pci_map_device(pci_dev)) { PMD_INIT_LOG(DEBUG, "failed to map pci device!"); return -1; } - ret = rte_pci_read_config(dev, &pos, 1, PCI_CAPABILITY_LIST); + ret = rte_pci_read_config(pci_dev, &pos, 1, PCI_CAPABILITY_LIST); if (ret != 1) { PMD_INIT_LOG(DEBUG, "failed to read pci capability list, ret %d", ret); @@ -626,7 +647,7 @@ virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw) } while (pos) { - ret = rte_pci_read_config(dev, &cap, 2, pos); + ret = rte_pci_read_config(pci_dev, &cap, 2, pos); if (ret != 2) { PMD_INIT_LOG(DEBUG, "failed to read pci cap at pos: %x ret %d", @@ -642,7 +663,7 @@ virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw) */ uint16_t flags; - ret = rte_pci_read_config(dev, &flags, sizeof(flags), + ret = rte_pci_read_config(pci_dev, &flags, sizeof(flags), pos + 2); if (ret != sizeof(flags)) { PMD_INIT_LOG(DEBUG, @@ -664,7 +685,7 @@ virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw) goto next; } - ret = rte_pci_read_config(dev, &cap, sizeof(cap), pos); + ret = rte_pci_read_config(pci_dev, &cap, sizeof(cap), pos); if (ret != sizeof(cap)) { PMD_INIT_LOG(DEBUG, "failed to read pci cap at pos: %x ret %d", @@ -678,24 +699,24 @@ virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw) switch (cap.cfg_type) { case VIRTIO_PCI_CAP_COMMON_CFG: - hw->common_cfg = get_cfg_addr(dev, &cap); + dev->common_cfg = get_cfg_addr(pci_dev, &cap); break; case VIRTIO_PCI_CAP_NOTIFY_CFG: - ret = rte_pci_read_config(dev, - &hw->notify_off_multiplier, + ret = rte_pci_read_config(pci_dev, + &dev->notify_off_multiplier, 4, pos + sizeof(cap)); if (ret != 4) PMD_INIT_LOG(DEBUG, "failed to read notify_off_multiplier, ret %d", ret); else - hw->notify_base = get_cfg_addr(dev, &cap); + dev->notify_base = get_cfg_addr(pci_dev, &cap); break; case VIRTIO_PCI_CAP_DEVICE_CFG: - hw->dev_cfg = get_cfg_addr(dev, &cap); + dev->dev_cfg = get_cfg_addr(pci_dev, &cap); break; case VIRTIO_PCI_CAP_ISR_CFG: - hw->isr = get_cfg_addr(dev, &cap); + dev->isr = get_cfg_addr(pci_dev, &cap); break; } @@ -703,19 +724,19 @@ virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw) pos = cap.cap_next; } - if (hw->common_cfg == NULL || hw->notify_base == NULL || - hw->dev_cfg == NULL || hw->isr == NULL) { + if (dev->common_cfg == NULL || dev->notify_base == NULL || + dev->dev_cfg == NULL || dev->isr == NULL) { PMD_INIT_LOG(INFO, "no modern virtio pci device found."); return -1; } PMD_INIT_LOG(INFO, "found modern virtio pci device."); - PMD_INIT_LOG(DEBUG, "common cfg mapped at: %p", hw->common_cfg); - PMD_INIT_LOG(DEBUG, "device cfg mapped at: %p", hw->dev_cfg); - PMD_INIT_LOG(DEBUG, "isr cfg mapped at: %p", hw->isr); + PMD_INIT_LOG(DEBUG, "common cfg mapped at: %p", dev->common_cfg); + PMD_INIT_LOG(DEBUG, "device cfg mapped at: %p", dev->dev_cfg); + PMD_INIT_LOG(DEBUG, "isr cfg mapped at: %p", dev->isr); PMD_INIT_LOG(DEBUG, "notify base: %p, notify off multiplier: %u", - hw->notify_base, hw->notify_off_multiplier); + dev->notify_base, dev->notify_off_multiplier); return 0; } diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index a60edc4a93..5629b37050 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -264,13 +264,8 @@ struct virtio_hw { bool has_rx_offload; uint16_t port_id; uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; - uint32_t notify_off_multiplier; uint32_t speed; /* link speed in MB */ uint8_t duplex; - uint8_t *isr; - uint16_t *notify_base; - struct virtio_pci_common_cfg *common_cfg; - struct virtio_net_config *dev_cfg; /* * App management thread and virtio interrupt handler thread * both can change device state, this lock is meant to avoid @@ -286,6 +281,11 @@ struct virtio_hw { struct virtio_pci_dev { struct virtio_hw hw; struct rte_pci_device *pci_dev; + struct virtio_pci_common_cfg *common_cfg; + struct virtio_net_config *dev_cfg; + uint8_t *isr; + uint16_t *notify_base; + uint32_t notify_off_multiplier; bool modern; }; From patchwork Sun Dec 20 21:13:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85538 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 652B5A09FD; Sun, 20 Dec 2020 22:18:58 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 94069CB6B; Sun, 20 Dec 2020 22:15:19 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id C00B3CB2F for ; Sun, 20 Dec 2020 22:15:17 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498916; 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=EaACO0WLVfEf3dKUeWr2yKXmR4S9jM3xUr339HZePBk=; b=fzNwhdKBW0ktWqNzOCq7rJecADagA8H7tySONg70iA4DLGrspNbzK0gnFd+Ma9HTHdUf2n y85Zd9u9F+VwAqHt97E5fdwa87JIUb15SkqL5hUxi2V2/7E9TulmFgeAkLVV+N8R+RaSoe 0ccIGwY0rKUH5XabX1YMXK79ovyrXb4= 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-32-eL48fXAvP8mioocZs5Krjg-1; Sun, 20 Dec 2020 16:15:12 -0500 X-MC-Unique: eL48fXAvP8mioocZs5Krjg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id F1BFB59; Sun, 20 Dec 2020 21:15:10 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 14BC160C43; Sun, 20 Dec 2020 21:15:07 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:39 +0100 Message-Id: <20201220211405.313012-15-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 14/40] net/virtio: pack virtio HW struct 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" This patch improves the virtio_hw struct packing, going from 88 down to 80 bytes with a 6 bytes hole in the end of the first cacheline. Fields only used in the slow path are placed in the end, so that hot path only uses the first cacheline. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio_pci.h | 45 ++++++++++++++++----------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 5629b37050..15f68f141c 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -246,26 +246,25 @@ struct virtio_pci_ops { struct virtio_net_config; struct virtio_hw { - struct virtnet_ctl *cvq; - uint64_t req_guest_features; - uint64_t guest_features; - uint32_t max_queue_pairs; - bool started; - uint16_t max_mtu; - uint16_t vtnet_hdr_size; - uint8_t vlan_strip; - uint8_t use_msix; - uint8_t use_vec_rx; - uint8_t use_vec_tx; - uint8_t use_inorder_rx; - uint8_t use_inorder_tx; - uint8_t weak_barriers; - bool has_tx_offload; - bool has_rx_offload; - uint16_t port_id; - uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; - uint32_t speed; /* link speed in MB */ - uint8_t duplex; + struct virtqueue **vqs; + uint64_t guest_features; + uint16_t vtnet_hdr_size; + uint8_t started; + uint8_t weak_barriers; + uint8_t vlan_strip; + uint8_t has_tx_offload; + uint8_t has_rx_offload; + uint8_t use_vec_rx; + uint8_t use_vec_tx; + uint8_t use_inorder_rx; + uint8_t use_inorder_tx; + uint8_t opened; + uint16_t port_id; + uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; + uint32_t speed; /* link speed in MB */ + uint8_t duplex; + uint8_t use_msix; + uint16_t max_mtu; /* * App management thread and virtio interrupt handler thread * both can change device state, this lock is meant to avoid @@ -273,9 +272,9 @@ struct virtio_hw { */ rte_spinlock_t state_lock; struct rte_mbuf **inject_pkts; - bool opened; - - struct virtqueue **vqs; + uint16_t max_queue_pairs; + uint64_t req_guest_features; + struct virtnet_ctl *cvq; }; struct virtio_pci_dev { From patchwork Sun Dec 20 21:13:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85539 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 12B72A09FD; Sun, 20 Dec 2020 22:19:21 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1F7ECCD60; Sun, 20 Dec 2020 22:15:22 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 4FC54CD38 for ; Sun, 20 Dec 2020 22:15:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498917; 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=ZncbNRPq7/ZKlPSWBDfskf/HkdwhT7ONRE/y4YME6kw=; b=QYXFWr9A7SLZiS2b0Ac3tQ1BZ2HPY0EnC2SRbJxMpT9+bFSsFZRVFXGVUv7scNVtWUErxG nRgKAyjXhqSaR5KymVPEEVWQjnidI+R16xCllHn3Q2GZQHts2I1CeoQzoSN/1v2Vx4vgwP d8yRJzIaU0CCCWWXjWe8XvYdUls7S9E= 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-526-OdoGq5r8OmalnNZGeWbuOA-1; Sun, 20 Dec 2020 16:15:14 -0500 X-MC-Unique: OdoGq5r8OmalnNZGeWbuOA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 3A9E11005E40; Sun, 20 Dec 2020 21:15:13 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5842E60C43; Sun, 20 Dec 2020 21:15:11 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:40 +0100 Message-Id: <20201220211405.313012-16-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 15/40] net/virtio: move legacy IO to Virtio PCI 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" This patch moves Virtio PCI legacy IO handling to virtio_pci.c. Two functions are created so that virtio_pci_ethdev does not have to care about it. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia Reviewed-by: David Marchand --- drivers/net/virtio/virtio_pci.c | 21 +++++++++++++++++++++ drivers/net/virtio/virtio_pci.h | 6 +++--- drivers/net/virtio/virtio_pci_ethdev.c | 4 ++-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 8c62507a0a..230a438bf7 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -31,6 +31,15 @@ #define VIRTIO_PCI_CONFIG(hw) \ (((hw)->use_msix == VIRTIO_MSIX_ENABLED) ? 24 : 20) + +struct virtio_pci_internal { + struct rte_pci_ioport io; +}; + +#define VTPCI_IO(hw) (&virtio_pci_internal[(hw)->port_id].io) + +struct virtio_pci_internal virtio_pci_internal[RTE_MAX_ETHPORTS]; + static inline int check_vq_phys_addr_ok(struct virtqueue *vq) { @@ -838,3 +847,15 @@ vtpci_msix_detect(struct rte_pci_device *dev) return VIRTIO_MSIX_NONE; } + +void vtpci_legacy_ioport_unmap(struct virtio_hw *hw) +{ + rte_pci_ioport_unmap(VTPCI_IO(hw)); +} + +int vtpci_legacy_ioport_map(struct virtio_hw *hw) +{ + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); + + return rte_pci_ioport_map(dev->pci_dev, 0, VTPCI_IO(hw)); +} diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 15f68f141c..c3db36d2fc 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -297,15 +297,12 @@ struct virtio_pci_dev { */ struct virtio_hw_internal { const struct virtio_pci_ops *vtpci_ops; - struct rte_pci_ioport io; }; #define VTPCI_OPS(hw) (virtio_hw_internal[(hw)->port_id].vtpci_ops) -#define VTPCI_IO(hw) (&virtio_hw_internal[(hw)->port_id].io) extern struct virtio_hw_internal virtio_hw_internal[RTE_MAX_ETHPORTS]; - /* * This structure is just a reference to read * net device specific config space; it just a chodu structure @@ -380,6 +377,9 @@ uint8_t vtpci_isr(struct virtio_hw *); enum virtio_msix_status vtpci_msix_detect(struct rte_pci_device *dev); +void vtpci_legacy_ioport_unmap(struct virtio_hw *hw); +int vtpci_legacy_ioport_map(struct virtio_hw *hw); + extern const struct virtio_pci_ops legacy_ops; extern const struct virtio_pci_ops modern_ops; extern const struct virtio_pci_ops virtio_user_ops; diff --git a/drivers/net/virtio/virtio_pci_ethdev.c b/drivers/net/virtio/virtio_pci_ethdev.c index a6d5e2e158..17342ae7d8 100644 --- a/drivers/net/virtio/virtio_pci_ethdev.c +++ b/drivers/net/virtio/virtio_pci_ethdev.c @@ -60,7 +60,7 @@ virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev) return -1; } } else { - if (rte_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0) + if (vtpci_legacy_ioport_map(hw) < 0) return -1; } @@ -109,7 +109,7 @@ eth_virtio_pci_init(struct rte_eth_dev *eth_dev) err_unmap: rte_pci_unmap_device(RTE_ETH_DEV_TO_PCI(eth_dev)); if (!dev->modern) - rte_pci_ioport_unmap(VTPCI_IO(hw)); + vtpci_legacy_ioport_unmap(hw); return ret; } From patchwork Sun Dec 20 21:13:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85540 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 859F2A09FD; Sun, 20 Dec 2020 22:19:39 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CAC97CD64; Sun, 20 Dec 2020 22:15:27 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 1C538CBB7 for ; Sun, 20 Dec 2020 22:15:26 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498924; 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=DNE3mz+QsEn6wBy/qQQdEk57ajblNdDXzj6mNOesCp8=; b=Vfgh/1FlC2G+AOZmV8xy83EP+eUJxCJllKXypwUq2cFX9tcb2wXygcCyUgM1ikFTlhvjOf AF+lLDa9I0bnpIcanBKLVgPmILyH2Q1/ATmKaGylwF1QwN9JxjBQBXwr3XnK37xukgTkTt vavx2hPvj0MaUSANPo9F5UMMvvNps7U= 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-460-AvSH_4e1Nw-3bfrMN_KMPA-1; Sun, 20 Dec 2020 16:15:22 -0500 X-MC-Unique: AvSH_4e1Nw-3bfrMN_KMPA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B6DA7107ACE4; Sun, 20 Dec 2020 21:15:21 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9795C60C43; Sun, 20 Dec 2020 21:15:13 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:41 +0100 Message-Id: <20201220211405.313012-17-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 16/40] net/virtio: introduce generic virtio header 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" This patch moves virtio_hw and virtio callbacks into a generic virtio header, now that they have been curated from PCI references. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio.h | 75 ++++++++++++++++++++++ drivers/net/virtio/virtio_ethdev.c | 20 +++--- drivers/net/virtio/virtio_pci.c | 26 ++++---- drivers/net/virtio/virtio_pci.h | 82 ++----------------------- drivers/net/virtio/virtio_pci_ethdev.c | 5 +- drivers/net/virtio/virtio_user_ethdev.c | 8 +-- drivers/net/virtio/virtqueue.h | 2 +- 7 files changed, 110 insertions(+), 108 deletions(-) create mode 100644 drivers/net/virtio/virtio.h diff --git a/drivers/net/virtio/virtio.h b/drivers/net/virtio/virtio.h new file mode 100644 index 0000000000..eb078bc227 --- /dev/null +++ b/drivers/net/virtio/virtio.h @@ -0,0 +1,75 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2014 Intel Corporation + * Copyright(c) 2020 Red Hat, Inc. + */ + +#ifndef _VIRTIO_H_ +#define _VIRTIO_H_ + +#include + +struct virtio_hw { + struct virtqueue **vqs; + uint64_t guest_features; + uint16_t vtnet_hdr_size; + uint8_t started; + uint8_t weak_barriers; + uint8_t vlan_strip; + uint8_t has_tx_offload; + uint8_t has_rx_offload; + uint8_t use_vec_rx; + uint8_t use_vec_tx; + uint8_t use_inorder_rx; + uint8_t use_inorder_tx; + uint8_t opened; + uint16_t port_id; + uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; + uint32_t speed; /* link speed in MB */ + uint8_t duplex; + uint8_t use_msix; + uint16_t max_mtu; + /* + * App management thread and virtio interrupt handler thread + * both can change device state, this lock is meant to avoid + * such a contention. + */ + rte_spinlock_t state_lock; + struct rte_mbuf **inject_pkts; + uint16_t max_queue_pairs; + uint64_t req_guest_features; + struct virtnet_ctl *cvq; +}; + +struct virtio_ops { + void (*read_dev_cfg)(struct virtio_hw *hw, size_t offset, void *dst, int len); + void (*write_dev_cfg)(struct virtio_hw *hw, size_t offset, const void *src, int len); + uint8_t (*get_status)(struct virtio_hw *hw); + void (*set_status)(struct virtio_hw *hw, uint8_t status); + uint64_t (*get_features)(struct virtio_hw *hw); + void (*set_features)(struct virtio_hw *hw, uint64_t features); + int (*features_ok)(struct virtio_hw *hw); + uint8_t (*get_isr)(struct virtio_hw *hw); + uint16_t (*set_config_irq)(struct virtio_hw *hw, uint16_t vec); + uint16_t (*set_queue_irq)(struct virtio_hw *hw, struct virtqueue *vq, uint16_t vec); + uint16_t (*get_queue_num)(struct virtio_hw *hw, uint16_t queue_id); + int (*setup_queue)(struct virtio_hw *hw, struct virtqueue *vq); + void (*del_queue)(struct virtio_hw *hw, struct virtqueue *vq); + void (*notify_queue)(struct virtio_hw *hw, struct virtqueue *vq); + int (*dev_close)(struct virtio_hw *hw); +}; + +/* + * While virtio_hw is stored in shared memory, this structure stores + * some infos that may vary in the multiple process model locally. + * For example, the vtpci_ops pointer. + */ +struct virtio_hw_internal { + const struct virtio_ops *virtio_ops; +}; + +#define VIRTIO_OPS(hw) (virtio_hw_internal[(hw)->port_id].virtio_ops) + +extern struct virtio_hw_internal virtio_hw_internal[RTE_MAX_ETHPORTS]; + + +#endif /* _VIRTIO_H_ */ diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 86d8930e78..80b3fdba9e 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -446,7 +446,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) * Read the virtqueue size from the Queue Size field * Always power of 2 and if 0 virtqueue does not exist */ - vq_size = VTPCI_OPS(hw)->get_queue_num(hw, vtpci_queue_idx); + vq_size = VIRTIO_OPS(hw)->get_queue_num(hw, vtpci_queue_idx); PMD_INIT_LOG(DEBUG, "vq_size: %u", vq_size); if (vq_size == 0) { PMD_INIT_LOG(ERR, "virtqueue does not exist"); @@ -608,7 +608,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) } } - if (VTPCI_OPS(hw)->setup_queue(hw, vq) < 0) { + if (VIRTIO_OPS(hw)->setup_queue(hw, vq) < 0) { PMD_INIT_LOG(ERR, "setup_queue failed"); return -EINVAL; } @@ -703,7 +703,7 @@ virtio_dev_close(struct rte_eth_dev *dev) /* reset the NIC */ if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) - VTPCI_OPS(hw)->set_config_irq(hw, VIRTIO_MSI_NO_VECTOR); + VIRTIO_OPS(hw)->set_config_irq(hw, VIRTIO_MSI_NO_VECTOR); if (intr_conf->rxq) virtio_queues_unbind_intr(dev); @@ -718,7 +718,7 @@ virtio_dev_close(struct rte_eth_dev *dev) virtio_dev_free_mbufs(dev); virtio_free_queues(hw); - return VTPCI_OPS(hw)->dev_close(hw); + return VIRTIO_OPS(hw)->dev_close(hw); } static int @@ -1290,7 +1290,7 @@ virtio_negotiate_features(struct virtio_hw *hw, uint64_t req_features) req_features); /* Read device(host) feature bits */ - host_features = VTPCI_OPS(hw)->get_features(hw); + host_features = VIRTIO_OPS(hw)->get_features(hw); PMD_INIT_LOG(DEBUG, "host_features before negotiate = %" PRIx64, host_features); @@ -1315,7 +1315,7 @@ virtio_negotiate_features(struct virtio_hw *hw, uint64_t req_features) PMD_INIT_LOG(DEBUG, "features after negotiate = %" PRIx64, hw->guest_features); - if (VTPCI_OPS(hw)->features_ok(hw) < 0) { + if (VIRTIO_OPS(hw)->features_ok(hw) < 0) { PMD_INIT_LOG(ERR, "Features not OK at bus level\n"); return -1; } @@ -1551,7 +1551,7 @@ virtio_queues_bind_intr(struct rte_eth_dev *dev) PMD_INIT_LOG(INFO, "queue/interrupt binding"); for (i = 0; i < dev->data->nb_rx_queues; ++i) { dev->intr_handle->intr_vec[i] = i + 1; - if (VTPCI_OPS(hw)->set_queue_irq(hw, hw->vqs[i * 2], i + 1) == + if (VIRTIO_OPS(hw)->set_queue_irq(hw, hw->vqs[i * 2], i + 1) == VIRTIO_MSI_NO_VECTOR) { PMD_DRV_LOG(ERR, "failed to set queue vector"); return -EBUSY; @@ -1569,7 +1569,7 @@ virtio_queues_unbind_intr(struct rte_eth_dev *dev) PMD_INIT_LOG(INFO, "queue/interrupt unbinding"); for (i = 0; i < dev->data->nb_rx_queues; ++i) - VTPCI_OPS(hw)->set_queue_irq(hw, + VIRTIO_OPS(hw)->set_queue_irq(hw, hw->vqs[i * VTNET_CQ], VIRTIO_MSI_NO_VECTOR); } @@ -2081,7 +2081,7 @@ virtio_dev_configure(struct rte_eth_dev *dev) if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) /* Enable vector (0) for Link State Intrerrupt */ - if (VTPCI_OPS(hw)->set_config_irq(hw, 0) == + if (VIRTIO_OPS(hw)->set_config_irq(hw, 0) == VIRTIO_MSI_NO_VECTOR) { PMD_DRV_LOG(ERR, "failed to set config vector"); return -EBUSY; @@ -2411,7 +2411,7 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN; dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS; - host_features = VTPCI_OPS(hw)->get_features(hw); + host_features = VIRTIO_OPS(hw)->get_features(hw); dev_info->rx_offload_capa = DEV_RX_OFFLOAD_VLAN_STRIP; dev_info->rx_offload_capa |= DEV_RX_OFFLOAD_JUMBO_FRAME; if (host_features & (1ULL << VIRTIO_NET_F_GUEST_CSUM)) { diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 230a438bf7..df69fcdd45 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -267,7 +267,7 @@ legacy_dev_close(struct virtio_hw *hw) return 0; } -const struct virtio_pci_ops legacy_ops = { +const struct virtio_ops legacy_ops = { .read_dev_cfg = legacy_read_dev_config, .write_dev_cfg = legacy_write_dev_config, .get_status = legacy_get_status, @@ -515,7 +515,7 @@ modern_dev_close(struct virtio_hw *hw) return 0; } -const struct virtio_pci_ops modern_ops = { +const struct virtio_ops modern_ops = { .read_dev_cfg = modern_read_dev_config, .write_dev_cfg = modern_write_dev_config, .get_status = modern_get_status, @@ -538,14 +538,14 @@ void vtpci_read_dev_config(struct virtio_hw *hw, size_t offset, void *dst, int length) { - VTPCI_OPS(hw)->read_dev_cfg(hw, offset, dst, length); + VIRTIO_OPS(hw)->read_dev_cfg(hw, offset, dst, length); } void vtpci_write_dev_config(struct virtio_hw *hw, size_t offset, const void *src, int length) { - VTPCI_OPS(hw)->write_dev_cfg(hw, offset, src, length); + VIRTIO_OPS(hw)->write_dev_cfg(hw, offset, src, length); } uint64_t @@ -558,7 +558,7 @@ vtpci_negotiate_features(struct virtio_hw *hw, uint64_t host_features) * host all support. */ features = host_features & hw->guest_features; - VTPCI_OPS(hw)->set_features(hw, features); + VIRTIO_OPS(hw)->set_features(hw, features); return features; } @@ -566,9 +566,9 @@ vtpci_negotiate_features(struct virtio_hw *hw, uint64_t host_features) void vtpci_reset(struct virtio_hw *hw) { - VTPCI_OPS(hw)->set_status(hw, VIRTIO_CONFIG_STATUS_RESET); + VIRTIO_OPS(hw)->set_status(hw, VIRTIO_CONFIG_STATUS_RESET); /* flush status write */ - VTPCI_OPS(hw)->get_status(hw); + VIRTIO_OPS(hw)->get_status(hw); } void @@ -581,21 +581,21 @@ void vtpci_set_status(struct virtio_hw *hw, uint8_t status) { if (status != VIRTIO_CONFIG_STATUS_RESET) - status |= VTPCI_OPS(hw)->get_status(hw); + status |= VIRTIO_OPS(hw)->get_status(hw); - VTPCI_OPS(hw)->set_status(hw, status); + VIRTIO_OPS(hw)->set_status(hw, status); } uint8_t vtpci_get_status(struct virtio_hw *hw) { - return VTPCI_OPS(hw)->get_status(hw); + return VIRTIO_OPS(hw)->get_status(hw); } uint8_t vtpci_isr(struct virtio_hw *hw) { - return VTPCI_OPS(hw)->get_isr(hw); + return VIRTIO_OPS(hw)->get_isr(hw); } static void * @@ -772,7 +772,7 @@ vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev) */ if (virtio_read_caps(pci_dev, hw) == 0) { PMD_INIT_LOG(INFO, "modern virtio pci detected."); - virtio_hw_internal[hw->port_id].vtpci_ops = &modern_ops; + VIRTIO_OPS(hw) = &modern_ops; dev->modern = true; goto msix_detect; } @@ -791,7 +791,7 @@ vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev) return -1; } - virtio_hw_internal[hw->port_id].vtpci_ops = &legacy_ops; + VIRTIO_OPS(hw) = &legacy_ops; dev->modern = false; msix_detect: diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index c3db36d2fc..8b07c4a369 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -12,6 +12,8 @@ #include #include +#include "virtio.h" + struct virtqueue; struct virtnet_ctl; @@ -214,68 +216,6 @@ struct virtio_pci_common_cfg { uint32_t queue_used_hi; /* read-write */ }; -struct virtio_hw; - -struct virtio_pci_ops { - void (*read_dev_cfg)(struct virtio_hw *hw, size_t offset, - void *dst, int len); - void (*write_dev_cfg)(struct virtio_hw *hw, size_t offset, - const void *src, int len); - - uint8_t (*get_status)(struct virtio_hw *hw); - void (*set_status)(struct virtio_hw *hw, uint8_t status); - - uint64_t (*get_features)(struct virtio_hw *hw); - void (*set_features)(struct virtio_hw *hw, uint64_t features); - int (*features_ok)(struct virtio_hw *hw); - - uint8_t (*get_isr)(struct virtio_hw *hw); - - uint16_t (*set_config_irq)(struct virtio_hw *hw, uint16_t vec); - - uint16_t (*set_queue_irq)(struct virtio_hw *hw, struct virtqueue *vq, - uint16_t vec); - - uint16_t (*get_queue_num)(struct virtio_hw *hw, uint16_t queue_id); - int (*setup_queue)(struct virtio_hw *hw, struct virtqueue *vq); - void (*del_queue)(struct virtio_hw *hw, struct virtqueue *vq); - void (*notify_queue)(struct virtio_hw *hw, struct virtqueue *vq); - int (*dev_close)(struct virtio_hw *hw); -}; - -struct virtio_net_config; - -struct virtio_hw { - struct virtqueue **vqs; - uint64_t guest_features; - uint16_t vtnet_hdr_size; - uint8_t started; - uint8_t weak_barriers; - uint8_t vlan_strip; - uint8_t has_tx_offload; - uint8_t has_rx_offload; - uint8_t use_vec_rx; - uint8_t use_vec_tx; - uint8_t use_inorder_rx; - uint8_t use_inorder_tx; - uint8_t opened; - uint16_t port_id; - uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; - uint32_t speed; /* link speed in MB */ - uint8_t duplex; - uint8_t use_msix; - uint16_t max_mtu; - /* - * App management thread and virtio interrupt handler thread - * both can change device state, this lock is meant to avoid - * such a contention. - */ - rte_spinlock_t state_lock; - struct rte_mbuf **inject_pkts; - uint16_t max_queue_pairs; - uint64_t req_guest_features; - struct virtnet_ctl *cvq; -}; struct virtio_pci_dev { struct virtio_hw hw; @@ -290,19 +230,6 @@ struct virtio_pci_dev { #define virtio_pci_get_dev(hw) container_of(hw, struct virtio_pci_dev, hw) -/* - * While virtio_hw is stored in shared memory, this structure stores - * some infos that may vary in the multiple process model locally. - * For example, the vtpci_ops pointer. - */ -struct virtio_hw_internal { - const struct virtio_pci_ops *vtpci_ops; -}; - -#define VTPCI_OPS(hw) (virtio_hw_internal[(hw)->port_id].vtpci_ops) - -extern struct virtio_hw_internal virtio_hw_internal[RTE_MAX_ETHPORTS]; - /* * This structure is just a reference to read * net device specific config space; it just a chodu structure @@ -380,8 +307,7 @@ enum virtio_msix_status vtpci_msix_detect(struct rte_pci_device *dev); void vtpci_legacy_ioport_unmap(struct virtio_hw *hw); int vtpci_legacy_ioport_map(struct virtio_hw *hw); -extern const struct virtio_pci_ops legacy_ops; -extern const struct virtio_pci_ops modern_ops; -extern const struct virtio_pci_ops virtio_user_ops; +extern const struct virtio_ops legacy_ops; +extern const struct virtio_ops modern_ops; #endif /* _VIRTIO_PCI_H_ */ diff --git a/drivers/net/virtio/virtio_pci_ethdev.c b/drivers/net/virtio/virtio_pci_ethdev.c index 17342ae7d8..347dc291e8 100644 --- a/drivers/net/virtio/virtio_pci_ethdev.c +++ b/drivers/net/virtio/virtio_pci_ethdev.c @@ -19,6 +19,7 @@ #include #include +#include "virtio.h" #include "virtio_ethdev.h" #include "virtio_pci.h" #include "virtio_logs.h" @@ -83,9 +84,9 @@ eth_virtio_pci_init(struct rte_eth_dev *eth_dev) } } else { if (dev->modern) - VTPCI_OPS(hw) = &modern_ops; + VIRTIO_OPS(hw) = &modern_ops; else - VTPCI_OPS(hw) = &legacy_ops; + VIRTIO_OPS(hw) = &legacy_ops; ret = virtio_remap_pci(RTE_ETH_DEV_TO_PCI(eth_dev), dev); if (ret < 0) { diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 1420db32be..14468ddf52 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -20,7 +20,7 @@ #include "virtio_ethdev.h" #include "virtio_logs.h" -#include "virtio_pci.h" +#include "virtio.h" #include "virtqueue.h" #include "virtio_rxtx.h" #include "virtio_user/virtio_user_dev.h" @@ -478,7 +478,7 @@ virtio_user_dev_close(struct virtio_hw *hw) return 0; } -const struct virtio_pci_ops virtio_user_ops = { +const struct virtio_ops virtio_user_ops = { .read_dev_cfg = virtio_user_read_dev_config, .write_dev_cfg = virtio_user_write_dev_config, .get_status = virtio_user_get_status, @@ -635,7 +635,7 @@ virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev) hw->port_id = data->port_id; dev->port_id = data->port_id; - virtio_hw_internal[hw->port_id].vtpci_ops = &virtio_user_ops; + VIRTIO_OPS(hw) = &virtio_user_ops; /* * MSIX is required to enable LSC (see virtio_init_device). * Here just pretend that we support msix. @@ -701,7 +701,7 @@ virtio_user_pmd_probe(struct rte_vdev_device *vdev) dev = eth_dev->data->dev_private; hw = &dev->hw; - VTPCI_OPS(hw) = &virtio_user_ops; + VIRTIO_OPS(hw) = &virtio_user_ops; if (eth_virtio_dev_init(eth_dev) < 0) { PMD_INIT_LOG(ERR, "eth_virtio_dev_init fails"); diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index e4a1393816..9d2089766b 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -564,7 +564,7 @@ virtqueue_kick_prepare_packed(struct virtqueue *vq) static inline void virtqueue_notify(struct virtqueue *vq) { - VTPCI_OPS(vq->hw)->notify_queue(vq->hw, vq); + VIRTIO_OPS(vq->hw)->notify_queue(vq->hw, vq); } #ifdef RTE_LIBRTE_VIRTIO_DEBUG_DUMP From patchwork Sun Dec 20 21:13:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85541 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id E135EA09FD; Sun, 20 Dec 2020 22:19:56 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 65F5ACBA9; Sun, 20 Dec 2020 22:15:33 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 181C9CB86 for ; Sun, 20 Dec 2020 22:15:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498929; 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=4DLA4YyZ0qUxuKJY7WSO1OnH12YrSWqQk+6yDkF4wDI=; b=NWYVxcOnP3PCK/tXjhIpL0fv/ZBT54x+XZYP6107DspS2A1+QbhAhVGrhkmdKdpZV49WgN dLwagpTDz1/gZvMxXG3ad9aceBnDikwsmSE8Jdq42NJEDePxf0fqG+SOJ3LxRXxlIkTx+H EZVp/PDvmtNXFFvH+yHiYS+kef8EWXc= 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-338-c8wdj7a4P3uEdubuo2LmoQ-1; Sun, 20 Dec 2020 16:15:27 -0500 X-MC-Unique: c8wdj7a4P3uEdubuo2LmoQ-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 74C2519251A1; Sun, 20 Dec 2020 21:15:26 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1D19960C43; Sun, 20 Dec 2020 21:15:21 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:42 +0100 Message-Id: <20201220211405.313012-18-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 17/40] net/virtio: move features definition to generic header 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" This patch moves all the Virtio definition to the generic header. It also renames some helpers to no more reference PCI. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/meson.build | 3 +- drivers/net/virtio/virtio.c | 22 ++++ drivers/net/virtio/virtio.h | 94 +++++++++++++++ drivers/net/virtio/virtio_ethdev.c | 110 +++++++++--------- drivers/net/virtio/virtio_pci.c | 21 +--- drivers/net/virtio/virtio_pci.h | 90 -------------- drivers/net/virtio/virtio_ring.h | 2 +- drivers/net/virtio/virtio_rxtx.c | 38 +++--- drivers/net/virtio/virtio_rxtx_packed_avx.c | 6 +- .../net/virtio/virtio_user/vhost_kernel_tap.c | 2 +- drivers/net/virtio/virtio_user_ethdev.c | 6 +- drivers/net/virtio/virtqueue.c | 4 +- drivers/net/virtio/virtqueue.h | 8 +- 13 files changed, 209 insertions(+), 197 deletions(-) create mode 100644 drivers/net/virtio/virtio.c diff --git a/drivers/net/virtio/meson.build b/drivers/net/virtio/meson.build index 0b62418f33..7de41cd04d 100644 --- a/drivers/net/virtio/meson.build +++ b/drivers/net/virtio/meson.build @@ -1,7 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2018 Intel Corporation -sources += files('virtio_ethdev.c', +sources += files('virtio.c', + 'virtio_ethdev.c', 'virtio_pci_ethdev.c', 'virtio_pci.c', 'virtio_rxtx.c', diff --git a/drivers/net/virtio/virtio.c b/drivers/net/virtio/virtio.c new file mode 100644 index 0000000000..d8d6bf7add --- /dev/null +++ b/drivers/net/virtio/virtio.c @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2014 Intel Corporation + * Copyright(c) 2020 Red Hat, Inc. + */ + +#include "virtio.h" + +uint64_t +virtio_negotiate_features(struct virtio_hw *hw, uint64_t host_features) +{ + uint64_t features; + + /* + * Limit negotiated features to what the driver, virtqueue, and + * host all support. + */ + features = host_features & hw->guest_features; + VIRTIO_OPS(hw)->set_features(hw, features); + + return features; +} + diff --git a/drivers/net/virtio/virtio.h b/drivers/net/virtio/virtio.h index eb078bc227..9e787803a4 100644 --- a/drivers/net/virtio/virtio.h +++ b/drivers/net/virtio/virtio.h @@ -8,6 +8,86 @@ #include +/* The feature bitmap for virtio net */ +#define VIRTIO_NET_F_CSUM 0 /* Host handles pkts w/ partial csum */ +#define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */ +#define VIRTIO_NET_F_MTU 3 /* Initial MTU advice. */ +#define VIRTIO_NET_F_MAC 5 /* Host has given MAC address. */ +#define VIRTIO_NET_F_GUEST_TSO4 7 /* Guest can handle TSOv4 in. */ +#define VIRTIO_NET_F_GUEST_TSO6 8 /* Guest can handle TSOv6 in. */ +#define VIRTIO_NET_F_GUEST_ECN 9 /* Guest can handle TSO[6] w/ ECN in. */ +#define VIRTIO_NET_F_GUEST_UFO 10 /* Guest can handle UFO in. */ +#define VIRTIO_NET_F_HOST_TSO4 11 /* Host can handle TSOv4 in. */ +#define VIRTIO_NET_F_HOST_TSO6 12 /* Host can handle TSOv6 in. */ +#define VIRTIO_NET_F_HOST_ECN 13 /* Host can handle TSO[6] w/ ECN in. */ +#define VIRTIO_NET_F_HOST_UFO 14 /* Host can handle UFO in. */ +#define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can merge receive buffers. */ +#define VIRTIO_NET_F_STATUS 16 /* virtio_net_config.status available */ +#define VIRTIO_NET_F_CTRL_VQ 17 /* Control channel available */ +#define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */ +#define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */ +#define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */ +#define VIRTIO_NET_F_GUEST_ANNOUNCE 21 /* Guest can announce device on the network */ +#define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow Steering */ +#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */ + +/* + * Do we get callbacks when the ring is completely used, + * even if we've suppressed them? + */ +#define VIRTIO_F_NOTIFY_ON_EMPTY 24 + +/* Can the device handle any descriptor layout? */ +#define VIRTIO_F_ANY_LAYOUT 27 + +/* We support indirect buffer descriptors */ +#define VIRTIO_RING_F_INDIRECT_DESC 28 + +#define VIRTIO_F_VERSION_1 32 +#define VIRTIO_F_IOMMU_PLATFORM 33 +#define VIRTIO_F_RING_PACKED 34 + +/* + * Some VirtIO feature bits (currently bits 28 through 31) are + * reserved for the transport being used (eg. virtio_ring), the + * rest are per-device feature bits. + */ +#define VIRTIO_TRANSPORT_F_START 28 +#define VIRTIO_TRANSPORT_F_END 34 + +/* + * Inorder feature indicates that all buffers are used by the device + * in the same order in which they have been made available. + */ +#define VIRTIO_F_IN_ORDER 35 + +/* + * This feature indicates that memory accesses by the driver and the device + * are ordered in a way described by the platform. + */ +#define VIRTIO_F_ORDER_PLATFORM 36 + +/* + * This feature indicates that the driver passes extra data (besides + * identifying the virtqueue) in its device notifications. + */ +#define VIRTIO_F_NOTIFICATION_DATA 38 + +/* Device set linkspeed and duplex */ +#define VIRTIO_NET_F_SPEED_DUPLEX 63 + +/* + * The Guest publishes the used index for which it expects an interrupt + * at the end of the avail ring. Host should ignore the avail->flags field + * + * The Host publishes the avail index for which it expects a kick + * at the end of the used ring. Guest should ignore the used->flags field. + */ +#define VIRTIO_RING_F_EVENT_IDX 29 + +#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */ +#define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */ + struct virtio_hw { struct virtqueue **vqs; uint64_t guest_features; @@ -72,4 +152,18 @@ struct virtio_hw_internal { extern struct virtio_hw_internal virtio_hw_internal[RTE_MAX_ETHPORTS]; +static inline int +virtio_with_feature(struct virtio_hw *hw, uint64_t bit) +{ + return (hw->guest_features & (1ULL << bit)) != 0; +} + +static inline int +virtio_with_packed_queue(struct virtio_hw *hw) +{ + return virtio_with_feature(hw, VIRTIO_F_RING_PACKED); +} + +uint64_t virtio_negotiate_features(struct virtio_hw *hw, uint64_t host_features); + #endif /* _VIRTIO_H_ */ diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 80b3fdba9e..c9085f2f35 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -339,7 +339,7 @@ virtio_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl, memcpy(cvq->virtio_net_hdr_mz->addr, ctrl, sizeof(struct virtio_pmd_ctrl)); - if (vtpci_packed_queue(vq->hw)) + if (virtio_with_packed_queue(vq->hw)) result = virtio_send_command_packed(cvq, ctrl, dlen, pkt_num); else result = virtio_send_command_split(cvq, ctrl, dlen, pkt_num); @@ -383,7 +383,7 @@ virtio_get_nr_vq(struct virtio_hw *hw) { uint16_t nr_vq = hw->max_queue_pairs * 2; - if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) + if (virtio_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) nr_vq += 1; return nr_vq; @@ -405,7 +405,7 @@ virtio_init_vring(struct virtqueue *vq) vq->vq_desc_tail_idx = (uint16_t)(vq->vq_nentries - 1); vq->vq_free_cnt = vq->vq_nentries; memset(vq->vq_descx, 0, sizeof(struct vq_desc_extra) * vq->vq_nentries); - if (vtpci_packed_queue(vq->hw)) { + if (virtio_with_packed_queue(vq->hw)) { vring_init_packed(&vq->vq_packed.ring, ring_mem, VIRTIO_PCI_VRING_ALIGN, size); vring_desc_init_packed(vq, size); @@ -453,7 +453,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) return -EINVAL; } - if (!vtpci_packed_queue(hw) && !rte_is_power_of_2(vq_size)) { + if (!virtio_with_packed_queue(hw) && !rte_is_power_of_2(vq_size)) { PMD_INIT_LOG(ERR, "split virtqueue size is not power of 2"); return -EINVAL; } @@ -486,7 +486,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) vq->hw = hw; vq->vq_queue_index = vtpci_queue_idx; vq->vq_nentries = vq_size; - if (vtpci_packed_queue(hw)) { + if (virtio_with_packed_queue(hw)) { vq->vq_packed.used_wrap_counter = 1; vq->vq_packed.cached_flags = VRING_PACKED_DESC_F_AVAIL; vq->vq_packed.event_flags_shadow = 0; @@ -584,7 +584,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) memset(txr, 0, vq_size * sizeof(*txr)); for (i = 0; i < vq_size; i++) { /* first indirect descriptor is always the tx header */ - if (!vtpci_packed_queue(hw)) { + if (!virtio_with_packed_queue(hw)) { struct vring_desc *start_dp = txr[i].tx_indir; vring_desc_init_split(start_dp, RTE_DIM(txr[i].tx_indir)); @@ -729,7 +729,7 @@ virtio_dev_promiscuous_enable(struct rte_eth_dev *dev) int dlen[1]; int ret; - if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) { + if (!virtio_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) { PMD_INIT_LOG(INFO, "host does not support rx control"); return -ENOTSUP; } @@ -756,7 +756,7 @@ virtio_dev_promiscuous_disable(struct rte_eth_dev *dev) int dlen[1]; int ret; - if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) { + if (!virtio_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) { PMD_INIT_LOG(INFO, "host does not support rx control"); return -ENOTSUP; } @@ -783,7 +783,7 @@ virtio_dev_allmulticast_enable(struct rte_eth_dev *dev) int dlen[1]; int ret; - if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) { + if (!virtio_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) { PMD_INIT_LOG(INFO, "host does not support rx control"); return -ENOTSUP; } @@ -810,7 +810,7 @@ virtio_dev_allmulticast_disable(struct rte_eth_dev *dev) int dlen[1]; int ret; - if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) { + if (!virtio_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) { PMD_INIT_LOG(INFO, "host does not support rx control"); return -ENOTSUP; } @@ -1104,7 +1104,7 @@ virtio_set_hwaddr(struct virtio_hw *hw) static void virtio_get_hwaddr(struct virtio_hw *hw) { - if (vtpci_with_feature(hw, VIRTIO_NET_F_MAC)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_MAC)) { vtpci_read_dev_config(hw, offsetof(struct virtio_net_config, mac), &hw->mac_addr, RTE_ETHER_ADDR_LEN); @@ -1122,7 +1122,7 @@ virtio_mac_table_set(struct virtio_hw *hw, struct virtio_pmd_ctrl ctrl; int err, len[2]; - if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) { + if (!virtio_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) { PMD_DRV_LOG(INFO, "host does not support mac table"); return -1; } @@ -1217,7 +1217,7 @@ virtio_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr) memcpy(hw->mac_addr, mac_addr, RTE_ETHER_ADDR_LEN); /* Use atomic update if available */ - if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) { struct virtio_pmd_ctrl ctrl; int len = RTE_ETHER_ADDR_LEN; @@ -1228,7 +1228,7 @@ virtio_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr) return virtio_send_command(hw->cvq, &ctrl, &len, 1); } - if (!vtpci_with_feature(hw, VIRTIO_NET_F_MAC)) + if (!virtio_with_feature(hw, VIRTIO_NET_F_MAC)) return -ENOTSUP; virtio_set_hwaddr(hw); @@ -1242,7 +1242,7 @@ virtio_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) struct virtio_pmd_ctrl ctrl; int len; - if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VLAN)) + if (!virtio_with_feature(hw, VIRTIO_NET_F_CTRL_VLAN)) return -ENOTSUP; ctrl.hdr.class = VIRTIO_NET_CTRL_VLAN; @@ -1281,7 +1281,7 @@ virtio_intr_disable(struct rte_eth_dev *dev) } static int -virtio_negotiate_features(struct virtio_hw *hw, uint64_t req_features) +virtio_ethdev_negotiate_features(struct virtio_hw *hw, uint64_t req_features) { uint64_t host_features; @@ -1311,7 +1311,7 @@ virtio_negotiate_features(struct virtio_hw *hw, uint64_t req_features) * guest feature bits. */ hw->guest_features = req_features; - hw->guest_features = vtpci_negotiate_features(hw, host_features); + hw->guest_features = virtio_negotiate_features(hw, host_features); PMD_INIT_LOG(DEBUG, "features after negotiate = %" PRIx64, hw->guest_features); @@ -1320,7 +1320,7 @@ virtio_negotiate_features(struct virtio_hw *hw, uint64_t req_features) return -1; } - if (vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) { + if (virtio_with_feature(hw, VIRTIO_F_VERSION_1)) { vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); if (!(vtpci_get_status(hw) & VIRTIO_CONFIG_STATUS_FEATURES_OK)) { @@ -1454,7 +1454,7 @@ virtio_interrupt_handler(void *param) RTE_ETH_EVENT_INTR_LSC, NULL); - if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS)) { vtpci_read_dev_config(hw, offsetof(struct virtio_net_config, status), &status, sizeof(status)); @@ -1474,7 +1474,7 @@ set_rxtx_funcs(struct rte_eth_dev *eth_dev) struct virtio_hw *hw = eth_dev->data->dev_private; eth_dev->tx_pkt_prepare = virtio_xmit_pkts_prepare; - if (vtpci_packed_queue(hw)) { + if (virtio_with_packed_queue(hw)) { PMD_INIT_LOG(INFO, "virtio: using packed ring %s Tx path on port %u", hw->use_vec_tx ? "vectorized" : "standard", @@ -1495,14 +1495,14 @@ set_rxtx_funcs(struct rte_eth_dev *eth_dev) } } - if (vtpci_packed_queue(hw)) { + if (virtio_with_packed_queue(hw)) { if (hw->use_vec_rx) { PMD_INIT_LOG(INFO, "virtio: using packed ring vectorized Rx path on port %u", eth_dev->data->port_id); eth_dev->rx_pkt_burst = &virtio_recv_pkts_packed_vec; - } else if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { + } else if (virtio_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { PMD_INIT_LOG(INFO, "virtio: using packed ring mergeable buffer Rx path on port %u", eth_dev->data->port_id); @@ -1524,7 +1524,7 @@ set_rxtx_funcs(struct rte_eth_dev *eth_dev) "virtio: using inorder Rx path on port %u", eth_dev->data->port_id); eth_dev->rx_pkt_burst = &virtio_recv_pkts_inorder; - } else if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { + } else if (virtio_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { PMD_INIT_LOG(INFO, "virtio: using mergeable buffer Rx path on port %u", eth_dev->data->port_id); @@ -1649,13 +1649,13 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) /* Tell the host we've known how to drive the device. */ vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); - if (virtio_negotiate_features(hw, req_features) < 0) + if (virtio_ethdev_negotiate_features(hw, req_features) < 0) return -1; - hw->weak_barriers = !vtpci_with_feature(hw, VIRTIO_F_ORDER_PLATFORM); + hw->weak_barriers = !virtio_with_feature(hw, VIRTIO_F_ORDER_PLATFORM); /* If host does not support both status and MSI-X then disable LSC */ - if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS) && + if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS) && hw->use_msix != VIRTIO_MSIX_NONE) eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC; else @@ -1664,9 +1664,9 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; /* Setting up rx_header size for the device */ - if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF) || - vtpci_with_feature(hw, VIRTIO_F_VERSION_1) || - vtpci_with_feature(hw, VIRTIO_F_RING_PACKED)) + if (virtio_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF) || + virtio_with_feature(hw, VIRTIO_F_VERSION_1) || + virtio_with_feature(hw, VIRTIO_F_RING_PACKED)) hw->vtnet_hdr_size = sizeof(struct virtio_net_hdr_mrg_rxbuf); else hw->vtnet_hdr_size = sizeof(struct virtio_net_hdr); @@ -1681,7 +1681,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) hw->mac_addr[3], hw->mac_addr[4], hw->mac_addr[5]); if (hw->speed == ETH_SPEED_NUM_UNKNOWN) { - if (vtpci_with_feature(hw, VIRTIO_NET_F_SPEED_DUPLEX)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_SPEED_DUPLEX)) { config = &local_config; vtpci_read_dev_config(hw, offsetof(struct virtio_net_config, speed), @@ -1697,14 +1697,14 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) hw->duplex = ETH_LINK_FULL_DUPLEX; PMD_INIT_LOG(DEBUG, "link speed = %d, duplex = %d", hw->speed, hw->duplex); - if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) { config = &local_config; vtpci_read_dev_config(hw, offsetof(struct virtio_net_config, mac), &config->mac, sizeof(config->mac)); - if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS)) { vtpci_read_dev_config(hw, offsetof(struct virtio_net_config, status), &config->status, sizeof(config->status)); @@ -1714,7 +1714,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) config->status = 0; } - if (vtpci_with_feature(hw, VIRTIO_NET_F_MQ)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_MQ)) { vtpci_read_dev_config(hw, offsetof(struct virtio_net_config, max_virtqueue_pairs), &config->max_virtqueue_pairs, @@ -1727,7 +1727,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) hw->max_queue_pairs = config->max_virtqueue_pairs; - if (vtpci_with_feature(hw, VIRTIO_NET_F_MTU)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_MTU)) { vtpci_read_dev_config(hw, offsetof(struct virtio_net_config, mtu), &config->mtu, @@ -1838,7 +1838,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) goto err_virtio_init; if (vectorized) { - if (!vtpci_packed_queue(hw)) { + if (!virtio_with_packed_queue(hw)) { hw->use_vec_rx = 1; } else { #if !defined(CC_AVX512_SUPPORT) @@ -1965,17 +1965,17 @@ virtio_dev_devargs_parse(struct rte_devargs *devargs, uint32_t *speed, int *vect static bool rx_offload_enabled(struct virtio_hw *hw) { - return vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM) || - vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) || - vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6); + return virtio_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM) || + virtio_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) || + virtio_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6); } static bool tx_offload_enabled(struct virtio_hw *hw) { - return vtpci_with_feature(hw, VIRTIO_NET_F_CSUM) || - vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO4) || - vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO6); + return virtio_with_feature(hw, VIRTIO_NET_F_CSUM) || + virtio_with_feature(hw, VIRTIO_NET_F_HOST_TSO4) || + virtio_with_feature(hw, VIRTIO_NET_F_HOST_TSO6); } /* @@ -2048,29 +2048,29 @@ virtio_dev_configure(struct rte_eth_dev *dev) if ((rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM)) && - !vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM)) { + !virtio_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM)) { PMD_DRV_LOG(ERR, "rx checksum not available on this host"); return -ENOTSUP; } if ((rx_offloads & DEV_RX_OFFLOAD_TCP_LRO) && - (!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) || - !vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6))) { + (!virtio_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) || + !virtio_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6))) { PMD_DRV_LOG(ERR, "Large Receive Offload not available on this host"); return -ENOTSUP; } /* start control queue */ - if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) + if (virtio_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) virtio_dev_cq_start(dev); if (rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP) hw->vlan_strip = 1; - if ((rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER) - && !vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VLAN)) { + if ((rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER) && + !virtio_with_feature(hw, VIRTIO_NET_F_CTRL_VLAN)) { PMD_DRV_LOG(ERR, "vlan filtering not available on this host"); return -ENOTSUP; @@ -2087,12 +2087,12 @@ virtio_dev_configure(struct rte_eth_dev *dev) return -EBUSY; } - if (vtpci_packed_queue(hw)) { + if (virtio_with_packed_queue(hw)) { #if defined(RTE_ARCH_X86_64) && defined(CC_AVX512_SUPPORT) if ((hw->use_vec_rx || hw->use_vec_tx) && (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX512F) || - !vtpci_with_feature(hw, VIRTIO_F_IN_ORDER) || - !vtpci_with_feature(hw, VIRTIO_F_VERSION_1) || + !virtio_with_feature(hw, VIRTIO_F_IN_ORDER) || + !virtio_with_feature(hw, VIRTIO_F_VERSION_1) || rte_vect_get_max_simd_bitwidth() < RTE_VECT_SIMD_512)) { PMD_DRV_LOG(INFO, "disabled packed ring vectorized path for requirements not met"); @@ -2105,7 +2105,7 @@ virtio_dev_configure(struct rte_eth_dev *dev) #endif if (hw->use_vec_rx) { - if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { PMD_DRV_LOG(INFO, "disabled packed ring vectorized rx for mrg_rxbuf enabled"); hw->use_vec_rx = 0; @@ -2118,7 +2118,7 @@ virtio_dev_configure(struct rte_eth_dev *dev) } } } else { - if (vtpci_with_feature(hw, VIRTIO_F_IN_ORDER)) { + if (virtio_with_feature(hw, VIRTIO_F_IN_ORDER)) { hw->use_inorder_tx = 1; hw->use_inorder_rx = 1; hw->use_vec_rx = 0; @@ -2132,7 +2132,7 @@ virtio_dev_configure(struct rte_eth_dev *dev) hw->use_vec_rx = 0; } #endif - if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { PMD_DRV_LOG(INFO, "disabled split ring vectorized rx for mrg_rxbuf enabled"); hw->use_vec_rx = 0; @@ -2350,7 +2350,7 @@ virtio_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complet if (!hw->started) { link.link_status = ETH_LINK_DOWN; link.link_speed = ETH_SPEED_NUM_NONE; - } else if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS)) { + } else if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS)) { PMD_INIT_LOG(DEBUG, "Get link status from hw"); vtpci_read_dev_config(hw, offsetof(struct virtio_net_config, status), @@ -2381,7 +2381,7 @@ virtio_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask) if (mask & ETH_VLAN_FILTER_MASK) { if ((offloads & DEV_RX_OFFLOAD_VLAN_FILTER) && - !vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VLAN)) { + !virtio_with_feature(hw, VIRTIO_NET_F_CTRL_VLAN)) { PMD_DRV_LOG(NOTICE, "vlan filtering not available on this host"); diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index df69fcdd45..9c07ebad00 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -356,7 +356,7 @@ modern_set_features(struct virtio_hw *hw, uint64_t features) static int modern_features_ok(struct virtio_hw *hw) { - if (!vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) { + if (!virtio_with_feature(hw, VIRTIO_F_VERSION_1)) { PMD_INIT_LOG(ERR, "Version 1+ required with modern devices\n"); return -1; } @@ -479,12 +479,12 @@ modern_notify_queue(struct virtio_hw *hw, struct virtqueue *vq) { uint32_t notify_data; - if (!vtpci_with_feature(hw, VIRTIO_F_NOTIFICATION_DATA)) { + if (!virtio_with_feature(hw, VIRTIO_F_NOTIFICATION_DATA)) { rte_write16(vq->vq_queue_index, vq->notify_addr); return; } - if (vtpci_with_feature(hw, VIRTIO_F_RING_PACKED)) { + if (virtio_with_feature(hw, VIRTIO_F_RING_PACKED)) { /* * Bit[0:15]: vq queue index * Bit[16:30]: avail index @@ -548,21 +548,6 @@ vtpci_write_dev_config(struct virtio_hw *hw, size_t offset, VIRTIO_OPS(hw)->write_dev_cfg(hw, offset, src, length); } -uint64_t -vtpci_negotiate_features(struct virtio_hw *hw, uint64_t host_features) -{ - uint64_t features; - - /* - * Limit negotiated features to what the driver, virtqueue, and - * host all support. - */ - features = host_features & hw->guest_features; - VIRTIO_OPS(hw)->set_features(hw, features); - - return features; -} - void vtpci_reset(struct virtio_hw *hw) { diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 8b07c4a369..b02e5c15f5 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -79,83 +79,6 @@ struct virtnet_ctl; */ #define VIRTIO_MAX_INDIRECT ((int) (PAGE_SIZE / 16)) -/* The feature bitmap for virtio net */ -#define VIRTIO_NET_F_CSUM 0 /* Host handles pkts w/ partial csum */ -#define VIRTIO_NET_F_GUEST_CSUM 1 /* Guest handles pkts w/ partial csum */ -#define VIRTIO_NET_F_MTU 3 /* Initial MTU advice. */ -#define VIRTIO_NET_F_MAC 5 /* Host has given MAC address. */ -#define VIRTIO_NET_F_GUEST_TSO4 7 /* Guest can handle TSOv4 in. */ -#define VIRTIO_NET_F_GUEST_TSO6 8 /* Guest can handle TSOv6 in. */ -#define VIRTIO_NET_F_GUEST_ECN 9 /* Guest can handle TSO[6] w/ ECN in. */ -#define VIRTIO_NET_F_GUEST_UFO 10 /* Guest can handle UFO in. */ -#define VIRTIO_NET_F_HOST_TSO4 11 /* Host can handle TSOv4 in. */ -#define VIRTIO_NET_F_HOST_TSO6 12 /* Host can handle TSOv6 in. */ -#define VIRTIO_NET_F_HOST_ECN 13 /* Host can handle TSO[6] w/ ECN in. */ -#define VIRTIO_NET_F_HOST_UFO 14 /* Host can handle UFO in. */ -#define VIRTIO_NET_F_MRG_RXBUF 15 /* Host can merge receive buffers. */ -#define VIRTIO_NET_F_STATUS 16 /* virtio_net_config.status available */ -#define VIRTIO_NET_F_CTRL_VQ 17 /* Control channel available */ -#define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */ -#define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */ -#define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */ -#define VIRTIO_NET_F_GUEST_ANNOUNCE 21 /* Guest can announce device on the - * network */ -#define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow - * Steering */ -#define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */ - -/* Do we get callbacks when the ring is completely used, even if we've - * suppressed them? */ -#define VIRTIO_F_NOTIFY_ON_EMPTY 24 - -/* Can the device handle any descriptor layout? */ -#define VIRTIO_F_ANY_LAYOUT 27 - -/* We support indirect buffer descriptors */ -#define VIRTIO_RING_F_INDIRECT_DESC 28 - -#define VIRTIO_F_VERSION_1 32 -#define VIRTIO_F_IOMMU_PLATFORM 33 -#define VIRTIO_F_RING_PACKED 34 - -/* - * Some VirtIO feature bits (currently bits 28 through 31) are - * reserved for the transport being used (eg. virtio_ring), the - * rest are per-device feature bits. - */ -#define VIRTIO_TRANSPORT_F_START 28 -#define VIRTIO_TRANSPORT_F_END 34 - -/* - * Inorder feature indicates that all buffers are used by the device - * in the same order in which they have been made available. - */ -#define VIRTIO_F_IN_ORDER 35 - -/* - * This feature indicates that memory accesses by the driver and the device - * are ordered in a way described by the platform. - */ -#define VIRTIO_F_ORDER_PLATFORM 36 - -/* - * This feature indicates that the driver passes extra data (besides - * identifying the virtqueue) in its device notifications. - */ -#define VIRTIO_F_NOTIFICATION_DATA 38 - -/* Device set linkspeed and duplex */ -#define VIRTIO_NET_F_SPEED_DUPLEX 63 - -/* The Guest publishes the used index for which it expects an interrupt - * at the end of the avail ring. Host should ignore the avail->flags field. */ -/* The Host publishes the avail index for which it expects a kick - * at the end of the used ring. Guest should ignore the used->flags field. */ -#define VIRTIO_RING_F_EVENT_IDX 29 - -#define VIRTIO_NET_S_LINK_UP 1 /* Link is up */ -#define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */ - /* * Maximum number of virtqueues per device. */ @@ -271,17 +194,6 @@ enum virtio_msix_status { VIRTIO_MSIX_ENABLED = 2 }; -static inline int -vtpci_with_feature(struct virtio_hw *hw, uint64_t bit) -{ - return (hw->guest_features & (1ULL << bit)) != 0; -} - -static inline int -vtpci_packed_queue(struct virtio_hw *hw) -{ - return vtpci_with_feature(hw, VIRTIO_F_RING_PACKED); -} /* * Function declaration from virtio_pci.c @@ -294,8 +206,6 @@ void vtpci_reinit_complete(struct virtio_hw *); uint8_t vtpci_get_status(struct virtio_hw *); void vtpci_set_status(struct virtio_hw *, uint8_t); -uint64_t vtpci_negotiate_features(struct virtio_hw *, uint64_t); - void vtpci_write_dev_config(struct virtio_hw *, size_t, const void *, int); void vtpci_read_dev_config(struct virtio_hw *, size_t, void *, int); diff --git a/drivers/net/virtio/virtio_ring.h b/drivers/net/virtio/virtio_ring.h index 0f6574f684..17a56b0a73 100644 --- a/drivers/net/virtio/virtio_ring.h +++ b/drivers/net/virtio/virtio_ring.h @@ -133,7 +133,7 @@ vring_size(struct virtio_hw *hw, unsigned int num, unsigned long align) { size_t size; - if (vtpci_packed_queue(hw)) { + if (virtio_with_packed_queue(hw)) { size = num * sizeof(struct vring_packed_desc); size += sizeof(struct vring_packed_desc_event); size = RTE_ALIGN_CEIL(size, align); diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c index 93fe856cbd..10989118b0 100644 --- a/drivers/net/virtio/virtio_rxtx.c +++ b/drivers/net/virtio/virtio_rxtx.c @@ -685,14 +685,14 @@ virtio_dev_rx_queue_setup_finish(struct rte_eth_dev *dev, uint16_t queue_idx) struct rte_mbuf *m; uint16_t desc_idx; int error, nbufs, i; - bool in_order = vtpci_with_feature(hw, VIRTIO_F_IN_ORDER); + bool in_order = virtio_with_feature(hw, VIRTIO_F_IN_ORDER); PMD_INIT_FUNC_TRACE(); /* Allocate blank mbufs for the each rx descriptor */ nbufs = 0; - if (hw->use_vec_rx && !vtpci_packed_queue(hw)) { + if (hw->use_vec_rx && !virtio_with_packed_queue(hw)) { for (desc_idx = 0; desc_idx < vq->vq_nentries; desc_idx++) { vq->vq_split.ring.avail->ring[desc_idx] = desc_idx; @@ -710,12 +710,12 @@ virtio_dev_rx_queue_setup_finish(struct rte_eth_dev *dev, uint16_t queue_idx) &rxvq->fake_mbuf; } - if (hw->use_vec_rx && !vtpci_packed_queue(hw)) { + if (hw->use_vec_rx && !virtio_with_packed_queue(hw)) { while (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) { virtio_rxq_rearm_vec(rxvq); nbufs += RTE_VIRTIO_VPMD_RX_REARM_THRESH; } - } else if (!vtpci_packed_queue(vq->hw) && in_order) { + } else if (!virtio_with_packed_queue(vq->hw) && in_order) { if ((!virtqueue_full(vq))) { uint16_t free_cnt = vq->vq_free_cnt; struct rte_mbuf *pkts[free_cnt]; @@ -741,7 +741,7 @@ virtio_dev_rx_queue_setup_finish(struct rte_eth_dev *dev, uint16_t queue_idx) break; /* Enqueue allocated buffers */ - if (vtpci_packed_queue(vq->hw)) + if (virtio_with_packed_queue(vq->hw)) error = virtqueue_enqueue_recv_refill_packed(vq, &m, 1); else @@ -754,7 +754,7 @@ virtio_dev_rx_queue_setup_finish(struct rte_eth_dev *dev, uint16_t queue_idx) nbufs++; } - if (!vtpci_packed_queue(vq->hw)) + if (!virtio_with_packed_queue(vq->hw)) vq_update_avail_idx(vq); } @@ -829,8 +829,8 @@ virtio_dev_tx_queue_setup_finish(struct rte_eth_dev *dev, PMD_INIT_FUNC_TRACE(); - if (!vtpci_packed_queue(hw)) { - if (vtpci_with_feature(hw, VIRTIO_F_IN_ORDER)) + if (!virtio_with_packed_queue(hw)) { + if (virtio_with_feature(hw, VIRTIO_F_IN_ORDER)) vq->vq_split.ring.desc[vq->vq_nentries - 1].next = 0; } @@ -847,7 +847,7 @@ virtio_discard_rxbuf(struct virtqueue *vq, struct rte_mbuf *m) * Requeue the discarded mbuf. This should always be * successful since it was just dequeued. */ - if (vtpci_packed_queue(vq->hw)) + if (virtio_with_packed_queue(vq->hw)) error = virtqueue_enqueue_recv_refill_packed(vq, &m, 1); else error = virtqueue_enqueue_recv_refill(vq, &m, 1); @@ -1209,7 +1209,7 @@ virtio_recv_pkts_inorder(void *rx_queue, ((char *)rxm->buf_addr + RTE_PKTMBUF_HEADROOM - hdr_size); - if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { seg_num = header->num_buffers; if (seg_num == 0) seg_num = 1; @@ -1735,7 +1735,7 @@ virtio_xmit_pkts_packed(void *tx_queue, struct rte_mbuf **tx_pkts, struct virtio_hw *hw = vq->hw; uint16_t hdr_size = hw->vtnet_hdr_size; uint16_t nb_tx = 0; - bool in_order = vtpci_with_feature(hw, VIRTIO_F_IN_ORDER); + bool in_order = virtio_with_feature(hw, VIRTIO_F_IN_ORDER); if (unlikely(hw->started == 0 && tx_pkts != hw->inject_pkts)) return nb_tx; @@ -1754,8 +1754,8 @@ virtio_xmit_pkts_packed(void *tx_queue, struct rte_mbuf **tx_pkts, int can_push = 0, use_indirect = 0, slots, need; /* optimize ring usage */ - if ((vtpci_with_feature(hw, VIRTIO_F_ANY_LAYOUT) || - vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) && + if ((virtio_with_feature(hw, VIRTIO_F_ANY_LAYOUT) || + virtio_with_feature(hw, VIRTIO_F_VERSION_1)) && rte_mbuf_refcnt_read(txm) == 1 && RTE_MBUF_DIRECT(txm) && txm->nb_segs == 1 && @@ -1763,7 +1763,7 @@ virtio_xmit_pkts_packed(void *tx_queue, struct rte_mbuf **tx_pkts, rte_is_aligned(rte_pktmbuf_mtod(txm, char *), __alignof__(struct virtio_net_hdr_mrg_rxbuf))) can_push = 1; - else if (vtpci_with_feature(hw, VIRTIO_RING_F_INDIRECT_DESC) && + else if (virtio_with_feature(hw, VIRTIO_RING_F_INDIRECT_DESC) && txm->nb_segs < VIRTIO_MAX_TX_INDIRECT) use_indirect = 1; /* How many main ring entries are needed to this Tx? @@ -1835,8 +1835,8 @@ virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) int can_push = 0, use_indirect = 0, slots, need; /* optimize ring usage */ - if ((vtpci_with_feature(hw, VIRTIO_F_ANY_LAYOUT) || - vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) && + if ((virtio_with_feature(hw, VIRTIO_F_ANY_LAYOUT) || + virtio_with_feature(hw, VIRTIO_F_VERSION_1)) && rte_mbuf_refcnt_read(txm) == 1 && RTE_MBUF_DIRECT(txm) && txm->nb_segs == 1 && @@ -1844,7 +1844,7 @@ virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) rte_is_aligned(rte_pktmbuf_mtod(txm, char *), __alignof__(struct virtio_net_hdr_mrg_rxbuf))) can_push = 1; - else if (vtpci_with_feature(hw, VIRTIO_RING_F_INDIRECT_DESC) && + else if (virtio_with_feature(hw, VIRTIO_RING_F_INDIRECT_DESC) && txm->nb_segs < VIRTIO_MAX_TX_INDIRECT) use_indirect = 1; @@ -1937,8 +1937,8 @@ virtio_xmit_pkts_inorder(void *tx_queue, int slots; /* optimize ring usage */ - if ((vtpci_with_feature(hw, VIRTIO_F_ANY_LAYOUT) || - vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) && + if ((virtio_with_feature(hw, VIRTIO_F_ANY_LAYOUT) || + virtio_with_feature(hw, VIRTIO_F_VERSION_1)) && rte_mbuf_refcnt_read(txm) == 1 && RTE_MBUF_DIRECT(txm) && txm->nb_segs == 1 && diff --git a/drivers/net/virtio/virtio_rxtx_packed_avx.c b/drivers/net/virtio/virtio_rxtx_packed_avx.c index a6a49ec439..c272766a9f 100644 --- a/drivers/net/virtio/virtio_rxtx_packed_avx.c +++ b/drivers/net/virtio/virtio_rxtx_packed_avx.c @@ -211,14 +211,14 @@ virtqueue_enqueue_single_packed_vec(struct virtnet_tx *txvq, int16_t need; /* optimize ring usage */ - if ((vtpci_with_feature(hw, VIRTIO_F_ANY_LAYOUT) || - vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) && + if ((virtio_with_feature(hw, VIRTIO_F_ANY_LAYOUT) || + virtio_with_feature(hw, VIRTIO_F_VERSION_1)) && rte_mbuf_refcnt_read(txm) == 1 && RTE_MBUF_DIRECT(txm) && txm->nb_segs == 1 && rte_pktmbuf_headroom(txm) >= hdr_size) can_push = 1; - else if (vtpci_with_feature(hw, VIRTIO_RING_F_INDIRECT_DESC) && + else if (virtio_with_feature(hw, VIRTIO_RING_F_INDIRECT_DESC) && txm->nb_segs < VIRTIO_MAX_TX_INDIRECT) use_indirect = 1; /* How many main ring entries are needed to this Tx? diff --git a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c index 79b8446f8e..eade702c5c 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c @@ -16,7 +16,7 @@ #include "vhost_kernel_tap.h" #include "../virtio_logs.h" -#include "../virtio_pci.h" +#include "../virtio.h" int vhost_kernel_tap_set_offload(int fd, uint64_t features) diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 14468ddf52..d05613ba3b 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -122,7 +122,7 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) dev->features &= dev->device_features; /* For packed ring, resetting queues is required in reconnection. */ - if (vtpci_packed_queue(hw) && + if (virtio_with_packed_queue(hw) && (old_status & VIRTIO_CONFIG_STATUS_DRIVER_OK)) { PMD_INIT_LOG(NOTICE, "Packets on the fly will be dropped" " when packed ring reconnecting."); @@ -423,7 +423,7 @@ virtio_user_setup_queue(struct virtio_hw *hw, struct virtqueue *vq) { struct virtio_user_dev *dev = virtio_user_get_dev(hw); - if (vtpci_packed_queue(hw)) + if (virtio_with_packed_queue(hw)) virtio_user_setup_queue_packed(vq, dev); else virtio_user_setup_queue_split(vq, dev); @@ -456,7 +456,7 @@ virtio_user_notify_queue(struct virtio_hw *hw, struct virtqueue *vq) struct virtio_user_dev *dev = virtio_user_get_dev(hw); if (hw->cvq && (hw->cvq->vq == vq)) { - if (vtpci_packed_queue(vq->hw)) + if (virtio_with_packed_queue(vq->hw)) virtio_user_handle_cq_packed(dev, vq->vq_queue_index); else virtio_user_handle_cq(dev, vq->vq_queue_index); diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c index 2702e120ee..59a2cb6599 100644 --- a/drivers/net/virtio/virtqueue.c +++ b/drivers/net/virtio/virtqueue.c @@ -32,7 +32,7 @@ virtqueue_detach_unused(struct virtqueue *vq) end = (vq->vq_avail_idx + vq->vq_free_cnt) & (vq->vq_nentries - 1); for (idx = 0; idx < vq->vq_nentries; idx++) { - if (hw->use_vec_rx && !vtpci_packed_queue(hw) && + if (hw->use_vec_rx && !virtio_with_packed_queue(hw) && type == VTNET_RQ) { if (start <= end && idx >= start && idx < end) continue; @@ -137,7 +137,7 @@ virtqueue_rxvq_flush(struct virtqueue *vq) { struct virtio_hw *hw = vq->hw; - if (vtpci_packed_queue(hw)) + if (virtio_with_packed_queue(hw)) virtqueue_rxvq_flush_packed(vq); else virtqueue_rxvq_flush_split(vq); diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index 9d2089766b..6c1df6f8e5 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -12,7 +12,7 @@ #include #include -#include "virtio_pci.h" +#include "virtio.h" #include "virtio_ring.h" #include "virtio_logs.h" #include "virtio_rxtx.h" @@ -386,7 +386,7 @@ virtqueue_disable_intr_split(struct virtqueue *vq) static inline void virtqueue_disable_intr(struct virtqueue *vq) { - if (vtpci_packed_queue(vq->hw)) + if (virtio_with_packed_queue(vq->hw)) virtqueue_disable_intr_packed(vq); else virtqueue_disable_intr_split(vq); @@ -420,7 +420,7 @@ virtqueue_enable_intr_split(struct virtqueue *vq) static inline void virtqueue_enable_intr(struct virtqueue *vq) { - if (vtpci_packed_queue(vq->hw)) + if (virtio_with_packed_queue(vq->hw)) virtqueue_enable_intr_packed(vq); else virtqueue_enable_intr_split(vq); @@ -573,7 +573,7 @@ virtqueue_notify(struct virtqueue *vq) used_idx = __atomic_load_n(&(vq)->vq_split.ring.used->idx, \ __ATOMIC_RELAXED); \ nused = (uint16_t)(used_idx - (vq)->vq_used_cons_idx); \ - if (vtpci_packed_queue((vq)->hw)) { \ + if (virtio_with_packed_queue((vq)->hw)) { \ PMD_INIT_LOG(DEBUG, \ "VQ: - size=%d; free=%d; used_cons_idx=%d; avail_idx=%d;" \ " cached_flags=0x%x; used_wrap_counter=%d", \ From patchwork Sun Dec 20 21:13:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85543 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id EFF2CA09FD; Sun, 20 Dec 2020 22:20:36 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 332AACCAC; Sun, 20 Dec 2020 22:15:39 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id 39E4ACD88 for ; Sun, 20 Dec 2020 22:15:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498933; 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=RXFAUI5HgvS/l5y+kr6lETqeNfT6E7gmrenbLKgZB2k=; b=hmEiwLQbvmmf8q0ssWYL3xKB+Ljezi/JrrRqkhai2S0hLn2fnBoViJX5ji+arN4nxE/2Il vCr7iAU+2Bs4RTGbvQxpFZnBEPTpbqDp+tQBKOp2+NJrw5gk4Xn/suNuNkL/HdUBInaORo k3vr6gPJm+DJoUyFPlVuoU9ognPoVas= 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-267-BvSiVw3gNoyo4lbLlZYOHA-1; Sun, 20 Dec 2020 16:15:29 -0500 X-MC-Unique: BvSiVw3gNoyo4lbLlZYOHA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id ACD4BBBEE2; Sun, 20 Dec 2020 21:15:28 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1236360C43; Sun, 20 Dec 2020 21:15:26 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:43 +0100 Message-Id: <20201220211405.313012-19-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 18/40] net/virtio: move virtqueue defines in generic header 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" This patch moves the virtqueues defines from PCI header to the genreric one. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio.h | 18 ++++++++++++++++++ drivers/net/virtio/virtio_ethdev.h | 3 ++- drivers/net/virtio/virtio_pci.h | 17 ----------------- .../net/virtio/virtio_user/virtio_user_dev.h | 2 +- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/drivers/net/virtio/virtio.h b/drivers/net/virtio/virtio.h index 9e787803a4..eeeb5dba4f 100644 --- a/drivers/net/virtio/virtio.h +++ b/drivers/net/virtio/virtio.h @@ -88,6 +88,24 @@ #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */ #define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */ +/* + * Each virtqueue indirect descriptor list must be physically contiguous. + * To allow us to malloc(9) each list individually, limit the number + * supported to what will fit in one page. With 4KB pages, this is a limit + * of 256 descriptors. If there is ever a need for more, we can switch to + * contigmalloc(9) for the larger allocations, similar to what + * bus_dmamem_alloc(9) does. + * + * Note the sizeof(struct vring_desc) is 16 bytes. + */ +#define VIRTIO_MAX_INDIRECT ((int)(PAGE_SIZE / 16)) + +/* + * Maximum number of virtqueues per device. + */ +#define VIRTIO_MAX_VIRTQUEUE_PAIRS 8 +#define VIRTIO_MAX_VIRTQUEUES (VIRTIO_MAX_VIRTQUEUE_PAIRS * 2 + 1) + struct virtio_hw { struct virtqueue **vqs; uint64_t guest_features; diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h index 13395937c8..6fc373f484 100644 --- a/drivers/net/virtio/virtio_ethdev.h +++ b/drivers/net/virtio/virtio_ethdev.h @@ -7,7 +7,8 @@ #include -#include "virtio_pci.h" +#include "virtio.h" +#include #ifndef PAGE_SIZE #define PAGE_SIZE 4096 diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index b02e5c15f5..249f9754cc 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -67,23 +67,6 @@ struct virtnet_ctl; #define VIRTIO_CONFIG_STATUS_DEV_NEED_RESET 0x40 #define VIRTIO_CONFIG_STATUS_FAILED 0x80 -/* - * Each virtqueue indirect descriptor list must be physically contiguous. - * To allow us to malloc(9) each list individually, limit the number - * supported to what will fit in one page. With 4KB pages, this is a limit - * of 256 descriptors. If there is ever a need for more, we can switch to - * contigmalloc(9) for the larger allocations, similar to what - * bus_dmamem_alloc(9) does. - * - * Note the sizeof(struct vring_desc) is 16 bytes. - */ -#define VIRTIO_MAX_INDIRECT ((int) (PAGE_SIZE / 16)) - -/* - * Maximum number of virtqueues per device. - */ -#define VIRTIO_MAX_VIRTQUEUE_PAIRS 8 -#define VIRTIO_MAX_VIRTQUEUES (VIRTIO_MAX_VIRTQUEUE_PAIRS * 2 + 1) /* Common configuration */ #define VIRTIO_PCI_CAP_COMMON_CFG 1 diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index 59f4dd1f24..0eb481ae21 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -7,7 +7,7 @@ #include #include -#include "../virtio_pci.h" +#include "../virtio.h" #include "../virtio_ring.h" enum virtio_user_backend_type { From patchwork Sun Dec 20 21:13:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85542 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 353EBA09FD; Sun, 20 Dec 2020 22:20:19 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 33D10CD8C; Sun, 20 Dec 2020 22:15:37 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 1C887CD84 for ; Sun, 20 Dec 2020 22:15:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498933; 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=JbB84VtxI9smY7R9kyT4vSea1pJWCWPdkHWveKBrxcY=; b=eIwYhFOWuIosjnQqjLUPGvS9o+XOHYwjNHi1EYEFG0P+o/Euz+XZUSXSszN9yrd7p49xV9 wOhyROkMF1fGmLd6vLGtVaSw9liGQ9cOtx+WjjIBfy9BWnQwBVE0L4Vq4FmXAXe8QcXlyW pgu4KnDeQQ/YfKQqbptSiCI8mChyvkM= 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-216-3HzqDh6iNF63ro4tsDeA0g-1; Sun, 20 Dec 2020 16:15:31 -0500 X-MC-Unique: 3HzqDh6iNF63ro4tsDeA0g-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9F70110054FF; Sun, 20 Dec 2020 21:15:30 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1137960C43; Sun, 20 Dec 2020 21:15:28 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:44 +0100 Message-Id: <20201220211405.313012-20-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 19/40] net/virtio: move config definitions to generic header 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" This patch moves config and status definitions from the PCI header to the generic one. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- drivers/net/virtio/virtio.c | 43 +++++++++++++++++++ drivers/net/virtio/virtio.h | 52 ++++++++++++++++++++++- drivers/net/virtio/virtio_ethdev.c | 36 ++++++++-------- drivers/net/virtio/virtio_pci.c | 44 -------------------- drivers/net/virtio/virtio_pci.h | 55 ------------------------- drivers/net/virtio/virtio_user_ethdev.c | 12 +++--- 6 files changed, 118 insertions(+), 124 deletions(-) diff --git a/drivers/net/virtio/virtio.c b/drivers/net/virtio/virtio.c index d8d6bf7add..ba3203e68b 100644 --- a/drivers/net/virtio/virtio.c +++ b/drivers/net/virtio/virtio.c @@ -20,3 +20,46 @@ virtio_negotiate_features(struct virtio_hw *hw, uint64_t host_features) return features; } + +void +virtio_read_dev_config(struct virtio_hw *hw, size_t offset, + void *dst, int length) +{ + VIRTIO_OPS(hw)->read_dev_cfg(hw, offset, dst, length); +} + +void +virtio_write_dev_config(struct virtio_hw *hw, size_t offset, + const void *src, int length) +{ + VIRTIO_OPS(hw)->write_dev_cfg(hw, offset, src, length); +} + +void +virtio_reset(struct virtio_hw *hw) +{ + VIRTIO_OPS(hw)->set_status(hw, VIRTIO_CONFIG_STATUS_RESET); + /* flush status write */ + VIRTIO_OPS(hw)->get_status(hw); +} + +void +virtio_reinit_complete(struct virtio_hw *hw) +{ + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK); +} + +void +virtio_set_status(struct virtio_hw *hw, uint8_t status) +{ + if (status != VIRTIO_CONFIG_STATUS_RESET) + status |= VIRTIO_OPS(hw)->get_status(hw); + + VIRTIO_OPS(hw)->set_status(hw, status); +} + +uint8_t +virtio_get_status(struct virtio_hw *hw) +{ + return VIRTIO_OPS(hw)->get_status(hw); +} diff --git a/drivers/net/virtio/virtio.h b/drivers/net/virtio/virtio.h index eeeb5dba4f..5169436c9f 100644 --- a/drivers/net/virtio/virtio.h +++ b/drivers/net/virtio/virtio.h @@ -106,6 +106,50 @@ #define VIRTIO_MAX_VIRTQUEUE_PAIRS 8 #define VIRTIO_MAX_VIRTQUEUES (VIRTIO_MAX_VIRTQUEUE_PAIRS * 2 + 1) +/* VirtIO device IDs. */ +#define VIRTIO_ID_NETWORK 0x01 +#define VIRTIO_ID_BLOCK 0x02 +#define VIRTIO_ID_CONSOLE 0x03 +#define VIRTIO_ID_ENTROPY 0x04 +#define VIRTIO_ID_BALLOON 0x05 +#define VIRTIO_ID_IOMEMORY 0x06 +#define VIRTIO_ID_9P 0x09 + +/* Status byte for guest to report progress. */ +#define VIRTIO_CONFIG_STATUS_RESET 0x00 +#define VIRTIO_CONFIG_STATUS_ACK 0x01 +#define VIRTIO_CONFIG_STATUS_DRIVER 0x02 +#define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04 +#define VIRTIO_CONFIG_STATUS_FEATURES_OK 0x08 +#define VIRTIO_CONFIG_STATUS_DEV_NEED_RESET 0x40 +#define VIRTIO_CONFIG_STATUS_FAILED 0x80 + +/* + * This structure is just a reference to read + * net device specific config space; it just a chodu structure + * + */ +struct virtio_net_config { + /* The config defining mac address (if VIRTIO_NET_F_MAC) */ + uint8_t mac[RTE_ETHER_ADDR_LEN]; + /* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */ + uint16_t status; + uint16_t max_virtqueue_pairs; + uint16_t mtu; + /* + * speed, in units of 1Mb. All values 0 to INT_MAX are legal. + * Any other value stands for unknown. + */ + uint32_t speed; + /* + * 0x00 - half duplex + * 0x01 - full duplex + * Any other value stands for unknown. + */ + uint8_t duplex; + +} __rte_packed; + struct virtio_hw { struct virtqueue **vqs; uint64_t guest_features; @@ -159,7 +203,7 @@ struct virtio_ops { /* * While virtio_hw is stored in shared memory, this structure stores * some infos that may vary in the multiple process model locally. - * For example, the vtpci_ops pointer. + * For example, the virtio_ops pointer. */ struct virtio_hw_internal { const struct virtio_ops *virtio_ops; @@ -183,5 +227,11 @@ virtio_with_packed_queue(struct virtio_hw *hw) } uint64_t virtio_negotiate_features(struct virtio_hw *hw, uint64_t host_features); +uint8_t virtio_get_status(struct virtio_hw *hw); +void virtio_set_status(struct virtio_hw *hw, uint8_t status); +void virtio_write_dev_config(struct virtio_hw *hw, size_t offset, const void *src, int length); +void virtio_read_dev_config(struct virtio_hw *hw, size_t offset, void *dst, int length); +void virtio_reset(struct virtio_hw *hw); +void virtio_reinit_complete(struct virtio_hw *hw); #endif /* _VIRTIO_H_ */ diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index c9085f2f35..560647f11b 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -714,7 +714,7 @@ virtio_dev_close(struct rte_eth_dev *dev) dev->intr_handle->intr_vec = NULL; } - vtpci_reset(hw); + virtio_reset(hw); virtio_dev_free_mbufs(dev); virtio_free_queues(hw); @@ -1096,7 +1096,7 @@ virtio_dev_stats_reset(struct rte_eth_dev *dev) static void virtio_set_hwaddr(struct virtio_hw *hw) { - vtpci_write_dev_config(hw, + virtio_write_dev_config(hw, offsetof(struct virtio_net_config, mac), &hw->mac_addr, RTE_ETHER_ADDR_LEN); } @@ -1105,7 +1105,7 @@ static void virtio_get_hwaddr(struct virtio_hw *hw) { if (virtio_with_feature(hw, VIRTIO_NET_F_MAC)) { - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, mac), &hw->mac_addr, RTE_ETHER_ADDR_LEN); } else { @@ -1298,7 +1298,7 @@ virtio_ethdev_negotiate_features(struct virtio_hw *hw, uint64_t req_features) if (host_features & req_features & (1ULL << VIRTIO_NET_F_MTU)) { struct virtio_net_config config; - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, mtu), &config.mtu, sizeof(config.mtu)); @@ -1321,9 +1321,9 @@ virtio_ethdev_negotiate_features(struct virtio_hw *hw, uint64_t req_features) } if (virtio_with_feature(hw, VIRTIO_F_VERSION_1)) { - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); - if (!(vtpci_get_status(hw) & VIRTIO_CONFIG_STATUS_FEATURES_OK)) { + if (!(virtio_get_status(hw) & VIRTIO_CONFIG_STATUS_FEATURES_OK)) { PMD_INIT_LOG(ERR, "Failed to set FEATURES_OK status!"); return -1; } @@ -1455,7 +1455,7 @@ virtio_interrupt_handler(void *param) NULL); if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS)) { - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, status), &status, sizeof(status)); if (status & VIRTIO_NET_S_ANNOUNCE) { @@ -1637,7 +1637,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) int ret; /* Reset the device although not necessary at startup */ - vtpci_reset(hw); + virtio_reset(hw); if (hw->vqs) { virtio_dev_free_mbufs(eth_dev); @@ -1645,10 +1645,10 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) } /* Tell the host we've noticed this device. */ - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_ACK); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_ACK); /* Tell the host we've known how to drive the device. */ - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); if (virtio_ethdev_negotiate_features(hw, req_features) < 0) return -1; @@ -1683,10 +1683,10 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) if (hw->speed == ETH_SPEED_NUM_UNKNOWN) { if (virtio_with_feature(hw, VIRTIO_NET_F_SPEED_DUPLEX)) { config = &local_config; - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, speed), &config->speed, sizeof(config->speed)); - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, duplex), &config->duplex, sizeof(config->duplex)); hw->speed = config->speed; @@ -1700,12 +1700,12 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) if (virtio_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) { config = &local_config; - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, mac), &config->mac, sizeof(config->mac)); if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS)) { - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, status), &config->status, sizeof(config->status)); } else { @@ -1715,7 +1715,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) } if (virtio_with_feature(hw, VIRTIO_NET_F_MQ)) { - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, max_virtqueue_pairs), &config->max_virtqueue_pairs, sizeof(config->max_virtqueue_pairs)); @@ -1728,7 +1728,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) hw->max_queue_pairs = config->max_virtqueue_pairs; if (virtio_with_feature(hw, VIRTIO_NET_F_MTU)) { - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, mtu), &config->mtu, sizeof(config->mtu)); @@ -1780,7 +1780,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) } } - vtpci_reinit_complete(hw); + virtio_reinit_complete(hw); return 0; } @@ -2352,7 +2352,7 @@ virtio_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complet link.link_speed = ETH_SPEED_NUM_NONE; } else if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS)) { PMD_INIT_LOG(DEBUG, "Get link status from hw"); - vtpci_read_dev_config(hw, + virtio_read_dev_config(hw, offsetof(struct virtio_net_config, status), &status, sizeof(status)); if ((status & VIRTIO_NET_S_LINK_UP) == 0) { diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 9c07ebad00..29dd84888f 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -533,50 +533,6 @@ const struct virtio_ops modern_ops = { .dev_close = modern_dev_close, }; - -void -vtpci_read_dev_config(struct virtio_hw *hw, size_t offset, - void *dst, int length) -{ - VIRTIO_OPS(hw)->read_dev_cfg(hw, offset, dst, length); -} - -void -vtpci_write_dev_config(struct virtio_hw *hw, size_t offset, - const void *src, int length) -{ - VIRTIO_OPS(hw)->write_dev_cfg(hw, offset, src, length); -} - -void -vtpci_reset(struct virtio_hw *hw) -{ - VIRTIO_OPS(hw)->set_status(hw, VIRTIO_CONFIG_STATUS_RESET); - /* flush status write */ - VIRTIO_OPS(hw)->get_status(hw); -} - -void -vtpci_reinit_complete(struct virtio_hw *hw) -{ - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK); -} - -void -vtpci_set_status(struct virtio_hw *hw, uint8_t status) -{ - if (status != VIRTIO_CONFIG_STATUS_RESET) - status |= VIRTIO_OPS(hw)->get_status(hw); - - VIRTIO_OPS(hw)->set_status(hw, status); -} - -uint8_t -vtpci_get_status(struct virtio_hw *hw) -{ - return VIRTIO_OPS(hw)->get_status(hw); -} - uint8_t vtpci_isr(struct virtio_hw *hw) { diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 249f9754cc..19d56c920c 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -49,25 +49,6 @@ struct virtnet_ctl; /* Vector value used to disable MSI for queue. */ #define VIRTIO_MSI_NO_VECTOR 0xFFFF -/* VirtIO device IDs. */ -#define VIRTIO_ID_NETWORK 0x01 -#define VIRTIO_ID_BLOCK 0x02 -#define VIRTIO_ID_CONSOLE 0x03 -#define VIRTIO_ID_ENTROPY 0x04 -#define VIRTIO_ID_BALLOON 0x05 -#define VIRTIO_ID_IOMEMORY 0x06 -#define VIRTIO_ID_9P 0x09 - -/* Status byte for guest to report progress. */ -#define VIRTIO_CONFIG_STATUS_RESET 0x00 -#define VIRTIO_CONFIG_STATUS_ACK 0x01 -#define VIRTIO_CONFIG_STATUS_DRIVER 0x02 -#define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04 -#define VIRTIO_CONFIG_STATUS_FEATURES_OK 0x08 -#define VIRTIO_CONFIG_STATUS_DEV_NEED_RESET 0x40 -#define VIRTIO_CONFIG_STATUS_FAILED 0x80 - - /* Common configuration */ #define VIRTIO_PCI_CAP_COMMON_CFG 1 /* Notifications */ @@ -136,32 +117,6 @@ struct virtio_pci_dev { #define virtio_pci_get_dev(hw) container_of(hw, struct virtio_pci_dev, hw) -/* - * This structure is just a reference to read - * net device specific config space; it just a chodu structure - * - */ -struct virtio_net_config { - /* The config defining mac address (if VIRTIO_NET_F_MAC) */ - uint8_t mac[RTE_ETHER_ADDR_LEN]; - /* See VIRTIO_NET_F_STATUS and VIRTIO_NET_S_* above */ - uint16_t status; - uint16_t max_virtqueue_pairs; - uint16_t mtu; - /* - * speed, in units of 1Mb. All values 0 to INT_MAX are legal. - * Any other value stands for unknown. - */ - uint32_t speed; - /* - * 0x00 - half duplex - * 0x01 - full duplex - * Any other value stands for unknown. - */ - uint8_t duplex; - -} __rte_packed; - /* * How many bits to shift physical queue address written to QUEUE_PFN. * 12 is historical, and due to x86 page size. @@ -182,16 +137,6 @@ enum virtio_msix_status { * Function declaration from virtio_pci.c */ int vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev); -void vtpci_reset(struct virtio_hw *); - -void vtpci_reinit_complete(struct virtio_hw *); - -uint8_t vtpci_get_status(struct virtio_hw *); -void vtpci_set_status(struct virtio_hw *, uint8_t); - -void vtpci_write_dev_config(struct virtio_hw *, size_t, const void *, int); - -void vtpci_read_dev_config(struct virtio_hw *, size_t, void *, int); uint8_t vtpci_isr(struct virtio_hw *); diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index d05613ba3b..0f252c0732 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -77,13 +77,13 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) return -1; dev->vhostfd = connectfd; - old_status = vtpci_get_status(hw); + old_status = virtio_get_status(hw); - vtpci_reset(hw); + virtio_reset(hw); - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_ACK); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_ACK); - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES, &dev->device_features) < 0) { @@ -129,10 +129,10 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) virtio_user_reset_queues_packed(eth_dev); } - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); /* Start the device */ - vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK); + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK); if (!dev->started) return -1; From patchwork Sun Dec 20 21:13:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85544 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id DB3FDA09FD; Sun, 20 Dec 2020 22:20:54 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B6904CDC4; Sun, 20 Dec 2020 22:15:41 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id 35AF9CD9A for ; Sun, 20 Dec 2020 22:15:37 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498935; 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=uSvFX9UBNfJcOyMFaaciG9eO0Xle6E0UC8gRUIIg5Go=; b=h9POIyO8QNgrNY7WbrzO7DdVjwaGOozkuwnSaXK+4uZuSUqzFmRjAS7AkU+G6PqD8482F5 TSZjJFM6VLlygdHojUaLfcdie7s6ZRflLX8wfyw07asOgaFN2uzE4WcWfJZwayEdkq255Z ytNMpjZQZlC+ySeuSxjFI9YkVLWWQG8= 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-441-M-oh9q5bPSau4EUl-whPvg-1; Sun, 20 Dec 2020 16:15:33 -0500 X-MC-Unique: M-oh9q5bPSau4EUl-whPvg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C624D19251A1; Sun, 20 Dec 2020 21:15:32 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id EDBDB60C43; Sun, 20 Dec 2020 21:15:30 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:45 +0100 Message-Id: <20201220211405.313012-21-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 20/40] net/virtio: make interrupt handling more generic 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" This patch aims at isolating MSIX notion into PCI layer. Signed-off-by: Maxime Coquelin Reviewed-by: David Marchand --- drivers/net/virtio/virtio.c | 6 ++ drivers/net/virtio/virtio.h | 11 +- drivers/net/virtio/virtio_ethdev.c | 7 +- drivers/net/virtio/virtio_pci.c | 131 ++++++++++++------------ drivers/net/virtio/virtio_pci.h | 25 ++--- drivers/net/virtio/virtio_user_ethdev.c | 4 +- 6 files changed, 90 insertions(+), 94 deletions(-) diff --git a/drivers/net/virtio/virtio.c b/drivers/net/virtio/virtio.c index ba3203e68b..7e1e77797f 100644 --- a/drivers/net/virtio/virtio.c +++ b/drivers/net/virtio/virtio.c @@ -63,3 +63,9 @@ virtio_get_status(struct virtio_hw *hw) { return VIRTIO_OPS(hw)->get_status(hw); } + +uint8_t +virtio_get_isr(struct virtio_hw *hw) +{ + return VIRTIO_OPS(hw)->get_isr(hw); +} diff --git a/drivers/net/virtio/virtio.h b/drivers/net/virtio/virtio.h index 5169436c9f..f44125f48a 100644 --- a/drivers/net/virtio/virtio.h +++ b/drivers/net/virtio/virtio.h @@ -124,6 +124,13 @@ #define VIRTIO_CONFIG_STATUS_DEV_NEED_RESET 0x40 #define VIRTIO_CONFIG_STATUS_FAILED 0x80 +/* The bit of the ISR which indicates a device has an interrupt. */ +#define VIRTIO_ISR_INTR 0x1 +/* The bit of the ISR which indicates a device configuration change. */ +#define VIRTIO_ISR_CONFIG 0x2 +/* Vector value used to disable MSI for queue. */ +#define VIRTIO_MSI_NO_VECTOR 0xFFFF + /* * This structure is just a reference to read * net device specific config space; it just a chodu structure @@ -168,7 +175,7 @@ struct virtio_hw { uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; uint32_t speed; /* link speed in MB */ uint8_t duplex; - uint8_t use_msix; + uint8_t intr_lsc; uint16_t max_mtu; /* * App management thread and virtio interrupt handler thread @@ -233,5 +240,5 @@ void virtio_write_dev_config(struct virtio_hw *hw, size_t offset, const void *sr void virtio_read_dev_config(struct virtio_hw *hw, size_t offset, void *dst, int length); void virtio_reset(struct virtio_hw *hw); void virtio_reinit_complete(struct virtio_hw *hw); - +uint8_t virtio_get_isr(struct virtio_hw *hw); #endif /* _VIRTIO_H_ */ diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 560647f11b..99a2dd24c4 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1442,13 +1442,13 @@ virtio_interrupt_handler(void *param) uint16_t status; /* Read interrupt status which clears interrupt */ - isr = vtpci_isr(hw); + isr = virtio_get_isr(hw); PMD_DRV_LOG(INFO, "interrupt status = %#x", isr); if (virtio_intr_unmask(dev) < 0) PMD_DRV_LOG(ERR, "interrupt enable failed"); - if (isr & VIRTIO_PCI_ISR_CONFIG) { + if (isr & VIRTIO_ISR_CONFIG) { if (virtio_dev_link_update(dev, 0) == 0) rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, @@ -1655,8 +1655,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) hw->weak_barriers = !virtio_with_feature(hw, VIRTIO_F_ORDER_PLATFORM); /* If host does not support both status and MSI-X then disable LSC */ - if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS) && - hw->use_msix != VIRTIO_MSIX_NONE) + if (virtio_with_feature(hw, VIRTIO_NET_F_STATUS) && hw->intr_lsc) eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC; else eth_dev->data->dev_flags &= ~RTE_ETH_DEV_INTR_LSC; diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 29dd84888f..01a437a1b4 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -28,8 +28,8 @@ * The remaining space is defined by each driver as the per-driver * configuration space. */ -#define VIRTIO_PCI_CONFIG(hw) \ - (((hw)->use_msix == VIRTIO_MSIX_ENABLED) ? 24 : 20) +#define VIRTIO_PCI_CONFIG(dev) \ + (((dev)->msix_status == VIRTIO_MSIX_ENABLED) ? 24 : 20) struct virtio_pci_internal { @@ -71,6 +71,7 @@ static void legacy_read_dev_config(struct virtio_hw *hw, size_t offset, void *dst, int length) { + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); #ifdef RTE_ARCH_PPC_64 int size; @@ -78,17 +79,17 @@ legacy_read_dev_config(struct virtio_hw *hw, size_t offset, if (length >= 4) { size = 4; rte_pci_ioport_read(VTPCI_IO(hw), dst, size, - VIRTIO_PCI_CONFIG(hw) + offset); + VIRTIO_PCI_CONFIG(dev) + offset); *(uint32_t *)dst = rte_be_to_cpu_32(*(uint32_t *)dst); } else if (length >= 2) { size = 2; rte_pci_ioport_read(VTPCI_IO(hw), dst, size, - VIRTIO_PCI_CONFIG(hw) + offset); + VIRTIO_PCI_CONFIG(dev) + offset); *(uint16_t *)dst = rte_be_to_cpu_16(*(uint16_t *)dst); } else { size = 1; rte_pci_ioport_read(VTPCI_IO(hw), dst, size, - VIRTIO_PCI_CONFIG(hw) + offset); + VIRTIO_PCI_CONFIG(dev) + offset); } dst = (char *)dst + size; @@ -97,7 +98,7 @@ legacy_read_dev_config(struct virtio_hw *hw, size_t offset, } #else rte_pci_ioport_read(VTPCI_IO(hw), dst, length, - VIRTIO_PCI_CONFIG(hw) + offset); + VIRTIO_PCI_CONFIG(dev) + offset); #endif } @@ -105,6 +106,7 @@ static void legacy_write_dev_config(struct virtio_hw *hw, size_t offset, const void *src, int length) { + struct virtio_pci_dev *dev = virtio_pci_get_dev(hw); #ifdef RTE_ARCH_PPC_64 union { uint32_t u32; @@ -117,16 +119,16 @@ legacy_write_dev_config(struct virtio_hw *hw, size_t offset, size = 4; tmp.u32 = rte_cpu_to_be_32(*(const uint32_t *)src); rte_pci_ioport_write(VTPCI_IO(hw), &tmp.u32, size, - VIRTIO_PCI_CONFIG(hw) + offset); + VIRTIO_PCI_CONFIG(dev) + offset); } else if (length >= 2) { size = 2; tmp.u16 = rte_cpu_to_be_16(*(const uint16_t *)src); rte_pci_ioport_write(VTPCI_IO(hw), &tmp.u16, size, - VIRTIO_PCI_CONFIG(hw) + offset); + VIRTIO_PCI_CONFIG(dev) + offset); } else { size = 1; rte_pci_ioport_write(VTPCI_IO(hw), src, size, - VIRTIO_PCI_CONFIG(hw) + offset); + VIRTIO_PCI_CONFIG(dev) + offset); } src = (const char *)src + size; @@ -135,7 +137,7 @@ legacy_write_dev_config(struct virtio_hw *hw, size_t offset, } #else rte_pci_ioport_write(VTPCI_IO(hw), src, length, - VIRTIO_PCI_CONFIG(hw) + offset); + VIRTIO_PCI_CONFIG(dev) + offset); #endif } @@ -533,12 +535,6 @@ const struct virtio_ops modern_ops = { .dev_close = modern_dev_close, }; -uint8_t -vtpci_isr(struct virtio_hw *hw) -{ - return VIRTIO_OPS(hw)->get_isr(hw); -} - static void * get_cfg_addr(struct rte_pci_device *dev, struct virtio_pci_cap *cap) { @@ -623,9 +619,9 @@ virtio_read_caps(struct rte_pci_device *pci_dev, struct virtio_hw *hw) } if (flags & PCI_MSIX_ENABLE) - hw->use_msix = VIRTIO_MSIX_ENABLED; + dev->msix_status = VIRTIO_MSIX_ENABLED; else - hw->use_msix = VIRTIO_MSIX_DISABLED; + dev->msix_status = VIRTIO_MSIX_DISABLED; } if (cap.cap_vndr != PCI_CAP_ID_VNDR) { @@ -691,6 +687,54 @@ virtio_read_caps(struct rte_pci_device *pci_dev, struct virtio_hw *hw) return 0; } +static enum virtio_msix_status +vtpci_msix_detect(struct rte_pci_device *dev) +{ + uint8_t pos; + int ret; + + ret = rte_pci_read_config(dev, &pos, 1, PCI_CAPABILITY_LIST); + if (ret != 1) { + PMD_INIT_LOG(DEBUG, + "failed to read pci capability list, ret %d", ret); + return VIRTIO_MSIX_NONE; + } + + while (pos) { + uint8_t cap[2]; + + ret = rte_pci_read_config(dev, cap, sizeof(cap), pos); + if (ret != sizeof(cap)) { + PMD_INIT_LOG(DEBUG, + "failed to read pci cap at pos: %x ret %d", + pos, ret); + break; + } + + if (cap[0] == PCI_CAP_ID_MSIX) { + uint16_t flags; + + ret = rte_pci_read_config(dev, &flags, sizeof(flags), + pos + sizeof(cap)); + if (ret != sizeof(flags)) { + PMD_INIT_LOG(DEBUG, + "failed to read pci cap at pos:" + " %x ret %d", pos + 2, ret); + break; + } + + if (flags & PCI_MSIX_ENABLE) + return VIRTIO_MSIX_ENABLED; + else + return VIRTIO_MSIX_DISABLED; + } + + pos = cap[1]; + } + + return VIRTIO_MSIX_NONE; +} + /* * Return -1: * if there is error mapping with VFIO/UIO. @@ -736,59 +780,12 @@ vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev) dev->modern = false; msix_detect: - hw->use_msix = vtpci_msix_detect(pci_dev); + dev->msix_status = vtpci_msix_detect(pci_dev); + hw->intr_lsc = !!dev->msix_status; return 0; } -enum virtio_msix_status -vtpci_msix_detect(struct rte_pci_device *dev) -{ - uint8_t pos; - int ret; - - ret = rte_pci_read_config(dev, &pos, 1, PCI_CAPABILITY_LIST); - if (ret != 1) { - PMD_INIT_LOG(DEBUG, - "failed to read pci capability list, ret %d", ret); - return VIRTIO_MSIX_NONE; - } - - while (pos) { - uint8_t cap[2]; - - ret = rte_pci_read_config(dev, cap, sizeof(cap), pos); - if (ret != sizeof(cap)) { - PMD_INIT_LOG(DEBUG, - "failed to read pci cap at pos: %x ret %d", - pos, ret); - break; - } - - if (cap[0] == PCI_CAP_ID_MSIX) { - uint16_t flags; - - ret = rte_pci_read_config(dev, &flags, sizeof(flags), - pos + sizeof(cap)); - if (ret != sizeof(flags)) { - PMD_INIT_LOG(DEBUG, - "failed to read pci cap at pos:" - " %x ret %d", pos + 2, ret); - break; - } - - if (flags & PCI_MSIX_ENABLE) - return VIRTIO_MSIX_ENABLED; - else - return VIRTIO_MSIX_DISABLED; - } - - pos = cap[1]; - } - - return VIRTIO_MSIX_NONE; -} - void vtpci_legacy_ioport_unmap(struct virtio_hw *hw) { rte_pci_ioport_unmap(VTPCI_IO(hw)); diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 19d56c920c..4ee890ffda 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -42,13 +42,6 @@ struct virtnet_ctl; #define VIRTIO_MSI_QUEUE_VECTOR 22 /* vector for selected VQ notifications (16, RW) */ -/* The bit of the ISR which indicates a device has an interrupt. */ -#define VIRTIO_PCI_ISR_INTR 0x1 -/* The bit of the ISR which indicates a device configuration change. */ -#define VIRTIO_PCI_ISR_CONFIG 0x2 -/* Vector value used to disable MSI for queue. */ -#define VIRTIO_MSI_NO_VECTOR 0xFFFF - /* Common configuration */ #define VIRTIO_PCI_CAP_COMMON_CFG 1 /* Notifications */ @@ -103,12 +96,18 @@ struct virtio_pci_common_cfg { uint32_t queue_used_hi; /* read-write */ }; +enum virtio_msix_status { + VIRTIO_MSIX_NONE = 0, + VIRTIO_MSIX_DISABLED = 1, + VIRTIO_MSIX_ENABLED = 2 +}; struct virtio_pci_dev { struct virtio_hw hw; struct rte_pci_device *pci_dev; struct virtio_pci_common_cfg *common_cfg; struct virtio_net_config *dev_cfg; + enum virtio_msix_status msix_status; uint8_t *isr; uint16_t *notify_base; uint32_t notify_off_multiplier; @@ -126,22 +125,10 @@ struct virtio_pci_dev { /* The alignment to use between consumer and producer parts of vring. */ #define VIRTIO_PCI_VRING_ALIGN 4096 -enum virtio_msix_status { - VIRTIO_MSIX_NONE = 0, - VIRTIO_MSIX_DISABLED = 1, - VIRTIO_MSIX_ENABLED = 2 -}; - - /* * Function declaration from virtio_pci.c */ int vtpci_init(struct rte_pci_device *pci_dev, struct virtio_pci_dev *dev); - -uint8_t vtpci_isr(struct virtio_hw *); - -enum virtio_msix_status vtpci_msix_detect(struct rte_pci_device *dev); - void vtpci_legacy_ioport_unmap(struct virtio_hw *hw); int vtpci_legacy_ioport_map(struct virtio_hw *hw); diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 0f252c0732..eacb268297 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -339,7 +339,7 @@ virtio_user_get_isr(struct virtio_hw *hw __rte_unused) /* rxq interrupts and config interrupt are separated in virtio-user, * here we only report config change. */ - return VIRTIO_PCI_ISR_CONFIG; + return VIRTIO_ISR_CONFIG; } static uint16_t @@ -640,7 +640,7 @@ virtio_user_eth_dev_alloc(struct rte_vdev_device *vdev) * MSIX is required to enable LSC (see virtio_init_device). * Here just pretend that we support msix. */ - hw->use_msix = 1; + hw->intr_lsc = 1; hw->use_vec_rx = 0; hw->use_vec_tx = 0; hw->use_inorder_rx = 0; From patchwork Sun Dec 20 21:13:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85545 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 650D8A09FD; Sun, 20 Dec 2020 22:21:17 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 71F4BCDB0; Sun, 20 Dec 2020 22:15:46 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 2D059CD76 for ; Sun, 20 Dec 2020 22:15:45 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498943; 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=OWZT4d6vowWTVWhhsvxz5uoz4Jsyg0PkU9+0vqKqc+w=; b=cm66FhCP0KbCwk0Uo+MxbO09xnuzSxNKZrCNiUq1kT+cuDefSNNG8czSnD51+INuqTv/SI sCmAM6sCnYK7Vvu4m4T2xtHXqXzVwqYABEafHx4ngj2YihfuqMKe+W2usudEL5v0MA+i1S Ed7XMkzP8Oa94ASIAeSNkSqAOcCDvWI= 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-574-yfbWV8U3MwuHhNeI52Zj4g-1; Sun, 20 Dec 2020 16:15:41 -0500 X-MC-Unique: yfbWV8U3MwuHhNeI52Zj4g-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D9B41800D55; Sun, 20 Dec 2020 21:15:40 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3C14160C62; Sun, 20 Dec 2020 21:15:32 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:46 +0100 Message-Id: <20201220211405.313012-22-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 21/40] net/virtio: move vring alignment to generic header 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" This patch moves vring alignment define to the generic Virtio header. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia Reviewed-by: David Marchand --- drivers/net/virtio/virtio.h | 3 +++ drivers/net/virtio/virtio_ethdev.c | 10 +++++----- drivers/net/virtio/virtio_pci.c | 2 +- drivers/net/virtio/virtio_pci.h | 3 --- drivers/net/virtio/virtio_user_ethdev.c | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/net/virtio/virtio.h b/drivers/net/virtio/virtio.h index f44125f48a..964e15bb22 100644 --- a/drivers/net/virtio/virtio.h +++ b/drivers/net/virtio/virtio.h @@ -131,6 +131,9 @@ /* Vector value used to disable MSI for queue. */ #define VIRTIO_MSI_NO_VECTOR 0xFFFF +/* The alignment to use between consumer and producer parts of vring. */ +#define VIRTIO_VRING_ALIGN 4096 + /* * This structure is just a reference to read * net device specific config space; it just a chodu structure diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 99a2dd24c4..1ca8715832 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -407,12 +407,12 @@ virtio_init_vring(struct virtqueue *vq) memset(vq->vq_descx, 0, sizeof(struct vq_desc_extra) * vq->vq_nentries); if (virtio_with_packed_queue(vq->hw)) { vring_init_packed(&vq->vq_packed.ring, ring_mem, - VIRTIO_PCI_VRING_ALIGN, size); + VIRTIO_VRING_ALIGN, size); vring_desc_init_packed(vq, size); } else { struct vring *vr = &vq->vq_split.ring; - vring_init_split(vr, ring_mem, VIRTIO_PCI_VRING_ALIGN, size); + vring_init_split(vr, ring_mem, VIRTIO_VRING_ALIGN, size); vring_desc_init_split(vr->desc, size); } /* @@ -497,14 +497,14 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) /* * Reserve a memzone for vring elements */ - size = vring_size(hw, vq_size, VIRTIO_PCI_VRING_ALIGN); - vq->vq_ring_size = RTE_ALIGN_CEIL(size, VIRTIO_PCI_VRING_ALIGN); + size = vring_size(hw, vq_size, VIRTIO_VRING_ALIGN); + vq->vq_ring_size = RTE_ALIGN_CEIL(size, VIRTIO_VRING_ALIGN); PMD_INIT_LOG(DEBUG, "vring_size: %d, rounded_vring_size: %d", size, vq->vq_ring_size); mz = rte_memzone_reserve_aligned(vq_name, vq->vq_ring_size, numa_node, RTE_MEMZONE_IOVA_CONTIG, - VIRTIO_PCI_VRING_ALIGN); + VIRTIO_VRING_ALIGN); if (mz == NULL) { if (rte_errno == EEXIST) mz = rte_memzone_lookup(vq_name); diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c index 01a437a1b4..f8532c5684 100644 --- a/drivers/net/virtio/virtio_pci.c +++ b/drivers/net/virtio/virtio_pci.c @@ -432,7 +432,7 @@ modern_setup_queue(struct virtio_hw *hw, struct virtqueue *vq) avail_addr = desc_addr + vq->vq_nentries * sizeof(struct vring_desc); used_addr = RTE_ALIGN_CEIL(avail_addr + offsetof(struct vring_avail, ring[vq->vq_nentries]), - VIRTIO_PCI_VRING_ALIGN); + VIRTIO_VRING_ALIGN); rte_write16(vq->vq_queue_index, &dev->common_cfg->queue_select); diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 4ee890ffda..2cb3ebf93d 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -122,9 +122,6 @@ struct virtio_pci_dev { */ #define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12 -/* The alignment to use between consumer and producer parts of vring. */ -#define VIRTIO_PCI_VRING_ALIGN 4096 - /* * Function declaration from virtio_pci.c */ diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index eacb268297..283f5c7a36 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -388,7 +388,7 @@ virtio_user_setup_queue_packed(struct virtqueue *vq, sizeof(struct vring_packed_desc); used_addr = RTE_ALIGN_CEIL(avail_addr + sizeof(struct vring_packed_desc_event), - VIRTIO_PCI_VRING_ALIGN); + VIRTIO_VRING_ALIGN); vring->num = vq->vq_nentries; vring->desc = (void *)(uintptr_t)desc_addr; vring->driver = (void *)(uintptr_t)avail_addr; @@ -410,7 +410,7 @@ virtio_user_setup_queue_split(struct virtqueue *vq, struct virtio_user_dev *dev) avail_addr = desc_addr + vq->vq_nentries * sizeof(struct vring_desc); used_addr = RTE_ALIGN_CEIL(avail_addr + offsetof(struct vring_avail, ring[vq->vq_nentries]), - VIRTIO_PCI_VRING_ALIGN); + VIRTIO_VRING_ALIGN); dev->vrings[queue_idx].num = vq->vq_nentries; dev->vrings[queue_idx].desc = (void *)(uintptr_t)desc_addr; From patchwork Sun Dec 20 21:13:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85546 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9EB71A09FD; Sun, 20 Dec 2020 22:21:35 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AA585CC77; Sun, 20 Dec 2020 22:15:51 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 85106CC79 for ; Sun, 20 Dec 2020 22:15:49 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498948; 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=kswVOWoXWw151wtuBQEQ8Mwox5x940jXmK4aDotjVbk=; b=T+9+a/sZJhrLCC763LgYc1J+4A30XtOH8wHnd58ZkA8x4M5Im0yrLTKJDGTyiy82tpYhwD UT/ZCltXEVcNhomF8mfwPZ8nBB8FXCYM8F835NwmHRD9XK6LItJADz0rZNoD8/mvRcRloa ihSX8uATw2rDXN8/HpQAD1jpjNQaKqk= 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-112-x6FR57KPONi21B6i6CLyZg-1; Sun, 20 Dec 2020 16:15:44 -0500 X-MC-Unique: x6FR57KPONi21B6i6CLyZg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 3C023801817; Sun, 20 Dec 2020 21:15:43 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4822560C43; Sun, 20 Dec 2020 21:15:41 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:47 +0100 Message-Id: <20201220211405.313012-23-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 22/40] net/virtio: remove last PCI refs in non-PCI code 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" This patch finalizes the bus isolation part of this refactoring. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia Reviewed-by: David Marchand --- drivers/net/virtio/virtio_ethdev.c | 21 +++++++++------------ drivers/net/virtio/virtio_rxtx.c | 18 +++++++++--------- drivers/net/virtio/virtio_rxtx_packed_avx.c | 2 +- drivers/net/virtio/virtio_user/vhost.h | 4 +++- drivers/net/virtio/virtqueue.c | 2 +- drivers/net/virtio/virtqueue.h | 6 +++--- 6 files changed, 26 insertions(+), 27 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 1ca8715832..96871b7b70 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -9,14 +9,11 @@ #include #include -#include #include #include #include #include #include -#include -#include #include #include #include @@ -32,7 +29,7 @@ #include #include "virtio_ethdev.h" -#include "virtio_pci.h" +#include "virtio.h" #include "virtio_logs.h" #include "virtqueue.h" #include "virtio_rxtx.h" @@ -422,7 +419,7 @@ virtio_init_vring(struct virtqueue *vq) } static int -virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) +virtio_init_queue(struct rte_eth_dev *dev, uint16_t queue_idx) { char vq_name[VIRTQUEUE_MAX_NAME_SZ]; char vq_hdr_name[VIRTQUEUE_MAX_NAME_SZ]; @@ -435,18 +432,18 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) struct virtqueue *vq; size_t sz_hdr_mz = 0; void *sw_ring = NULL; - int queue_type = virtio_get_queue_type(hw, vtpci_queue_idx); + int queue_type = virtio_get_queue_type(hw, queue_idx); int ret; int numa_node = dev->device->numa_node; PMD_INIT_LOG(INFO, "setting up queue: %u on NUMA node %d", - vtpci_queue_idx, numa_node); + queue_idx, numa_node); /* * Read the virtqueue size from the Queue Size field * Always power of 2 and if 0 virtqueue does not exist */ - vq_size = VIRTIO_OPS(hw)->get_queue_num(hw, vtpci_queue_idx); + vq_size = VIRTIO_OPS(hw)->get_queue_num(hw, queue_idx); PMD_INIT_LOG(DEBUG, "vq_size: %u", vq_size); if (vq_size == 0) { PMD_INIT_LOG(ERR, "virtqueue does not exist"); @@ -459,7 +456,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) } snprintf(vq_name, sizeof(vq_name), "port%d_vq%d", - dev->data->port_id, vtpci_queue_idx); + dev->data->port_id, queue_idx); size = RTE_ALIGN_CEIL(sizeof(*vq) + vq_size * sizeof(struct vq_desc_extra), @@ -481,10 +478,10 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) PMD_INIT_LOG(ERR, "can not allocate vq"); return -ENOMEM; } - hw->vqs[vtpci_queue_idx] = vq; + hw->vqs[queue_idx] = vq; vq->hw = hw; - vq->vq_queue_index = vtpci_queue_idx; + vq->vq_queue_index = queue_idx; vq->vq_nentries = vq_size; if (virtio_with_packed_queue(hw)) { vq->vq_packed.used_wrap_counter = 1; @@ -527,7 +524,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx) if (sz_hdr_mz) { snprintf(vq_hdr_name, sizeof(vq_hdr_name), "port%d_vq%d_hdr", - dev->data->port_id, vtpci_queue_idx); + dev->data->port_id, queue_idx); hdr_mz = rte_memzone_reserve_aligned(vq_hdr_name, sz_hdr_mz, numa_node, RTE_MEMZONE_IOVA_CONTIG, RTE_CACHE_LINE_SIZE); diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c index 10989118b0..aca6eb9cd0 100644 --- a/drivers/net/virtio/virtio_rxtx.c +++ b/drivers/net/virtio/virtio_rxtx.c @@ -27,7 +27,7 @@ #include "virtio_logs.h" #include "virtio_ethdev.h" -#include "virtio_pci.h" +#include "virtio.h" #include "virtqueue.h" #include "virtio_rxtx.h" #include "virtio_rxtx_simple.h" @@ -628,9 +628,9 @@ virtio_dev_rx_queue_setup(struct rte_eth_dev *dev, const struct rte_eth_rxconf *rx_conf, struct rte_mempool *mp) { - uint16_t vtpci_queue_idx = 2 * queue_idx + VTNET_SQ_RQ_QUEUE_IDX; + uint16_t vq_idx = 2 * queue_idx + VTNET_SQ_RQ_QUEUE_IDX; struct virtio_hw *hw = dev->data->dev_private; - struct virtqueue *vq = hw->vqs[vtpci_queue_idx]; + struct virtqueue *vq = hw->vqs[vq_idx]; struct virtnet_rx *rxvq; uint16_t rx_free_thresh; @@ -678,9 +678,9 @@ virtio_dev_rx_queue_setup(struct rte_eth_dev *dev, int virtio_dev_rx_queue_setup_finish(struct rte_eth_dev *dev, uint16_t queue_idx) { - uint16_t vtpci_queue_idx = 2 * queue_idx + VTNET_SQ_RQ_QUEUE_IDX; + uint16_t vq_idx = 2 * queue_idx + VTNET_SQ_RQ_QUEUE_IDX; struct virtio_hw *hw = dev->data->dev_private; - struct virtqueue *vq = hw->vqs[vtpci_queue_idx]; + struct virtqueue *vq = hw->vqs[vq_idx]; struct virtnet_rx *rxvq = &vq->rxq; struct rte_mbuf *m; uint16_t desc_idx; @@ -779,9 +779,9 @@ virtio_dev_tx_queue_setup(struct rte_eth_dev *dev, unsigned int socket_id __rte_unused, const struct rte_eth_txconf *tx_conf) { - uint8_t vtpci_queue_idx = 2 * queue_idx + VTNET_SQ_TQ_QUEUE_IDX; + uint8_t vq_idx = 2 * queue_idx + VTNET_SQ_TQ_QUEUE_IDX; struct virtio_hw *hw = dev->data->dev_private; - struct virtqueue *vq = hw->vqs[vtpci_queue_idx]; + struct virtqueue *vq = hw->vqs[vq_idx]; struct virtnet_tx *txvq; uint16_t tx_free_thresh; @@ -823,9 +823,9 @@ int virtio_dev_tx_queue_setup_finish(struct rte_eth_dev *dev, uint16_t queue_idx) { - uint8_t vtpci_queue_idx = 2 * queue_idx + VTNET_SQ_TQ_QUEUE_IDX; + uint8_t vq_idx = 2 * queue_idx + VTNET_SQ_TQ_QUEUE_IDX; struct virtio_hw *hw = dev->data->dev_private; - struct virtqueue *vq = hw->vqs[vtpci_queue_idx]; + struct virtqueue *vq = hw->vqs[vq_idx]; PMD_INIT_FUNC_TRACE(); diff --git a/drivers/net/virtio/virtio_rxtx_packed_avx.c b/drivers/net/virtio/virtio_rxtx_packed_avx.c index c272766a9f..a3dcc01a43 100644 --- a/drivers/net/virtio/virtio_rxtx_packed_avx.c +++ b/drivers/net/virtio/virtio_rxtx_packed_avx.c @@ -12,7 +12,7 @@ #include "virtio_logs.h" #include "virtio_ethdev.h" -#include "virtio_pci.h" +#include "virtio.h" #include "virtqueue.h" #define BYTE_SIZE 8 diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index 210a3704e7..9d2a8505b3 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -9,7 +9,9 @@ #include #include -#include "../virtio_pci.h" +#include + +#include "../virtio.h" #include "../virtio_logs.h" #include "../virtqueue.h" diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c index 59a2cb6599..1f9af3c31b 100644 --- a/drivers/net/virtio/virtqueue.c +++ b/drivers/net/virtio/virtqueue.c @@ -7,7 +7,7 @@ #include "virtqueue.h" #include "virtio_logs.h" -#include "virtio_pci.h" +#include "virtio.h" #include "virtio_rxtx_simple.h" /* diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index 6c1df6f8e5..9274c48080 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -449,11 +449,11 @@ virtqueue_full(const struct virtqueue *vq) } static inline int -virtio_get_queue_type(struct virtio_hw *hw, uint16_t vtpci_queue_idx) +virtio_get_queue_type(struct virtio_hw *hw, uint16_t vq_idx) { - if (vtpci_queue_idx == hw->max_queue_pairs * 2) + if (vq_idx == hw->max_queue_pairs * 2) return VTNET_CQ; - else if (vtpci_queue_idx % 2 == 0) + else if (vq_idx % 2 == 0) return VTNET_RQ; else return VTNET_TQ; From patchwork Sun Dec 20 21:13:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85547 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D023AA09FD; Sun, 20 Dec 2020 22:21:51 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 18D53CDCE; Sun, 20 Dec 2020 22:15:53 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id BBE4ACD74 for ; Sun, 20 Dec 2020 22:15:49 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498948; 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=wapIGAT/L/lpNUj3xf8stnln27rfX8v3wED6EW6M6kU=; b=eyFDY8G0Q3n40odOqpif5hT4ojNeAuuEv2yH5K+JbrmwkKIbHCC+KBSOMSV45+towzPPSY zDZd/64oqllPmsGyl8J1tw3lO03Dv3sdZRrAZXq4k7lXDtvSRKCXhouzQ669OOd1gshxYn uKqShMNEJgLzJvlHgMBlqr8sRtSLNI0= 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-156-UugmVLx0P3qesWp6DgHZOw-1; Sun, 20 Dec 2020 16:15:46 -0500 X-MC-Unique: UugmVLx0P3qesWp6DgHZOw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6049219251A1; Sun, 20 Dec 2020 21:15:45 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id A0BFC60C43; Sun, 20 Dec 2020 21:15:43 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:48 +0100 Message-Id: <20201220211405.313012-24-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 23/40] net/virtio: make Vhost-user req sender consistent 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" This patch makes vhost_user_write() consistent with vhost_user_read(), by passing a pointer on the Vhost-user message instead of a buffer pointer and its length, which is now calculated in the function. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost_user.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index b93e65c60b..e9053eea95 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -51,7 +51,7 @@ struct vhost_user_msg { (sizeof(struct vhost_user_msg) - VHOST_USER_HDR_SIZE) static int -vhost_user_write(int fd, void *buf, int len, int *fds, int fd_num) +vhost_user_write(int fd, struct vhost_user_msg *msg, int *fds, int fd_num) { int r; struct msghdr msgh; @@ -63,8 +63,8 @@ vhost_user_write(int fd, void *buf, int len, int *fds, int fd_num) memset(&msgh, 0, sizeof(msgh)); memset(control, 0, sizeof(control)); - iov.iov_base = (uint8_t *)buf; - iov.iov_len = len; + iov.iov_base = (uint8_t *)msg; + iov.iov_len = VHOST_USER_HDR_SIZE + msg->size; msgh.msg_iov = &iov; msgh.msg_iovlen = 1; @@ -259,7 +259,6 @@ vhost_user_sock(struct virtio_user_dev *dev, int has_reply_ack = 0; int fds[VHOST_MEMORY_MAX_NREGIONS]; int fd_num = 0; - int len; int vhostfd = dev->vhostfd; RTE_SET_USED(m); @@ -359,8 +358,7 @@ vhost_user_sock(struct virtio_user_dev *dev, return -1; } - len = VHOST_USER_HDR_SIZE + msg.size; - if (vhost_user_write(vhostfd, &msg, len, fds, fd_num) < 0) { + if (vhost_user_write(vhostfd, &msg, fds, fd_num) < 0) { PMD_DRV_LOG(ERR, "%s failed: %s", vhost_msg_strings[req], strerror(errno)); return -1; From patchwork Sun Dec 20 21:13:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85548 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 9CE8CA09FD; Sun, 20 Dec 2020 22:22:07 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7B40ACDF8; Sun, 20 Dec 2020 22:15:54 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id F14C0CD7E for ; Sun, 20 Dec 2020 22:15:51 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498950; 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=qF2bSIh/D6GzoG+qlopRdkgcsh2MwjW7TP6fLv6OiBQ=; b=VhBZBlMGxU2BAcFCf9Z7yojQut1urChrIP1SgcdhO99OgwFHuYNpm9GbJz+MknbRO5NZal JjLu+gEEpHJW7Wd6Q8G2yjvJdq4GW7czmo9m3kanw9oXaSpkZ9rHG+Ojgy9c+kc8yV23z3 DgOL/zfyxdEtLjS4tlMEDCpTxiSXYl8= 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-321--8fKGpcdNZ-QM0kQ0B5JNg-1; Sun, 20 Dec 2020 16:15:48 -0500 X-MC-Unique: -8fKGpcdNZ-QM0kQ0B5JNg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B787F59; Sun, 20 Dec 2020 21:15:47 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id CDB5560C43; Sun, 20 Dec 2020 21:15:45 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:49 +0100 Message-Id: <20201220211405.313012-25-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 24/40] net/virtio: add Virtio-user ops to set owner 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" This patch implements a dedicated callabck for sending owner request. All the requests will be converted that way so that backends other than Vhost-user don't have to work around being it. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 1 + drivers/net/virtio/virtio_user/vhost_kernel.c | 28 +++++++++++++++-- drivers/net/virtio/virtio_user/vhost_user.c | 21 +++++++++++-- drivers/net/virtio/virtio_user/vhost_vdpa.c | 30 ++++++++++++++++--- .../net/virtio/virtio_user/virtio_user_dev.c | 3 +- 5 files changed, 72 insertions(+), 11 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index 9d2a8505b3..8e819ecfb8 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -101,6 +101,7 @@ struct virtio_user_dev; struct virtio_user_backend_ops { int (*setup)(struct virtio_user_dev *dev); + int (*set_owner)(struct virtio_user_dev *dev); int (*send_request)(struct virtio_user_dev *dev, enum vhost_user_request req, void *arg); diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index 2c805077af..b79dcad179 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -55,8 +56,28 @@ get_vhost_kernel_max_regions(void) close(fd); } +static int +vhost_kernel_ioctl(int fd, uint64_t request, void *arg) +{ + int ret; + + ret = ioctl(fd, request, arg); + if (ret) { + PMD_DRV_LOG(ERR, "Vhost-kernel ioctl %"PRIu64" failed (%s)", + request, strerror(errno)); + return -1; + } + + return 0; +} + +static int +vhost_kernel_set_owner(struct virtio_user_dev *dev) +{ + return vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_OWNER, NULL); +} + static uint64_t vhost_req_user_to_kernel[] = { - [VHOST_USER_SET_OWNER] = VHOST_SET_OWNER, [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, [VHOST_USER_SET_FEATURES] = VHOST_SET_FEATURES, [VHOST_USER_GET_FEATURES] = VHOST_GET_FEATURES, @@ -175,7 +196,7 @@ tap_support_features(void) } static int -vhost_kernel_ioctl(struct virtio_user_dev *dev, +vhost_kernel_send_request(struct virtio_user_dev *dev, enum vhost_user_request req, void *arg) { @@ -385,6 +406,7 @@ vhost_kernel_enable_queue_pair(struct virtio_user_dev *dev, struct virtio_user_backend_ops virtio_ops_kernel = { .setup = vhost_kernel_setup, - .send_request = vhost_kernel_ioctl, + .set_owner = vhost_kernel_set_owner, + .send_request = vhost_kernel_send_request, .enable_qp = vhost_kernel_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index e9053eea95..5ab15318ac 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -125,6 +125,24 @@ vhost_user_read(int fd, struct vhost_user_msg *msg) return -1; } +static int +vhost_user_set_owner(struct virtio_user_dev *dev) +{ + int ret; + struct vhost_user_msg msg = { + .request = VHOST_USER_SET_OWNER, + .flags = VHOST_USER_VERSION, + }; + + ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to set owner"); + return -1; + } + + return 0; +} + struct walk_arg { struct vhost_memory *vm; int *fds; @@ -230,7 +248,6 @@ prepare_vhost_memory_user(struct vhost_user_msg *msg, int fds[]) static struct vhost_user_msg m; const char * const vhost_msg_strings[] = { - [VHOST_USER_SET_OWNER] = "VHOST_SET_OWNER", [VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER", [VHOST_USER_SET_FEATURES] = "VHOST_SET_FEATURES", [VHOST_USER_GET_FEATURES] = "VHOST_GET_FEATURES", @@ -303,7 +320,6 @@ vhost_user_sock(struct virtio_user_dev *dev, msg.size = sizeof(m.payload.u64); break; - case VHOST_USER_SET_OWNER: case VHOST_USER_RESET_OWNER: break; @@ -514,6 +530,7 @@ vhost_user_enable_queue_pair(struct virtio_user_dev *dev, struct virtio_user_backend_ops virtio_ops_user = { .setup = vhost_user_setup, + .set_owner = vhost_user_set_owner, .send_request = vhost_user_sock, .enable_qp = vhost_user_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index c7b9349fc8..f405b6b86a 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -37,7 +37,6 @@ struct vhost_vring_state) static uint64_t vhost_req_user_to_vdpa[] = { - [VHOST_USER_SET_OWNER] = VHOST_SET_OWNER, [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, [VHOST_USER_SET_FEATURES] = VHOST_SET_FEATURES, [VHOST_USER_GET_FEATURES] = VHOST_GET_FEATURES, @@ -80,6 +79,28 @@ struct vhost_msg { }; }; + +static int +vhost_vdpa_ioctl(int fd, uint64_t request, void *arg) +{ + int ret; + + ret = ioctl(fd, request, arg); + if (ret) { + PMD_DRV_LOG(ERR, "Vhost-vDPA ioctl %"PRIu64" failed (%s)", + request, strerror(errno)); + return -1; + } + + return 0; +} + +static int +vhost_vdpa_set_owner(struct virtio_user_dev *dev) +{ + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_OWNER, NULL); +} + static int vhost_vdpa_dma_map(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len) @@ -192,7 +213,7 @@ vhost_vdpa_dma_map_all(struct virtio_user_dev *dev) (1ULL << VIRTIO_NET_F_CSUM)) static int -vhost_vdpa_ioctl(struct virtio_user_dev *dev, +vhost_vdpa_send_request(struct virtio_user_dev *dev, enum vhost_user_request req, void *arg) { @@ -280,7 +301,7 @@ vhost_vdpa_enable_queue_pair(struct virtio_user_dev *dev, .num = enable, }; - if (vhost_vdpa_ioctl(dev, VHOST_USER_SET_VRING_ENABLE, &state)) + if (vhost_vdpa_send_request(dev, VHOST_USER_SET_VRING_ENABLE, &state)) return -1; } @@ -291,7 +312,8 @@ vhost_vdpa_enable_queue_pair(struct virtio_user_dev *dev, struct virtio_user_backend_ops virtio_ops_vdpa = { .setup = vhost_vdpa_setup, - .send_request = vhost_vdpa_ioctl, + .set_owner = vhost_vdpa_set_owner, + .send_request = vhost_vdpa_send_request, .enable_qp = vhost_vdpa_enable_queue_pair, .dma_map = vhost_vdpa_dma_map, .dma_unmap = vhost_vdpa_dma_unmap, diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 053f0267ca..f8e4581951 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -482,8 +482,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, (1ULL << VHOST_USER_F_PROTOCOL_FEATURES); if (!dev->is_server) { - if (dev->ops->send_request(dev, VHOST_USER_SET_OWNER, - NULL) < 0) { + if (dev->ops->set_owner(dev) < 0) { PMD_INIT_LOG(ERR, "set_owner fails: %s", strerror(errno)); return -1; From patchwork Sun Dec 20 21:13:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85549 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 35F08A09FD; Sun, 20 Dec 2020 22:22:27 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 13791CC17; Sun, 20 Dec 2020 22:15:58 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id A1423CE2F for ; Sun, 20 Dec 2020 22:15:56 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498955; 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=9KlXRxEQlM6ievZYqBYHPCfxyxiByf9Vx8ZgzcZymG8=; b=Q9jwX8OmAJNGfRHs4nbIHru66dQ1sdd+iGkZOZMWpjxK5DekwqL18sg4ksN7YAYxTewdnW 6B+XyxMQoHvfL26PJZpM+nH0qAQEIP3nbtjzdDi2LbcmibBV/e7sLq6010ULLb04qC8Ohx gLpEVnTYvSzrEFgfBKzY8D2RJJOa7dA= 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-392-qaI6Oq_eN1uRxBDWy9h_jw-1; Sun, 20 Dec 2020 16:15:53 -0500 X-MC-Unique: qaI6Oq_eN1uRxBDWy9h_jw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 17733805EF1; Sun, 20 Dec 2020 21:15:52 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2607760C43; Sun, 20 Dec 2020 21:15:47 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:50 +0100 Message-Id: <20201220211405.313012-26-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 25/40] net/virtio: add Virtio-user features ops 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" This patch introduce new callbacks for getting and setting Virtio features, and implements them for the different backend types. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 2 + drivers/net/virtio/virtio_user/vhost_kernel.c | 150 +++++++++--------- .../net/virtio/virtio_user/vhost_kernel_tap.c | 23 +++ .../net/virtio/virtio_user/vhost_kernel_tap.h | 1 + drivers/net/virtio/virtio_user/vhost_user.c | 63 +++++++- drivers/net/virtio/virtio_user/vhost_vdpa.c | 38 +++-- .../net/virtio/virtio_user/virtio_user_dev.c | 5 +- drivers/net/virtio/virtio_user_ethdev.c | 3 +- 8 files changed, 188 insertions(+), 97 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index 8e819ecfb8..16978e27ed 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -102,6 +102,8 @@ struct virtio_user_dev; struct virtio_user_backend_ops { int (*setup)(struct virtio_user_dev *dev); int (*set_owner)(struct virtio_user_dev *dev); + int (*get_features)(struct virtio_user_dev *dev, uint64_t *features); + int (*set_features)(struct virtio_user_dev *dev, uint64_t features); int (*send_request)(struct virtio_user_dev *dev, enum vhost_user_request req, void *arg); diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index b79dcad179..f44df8ef1f 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -38,6 +38,28 @@ struct vhost_memory_kernel { #define VHOST_SET_VRING_ERR _IOW(VHOST_VIRTIO, 0x22, struct vhost_vring_file) #define VHOST_NET_SET_BACKEND _IOW(VHOST_VIRTIO, 0x30, struct vhost_vring_file) +/* with below features, vhost kernel does not need to do the checksum and TSO, + * these info will be passed to virtio_user through virtio net header. + */ +#define VHOST_KERNEL_GUEST_OFFLOADS_MASK \ + ((1ULL << VIRTIO_NET_F_GUEST_CSUM) | \ + (1ULL << VIRTIO_NET_F_GUEST_TSO4) | \ + (1ULL << VIRTIO_NET_F_GUEST_TSO6) | \ + (1ULL << VIRTIO_NET_F_GUEST_ECN) | \ + (1ULL << VIRTIO_NET_F_GUEST_UFO)) + +/* with below features, when flows from virtio_user to vhost kernel + * (1) if flows goes up through the kernel networking stack, it does not need + * to verify checksum, which can save CPU cycles; + * (2) if flows goes through a Linux bridge and outside from an interface + * (kernel driver), checksum and TSO will be done by GSO in kernel or even + * offloaded into real physical device. + */ +#define VHOST_KERNEL_HOST_OFFLOADS_MASK \ + ((1ULL << VIRTIO_NET_F_HOST_TSO4) | \ + (1ULL << VIRTIO_NET_F_HOST_TSO6) | \ + (1ULL << VIRTIO_NET_F_CSUM)) + static uint64_t max_regions = 64; static void @@ -77,10 +99,57 @@ vhost_kernel_set_owner(struct virtio_user_dev *dev) return vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_OWNER, NULL); } +static int +vhost_kernel_get_features(struct virtio_user_dev *dev, uint64_t *features) +{ + int ret; + unsigned int tap_features; + + ret = vhost_kernel_ioctl(dev->vhostfds[0], VHOST_GET_FEATURES, features); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to get features"); + return -1; + } + + ret = tap_support_features(&tap_features); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to get TAP features)"); + return -1; + } + + /* with tap as the backend, all these features are supported + * but not claimed by vhost-net, so we add them back when + * reporting to upper layer. + */ + if (tap_features & IFF_VNET_HDR) { + *features |= VHOST_KERNEL_GUEST_OFFLOADS_MASK; + *features |= VHOST_KERNEL_HOST_OFFLOADS_MASK; + } + + /* vhost_kernel will not declare this feature, but it does + * support multi-queue. + */ + if (tap_features & IFF_MULTI_QUEUE) + *features |= (1ull << VIRTIO_NET_F_MQ); + + return 0; +} + +static int +vhost_kernel_set_features(struct virtio_user_dev *dev, uint64_t features) +{ + /* We don't need memory protection here */ + features &= ~(1ULL << VIRTIO_F_IOMMU_PLATFORM); + /* VHOST kernel does not know about below flags */ + features &= ~VHOST_KERNEL_GUEST_OFFLOADS_MASK; + features &= ~VHOST_KERNEL_HOST_OFFLOADS_MASK; + features &= ~(1ULL << VIRTIO_NET_F_MQ); + + return vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_FEATURES, &features); +} + static uint64_t vhost_req_user_to_kernel[] = { [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, - [VHOST_USER_SET_FEATURES] = VHOST_SET_FEATURES, - [VHOST_USER_GET_FEATURES] = VHOST_GET_FEATURES, [VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL, [VHOST_USER_SET_VRING_NUM] = VHOST_SET_VRING_NUM, [VHOST_USER_SET_VRING_BASE] = VHOST_SET_VRING_BASE, @@ -150,51 +219,6 @@ prepare_vhost_memory_kernel(void) return vm; } -/* with below features, vhost kernel does not need to do the checksum and TSO, - * these info will be passed to virtio_user through virtio net header. - */ -#define VHOST_KERNEL_GUEST_OFFLOADS_MASK \ - ((1ULL << VIRTIO_NET_F_GUEST_CSUM) | \ - (1ULL << VIRTIO_NET_F_GUEST_TSO4) | \ - (1ULL << VIRTIO_NET_F_GUEST_TSO6) | \ - (1ULL << VIRTIO_NET_F_GUEST_ECN) | \ - (1ULL << VIRTIO_NET_F_GUEST_UFO)) - -/* with below features, when flows from virtio_user to vhost kernel - * (1) if flows goes up through the kernel networking stack, it does not need - * to verify checksum, which can save CPU cycles; - * (2) if flows goes through a Linux bridge and outside from an interface - * (kernel driver), checksum and TSO will be done by GSO in kernel or even - * offloaded into real physical device. - */ -#define VHOST_KERNEL_HOST_OFFLOADS_MASK \ - ((1ULL << VIRTIO_NET_F_HOST_TSO4) | \ - (1ULL << VIRTIO_NET_F_HOST_TSO6) | \ - (1ULL << VIRTIO_NET_F_CSUM)) - -static unsigned int -tap_support_features(void) -{ - int tapfd; - unsigned int tap_features; - - tapfd = open(PATH_NET_TUN, O_RDWR); - if (tapfd < 0) { - PMD_DRV_LOG(ERR, "fail to open %s: %s", - PATH_NET_TUN, strerror(errno)); - return -1; - } - - if (ioctl(tapfd, TUNGETFEATURES, &tap_features) == -1) { - PMD_DRV_LOG(ERR, "TUNGETFEATURES failed: %s", strerror(errno)); - close(tapfd); - return -1; - } - - close(tapfd); - return tap_features; -} - static int vhost_kernel_send_request(struct virtio_user_dev *dev, enum vhost_user_request req, @@ -206,7 +230,6 @@ vhost_kernel_send_request(struct virtio_user_dev *dev, struct vhost_memory_kernel *vm = NULL; int vhostfd; unsigned int queue_sel; - unsigned int features; PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]); @@ -219,17 +242,6 @@ vhost_kernel_send_request(struct virtio_user_dev *dev, arg = (void *)vm; } - if (req_kernel == VHOST_SET_FEATURES) { - /* We don't need memory protection here */ - *(uint64_t *)arg &= ~(1ULL << VIRTIO_F_IOMMU_PLATFORM); - - /* VHOST kernel does not know about below flags */ - *(uint64_t *)arg &= ~VHOST_KERNEL_GUEST_OFFLOADS_MASK; - *(uint64_t *)arg &= ~VHOST_KERNEL_HOST_OFFLOADS_MASK; - - *(uint64_t *)arg &= ~(1ULL << VIRTIO_NET_F_MQ); - } - switch (req_kernel) { case VHOST_SET_VRING_NUM: case VHOST_SET_VRING_ADDR: @@ -259,24 +271,6 @@ vhost_kernel_send_request(struct virtio_user_dev *dev, ret = ioctl(vhostfd, req_kernel, arg); } - if (!ret && req_kernel == VHOST_GET_FEATURES) { - features = tap_support_features(); - /* with tap as the backend, all these features are supported - * but not claimed by vhost-net, so we add them back when - * reporting to upper layer. - */ - if (features & IFF_VNET_HDR) { - *((uint64_t *)arg) |= VHOST_KERNEL_GUEST_OFFLOADS_MASK; - *((uint64_t *)arg) |= VHOST_KERNEL_HOST_OFFLOADS_MASK; - } - - /* vhost_kernel will not declare this feature, but it does - * support multi-queue. - */ - if (features & IFF_MULTI_QUEUE) - *(uint64_t *)arg |= (1ull << VIRTIO_NET_F_MQ); - } - if (vm) free(vm); @@ -407,6 +401,8 @@ vhost_kernel_enable_queue_pair(struct virtio_user_dev *dev, struct virtio_user_backend_ops virtio_ops_kernel = { .setup = vhost_kernel_setup, .set_owner = vhost_kernel_set_owner, + .get_features = vhost_kernel_get_features, + .set_features = vhost_kernel_set_features, .send_request = vhost_kernel_send_request, .enable_qp = vhost_kernel_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c index eade702c5c..99096bdf39 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.c @@ -18,6 +18,29 @@ #include "../virtio_logs.h" #include "../virtio.h" + +int +tap_support_features(unsigned int *tap_features) +{ + int tapfd; + + tapfd = open(PATH_NET_TUN, O_RDWR); + if (tapfd < 0) { + PMD_DRV_LOG(ERR, "fail to open %s: %s", + PATH_NET_TUN, strerror(errno)); + return -1; + } + + if (ioctl(tapfd, TUNGETFEATURES, tap_features) == -1) { + PMD_DRV_LOG(ERR, "TUNGETFEATURES failed: %s", strerror(errno)); + close(tapfd); + return -1; + } + + close(tapfd); + return 0; +} + int vhost_kernel_tap_set_offload(int fd, uint64_t features) { diff --git a/drivers/net/virtio/virtio_user/vhost_kernel_tap.h b/drivers/net/virtio/virtio_user/vhost_kernel_tap.h index 5c4447b296..ed03fce21e 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel_tap.h +++ b/drivers/net/virtio/virtio_user/vhost_kernel_tap.h @@ -43,5 +43,6 @@ int vhost_kernel_open_tap(char **p_ifname, int hdr_size, int req_mq, const char *mac, uint64_t features); int vhost_kernel_tap_set_offload(int fd, uint64_t features); int vhost_kernel_tap_set_queue(int fd, bool attach); +int tap_support_features(unsigned int *tap_features); #endif diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index 5ab15318ac..d204fa1eb0 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -143,6 +143,62 @@ vhost_user_set_owner(struct virtio_user_dev *dev) return 0; } +static int +vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features) +{ + int ret; + struct vhost_user_msg msg = { + .request = VHOST_USER_GET_FEATURES, + .flags = VHOST_USER_VERSION, + }; + + ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + if (ret < 0) + goto err; + + ret = vhost_user_read(dev->vhostfd, &msg); + if (ret < 0) + goto err; + + if (msg.request != VHOST_USER_GET_FEATURES) { + PMD_DRV_LOG(ERR, "Unexpected request type (%d)", msg.request); + goto err; + } + + if (msg.size != sizeof(*features)) { + PMD_DRV_LOG(ERR, "Unexpected payload size (%d)", msg.size); + goto err; + } + + *features = msg.payload.u64; + + return 0; +err: + PMD_DRV_LOG(ERR, "Failed to get backend features"); + + return -1; +} + +static int +vhost_user_set_features(struct virtio_user_dev *dev, uint64_t features) +{ + int ret; + struct vhost_user_msg msg = { + .request = VHOST_USER_SET_FEATURES, + .flags = VHOST_USER_VERSION, + .size = sizeof(features), + .payload.u64 = features, + }; + + ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to set features"); + return -1; + } + + return 0; +} + struct walk_arg { struct vhost_memory *vm; int *fds; @@ -249,8 +305,6 @@ static struct vhost_user_msg m; const char * const vhost_msg_strings[] = { [VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER", - [VHOST_USER_SET_FEATURES] = "VHOST_SET_FEATURES", - [VHOST_USER_GET_FEATURES] = "VHOST_GET_FEATURES", [VHOST_USER_SET_VRING_CALL] = "VHOST_SET_VRING_CALL", [VHOST_USER_SET_VRING_NUM] = "VHOST_SET_VRING_NUM", [VHOST_USER_SET_VRING_BASE] = "VHOST_SET_VRING_BASE", @@ -299,7 +353,6 @@ vhost_user_sock(struct virtio_user_dev *dev, (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))) return -ENOTSUP; /* Fallthrough */ - case VHOST_USER_GET_FEATURES: case VHOST_USER_GET_PROTOCOL_FEATURES: need_reply = 1; break; @@ -313,7 +366,6 @@ vhost_user_sock(struct virtio_user_dev *dev, if (has_reply_ack) msg.flags |= VHOST_USER_NEED_REPLY_MASK; /* Fallthrough */ - case VHOST_USER_SET_FEATURES: case VHOST_USER_SET_PROTOCOL_FEATURES: case VHOST_USER_SET_LOG_BASE: msg.payload.u64 = *((__u64 *)arg); @@ -393,7 +445,6 @@ vhost_user_sock(struct virtio_user_dev *dev, } switch (req) { - case VHOST_USER_GET_FEATURES: case VHOST_USER_GET_STATUS: case VHOST_USER_GET_PROTOCOL_FEATURES: if (msg.size != sizeof(m.payload.u64)) { @@ -531,6 +582,8 @@ vhost_user_enable_queue_pair(struct virtio_user_dev *dev, struct virtio_user_backend_ops virtio_ops_user = { .setup = vhost_user_setup, .set_owner = vhost_user_set_owner, + .get_features = vhost_user_get_features, + .set_features = vhost_user_set_features, .send_request = vhost_user_sock, .enable_qp = vhost_user_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index f405b6b86a..c0a9b5b767 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -38,8 +38,6 @@ static uint64_t vhost_req_user_to_vdpa[] = { [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, - [VHOST_USER_SET_FEATURES] = VHOST_SET_FEATURES, - [VHOST_USER_GET_FEATURES] = VHOST_GET_FEATURES, [VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL, [VHOST_USER_SET_VRING_NUM] = VHOST_SET_VRING_NUM, [VHOST_USER_SET_VRING_BASE] = VHOST_SET_VRING_BASE, @@ -101,6 +99,32 @@ vhost_vdpa_set_owner(struct virtio_user_dev *dev) return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_OWNER, NULL); } +static int +vhost_vdpa_get_features(struct virtio_user_dev *dev, uint64_t *features) +{ + int ret; + + ret = vhost_vdpa_ioctl(dev->vhostfd, VHOST_GET_FEATURES, features); + if (ret) { + PMD_DRV_LOG(ERR, "Failed to get features"); + return -1; + } + + /* Multiqueue not supported for now */ + *features &= ~(1ULL << VIRTIO_NET_F_MQ); + + return 0; +} + +static int +vhost_vdpa_set_features(struct virtio_user_dev *dev, uint64_t features) +{ + /* WORKAROUND */ + features |= 1ULL << VIRTIO_F_IOMMU_PLATFORM; + + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_FEATURES, &features); +} + static int vhost_vdpa_dma_map(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len) @@ -227,14 +251,6 @@ vhost_vdpa_send_request(struct virtio_user_dev *dev, if (req_vdpa == VHOST_SET_MEM_TABLE) return vhost_vdpa_dma_map_all(dev); - if (req_vdpa == VHOST_SET_FEATURES) { - /* WORKAROUND */ - *(uint64_t *)arg |= 1ULL << VIRTIO_F_IOMMU_PLATFORM; - - /* Multiqueue not supported for now */ - *(uint64_t *)arg &= ~(1ULL << VIRTIO_NET_F_MQ); - } - switch (req_vdpa) { case VHOST_SET_VRING_NUM: case VHOST_SET_VRING_ADDR: @@ -313,6 +329,8 @@ vhost_vdpa_enable_queue_pair(struct virtio_user_dev *dev, struct virtio_user_backend_ops virtio_ops_vdpa = { .setup = vhost_vdpa_setup, .set_owner = vhost_vdpa_set_owner, + .get_features = vhost_vdpa_get_features, + .set_features = vhost_vdpa_set_features, .send_request = vhost_vdpa_send_request, .enable_qp = vhost_vdpa_enable_queue_pair, .dma_map = vhost_vdpa_dma_map, diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index f8e4581951..0a85d058a8 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -141,7 +141,7 @@ virtio_user_dev_set_features(struct virtio_user_dev *dev) /* Strip VIRTIO_NET_F_CTRL_VQ, as devices do not really need to know */ features &= ~(1ull << VIRTIO_NET_F_CTRL_VQ); features &= ~(1ull << VIRTIO_NET_F_STATUS); - ret = dev->ops->send_request(dev, VHOST_USER_SET_FEATURES, &features); + ret = dev->ops->set_features(dev, features); if (ret < 0) goto error; PMD_DRV_LOG(INFO, "set features: %" PRIx64, features); @@ -488,8 +488,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, return -1; } - if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES, - &dev->device_features) < 0) { + if (dev->ops->get_features(dev, &dev->device_features) < 0) { PMD_INIT_LOG(ERR, "get_features failed: %s", strerror(errno)); return -1; diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 283f5c7a36..4d2635c8aa 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -85,8 +85,7 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); - if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES, - &dev->device_features) < 0) { + if (dev->ops->get_features(dev, &dev->device_features) < 0) { PMD_INIT_LOG(ERR, "get_features failed: %s", strerror(errno)); return -1; From patchwork Sun Dec 20 21:13:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85550 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 56900A09FD; Sun, 20 Dec 2020 22:22:43 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2FB06CE30; Sun, 20 Dec 2020 22:16:05 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id 3D14FCACF for ; Sun, 20 Dec 2020 22:16:04 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498962; 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=FXGjLAkn0eKc2Fr/cO1umCgHXMJt3qXeoWdQ60g/3Qc=; b=Gp8ns/62NeY0z6bUwA2mEaQkYKk6iM3Ic0omQGRtG3fxAUoiG7HcIYVJyV7cceYQ5+ckiW 1XYAzz714ZRpcUXr70IWrw0AslxGlyECuUAs1ZIjWOEptyrAXuOAzJ6Zp1RJ6CdCE9Ws// hJ2szx3UBC0+Tcl9ZVGleylL1/GiZsw= 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-35-F_ikkMiAP4-9HT3y24q14A-1; Sun, 20 Dec 2020 16:16:01 -0500 X-MC-Unique: F_ikkMiAP4-9HT3y24q14A-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E67FC107ACF6; Sun, 20 Dec 2020 21:15:59 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7139960C43; Sun, 20 Dec 2020 21:15:52 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:51 +0100 Message-Id: <20201220211405.313012-27-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 26/40] net/virtio: add Virtio-user protocol features ops 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" This patch introduce new callbacks for getting and setting Vhost-user protocol features. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 2 + drivers/net/virtio/virtio_user/vhost_user.c | 64 +++++++++++++++++-- .../net/virtio/virtio_user/virtio_user_dev.c | 17 ++--- drivers/net/virtio/virtio_user_ethdev.c | 14 ++-- 4 files changed, 69 insertions(+), 28 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index 16978e27ed..d8c59ab308 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -104,6 +104,8 @@ struct virtio_user_backend_ops { int (*set_owner)(struct virtio_user_dev *dev); int (*get_features)(struct virtio_user_dev *dev, uint64_t *features); int (*set_features)(struct virtio_user_dev *dev, uint64_t features); + int (*get_protocol_features)(struct virtio_user_dev *dev, uint64_t *features); + int (*set_protocol_features)(struct virtio_user_dev *dev, uint64_t features); int (*send_request)(struct virtio_user_dev *dev, enum vhost_user_request req, void *arg); diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index d204fa1eb0..5e89b1d72d 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -199,6 +199,62 @@ vhost_user_set_features(struct virtio_user_dev *dev, uint64_t features) return 0; } +static int +vhost_user_get_protocol_features(struct virtio_user_dev *dev, uint64_t *features) +{ + int ret; + struct vhost_user_msg msg = { + .request = VHOST_USER_GET_PROTOCOL_FEATURES, + .flags = VHOST_USER_VERSION, + }; + + ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + if (ret < 0) + goto err; + + ret = vhost_user_read(dev->vhostfd, &msg); + if (ret < 0) + goto err; + + if (msg.request != VHOST_USER_GET_PROTOCOL_FEATURES) { + PMD_DRV_LOG(ERR, "Unexpected request type (%d)", msg.request); + goto err; + } + + if (msg.size != sizeof(*features)) { + PMD_DRV_LOG(ERR, "Unexpected payload size (%d)", msg.size); + goto err; + } + + *features = msg.payload.u64; + + return 0; +err: + PMD_DRV_LOG(ERR, "Failed to get backend protocol features"); + + return -1; +} + +static int +vhost_user_set_protocol_features(struct virtio_user_dev *dev, uint64_t features) +{ + int ret; + struct vhost_user_msg msg = { + .request = VHOST_USER_SET_PROTOCOL_FEATURES, + .flags = VHOST_USER_VERSION, + .size = sizeof(features), + .payload.u64 = features, + }; + + ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to set protocol features"); + return -1; + } + + return 0; +} + struct walk_arg { struct vhost_memory *vm; int *fds; @@ -313,8 +369,6 @@ const char * const vhost_msg_strings[] = { [VHOST_USER_SET_VRING_KICK] = "VHOST_SET_VRING_KICK", [VHOST_USER_SET_MEM_TABLE] = "VHOST_SET_MEM_TABLE", [VHOST_USER_SET_VRING_ENABLE] = "VHOST_SET_VRING_ENABLE", - [VHOST_USER_GET_PROTOCOL_FEATURES] = "VHOST_USER_GET_PROTOCOL_FEATURES", - [VHOST_USER_SET_PROTOCOL_FEATURES] = "VHOST_USER_SET_PROTOCOL_FEATURES", [VHOST_USER_SET_STATUS] = "VHOST_SET_STATUS", [VHOST_USER_GET_STATUS] = "VHOST_GET_STATUS", }; @@ -352,8 +406,6 @@ vhost_user_sock(struct virtio_user_dev *dev, (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))) return -ENOTSUP; - /* Fallthrough */ - case VHOST_USER_GET_PROTOCOL_FEATURES: need_reply = 1; break; @@ -366,7 +418,6 @@ vhost_user_sock(struct virtio_user_dev *dev, if (has_reply_ack) msg.flags |= VHOST_USER_NEED_REPLY_MASK; /* Fallthrough */ - case VHOST_USER_SET_PROTOCOL_FEATURES: case VHOST_USER_SET_LOG_BASE: msg.payload.u64 = *((__u64 *)arg); msg.size = sizeof(m.payload.u64); @@ -446,7 +497,6 @@ vhost_user_sock(struct virtio_user_dev *dev, switch (req) { case VHOST_USER_GET_STATUS: - case VHOST_USER_GET_PROTOCOL_FEATURES: if (msg.size != sizeof(m.payload.u64)) { PMD_DRV_LOG(ERR, "Received bad msg size"); return -1; @@ -584,6 +634,8 @@ struct virtio_user_backend_ops virtio_ops_user = { .set_owner = vhost_user_set_owner, .get_features = vhost_user_get_features, .set_features = vhost_user_set_features, + .get_protocol_features = vhost_user_get_protocol_features, + .set_protocol_features = vhost_user_set_protocol_features, .send_request = vhost_user_sock, .enable_qp = vhost_user_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 0a85d058a8..6bb61b3e89 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -495,24 +495,17 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, } - if (dev->device_features & - (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) { - if (dev->ops->send_request(dev, - VHOST_USER_GET_PROTOCOL_FEATURES, - &protocol_features)) + if (dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) { + if (dev->ops->get_protocol_features(dev, &protocol_features)) return -1; dev->protocol_features &= protocol_features; - if (dev->ops->send_request(dev, - VHOST_USER_SET_PROTOCOL_FEATURES, - &dev->protocol_features)) + if (dev->ops->set_protocol_features(dev, dev->protocol_features)) return -1; - if (!(dev->protocol_features & - (1ULL << VHOST_USER_PROTOCOL_F_MQ))) - dev->unsupported_features |= - (1ull << VIRTIO_NET_F_MQ); + if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) + dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ); } } else { /* We just pretend vhost-user can support all these features. diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 4d2635c8aa..c63d010e16 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -93,23 +93,17 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) if (dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) { - if (dev->ops->send_request(dev, - VHOST_USER_GET_PROTOCOL_FEATURES, - &protocol_features)) + if (dev->ops->get_protocol_features(dev, &protocol_features)) return -1; /* Offer VHOST_USER_PROTOCOL_F_STATUS */ - dev->protocol_features |= - (1ULL << VHOST_USER_PROTOCOL_F_STATUS); + dev->protocol_features |= (1ULL << VHOST_USER_PROTOCOL_F_STATUS); dev->protocol_features &= protocol_features; - if (dev->ops->send_request(dev, - VHOST_USER_SET_PROTOCOL_FEATURES, - &dev->protocol_features)) + if (dev->ops->set_protocol_features(dev, dev->protocol_features)) return -1; - if (!(dev->protocol_features & - (1ULL << VHOST_USER_PROTOCOL_F_MQ))) + if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ); } From patchwork Sun Dec 20 21:13:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85551 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id CF1A6A09FD; Sun, 20 Dec 2020 22:22:58 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 988C3CC74; Sun, 20 Dec 2020 22:16:10 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id 7A5BFCACF for ; Sun, 20 Dec 2020 22:16:08 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498967; 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=CZIt5itbBC5ApJGWaLu2a0dyDqGJG1o44NuPX6qOv0I=; b=c+S3T0hSZkHa9LCKmtvL7EDdDqbG4yQ2Mf+tZsdSf0gjSvBhDZ/oc1HaNqYfTk4OOg0WJR akbYfh3a0Q0ofMjqvCI9Q8JfnkOb8/rlHicRZLHUjXEsSzV8+0bwtsXmzXC+l6V097w76x Mtm8s0FkWBh+txvtOZ6kTizQuFFhxUE= 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-225-Y1kacjAROoiR0r5y9pab5w-1; Sun, 20 Dec 2020 16:16:03 -0500 X-MC-Unique: Y1kacjAROoiR0r5y9pab5w-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 16597107ACE3; Sun, 20 Dec 2020 21:16:02 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5620F60C43; Sun, 20 Dec 2020 21:16:00 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:52 +0100 Message-Id: <20201220211405.313012-28-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 27/40] net/virtio: add Virtio-user memory tables ops 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" This patch implements a dedicated callback for preparing and sending memory table to the backends. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 1 + drivers/net/virtio/virtio_user/vhost_kernel.c | 60 +++++++-------- drivers/net/virtio/virtio_user/vhost_user.c | 73 ++++++++++++++----- drivers/net/virtio/virtio_user/vhost_vdpa.c | 8 +- .../net/virtio/virtio_user/virtio_user_dev.c | 4 +- 5 files changed, 88 insertions(+), 58 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index d8c59ab308..0a582a6844 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -106,6 +106,7 @@ struct virtio_user_backend_ops { int (*set_features)(struct virtio_user_dev *dev, uint64_t features); int (*get_protocol_features)(struct virtio_user_dev *dev, uint64_t *features); int (*set_protocol_features)(struct virtio_user_dev *dev, uint64_t features); + int (*set_memory_table)(struct virtio_user_dev *dev); int (*send_request)(struct virtio_user_dev *dev, enum vhost_user_request req, void *arg); diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index f44df8ef1f..2d30f572b6 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -148,17 +148,6 @@ vhost_kernel_set_features(struct virtio_user_dev *dev, uint64_t features) return vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_FEATURES, &features); } -static uint64_t vhost_req_user_to_kernel[] = { - [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, - [VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL, - [VHOST_USER_SET_VRING_NUM] = VHOST_SET_VRING_NUM, - [VHOST_USER_SET_VRING_BASE] = VHOST_SET_VRING_BASE, - [VHOST_USER_GET_VRING_BASE] = VHOST_GET_VRING_BASE, - [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR, - [VHOST_USER_SET_VRING_KICK] = VHOST_SET_VRING_KICK, - [VHOST_USER_SET_MEM_TABLE] = VHOST_SET_MEM_TABLE, -}; - static int add_memseg_list(const struct rte_memseg_list *msl, void *arg) { @@ -193,16 +182,17 @@ add_memseg_list(const struct rte_memseg_list *msl, void *arg) * have much more memory regions. Below function will treat each * contiguous memory space reserved by DPDK as one region. */ -static struct vhost_memory_kernel * -prepare_vhost_memory_kernel(void) +static int +vhost_kernel_set_memory_table(struct virtio_user_dev *dev) { struct vhost_memory_kernel *vm; + int ret; vm = malloc(sizeof(struct vhost_memory_kernel) + max_regions * sizeof(struct vhost_memory_region)); if (!vm) - return NULL; + goto err; vm->nregions = 0; vm->padding = 0; @@ -211,14 +201,34 @@ prepare_vhost_memory_kernel(void) * The memory lock has already been taken by memory subsystem * or virtio_user_start_device(). */ - if (rte_memseg_list_walk_thread_unsafe(add_memseg_list, vm) < 0) { - free(vm); - return NULL; - } + ret = rte_memseg_list_walk_thread_unsafe(add_memseg_list, vm); + if (ret < 0) + goto err_free; + + ret = vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_MEM_TABLE, vm); + if (ret < 0) + goto err_free; - return vm; + free(vm); + + return 0; +err_free: + free(vm); +err: + PMD_DRV_LOG(ERR, "Failed to set memory table"); + return -1; } +static uint64_t vhost_req_user_to_kernel[] = { + [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, + [VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL, + [VHOST_USER_SET_VRING_NUM] = VHOST_SET_VRING_NUM, + [VHOST_USER_SET_VRING_BASE] = VHOST_SET_VRING_BASE, + [VHOST_USER_GET_VRING_BASE] = VHOST_GET_VRING_BASE, + [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR, + [VHOST_USER_SET_VRING_KICK] = VHOST_SET_VRING_KICK, +}; + static int vhost_kernel_send_request(struct virtio_user_dev *dev, enum vhost_user_request req, @@ -227,7 +237,6 @@ vhost_kernel_send_request(struct virtio_user_dev *dev, int ret = -1; unsigned int i; uint64_t req_kernel; - struct vhost_memory_kernel *vm = NULL; int vhostfd; unsigned int queue_sel; @@ -235,13 +244,6 @@ vhost_kernel_send_request(struct virtio_user_dev *dev, req_kernel = vhost_req_user_to_kernel[req]; - if (req_kernel == VHOST_SET_MEM_TABLE) { - vm = prepare_vhost_memory_kernel(); - if (!vm) - return -1; - arg = (void *)vm; - } - switch (req_kernel) { case VHOST_SET_VRING_NUM: case VHOST_SET_VRING_ADDR: @@ -271,9 +273,6 @@ vhost_kernel_send_request(struct virtio_user_dev *dev, ret = ioctl(vhostfd, req_kernel, arg); } - if (vm) - free(vm); - if (ret < 0) PMD_DRV_LOG(ERR, "%s failed: %s", vhost_msg_strings[req], strerror(errno)); @@ -403,6 +402,7 @@ struct virtio_user_backend_ops virtio_ops_kernel = { .set_owner = vhost_kernel_set_owner, .get_features = vhost_kernel_get_features, .set_features = vhost_kernel_set_features, + .set_memory_table = vhost_kernel_set_memory_table, .send_request = vhost_kernel_send_request, .enable_qp = vhost_kernel_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index 5e89b1d72d..57f6337750 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -125,6 +125,29 @@ vhost_user_read(int fd, struct vhost_user_msg *msg) return -1; } +static int +vhost_user_check_reply_ack(struct virtio_user_dev *dev, struct vhost_user_msg *msg) +{ + enum vhost_user_request req = msg->request; + int ret; + + if (!(msg->flags & VHOST_USER_NEED_REPLY_MASK)) + return 0; + + ret = vhost_user_read(dev->vhostfd, msg); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to read reply-ack"); + return -1; + } + + if (req != msg->request) { + PMD_DRV_LOG(ERR, "Unexpected reply-ack request type (%d)", msg->request); + return -1; + } + + return msg->payload.u64 ? -1 : 0; +} + static int vhost_user_set_owner(struct virtio_user_dev *dev) { @@ -336,25 +359,47 @@ update_memory_region(const struct rte_memseg_list *msl __rte_unused, } static int -prepare_vhost_memory_user(struct vhost_user_msg *msg, int fds[]) +vhost_user_set_memory_table(struct virtio_user_dev *dev) { struct walk_arg wa; + int fds[VHOST_MEMORY_MAX_NREGIONS]; + int ret, fd_num; + struct vhost_user_msg msg = { + .request = VHOST_USER_SET_MEM_TABLE, + .flags = VHOST_USER_VERSION, + }; + + if (dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)) + msg.flags |= VHOST_USER_NEED_REPLY_MASK; wa.region_nr = 0; - wa.vm = &msg->payload.memory; + wa.vm = &msg.payload.memory; wa.fds = fds; /* * The memory lock has already been taken by memory subsystem * or virtio_user_start_device(). */ - if (rte_memseg_walk_thread_unsafe(update_memory_region, &wa) < 0) - return -1; + ret = rte_memseg_walk_thread_unsafe(update_memory_region, &wa); + if (ret < 0) + goto err; - msg->payload.memory.nregions = wa.region_nr; - msg->payload.memory.padding = 0; + fd_num = wa.region_nr; + msg.payload.memory.nregions = wa.region_nr; + msg.payload.memory.padding = 0; - return 0; + msg.size = sizeof(msg.payload.memory.nregions); + msg.size += sizeof(msg.payload.memory.padding); + msg.size += fd_num * sizeof(struct vhost_memory_region); + + ret = vhost_user_write(dev->vhostfd, &msg, fds, fd_num); + if (ret < 0) + goto err; + + return vhost_user_check_reply_ack(dev, &msg); +err: + PMD_DRV_LOG(ERR, "Failed to set memory table"); + return -1; } static struct vhost_user_msg m; @@ -367,7 +412,6 @@ const char * const vhost_msg_strings[] = { [VHOST_USER_GET_VRING_BASE] = "VHOST_GET_VRING_BASE", [VHOST_USER_SET_VRING_ADDR] = "VHOST_SET_VRING_ADDR", [VHOST_USER_SET_VRING_KICK] = "VHOST_SET_VRING_KICK", - [VHOST_USER_SET_MEM_TABLE] = "VHOST_SET_MEM_TABLE", [VHOST_USER_SET_VRING_ENABLE] = "VHOST_SET_VRING_ENABLE", [VHOST_USER_SET_STATUS] = "VHOST_SET_STATUS", [VHOST_USER_GET_STATUS] = "VHOST_GET_STATUS", @@ -426,18 +470,6 @@ vhost_user_sock(struct virtio_user_dev *dev, case VHOST_USER_RESET_OWNER: break; - case VHOST_USER_SET_MEM_TABLE: - if (prepare_vhost_memory_user(&msg, fds) < 0) - return -1; - fd_num = msg.payload.memory.nregions; - msg.size = sizeof(m.payload.memory.nregions); - msg.size += sizeof(m.payload.memory.padding); - msg.size += fd_num * sizeof(struct vhost_memory_region); - - if (has_reply_ack) - msg.flags |= VHOST_USER_NEED_REPLY_MASK; - break; - case VHOST_USER_SET_LOG_FD: fds[fd_num++] = *((int *)arg); break; @@ -636,6 +668,7 @@ struct virtio_user_backend_ops virtio_ops_user = { .set_features = vhost_user_set_features, .get_protocol_features = vhost_user_get_protocol_features, .set_protocol_features = vhost_user_set_protocol_features, + .set_memory_table = vhost_user_set_memory_table, .send_request = vhost_user_sock, .enable_qp = vhost_user_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index c0a9b5b767..3059ec545d 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -19,7 +19,6 @@ #define VHOST_SET_FEATURES _IOW(VHOST_VIRTIO, 0x00, __u64) #define VHOST_SET_OWNER _IO(VHOST_VIRTIO, 0x01) #define VHOST_RESET_OWNER _IO(VHOST_VIRTIO, 0x02) -#define VHOST_SET_MEM_TABLE _IOW(VHOST_VIRTIO, 0x03, void *) #define VHOST_SET_LOG_BASE _IOW(VHOST_VIRTIO, 0x04, __u64) #define VHOST_SET_LOG_FD _IOW(VHOST_VIRTIO, 0x07, int) #define VHOST_SET_VRING_NUM _IOW(VHOST_VIRTIO, 0x10, struct vhost_vring_state) @@ -44,7 +43,6 @@ static uint64_t vhost_req_user_to_vdpa[] = { [VHOST_USER_GET_VRING_BASE] = VHOST_GET_VRING_BASE, [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR, [VHOST_USER_SET_VRING_KICK] = VHOST_SET_VRING_KICK, - [VHOST_USER_SET_MEM_TABLE] = VHOST_SET_MEM_TABLE, [VHOST_USER_SET_STATUS] = VHOST_VDPA_SET_STATUS, [VHOST_USER_GET_STATUS] = VHOST_VDPA_GET_STATUS, [VHOST_USER_SET_VRING_ENABLE] = VHOST_VDPA_SET_VRING_ENABLE, @@ -202,7 +200,7 @@ vhost_vdpa_map(const struct rte_memseg_list *msl, const struct rte_memseg *ms, } static int -vhost_vdpa_dma_map_all(struct virtio_user_dev *dev) +vhost_vdpa_set_memory_table(struct virtio_user_dev *dev) { vhost_vdpa_dma_unmap(dev, NULL, 0, SIZE_MAX); @@ -248,9 +246,6 @@ vhost_vdpa_send_request(struct virtio_user_dev *dev, req_vdpa = vhost_req_user_to_vdpa[req]; - if (req_vdpa == VHOST_SET_MEM_TABLE) - return vhost_vdpa_dma_map_all(dev); - switch (req_vdpa) { case VHOST_SET_VRING_NUM: case VHOST_SET_VRING_ADDR: @@ -331,6 +326,7 @@ struct virtio_user_backend_ops virtio_ops_vdpa = { .set_owner = vhost_vdpa_set_owner, .get_features = vhost_vdpa_get_features, .set_features = vhost_vdpa_set_features, + .set_memory_table = vhost_vdpa_set_memory_table, .send_request = vhost_vdpa_send_request, .enable_qp = vhost_vdpa_enable_queue_pair, .dma_map = vhost_vdpa_dma_map, diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 6bb61b3e89..ae976be158 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -177,7 +177,7 @@ virtio_user_start_device(struct virtio_user_dev *dev) goto error; /* Step 2: share memory regions */ - ret = dev->ops->send_request(dev, VHOST_USER_SET_MEM_TABLE, NULL); + ret = dev->ops->set_memory_table(dev); if (ret < 0) goto error; @@ -351,7 +351,7 @@ virtio_user_mem_event_cb(enum rte_mem_event type __rte_unused, dev->ops->enable_qp(dev, i, 0); /* Step 2: update memory regions */ - dev->ops->send_request(dev, VHOST_USER_SET_MEM_TABLE, NULL); + dev->ops->set_memory_table(dev); /* Step 3: resume the active queues */ for (i = 0; i < dev->queue_pairs; i++) From patchwork Sun Dec 20 21:13:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85552 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4D34CA09FD; Sun, 20 Dec 2020 22:23:20 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 59F6DCE66; Sun, 20 Dec 2020 22:16:12 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 8CB14CACF for ; Sun, 20 Dec 2020 22:16:10 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498969; 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=NmNjpSWLujDYJcFg9tT21/oX3MOotkkUqnwC/jOwvAY=; b=Qrsrj7VNuxUswi0CY6xc7qUAK055ow4ov990e1AE2y9rwrU/uyJ1v5jPVnlFej6yLUJYXk eRLRFTxzXkHIcxieNMDWUmKVITn4DFxXz/3Qb/rLYngLRs9aazvXlc73r8P9aRSgaBsgmt cOQbExsW7RfcUY39Lygqw0OAF3Dg0i8= 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-206-Fhm8PZuYM3mTfljBnhHb8g-1; Sun, 20 Dec 2020 16:16:07 -0500 X-MC-Unique: Fhm8PZuYM3mTfljBnhHb8g-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4A78619251A2; Sun, 20 Dec 2020 21:16:06 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 711DF60C43; Sun, 20 Dec 2020 21:16:02 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:53 +0100 Message-Id: <20201220211405.313012-29-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 28/40] net/virtio: add Virtio-user vring setting ops 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" This patch introduces new callbacks for setting and getting vring state. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 4 + drivers/net/virtio/virtio_user/vhost_kernel.c | 49 +++++++- drivers/net/virtio/virtio_user/vhost_user.c | 114 +++++++++++++----- drivers/net/virtio/virtio_user/vhost_vdpa.c | 40 ++++-- .../net/virtio/virtio_user/virtio_user_dev.c | 9 +- 5 files changed, 168 insertions(+), 48 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index 0a582a6844..1385c1563b 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -107,6 +107,10 @@ struct virtio_user_backend_ops { int (*get_protocol_features)(struct virtio_user_dev *dev, uint64_t *features); int (*set_protocol_features)(struct virtio_user_dev *dev, uint64_t features); int (*set_memory_table)(struct virtio_user_dev *dev); + int (*set_vring_enable)(struct virtio_user_dev *dev, struct vhost_vring_state *state); + int (*set_vring_num)(struct virtio_user_dev *dev, struct vhost_vring_state *state); + int (*set_vring_base)(struct virtio_user_dev *dev, struct vhost_vring_state *state); + int (*get_vring_base)(struct virtio_user_dev *dev, struct vhost_vring_state *state); int (*send_request)(struct virtio_user_dev *dev, enum vhost_user_request req, void *arg); diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index 2d30f572b6..2f1b4840ee 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -219,12 +219,49 @@ vhost_kernel_set_memory_table(struct virtio_user_dev *dev) return -1; } +static int +vhost_kernel_set_vring(struct virtio_user_dev *dev, uint64_t req, struct vhost_vring_state *state) +{ + int ret, fd; + uint32_t index = state->index; + + /* Convert from queue index to queue-pair & offset */ + fd = dev->vhostfds[state->index / 2]; + state->index %= 2; + + ret = vhost_kernel_ioctl(fd, req, state); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to set vring (request %lu)", req); + return -1; + } + + /* restore index back to queue index */ + state->index = index; + + return 0; +} + +static int +vhost_kernel_set_vring_num(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + return vhost_kernel_set_vring(dev, VHOST_SET_VRING_NUM, state); +} + +static int +vhost_kernel_set_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + return vhost_kernel_set_vring(dev, VHOST_SET_VRING_BASE, state); +} + +static int +vhost_kernel_get_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + return vhost_kernel_set_vring(dev, VHOST_GET_VRING_BASE, state); +} + static uint64_t vhost_req_user_to_kernel[] = { [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, [VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL, - [VHOST_USER_SET_VRING_NUM] = VHOST_SET_VRING_NUM, - [VHOST_USER_SET_VRING_BASE] = VHOST_SET_VRING_BASE, - [VHOST_USER_GET_VRING_BASE] = VHOST_GET_VRING_BASE, [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR, [VHOST_USER_SET_VRING_KICK] = VHOST_SET_VRING_KICK, }; @@ -245,10 +282,7 @@ vhost_kernel_send_request(struct virtio_user_dev *dev, req_kernel = vhost_req_user_to_kernel[req]; switch (req_kernel) { - case VHOST_SET_VRING_NUM: case VHOST_SET_VRING_ADDR: - case VHOST_SET_VRING_BASE: - case VHOST_GET_VRING_BASE: case VHOST_SET_VRING_KICK: case VHOST_SET_VRING_CALL: queue_sel = *(unsigned int *)arg; @@ -403,6 +437,9 @@ struct virtio_user_backend_ops virtio_ops_kernel = { .get_features = vhost_kernel_get_features, .set_features = vhost_kernel_set_features, .set_memory_table = vhost_kernel_set_memory_table, + .set_vring_num = vhost_kernel_set_vring_num, + .set_vring_base = vhost_kernel_set_vring_base, + .get_vring_base = vhost_kernel_get_vring_base, .send_request = vhost_kernel_send_request, .enable_qp = vhost_kernel_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index 57f6337750..50a587fab4 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -402,17 +402,94 @@ vhost_user_set_memory_table(struct virtio_user_dev *dev) return -1; } +static int +vhost_user_set_vring(struct virtio_user_dev *dev, enum vhost_user_request req, + struct vhost_vring_state *state) +{ + int ret; + struct vhost_user_msg msg = { + .request = req, + .flags = VHOST_USER_VERSION, + .size = sizeof(*state), + .payload.state = *state, + }; + + ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to set vring state (request %d)", req); + return -1; + } + + return 0; +} + +static int +vhost_user_set_vring_enable(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + return vhost_user_set_vring(dev, VHOST_USER_SET_VRING_ENABLE, state); +} + +static int +vhost_user_set_vring_num(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + return vhost_user_set_vring(dev, VHOST_USER_SET_VRING_NUM, state); +} + +static int +vhost_user_set_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + return vhost_user_set_vring(dev, VHOST_USER_SET_VRING_BASE, state); +} + +static int +vhost_user_get_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + int ret; + struct vhost_user_msg msg; + unsigned int index = state->index; + + ret = vhost_user_set_vring(dev, VHOST_USER_GET_VRING_BASE, state); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to send request"); + goto err; + } + + ret = vhost_user_read(dev->vhostfd, &msg); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to read reply"); + goto err; + } + + if (msg.request != VHOST_USER_GET_VRING_BASE) { + PMD_DRV_LOG(ERR, "Unexpected request type (%d)", msg.request); + goto err; + } + + if (msg.size != sizeof(*state)) { + PMD_DRV_LOG(ERR, "Unexpected payload size (%u)", msg.size); + goto err; + } + + if (msg.payload.state.index != index) { + PMD_DRV_LOG(ERR, "Unexpected ring index (%u)", state->index); + goto err; + } + + *state = msg.payload.state; + + return 0; +err: + PMD_DRV_LOG(ERR, "Failed to get vring base"); + return -1; +} + static struct vhost_user_msg m; const char * const vhost_msg_strings[] = { [VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER", [VHOST_USER_SET_VRING_CALL] = "VHOST_SET_VRING_CALL", - [VHOST_USER_SET_VRING_NUM] = "VHOST_SET_VRING_NUM", - [VHOST_USER_SET_VRING_BASE] = "VHOST_SET_VRING_BASE", - [VHOST_USER_GET_VRING_BASE] = "VHOST_GET_VRING_BASE", [VHOST_USER_SET_VRING_ADDR] = "VHOST_SET_VRING_ADDR", [VHOST_USER_SET_VRING_KICK] = "VHOST_SET_VRING_KICK", - [VHOST_USER_SET_VRING_ENABLE] = "VHOST_SET_VRING_ENABLE", [VHOST_USER_SET_STATUS] = "VHOST_SET_STATUS", [VHOST_USER_GET_STATUS] = "VHOST_GET_STATUS", }; @@ -474,19 +551,6 @@ vhost_user_sock(struct virtio_user_dev *dev, fds[fd_num++] = *((int *)arg); break; - case VHOST_USER_SET_VRING_NUM: - case VHOST_USER_SET_VRING_BASE: - case VHOST_USER_SET_VRING_ENABLE: - memcpy(&msg.payload.state, arg, sizeof(msg.payload.state)); - msg.size = sizeof(m.payload.state); - break; - - case VHOST_USER_GET_VRING_BASE: - memcpy(&msg.payload.state, arg, sizeof(msg.payload.state)); - msg.size = sizeof(m.payload.state); - need_reply = 1; - break; - case VHOST_USER_SET_VRING_ADDR: memcpy(&msg.payload.addr, arg, sizeof(msg.payload.addr)); msg.size = sizeof(m.payload.addr); @@ -535,14 +599,6 @@ vhost_user_sock(struct virtio_user_dev *dev, } *((__u64 *)arg) = msg.payload.u64; break; - case VHOST_USER_GET_VRING_BASE: - if (msg.size != sizeof(m.payload.state)) { - PMD_DRV_LOG(ERR, "Received bad msg size"); - return -1; - } - memcpy(arg, &msg.payload.state, - sizeof(struct vhost_vring_state)); - break; default: /* Reply-ack handling */ if (msg.size != sizeof(m.payload.u64)) { @@ -650,10 +706,10 @@ vhost_user_enable_queue_pair(struct virtio_user_dev *dev, for (i = 0; i < 2; ++i) { struct vhost_vring_state state = { .index = pair_idx * 2 + i, - .num = enable, + .num = enable, }; - if (vhost_user_sock(dev, VHOST_USER_SET_VRING_ENABLE, &state)) + if (vhost_user_set_vring_enable(dev, &state)) return -1; } @@ -669,6 +725,10 @@ struct virtio_user_backend_ops virtio_ops_user = { .get_protocol_features = vhost_user_get_protocol_features, .set_protocol_features = vhost_user_set_protocol_features, .set_memory_table = vhost_user_set_memory_table, + .set_vring_enable = vhost_user_set_vring_enable, + .set_vring_num = vhost_user_set_vring_num, + .set_vring_base = vhost_user_set_vring_base, + .get_vring_base = vhost_user_get_vring_base, .send_request = vhost_user_sock, .enable_qp = vhost_user_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index 3059ec545d..c1b790ddc6 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -32,20 +32,15 @@ #define VHOST_VDPA_GET_DEVICE_ID _IOR(VHOST_VIRTIO, 0x70, __u32) #define VHOST_VDPA_GET_STATUS _IOR(VHOST_VIRTIO, 0x71, __u8) #define VHOST_VDPA_SET_STATUS _IOW(VHOST_VIRTIO, 0x72, __u8) -#define VHOST_VDPA_SET_VRING_ENABLE _IOW(VHOST_VIRTIO, 0x75, \ - struct vhost_vring_state) +#define VHOST_VDPA_SET_VRING_ENABLE _IOW(VHOST_VIRTIO, 0x75, struct vhost_vring_state) static uint64_t vhost_req_user_to_vdpa[] = { [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, [VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL, - [VHOST_USER_SET_VRING_NUM] = VHOST_SET_VRING_NUM, - [VHOST_USER_SET_VRING_BASE] = VHOST_SET_VRING_BASE, - [VHOST_USER_GET_VRING_BASE] = VHOST_GET_VRING_BASE, [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR, [VHOST_USER_SET_VRING_KICK] = VHOST_SET_VRING_KICK, [VHOST_USER_SET_STATUS] = VHOST_VDPA_SET_STATUS, [VHOST_USER_GET_STATUS] = VHOST_VDPA_GET_STATUS, - [VHOST_USER_SET_VRING_ENABLE] = VHOST_VDPA_SET_VRING_ENABLE, }; /* no alignment requirement */ @@ -219,6 +214,30 @@ vhost_vdpa_set_memory_table(struct virtio_user_dev *dev) return rte_memseg_walk_thread_unsafe(vhost_vdpa_map, dev); } +static int +vhost_vdpa_set_vring_enable(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_VDPA_SET_VRING_ENABLE, state); +} + +static int +vhost_vdpa_set_vring_num(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_NUM, state); +} + +static int +vhost_vdpa_set_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_BASE, state); +} + +static int +vhost_vdpa_get_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state *state) +{ + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_GET_VRING_BASE, state); +} + /* with below features, vhost vdpa does not need to do the checksum and TSO, * these info will be passed to virtio_user through virtio net header. */ @@ -247,10 +266,7 @@ vhost_vdpa_send_request(struct virtio_user_dev *dev, req_vdpa = vhost_req_user_to_vdpa[req]; switch (req_vdpa) { - case VHOST_SET_VRING_NUM: case VHOST_SET_VRING_ADDR: - case VHOST_SET_VRING_BASE: - case VHOST_GET_VRING_BASE: case VHOST_SET_VRING_KICK: case VHOST_SET_VRING_CALL: PMD_DRV_LOG(DEBUG, "vhostfd=%d, index=%u", @@ -312,7 +328,7 @@ vhost_vdpa_enable_queue_pair(struct virtio_user_dev *dev, .num = enable, }; - if (vhost_vdpa_send_request(dev, VHOST_USER_SET_VRING_ENABLE, &state)) + if (vhost_vdpa_set_vring_enable(dev, &state)) return -1; } @@ -327,6 +343,10 @@ struct virtio_user_backend_ops virtio_ops_vdpa = { .get_features = vhost_vdpa_get_features, .set_features = vhost_vdpa_set_features, .set_memory_table = vhost_vdpa_set_memory_table, + .set_vring_enable = vhost_vdpa_set_vring_enable, + .set_vring_num = vhost_vdpa_set_vring_num, + .set_vring_base = vhost_vdpa_set_vring_base, + .get_vring_base = vhost_vdpa_get_vring_base, .send_request = vhost_vdpa_send_request, .enable_qp = vhost_vdpa_enable_queue_pair, .dma_map = vhost_vdpa_dma_map, diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index ae976be158..496a48ee51 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -73,13 +73,13 @@ virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel) state.index = queue_sel; state.num = vring->num; - dev->ops->send_request(dev, VHOST_USER_SET_VRING_NUM, &state); + dev->ops->set_vring_num(dev, &state); state.index = queue_sel; state.num = 0; /* no reservation */ if (dev->features & (1ULL << VIRTIO_F_RING_PACKED)) state.num |= (1 << 15); - dev->ops->send_request(dev, VHOST_USER_SET_VRING_BASE, &state); + dev->ops->set_vring_base(dev, &state); dev->ops->send_request(dev, VHOST_USER_SET_VRING_ADDR, &addr); @@ -218,9 +218,8 @@ int virtio_user_stop_device(struct virtio_user_dev *dev) /* Stop the backend. */ for (i = 0; i < dev->max_queue_pairs * 2; ++i) { state.index = i; - if (dev->ops->send_request(dev, VHOST_USER_GET_VRING_BASE, - &state) < 0) { - PMD_DRV_LOG(ERR, "get_vring_base failed, index=%u\n", + if (dev->ops->get_vring_base(dev, &state) < 0) { + PMD_DRV_LOG(ERR, "get_vring_base failed, index=%u", i); error = -1; goto out; From patchwork Sun Dec 20 21:13:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85553 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 06E5BA09FD; Sun, 20 Dec 2020 22:23:38 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B96CECC19; Sun, 20 Dec 2020 22:16:18 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 0FB99CBF1 for ; Sun, 20 Dec 2020 22:16:16 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498975; 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=UGM+v1hjJ2UJmGj78ExypFNx7m4hMMnexVEiC6ZtwJk=; b=WRmcoj6hul82Edm8lSYC5FMOiSnmdRefB3oYfGG8g7P7/Yj/PS+fhIX2HI8Jglacq1pjgs qbxvX0RO54KMu2xTp4MzgVdsne3UmfJA5IQsNCpZsSPDTGqMDyk9ohPJKuF0bzys7kcVqd kCJrfJxVb7oRpOIoBn26elc5OUv5oJc= 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-370-zoe3yM9NNta36QaLHw9d_A-1; Sun, 20 Dec 2020 16:16:12 -0500 X-MC-Unique: zoe3yM9NNta36QaLHw9d_A-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9018E800D53; Sun, 20 Dec 2020 21:16:10 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id C1B1B60C43; Sun, 20 Dec 2020 21:16:06 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:54 +0100 Message-Id: <20201220211405.313012-30-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 29/40] net/virtio: add Virtio-user vring file ops 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" This patch introduces new callbacks for setting vring files (kick and call). Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 2 + drivers/net/virtio/virtio_user/vhost_kernel.c | 41 +++++++++++++++-- drivers/net/virtio/virtio_user/vhost_user.c | 46 +++++++++++++++++-- drivers/net/virtio/virtio_user/vhost_vdpa.c | 18 ++++++-- .../net/virtio/virtio_user/virtio_user_dev.c | 4 +- 5 files changed, 97 insertions(+), 14 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index 1385c1563b..b296ee215d 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -111,6 +111,8 @@ struct virtio_user_backend_ops { int (*set_vring_num)(struct virtio_user_dev *dev, struct vhost_vring_state *state); int (*set_vring_base)(struct virtio_user_dev *dev, struct vhost_vring_state *state); int (*get_vring_base)(struct virtio_user_dev *dev, struct vhost_vring_state *state); + int (*set_vring_call)(struct virtio_user_dev *dev, struct vhost_vring_file *file); + int (*set_vring_kick)(struct virtio_user_dev *dev, struct vhost_vring_file *file); int (*send_request)(struct virtio_user_dev *dev, enum vhost_user_request req, void *arg); diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index 2f1b4840ee..1805aee7f7 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -259,11 +259,44 @@ vhost_kernel_get_vring_base(struct virtio_user_dev *dev, struct vhost_vring_stat return vhost_kernel_set_vring(dev, VHOST_GET_VRING_BASE, state); } +static int +vhost_kernel_set_vring_file(struct virtio_user_dev *dev, uint64_t req, + struct vhost_vring_file *file) +{ + int ret, fd; + uint32_t index = file->index; + + /* Convert from queue index to queue-pair & offset */ + fd = dev->vhostfds[file->index / 2]; + file->index %= 2; + + ret = vhost_kernel_ioctl(fd, req, file); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to set vring file (request %lu)", req); + return -1; + } + + /* restore index back to queue index */ + file->index = index; + + return 0; +} + +static int +vhost_kernel_set_vring_kick(struct virtio_user_dev *dev, struct vhost_vring_file *file) +{ + return vhost_kernel_set_vring_file(dev, VHOST_SET_VRING_CALL, file); +} + +static int +vhost_kernel_set_vring_call(struct virtio_user_dev *dev, struct vhost_vring_file *file) +{ + return vhost_kernel_set_vring_file(dev, VHOST_SET_VRING_KICK, file); +} + static uint64_t vhost_req_user_to_kernel[] = { [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, - [VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL, [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR, - [VHOST_USER_SET_VRING_KICK] = VHOST_SET_VRING_KICK, }; static int @@ -283,8 +316,6 @@ vhost_kernel_send_request(struct virtio_user_dev *dev, switch (req_kernel) { case VHOST_SET_VRING_ADDR: - case VHOST_SET_VRING_KICK: - case VHOST_SET_VRING_CALL: queue_sel = *(unsigned int *)arg; vhostfd = dev->vhostfds[queue_sel / 2]; *(unsigned int *)arg = queue_sel % 2; @@ -440,6 +471,8 @@ struct virtio_user_backend_ops virtio_ops_kernel = { .set_vring_num = vhost_kernel_set_vring_num, .set_vring_base = vhost_kernel_set_vring_base, .get_vring_base = vhost_kernel_get_vring_base, + .set_vring_call = vhost_kernel_set_vring_call, + .set_vring_kick = vhost_kernel_set_vring_kick, .send_request = vhost_kernel_send_request, .enable_qp = vhost_kernel_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index 50a587fab4..509a96dfbc 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -483,13 +483,51 @@ vhost_user_get_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state return -1; } +static int +vhost_user_set_vring_file(struct virtio_user_dev *dev, enum vhost_user_request req, + struct vhost_vring_file *file) +{ + int ret; + int fd = file->fd; + int num_fd = 0; + struct vhost_user_msg msg = { + .request = req, + .flags = VHOST_USER_VERSION, + .size = sizeof(msg.payload.u64), + .payload.u64 = file->index & VHOST_USER_VRING_IDX_MASK, + }; + + if (fd >= 0) + num_fd++; + else + msg.payload.u64 |= VHOST_USER_VRING_NOFD_MASK; + + ret = vhost_user_write(dev->vhostfd, &msg, &fd, num_fd); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to set vring file (request %d)", req); + return -1; + } + + return 0; +} + +static int +vhost_user_set_vring_call(struct virtio_user_dev *dev, struct vhost_vring_file *file) +{ + return vhost_user_set_vring_file(dev, VHOST_USER_SET_VRING_CALL, file); +} + +static int +vhost_user_set_vring_kick(struct virtio_user_dev *dev, struct vhost_vring_file *file) +{ + return vhost_user_set_vring_file(dev, VHOST_USER_SET_VRING_KICK, file); +} + static struct vhost_user_msg m; const char * const vhost_msg_strings[] = { [VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER", - [VHOST_USER_SET_VRING_CALL] = "VHOST_SET_VRING_CALL", [VHOST_USER_SET_VRING_ADDR] = "VHOST_SET_VRING_ADDR", - [VHOST_USER_SET_VRING_KICK] = "VHOST_SET_VRING_KICK", [VHOST_USER_SET_STATUS] = "VHOST_SET_STATUS", [VHOST_USER_GET_STATUS] = "VHOST_GET_STATUS", }; @@ -556,8 +594,6 @@ vhost_user_sock(struct virtio_user_dev *dev, msg.size = sizeof(m.payload.addr); break; - case VHOST_USER_SET_VRING_KICK: - case VHOST_USER_SET_VRING_CALL: case VHOST_USER_SET_VRING_ERR: file = arg; msg.payload.u64 = file->index & VHOST_USER_VRING_IDX_MASK; @@ -729,6 +765,8 @@ struct virtio_user_backend_ops virtio_ops_user = { .set_vring_num = vhost_user_set_vring_num, .set_vring_base = vhost_user_set_vring_base, .get_vring_base = vhost_user_get_vring_base, + .set_vring_call = vhost_user_set_vring_call, + .set_vring_kick = vhost_user_set_vring_kick, .send_request = vhost_user_sock, .enable_qp = vhost_user_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index c1b790ddc6..48fe3f23e8 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -36,9 +36,7 @@ static uint64_t vhost_req_user_to_vdpa[] = { [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, - [VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL, [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR, - [VHOST_USER_SET_VRING_KICK] = VHOST_SET_VRING_KICK, [VHOST_USER_SET_STATUS] = VHOST_VDPA_SET_STATUS, [VHOST_USER_GET_STATUS] = VHOST_VDPA_GET_STATUS, }; @@ -238,6 +236,18 @@ vhost_vdpa_get_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state return vhost_vdpa_ioctl(dev->vhostfd, VHOST_GET_VRING_BASE, state); } +static int +vhost_vdpa_set_vring_call(struct virtio_user_dev *dev, struct vhost_vring_file *file) +{ + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_CALL, file); +} + +static int +vhost_vdpa_set_vring_kick(struct virtio_user_dev *dev, struct vhost_vring_file *file) +{ + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_KICK, file); +} + /* with below features, vhost vdpa does not need to do the checksum and TSO, * these info will be passed to virtio_user through virtio net header. */ @@ -267,8 +277,6 @@ vhost_vdpa_send_request(struct virtio_user_dev *dev, switch (req_vdpa) { case VHOST_SET_VRING_ADDR: - case VHOST_SET_VRING_KICK: - case VHOST_SET_VRING_CALL: PMD_DRV_LOG(DEBUG, "vhostfd=%d, index=%u", dev->vhostfd, *(unsigned int *)arg); break; @@ -347,6 +355,8 @@ struct virtio_user_backend_ops virtio_ops_vdpa = { .set_vring_num = vhost_vdpa_set_vring_num, .set_vring_base = vhost_vdpa_set_vring_base, .get_vring_base = vhost_vdpa_get_vring_base, + .set_vring_call = vhost_vdpa_set_vring_call, + .set_vring_kick = vhost_vdpa_set_vring_kick, .send_request = vhost_vdpa_send_request, .enable_qp = vhost_vdpa_enable_queue_pair, .dma_map = vhost_vdpa_dma_map, diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 496a48ee51..e4975838ea 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -40,7 +40,7 @@ virtio_user_create_queue(struct virtio_user_dev *dev, uint32_t queue_sel) file.index = queue_sel; file.fd = dev->callfds[queue_sel]; - dev->ops->send_request(dev, VHOST_USER_SET_VRING_CALL, &file); + dev->ops->set_vring_call(dev, &file); return 0; } @@ -89,7 +89,7 @@ virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel) */ file.index = queue_sel; file.fd = dev->kickfds[queue_sel]; - dev->ops->send_request(dev, VHOST_USER_SET_VRING_KICK, &file); + dev->ops->set_vring_kick(dev, &file); return 0; } From patchwork Sun Dec 20 21:13:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85554 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6F8F3A09FD; Sun, 20 Dec 2020 22:23:54 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2CCA2CC33; Sun, 20 Dec 2020 22:16:25 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id B2856CC33 for ; Sun, 20 Dec 2020 22:16:22 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498981; 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=7DUvftMSvmbyRTNIWIF+DPIPP1DD+jBwrcnwftBNwdE=; b=jCRKvR85Wfpw+mrAFFhu6907RYMDkQSc5tyqn+Y44ow8U90gPXRV0uf1vr5RNOdXQ8MOuC NG2qi0Ca6YlcbsEqsIWGm63h9TtaOrvQWVzqmi88a3LC/Eh4bQ2A/SM/OYu0KjLZdHrIkx gh6OPgh4DIvoxODjyVwBDsP/tC3TdNk= 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-140-ZKGSI1foMzS5CDIvicOGJA-1; Sun, 20 Dec 2020 16:16:19 -0500 X-MC-Unique: ZKGSI1foMzS5CDIvicOGJA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A54F9107ACE3; Sun, 20 Dec 2020 21:16:18 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 07E4B60C43; Sun, 20 Dec 2020 21:16:10 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:55 +0100 Message-Id: <20201220211405.313012-31-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 30/40] net/virtio: add Virtio-user vring address ops 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" This patch introduces a new callback for setting vrings addresses. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 1 + drivers/net/virtio/virtio_user/vhost_kernel.c | 32 +++++++++++++------ drivers/net/virtio/virtio_user/vhost_user.c | 29 +++++++++++++---- drivers/net/virtio/virtio_user/vhost_vdpa.c | 8 ++++- .../net/virtio/virtio_user/virtio_user_dev.c | 2 +- 5 files changed, 55 insertions(+), 17 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index b296ee215d..956eb58728 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -113,6 +113,7 @@ struct virtio_user_backend_ops { int (*get_vring_base)(struct virtio_user_dev *dev, struct vhost_vring_state *state); int (*set_vring_call)(struct virtio_user_dev *dev, struct vhost_vring_file *file); int (*set_vring_kick)(struct virtio_user_dev *dev, struct vhost_vring_file *file); + int (*set_vring_addr)(struct virtio_user_dev *dev, struct vhost_vring_addr *addr); int (*send_request)(struct virtio_user_dev *dev, enum vhost_user_request req, void *arg); diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index 1805aee7f7..8cd86b72c6 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -294,9 +294,30 @@ vhost_kernel_set_vring_call(struct virtio_user_dev *dev, struct vhost_vring_file return vhost_kernel_set_vring_file(dev, VHOST_SET_VRING_KICK, file); } +static int +vhost_kernel_set_vring_addr(struct virtio_user_dev *dev, struct vhost_vring_addr *addr) +{ + int ret, fd; + uint32_t index = addr->index; + + /* Convert from queue index to queue-pair & offset */ + fd = dev->vhostfds[addr->index / 2]; + addr->index %= 2; + + ret = vhost_kernel_ioctl(fd, VHOST_SET_VRING_ADDR, addr); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to set vring address"); + return -1; + } + + /* restore index back to queue index */ + addr->index = index; + + return 0; +} + static uint64_t vhost_req_user_to_kernel[] = { [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, - [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR, }; static int @@ -308,20 +329,12 @@ vhost_kernel_send_request(struct virtio_user_dev *dev, unsigned int i; uint64_t req_kernel; int vhostfd; - unsigned int queue_sel; PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]); req_kernel = vhost_req_user_to_kernel[req]; switch (req_kernel) { - case VHOST_SET_VRING_ADDR: - queue_sel = *(unsigned int *)arg; - vhostfd = dev->vhostfds[queue_sel / 2]; - *(unsigned int *)arg = queue_sel % 2; - PMD_DRV_LOG(DEBUG, "vhostfd=%d, index=%u", - vhostfd, *(unsigned int *)arg); - break; default: vhostfd = -1; } @@ -473,6 +486,7 @@ struct virtio_user_backend_ops virtio_ops_kernel = { .get_vring_base = vhost_kernel_get_vring_base, .set_vring_call = vhost_kernel_set_vring_call, .set_vring_kick = vhost_kernel_set_vring_kick, + .set_vring_addr = vhost_kernel_set_vring_addr, .send_request = vhost_kernel_send_request, .enable_qp = vhost_kernel_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index 509a96dfbc..59cf366683 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -523,11 +523,32 @@ vhost_user_set_vring_kick(struct virtio_user_dev *dev, struct vhost_vring_file * return vhost_user_set_vring_file(dev, VHOST_USER_SET_VRING_KICK, file); } + +static int +vhost_user_set_vring_addr(struct virtio_user_dev *dev, struct vhost_vring_addr *addr) +{ + int ret; + struct vhost_user_msg msg = { + .request = VHOST_USER_SET_VRING_ADDR, + .flags = VHOST_USER_VERSION, + .size = sizeof(*addr), + .payload.addr = *addr, + }; + + ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to send vring addresses"); + return -1; + } + + return 0; +} + + static struct vhost_user_msg m; const char * const vhost_msg_strings[] = { [VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER", - [VHOST_USER_SET_VRING_ADDR] = "VHOST_SET_VRING_ADDR", [VHOST_USER_SET_STATUS] = "VHOST_SET_STATUS", [VHOST_USER_GET_STATUS] = "VHOST_GET_STATUS", }; @@ -589,11 +610,6 @@ vhost_user_sock(struct virtio_user_dev *dev, fds[fd_num++] = *((int *)arg); break; - case VHOST_USER_SET_VRING_ADDR: - memcpy(&msg.payload.addr, arg, sizeof(msg.payload.addr)); - msg.size = sizeof(m.payload.addr); - break; - case VHOST_USER_SET_VRING_ERR: file = arg; msg.payload.u64 = file->index & VHOST_USER_VRING_IDX_MASK; @@ -767,6 +783,7 @@ struct virtio_user_backend_ops virtio_ops_user = { .get_vring_base = vhost_user_get_vring_base, .set_vring_call = vhost_user_set_vring_call, .set_vring_kick = vhost_user_set_vring_kick, + .set_vring_addr = vhost_user_set_vring_addr, .send_request = vhost_user_sock, .enable_qp = vhost_user_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index 48fe3f23e8..e09e7c9fb8 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -36,7 +36,6 @@ static uint64_t vhost_req_user_to_vdpa[] = { [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, - [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR, [VHOST_USER_SET_STATUS] = VHOST_VDPA_SET_STATUS, [VHOST_USER_GET_STATUS] = VHOST_VDPA_GET_STATUS, }; @@ -248,6 +247,12 @@ vhost_vdpa_set_vring_kick(struct virtio_user_dev *dev, struct vhost_vring_file * return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_KICK, file); } +static int +vhost_vdpa_set_vring_addr(struct virtio_user_dev *dev, struct vhost_vring_addr *addr) +{ + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_ADDR, addr); +} + /* with below features, vhost vdpa does not need to do the checksum and TSO, * these info will be passed to virtio_user through virtio net header. */ @@ -357,6 +362,7 @@ struct virtio_user_backend_ops virtio_ops_vdpa = { .get_vring_base = vhost_vdpa_get_vring_base, .set_vring_call = vhost_vdpa_set_vring_call, .set_vring_kick = vhost_vdpa_set_vring_kick, + .set_vring_addr = vhost_vdpa_set_vring_addr, .send_request = vhost_vdpa_send_request, .enable_qp = vhost_vdpa_enable_queue_pair, .dma_map = vhost_vdpa_dma_map, diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index e4975838ea..48ca7a2548 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -81,7 +81,7 @@ virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel) state.num |= (1 << 15); dev->ops->set_vring_base(dev, &state); - dev->ops->send_request(dev, VHOST_USER_SET_VRING_ADDR, &addr); + dev->ops->set_vring_addr(dev, &addr); /* Of all per virtqueue MSGs, make sure VHOST_USER_SET_VRING_KICK comes * lastly because vhost depends on this msg to judge if From patchwork Sun Dec 20 21:13:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85555 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id D8CDAA09FD; Sun, 20 Dec 2020 22:24:12 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CE40FCE53; Sun, 20 Dec 2020 22:16:28 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id 31404CE7B for ; Sun, 20 Dec 2020 22:16:27 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498985; 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=Y7HEod0hd5x+CMuDa+dgI0l7I1pYUB+SnHY3l5vZ8IU=; b=hDz4vJ13MOKYUdLmHwA/H9Q1foz3aZ7AaILM8TgF5yqq6jbNkDuonqVz56d7e+oYmHbd/z r0afkipQAtojLo8kPn13++NL0jtpYskUsffjRIj7n+KXHMjhOaDUloisZom5hwLjOOsyuV NnsaQVnvE0jm1DXkBLkeL0pOEmzl69U= 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-275-a7a3XGMONtOvxP36TZYdcg-1; Sun, 20 Dec 2020 16:16:23 -0500 X-MC-Unique: a7a3XGMONtOvxP36TZYdcg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8C66619251A1; Sun, 20 Dec 2020 21:16:22 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 13F4560C43; Sun, 20 Dec 2020 21:16:18 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:56 +0100 Message-Id: <20201220211405.313012-32-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 31/40] net/virtio: add Virtio-user status ops 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" This patch introduces new callbacks to get and set the device status. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 2 + drivers/net/virtio/virtio_user/vhost_kernel.c | 14 ++ drivers/net/virtio/virtio_user/vhost_user.c | 121 +++++++++++++----- drivers/net/virtio/virtio_user/vhost_vdpa.c | 16 ++- .../net/virtio/virtio_user/virtio_user_dev.c | 42 ++---- 5 files changed, 129 insertions(+), 66 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index 956eb58728..c85ba9a47b 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -114,6 +114,8 @@ struct virtio_user_backend_ops { int (*set_vring_call)(struct virtio_user_dev *dev, struct vhost_vring_file *file); int (*set_vring_kick)(struct virtio_user_dev *dev, struct vhost_vring_file *file); int (*set_vring_addr)(struct virtio_user_dev *dev, struct vhost_vring_addr *addr); + int (*get_status)(struct virtio_user_dev *dev, uint8_t *status); + int (*set_status)(struct virtio_user_dev *dev, uint8_t status); int (*send_request)(struct virtio_user_dev *dev, enum vhost_user_request req, void *arg); diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index 8cd86b72c6..0b74f73c97 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -316,6 +316,18 @@ vhost_kernel_set_vring_addr(struct virtio_user_dev *dev, struct vhost_vring_addr return 0; } +static int +vhost_kernel_get_status(struct virtio_user_dev *dev __rte_unused, uint8_t *status __rte_unused) +{ + return -ENOTSUP; +} + +static int +vhost_kernel_set_status(struct virtio_user_dev *dev __rte_unused, uint8_t status __rte_unused) +{ + return -ENOTSUP; +} + static uint64_t vhost_req_user_to_kernel[] = { [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, }; @@ -487,6 +499,8 @@ struct virtio_user_backend_ops virtio_ops_kernel = { .set_vring_call = vhost_kernel_set_vring_call, .set_vring_kick = vhost_kernel_set_vring_kick, .set_vring_addr = vhost_kernel_set_vring_addr, + .get_status = vhost_kernel_get_status, + .set_status = vhost_kernel_set_status, .send_request = vhost_kernel_send_request, .enable_qp = vhost_kernel_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index 59cf366683..d426b44fe7 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -544,13 +544,100 @@ vhost_user_set_vring_addr(struct virtio_user_dev *dev, struct vhost_vring_addr * return 0; } +static int +vhost_user_get_status(struct virtio_user_dev *dev, uint8_t *status) +{ + int ret; + struct vhost_user_msg msg = { + .request = VHOST_USER_GET_STATUS, + .flags = VHOST_USER_VERSION, + }; + + /* + * If features have not been negotiated, we don't know if the backend + * supports protocol features + */ + if (!(dev->status & VIRTIO_CONFIG_STATUS_FEATURES_OK)) + return -ENOTSUP; + + /* Status protocol feature requires protocol features support */ + if (!(dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES))) + return -ENOTSUP; + + if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) + return -ENOTSUP; + + ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to send request"); + goto err; + } + + ret = vhost_user_read(dev->vhostfd, &msg); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to recv request"); + goto err; + } + + if (msg.request != VHOST_USER_GET_STATUS) { + PMD_DRV_LOG(ERR, "Unexpected request type (%d)", msg.request); + goto err; + } + + if (msg.size != sizeof(msg.payload.u64)) { + PMD_DRV_LOG(ERR, "Unexpected payload size (%d)", msg.size); + goto err; + } + + *status = (uint8_t)msg.payload.u64; + + return 0; +err: + PMD_DRV_LOG(ERR, "Failed to get device status"); + return -1; +} + +static int +vhost_user_set_status(struct virtio_user_dev *dev, uint8_t status) +{ + int ret; + struct vhost_user_msg msg = { + .request = VHOST_USER_SET_STATUS, + .flags = VHOST_USER_VERSION, + .size = sizeof(msg.payload.u64), + .payload.u64 = status, + }; + + if (dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)) + msg.flags |= VHOST_USER_NEED_REPLY_MASK; + + /* + * If features have not been negotiated, we don't know if the backend + * supports protocol features + */ + if (!(dev->status & VIRTIO_CONFIG_STATUS_FEATURES_OK)) + return -ENOTSUP; + + /* Status protocol feature requires protocol features support */ + if (!(dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES))) + return -ENOTSUP; + + if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) + return -ENOTSUP; + + ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + if (ret < 0) { + PMD_DRV_LOG(ERR, "Failed to send get status request"); + return -1; + } + + return vhost_user_check_reply_ack(dev, &msg); +} static struct vhost_user_msg m; const char * const vhost_msg_strings[] = { [VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER", - [VHOST_USER_SET_STATUS] = "VHOST_SET_STATUS", - [VHOST_USER_GET_STATUS] = "VHOST_GET_STATUS", }; static int @@ -561,7 +648,6 @@ vhost_user_sock(struct virtio_user_dev *dev, struct vhost_user_msg msg; struct vhost_vring_file *file = 0; int need_reply = 0; - int has_reply_ack = 0; int fds[VHOST_MEMORY_MAX_NREGIONS]; int fd_num = 0; int vhostfd = dev->vhostfd; @@ -573,31 +659,11 @@ vhost_user_sock(struct virtio_user_dev *dev, if (dev->is_server && vhostfd < 0) return -1; - if (dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)) - has_reply_ack = 1; - msg.request = req; msg.flags = VHOST_USER_VERSION; msg.size = 0; switch (req) { - case VHOST_USER_GET_STATUS: - if (!(dev->status & VIRTIO_CONFIG_STATUS_FEATURES_OK) || - (!(dev->protocol_features & - (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))) - return -ENOTSUP; - need_reply = 1; - break; - - case VHOST_USER_SET_STATUS: - if (!(dev->status & VIRTIO_CONFIG_STATUS_FEATURES_OK) || - (!(dev->protocol_features & - (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))) - return -ENOTSUP; - - if (has_reply_ack) - msg.flags |= VHOST_USER_NEED_REPLY_MASK; - /* Fallthrough */ case VHOST_USER_SET_LOG_BASE: msg.payload.u64 = *((__u64 *)arg); msg.size = sizeof(m.payload.u64); @@ -644,13 +710,6 @@ vhost_user_sock(struct virtio_user_dev *dev, } switch (req) { - case VHOST_USER_GET_STATUS: - if (msg.size != sizeof(m.payload.u64)) { - PMD_DRV_LOG(ERR, "Received bad msg size"); - return -1; - } - *((__u64 *)arg) = msg.payload.u64; - break; default: /* Reply-ack handling */ if (msg.size != sizeof(m.payload.u64)) { @@ -784,6 +843,8 @@ struct virtio_user_backend_ops virtio_ops_user = { .set_vring_call = vhost_user_set_vring_call, .set_vring_kick = vhost_user_set_vring_kick, .set_vring_addr = vhost_user_set_vring_addr, + .get_status = vhost_user_get_status, + .set_status = vhost_user_set_status, .send_request = vhost_user_sock, .enable_qp = vhost_user_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index e09e7c9fb8..f4331884c3 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -36,8 +36,6 @@ static uint64_t vhost_req_user_to_vdpa[] = { [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, - [VHOST_USER_SET_STATUS] = VHOST_VDPA_SET_STATUS, - [VHOST_USER_GET_STATUS] = VHOST_VDPA_GET_STATUS, }; /* no alignment requirement */ @@ -253,6 +251,18 @@ vhost_vdpa_set_vring_addr(struct virtio_user_dev *dev, struct vhost_vring_addr * return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_ADDR, addr); } +static int +vhost_vdpa_get_status(struct virtio_user_dev *dev, uint8_t *status) +{ + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_VDPA_GET_STATUS, status); +} + +static int +vhost_vdpa_set_status(struct virtio_user_dev *dev, uint8_t status) +{ + return vhost_vdpa_ioctl(dev->vhostfd, VHOST_VDPA_SET_STATUS, &status); +} + /* with below features, vhost vdpa does not need to do the checksum and TSO, * these info will be passed to virtio_user through virtio net header. */ @@ -363,6 +373,8 @@ struct virtio_user_backend_ops virtio_ops_vdpa = { .set_vring_call = vhost_vdpa_set_vring_call, .set_vring_kick = vhost_vdpa_set_vring_kick, .set_vring_addr = vhost_vdpa_set_vring_addr, + .get_status = vhost_vdpa_get_status, + .set_status = vhost_vdpa_set_status, .send_request = vhost_vdpa_send_request, .enable_qp = vhost_vdpa_enable_queue_pair, .dma_map = vhost_vdpa_dma_map, diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 48ca7a2548..e1f016aa8c 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -805,21 +805,12 @@ int virtio_user_dev_set_status(struct virtio_user_dev *dev, uint8_t status) { int ret; - uint64_t arg = status; pthread_mutex_lock(&dev->mutex); dev->status = status; - if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) - ret = dev->ops->send_request(dev, - VHOST_USER_SET_STATUS, &arg); - else if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_VDPA) - ret = dev->ops->send_request(dev, - VHOST_USER_SET_STATUS, &status); - else - ret = -ENOTSUP; - + ret = dev->ops->set_status(dev, status); if (ret && ret != -ENOTSUP) { - PMD_INIT_LOG(ERR, "VHOST_USER_SET_STATUS failed (%d): %s", ret, + PMD_INIT_LOG(ERR, "Virtio-user set status failed (%d): %s", ret, strerror(errno)); } @@ -830,29 +821,13 @@ virtio_user_dev_set_status(struct virtio_user_dev *dev, uint8_t status) int virtio_user_dev_update_status(struct virtio_user_dev *dev) { - uint64_t ret; + int ret; uint8_t status; - int err; pthread_mutex_lock(&dev->mutex); - if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) { - err = dev->ops->send_request(dev, VHOST_USER_GET_STATUS, &ret); - if (!err && ret > UINT8_MAX) { - PMD_INIT_LOG(ERR, "Invalid VHOST_USER_GET_STATUS " - "response 0x%" PRIx64 "\n", ret); - err = -1; - goto error; - } - status = ret; - } else if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_VDPA) { - err = dev->ops->send_request(dev, VHOST_USER_GET_STATUS, - &status); - } else { - err = -ENOTSUP; - } - - if (!err) { + ret = dev->ops->get_status(dev, &status); + if (!ret) { dev->status = status; PMD_INIT_LOG(DEBUG, "Updated Device Status(0x%08x):\n" "\t-RESET: %u\n" @@ -870,12 +845,11 @@ virtio_user_dev_update_status(struct virtio_user_dev *dev) !!(dev->status & VIRTIO_CONFIG_STATUS_FEATURES_OK), !!(dev->status & VIRTIO_CONFIG_STATUS_DEV_NEED_RESET), !!(dev->status & VIRTIO_CONFIG_STATUS_FAILED)); - } else if (err != -ENOTSUP) { - PMD_INIT_LOG(ERR, "VHOST_USER_GET_STATUS failed (%d): %s", err, + } else if (ret != -ENOTSUP) { + PMD_INIT_LOG(ERR, "Virtio-user get status failed (%d): %s", ret, strerror(errno)); } -error: pthread_mutex_unlock(&dev->mutex); - return err; + return ret; } From patchwork Sun Dec 20 21:13:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85556 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id B4B0BA09FD; Sun, 20 Dec 2020 22:24:27 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3DDBFCE8B; Sun, 20 Dec 2020 22:16:32 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 586E1CE8A for ; Sun, 20 Dec 2020 22:16:29 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498987; 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=90MzPkDX+xD6Plj9y4yNgK6qNcHEJYVxqSoS2xLHO9Y=; b=GGTK6ljUOdM981Zpr+p7GgJG/Xhmov3zELK+KpGQO5MhYWZ1nLdOnApsd+jvv/MOsi8aK8 0jfyDhwR1Dbzb+HKsEKOB5aVh75oCYznZP3Hc1ueXAdmAUiqH2v2ve1rE6b0r37PaQC5Xq J+muU50Ch1dRx8TrX7G/008u4cTxo+A= 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-350-gk577GWcNjusEAGmWxDrfg-1; Sun, 20 Dec 2020 16:16:25 -0500 X-MC-Unique: gk577GWcNjusEAGmWxDrfg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E21D3800D62; Sun, 20 Dec 2020 21:16:24 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0351460C43; Sun, 20 Dec 2020 21:16:22 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:57 +0100 Message-Id: <20201220211405.313012-33-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 32/40] net/virtio: remove useless request ops 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" Now that all the ops have been implemented, we can remove the send_request ops for all backends. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 15 +-- drivers/net/virtio/virtio_user/vhost_kernel.c | 43 --------- drivers/net/virtio/virtio_user/vhost_user.c | 96 ------------------- drivers/net/virtio/virtio_user/vhost_vdpa.c | 49 ---------- 4 files changed, 3 insertions(+), 200 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index c85ba9a47b..3e39fd2246 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -88,8 +88,6 @@ enum vhost_user_request { VHOST_USER_MAX }; -extern const char * const vhost_msg_strings[VHOST_USER_MAX]; - struct vhost_memory_region { uint64_t guest_phys_addr; uint64_t memory_size; /* bytes */ @@ -116,16 +114,9 @@ struct virtio_user_backend_ops { int (*set_vring_addr)(struct virtio_user_dev *dev, struct vhost_vring_addr *addr); int (*get_status)(struct virtio_user_dev *dev, uint8_t *status); int (*set_status)(struct virtio_user_dev *dev, uint8_t status); - int (*send_request)(struct virtio_user_dev *dev, - enum vhost_user_request req, - void *arg); - int (*enable_qp)(struct virtio_user_dev *dev, - uint16_t pair_idx, - int enable); - int (*dma_map)(struct virtio_user_dev *dev, void *addr, - uint64_t iova, size_t len); - int (*dma_unmap)(struct virtio_user_dev *dev, void *addr, - uint64_t iova, size_t len); + int (*enable_qp)(struct virtio_user_dev *dev, uint16_t pair_idx, int enable); + int (*dma_map)(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len); + int (*dma_unmap)(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len); }; extern struct virtio_user_backend_ops virtio_ops_user; diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index 0b74f73c97..c4c9c9d085 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -328,48 +328,6 @@ vhost_kernel_set_status(struct virtio_user_dev *dev __rte_unused, uint8_t status return -ENOTSUP; } -static uint64_t vhost_req_user_to_kernel[] = { - [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, -}; - -static int -vhost_kernel_send_request(struct virtio_user_dev *dev, - enum vhost_user_request req, - void *arg) -{ - int ret = -1; - unsigned int i; - uint64_t req_kernel; - int vhostfd; - - PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]); - - req_kernel = vhost_req_user_to_kernel[req]; - - switch (req_kernel) { - default: - vhostfd = -1; - } - if (vhostfd == -1) { - for (i = 0; i < dev->max_queue_pairs; ++i) { - if (dev->vhostfds[i] < 0) - continue; - - ret = ioctl(dev->vhostfds[i], req_kernel, arg); - if (ret < 0) - break; - } - } else { - ret = ioctl(vhostfd, req_kernel, arg); - } - - if (ret < 0) - PMD_DRV_LOG(ERR, "%s failed: %s", - vhost_msg_strings[req], strerror(errno)); - - return ret; -} - /** * Set up environment to talk with a vhost kernel backend. * @@ -501,6 +459,5 @@ struct virtio_user_backend_ops virtio_ops_kernel = { .set_vring_addr = vhost_kernel_set_vring_addr, .get_status = vhost_kernel_get_status, .set_status = vhost_kernel_set_status, - .send_request = vhost_kernel_send_request, .enable_qp = vhost_kernel_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index d426b44fe7..0632b80050 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -634,101 +634,6 @@ vhost_user_set_status(struct virtio_user_dev *dev, uint8_t status) return vhost_user_check_reply_ack(dev, &msg); } -static struct vhost_user_msg m; - -const char * const vhost_msg_strings[] = { - [VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER", -}; - -static int -vhost_user_sock(struct virtio_user_dev *dev, - enum vhost_user_request req, - void *arg) -{ - struct vhost_user_msg msg; - struct vhost_vring_file *file = 0; - int need_reply = 0; - int fds[VHOST_MEMORY_MAX_NREGIONS]; - int fd_num = 0; - int vhostfd = dev->vhostfd; - - RTE_SET_USED(m); - - PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]); - - if (dev->is_server && vhostfd < 0) - return -1; - - msg.request = req; - msg.flags = VHOST_USER_VERSION; - msg.size = 0; - - switch (req) { - case VHOST_USER_SET_LOG_BASE: - msg.payload.u64 = *((__u64 *)arg); - msg.size = sizeof(m.payload.u64); - break; - - case VHOST_USER_RESET_OWNER: - break; - - case VHOST_USER_SET_LOG_FD: - fds[fd_num++] = *((int *)arg); - break; - - case VHOST_USER_SET_VRING_ERR: - file = arg; - msg.payload.u64 = file->index & VHOST_USER_VRING_IDX_MASK; - msg.size = sizeof(m.payload.u64); - if (file->fd > 0) - fds[fd_num++] = file->fd; - else - msg.payload.u64 |= VHOST_USER_VRING_NOFD_MASK; - break; - - default: - PMD_DRV_LOG(ERR, "trying to send unhandled msg type"); - return -1; - } - - if (vhost_user_write(vhostfd, &msg, fds, fd_num) < 0) { - PMD_DRV_LOG(ERR, "%s failed: %s", - vhost_msg_strings[req], strerror(errno)); - return -1; - } - - if (need_reply || msg.flags & VHOST_USER_NEED_REPLY_MASK) { - if (vhost_user_read(vhostfd, &msg) < 0) { - PMD_DRV_LOG(ERR, "Received msg failed: %s", - strerror(errno)); - return -1; - } - - if (req != msg.request) { - PMD_DRV_LOG(ERR, "Received unexpected msg type"); - return -1; - } - - switch (req) { - default: - /* Reply-ack handling */ - if (msg.size != sizeof(m.payload.u64)) { - PMD_DRV_LOG(ERR, "Received bad msg size"); - return -1; - } - - if (msg.payload.u64 != 0) { - PMD_DRV_LOG(ERR, "Slave replied NACK"); - return -1; - } - - break; - } - } - - return 0; -} - #define MAX_VIRTIO_USER_BACKLOG 1 static int virtio_user_start_server(struct virtio_user_dev *dev, struct sockaddr_un *un) @@ -845,6 +750,5 @@ struct virtio_user_backend_ops virtio_ops_user = { .set_vring_addr = vhost_user_set_vring_addr, .get_status = vhost_user_get_status, .set_status = vhost_user_set_status, - .send_request = vhost_user_sock, .enable_qp = vhost_user_enable_queue_pair }; diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index f4331884c3..ecfaeaf814 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -34,10 +34,6 @@ #define VHOST_VDPA_SET_STATUS _IOW(VHOST_VIRTIO, 0x72, __u8) #define VHOST_VDPA_SET_VRING_ENABLE _IOW(VHOST_VIRTIO, 0x75, struct vhost_vring_state) -static uint64_t vhost_req_user_to_vdpa[] = { - [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER, -}; - /* no alignment requirement */ struct vhost_iotlb_msg { uint64_t iova; @@ -263,50 +259,6 @@ vhost_vdpa_set_status(struct virtio_user_dev *dev, uint8_t status) return vhost_vdpa_ioctl(dev->vhostfd, VHOST_VDPA_SET_STATUS, &status); } -/* with below features, vhost vdpa does not need to do the checksum and TSO, - * these info will be passed to virtio_user through virtio net header. - */ -#define VHOST_VDPA_GUEST_OFFLOADS_MASK \ - ((1ULL << VIRTIO_NET_F_GUEST_CSUM) | \ - (1ULL << VIRTIO_NET_F_GUEST_TSO4) | \ - (1ULL << VIRTIO_NET_F_GUEST_TSO6) | \ - (1ULL << VIRTIO_NET_F_GUEST_ECN) | \ - (1ULL << VIRTIO_NET_F_GUEST_UFO)) - -#define VHOST_VDPA_HOST_OFFLOADS_MASK \ - ((1ULL << VIRTIO_NET_F_HOST_TSO4) | \ - (1ULL << VIRTIO_NET_F_HOST_TSO6) | \ - (1ULL << VIRTIO_NET_F_CSUM)) - -static int -vhost_vdpa_send_request(struct virtio_user_dev *dev, - enum vhost_user_request req, - void *arg) -{ - int ret = -1; - uint64_t req_vdpa; - - PMD_DRV_LOG(INFO, "%s", vhost_msg_strings[req]); - - req_vdpa = vhost_req_user_to_vdpa[req]; - - switch (req_vdpa) { - case VHOST_SET_VRING_ADDR: - PMD_DRV_LOG(DEBUG, "vhostfd=%d, index=%u", - dev->vhostfd, *(unsigned int *)arg); - break; - default: - break; - } - - ret = ioctl(dev->vhostfd, req_vdpa, arg); - if (ret < 0) - PMD_DRV_LOG(ERR, "%s failed: %s", - vhost_msg_strings[req], strerror(errno)); - - return ret; -} - /** * Set up environment to talk with a vhost vdpa backend. * @@ -375,7 +327,6 @@ struct virtio_user_backend_ops virtio_ops_vdpa = { .set_vring_addr = vhost_vdpa_set_vring_addr, .get_status = vhost_vdpa_get_status, .set_status = vhost_vdpa_set_status, - .send_request = vhost_vdpa_send_request, .enable_qp = vhost_vdpa_enable_queue_pair, .dma_map = vhost_vdpa_dma_map, .dma_unmap = vhost_vdpa_dma_unmap, From patchwork Sun Dec 20 21:13:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85557 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id EEFF8A09FD; Sun, 20 Dec 2020 22:24:41 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id BF0A4CEAC; Sun, 20 Dec 2020 22:16:33 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id B4380CE8B for ; Sun, 20 Dec 2020 22:16:31 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498990; 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=BwTu19Ans96LNSmrgDjgnmYd9CYqmsaaRG6HNpNoFP0=; b=i0LjGDudwqdVxMpg+P7DiBkT70Jf2hB/rDlG1kKLRISCL6ul2Whmq0SD37iNNoCXMCvsU/ CO861kr9BChTeC7BHH39K6R67b1IoLaXydwfNOpTPUrV1t2EBTPO263fGA7A9qZe1NXyaM O6VBAoMFCGRv+HI9xpbJP3/ILdZ2roQ= 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-528-h7sHsB8eMlqyFBuAV1218Q-1; Sun, 20 Dec 2020 16:16:28 -0500 X-MC-Unique: h7sHsB8eMlqyFBuAV1218Q-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2BCDB19251A1; Sun, 20 Dec 2020 21:16:27 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5134760C64; Sun, 20 Dec 2020 21:16:25 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:58 +0100 Message-Id: <20201220211405.313012-34-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 33/40] net/virtio: improve Virtio-user errors handling 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" This patch adds error logs and propagate errors reported by the backend. It also adds the device path in error logs to make it easier to distinguish which device is facing the issue. Signed-off-by: Maxime Coquelin --- .../net/virtio/virtio_user/virtio_user_dev.c | 155 ++++++++++++------ 1 file changed, 104 insertions(+), 51 deletions(-) diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index e1f016aa8c..b92b7f7aae 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -37,10 +37,15 @@ virtio_user_create_queue(struct virtio_user_dev *dev, uint32_t queue_sel) * pair. */ struct vhost_vring_file file; + int ret; file.index = queue_sel; file.fd = dev->callfds[queue_sel]; - dev->ops->set_vring_call(dev, &file); + ret = dev->ops->set_vring_call(dev, &file); + if (ret < 0) { + PMD_INIT_LOG(ERR, "(%s) Failed to create queue %u\n", dev->path, queue_sel); + return -1; + } return 0; } @@ -48,6 +53,7 @@ virtio_user_create_queue(struct virtio_user_dev *dev, uint32_t queue_sel) static int virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel) { + int ret; struct vhost_vring_file file; struct vhost_vring_state state; struct vring *vring = &dev->vrings[queue_sel]; @@ -73,15 +79,21 @@ virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel) state.index = queue_sel; state.num = vring->num; - dev->ops->set_vring_num(dev, &state); + ret = dev->ops->set_vring_num(dev, &state); + if (ret < 0) + goto err; state.index = queue_sel; state.num = 0; /* no reservation */ if (dev->features & (1ULL << VIRTIO_F_RING_PACKED)) state.num |= (1 << 15); - dev->ops->set_vring_base(dev, &state); + ret = dev->ops->set_vring_base(dev, &state); + if (ret < 0) + goto err; - dev->ops->set_vring_addr(dev, &addr); + ret = dev->ops->set_vring_addr(dev, &addr); + if (ret < 0) + goto err; /* Of all per virtqueue MSGs, make sure VHOST_USER_SET_VRING_KICK comes * lastly because vhost depends on this msg to judge if @@ -89,9 +101,15 @@ virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel) */ file.index = queue_sel; file.fd = dev->kickfds[queue_sel]; - dev->ops->set_vring_kick(dev, &file); + ret = dev->ops->set_vring_kick(dev, &file); + if (ret < 0) + goto err; return 0; +err: + PMD_INIT_LOG(ERR, "(%s) Failed to kick queue %u\n", dev->path, queue_sel); + + return -1; } static int @@ -103,14 +121,14 @@ virtio_user_queue_setup(struct virtio_user_dev *dev, for (i = 0; i < dev->max_queue_pairs; ++i) { queue_sel = 2 * i + VTNET_SQ_RQ_QUEUE_IDX; if (fn(dev, queue_sel) < 0) { - PMD_DRV_LOG(INFO, "setup rx vq fails: %u", i); + PMD_DRV_LOG(ERR, "(%s) setup rx vq fails: %u", dev->path, i); return -1; } } for (i = 0; i < dev->max_queue_pairs; ++i) { queue_sel = 2 * i + VTNET_SQ_TQ_QUEUE_IDX; if (fn(dev, queue_sel) < 0) { - PMD_DRV_LOG(INFO, "setup tx vq fails: %u", i); + PMD_DRV_LOG(INFO, "(%s) setup tx vq fails: %u", dev->path, i); return -1; } } @@ -144,7 +162,7 @@ virtio_user_dev_set_features(struct virtio_user_dev *dev) ret = dev->ops->set_features(dev, features); if (ret < 0) goto error; - PMD_DRV_LOG(INFO, "set features: %" PRIx64, features); + PMD_DRV_LOG(INFO, "(%s) set features: %" PRIx64, dev->path, features); error: pthread_mutex_unlock(&dev->mutex); @@ -172,9 +190,10 @@ virtio_user_start_device(struct virtio_user_dev *dev) rte_mcfg_mem_read_lock(); pthread_mutex_lock(&dev->mutex); + /* Vhost-user client not connected yet, will start later */ if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER && dev->vhostfd < 0) - goto error; + goto out; /* Step 2: share memory regions */ ret = dev->ops->set_memory_table(dev); @@ -182,15 +201,19 @@ virtio_user_start_device(struct virtio_user_dev *dev) goto error; /* Step 3: kick queues */ - if (virtio_user_queue_setup(dev, virtio_user_kick_queue) < 0) + ret = virtio_user_queue_setup(dev, virtio_user_kick_queue); + if (ret < 0) goto error; /* Step 4: enable queues * we enable the 1st queue pair by default. */ - dev->ops->enable_qp(dev, 0, 1); + ret = dev->ops->enable_qp(dev, 0, 1); + if (ret < 0) + goto error; dev->started = true; +out: pthread_mutex_unlock(&dev->mutex); rte_mcfg_mem_read_unlock(); @@ -198,6 +221,9 @@ virtio_user_start_device(struct virtio_user_dev *dev) error: pthread_mutex_unlock(&dev->mutex); rte_mcfg_mem_read_unlock(); + + PMD_INIT_LOG(ERR, "(%s) Failed to start device\n", dev->path); + /* TODO: free resource here or caller to check */ return -1; } @@ -206,31 +232,40 @@ int virtio_user_stop_device(struct virtio_user_dev *dev) { struct vhost_vring_state state; uint32_t i; - int error = 0; + int ret; pthread_mutex_lock(&dev->mutex); if (!dev->started) goto out; - for (i = 0; i < dev->max_queue_pairs; ++i) - dev->ops->enable_qp(dev, i, 0); + for (i = 0; i < dev->max_queue_pairs; ++i) { + ret = dev->ops->enable_qp(dev, i, 0); + if (ret < 0) + goto err; + } /* Stop the backend. */ for (i = 0; i < dev->max_queue_pairs * 2; ++i) { state.index = i; - if (dev->ops->get_vring_base(dev, &state) < 0) { - PMD_DRV_LOG(ERR, "get_vring_base failed, index=%u", - i); - error = -1; - goto out; + ret = dev->ops->get_vring_base(dev, &state); + if (ret < 0) { + PMD_DRV_LOG(ERR, "(%s) get_vring_base failed, index=%u", dev->path, i); + goto err; } } dev->started = false; + out: pthread_mutex_unlock(&dev->mutex); - return error; + return 0; +err: + pthread_mutex_unlock(&dev->mutex); + + PMD_INIT_LOG(ERR, "(%s) Failed to stop device\n", dev->path); + + return -1; } static inline void @@ -270,12 +305,12 @@ virtio_user_dev_init_notify(struct virtio_user_dev *dev) */ callfd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); if (callfd < 0) { - PMD_DRV_LOG(ERR, "callfd error, %s", strerror(errno)); + PMD_DRV_LOG(ERR, "(%s) callfd error, %s", dev->path, strerror(errno)); break; } kickfd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); if (kickfd < 0) { - PMD_DRV_LOG(ERR, "kickfd error, %s", strerror(errno)); + PMD_DRV_LOG(ERR, "(%s) kickfd error, %s", dev->path, strerror(errno)); break; } dev->callfds[i] = callfd; @@ -303,7 +338,7 @@ virtio_user_fill_intr_handle(struct virtio_user_dev *dev) if (!eth_dev->intr_handle) { eth_dev->intr_handle = malloc(sizeof(*eth_dev->intr_handle)); if (!eth_dev->intr_handle) { - PMD_DRV_LOG(ERR, "fail to allocate intr_handle"); + PMD_DRV_LOG(ERR, "(%s) fail to allocate intr_handle", dev->path); return -1; } memset(eth_dev->intr_handle, 0, sizeof(*eth_dev->intr_handle)); @@ -334,6 +369,7 @@ virtio_user_mem_event_cb(enum rte_mem_event type __rte_unused, struct virtio_user_dev *dev = arg; struct rte_memseg_list *msl; uint16_t i; + int ret = 0; /* ignore externally allocated memory */ msl = rte_mem_virt2memseg_list(addr); @@ -346,18 +382,29 @@ virtio_user_mem_event_cb(enum rte_mem_event type __rte_unused, goto exit; /* Step 1: pause the active queues */ - for (i = 0; i < dev->queue_pairs; i++) - dev->ops->enable_qp(dev, i, 0); + for (i = 0; i < dev->queue_pairs; i++) { + ret = dev->ops->enable_qp(dev, i, 0); + if (ret < 0) + goto exit; + } /* Step 2: update memory regions */ - dev->ops->set_memory_table(dev); + ret = dev->ops->set_memory_table(dev); + if (ret < 0) + goto exit; /* Step 3: resume the active queues */ - for (i = 0; i < dev->queue_pairs; i++) - dev->ops->enable_qp(dev, i, 1); + for (i = 0; i < dev->queue_pairs; i++) { + ret = dev->ops->enable_qp(dev, i, 1); + if (ret < 0) + goto exit; + } exit: pthread_mutex_unlock(&dev->mutex); + + if (ret < 0) + PMD_DRV_LOG(ERR, "(%s) Failed to update memory table\n", dev->path); } static int @@ -387,7 +434,7 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) dev->tapfds = malloc(dev->max_queue_pairs * sizeof(int)); if (!dev->vhostfds || !dev->tapfds) { - PMD_INIT_LOG(ERR, "Failed to malloc"); + PMD_INIT_LOG(ERR, "(%s) Failed to allocate FDs", dev->path); return -1; } @@ -399,19 +446,25 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) VIRTIO_USER_BACKEND_VHOST_VDPA) { dev->ops = &virtio_ops_vdpa; } else { - PMD_DRV_LOG(ERR, "Unknown backend type"); + PMD_DRV_LOG(ERR, "(%s) Unknown backend type", dev->path); return -1; } } - if (dev->ops->setup(dev) < 0) + if (dev->ops->setup(dev) < 0) { + PMD_INIT_LOG(ERR, "(%s) Failed to setup backend\n", dev->path); return -1; + } - if (virtio_user_dev_init_notify(dev) < 0) + if (virtio_user_dev_init_notify(dev) < 0) { + PMD_INIT_LOG(ERR, "(%s) Failed to init notifiers\n", dev->path); return -1; + } - if (virtio_user_fill_intr_handle(dev) < 0) + if (virtio_user_fill_intr_handle(dev) < 0) { + PMD_INIT_LOG(ERR, "(%s) Failed to init interrupt handler\n", dev->path); return -1; + } return 0; } @@ -472,7 +525,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, } if (virtio_user_dev_setup(dev) < 0) { - PMD_INIT_LOG(ERR, "backend set up fails"); + PMD_INIT_LOG(ERR, "(%s) backend set up fails", dev->path); return -1; } @@ -482,26 +535,29 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, if (!dev->is_server) { if (dev->ops->set_owner(dev) < 0) { - PMD_INIT_LOG(ERR, "set_owner fails: %s", - strerror(errno)); + PMD_INIT_LOG(ERR, "(%s) Failed to set backend owner", dev->path); return -1; } if (dev->ops->get_features(dev, &dev->device_features) < 0) { - PMD_INIT_LOG(ERR, "get_features failed: %s", - strerror(errno)); + PMD_INIT_LOG(ERR, "(%s) Failed to get backend features", dev->path); return -1; } - if (dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) { - if (dev->ops->get_protocol_features(dev, &protocol_features)) + if (dev->ops->get_protocol_features(dev, &protocol_features)) { + PMD_INIT_LOG(ERR, "(%s) Failed to get backend protocol features", + dev->path); return -1; + } dev->protocol_features &= protocol_features; - if (dev->ops->set_protocol_features(dev, dev->protocol_features)) + if (dev->ops->set_protocol_features(dev, dev->protocol_features)) { + PMD_INIT_LOG(ERR, "(%s) Failed to set backend protocol features", + dev->path); return -1; + } if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ); @@ -568,8 +624,8 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, if (rte_mem_event_callback_register(VIRTIO_USER_MEM_EVENT_CLB_NAME, virtio_user_mem_event_cb, dev)) { if (rte_errno != ENOTSUP) { - PMD_INIT_LOG(ERR, "Failed to register mem event" - " callback\n"); + PMD_INIT_LOG(ERR, "(%s) Failed to register mem event callback\n", + dev->path); return -1; } } @@ -622,8 +678,8 @@ virtio_user_handle_mq(struct virtio_user_dev *dev, uint16_t q_pairs) uint8_t ret = 0; if (q_pairs > dev->max_queue_pairs) { - PMD_INIT_LOG(ERR, "multi-q config %u, but only %u supported", - q_pairs, dev->max_queue_pairs); + PMD_INIT_LOG(ERR, "(%s) multi-q config %u, but only %u supported", + dev->path, q_pairs, dev->max_queue_pairs); return -1; } @@ -809,10 +865,8 @@ virtio_user_dev_set_status(struct virtio_user_dev *dev, uint8_t status) pthread_mutex_lock(&dev->mutex); dev->status = status; ret = dev->ops->set_status(dev, status); - if (ret && ret != -ENOTSUP) { - PMD_INIT_LOG(ERR, "Virtio-user set status failed (%d): %s", ret, - strerror(errno)); - } + if (ret && ret != -ENOTSUP) + PMD_INIT_LOG(ERR, "(%s) Failed to set backend status\n", dev->path); pthread_mutex_unlock(&dev->mutex); return ret; @@ -846,8 +900,7 @@ virtio_user_dev_update_status(struct virtio_user_dev *dev) !!(dev->status & VIRTIO_CONFIG_STATUS_DEV_NEED_RESET), !!(dev->status & VIRTIO_CONFIG_STATUS_FAILED)); } else if (ret != -ENOTSUP) { - PMD_INIT_LOG(ERR, "Virtio-user get status failed (%d): %s", ret, - strerror(errno)); + PMD_INIT_LOG(ERR, "(%s) Failed to get backend status\n", dev->path); } pthread_mutex_unlock(&dev->mutex); From patchwork Sun Dec 20 21:13:59 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85558 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 55814A09FD; Sun, 20 Dec 2020 22:25:01 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 63EBECC43; Sun, 20 Dec 2020 22:16:39 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 24F64CC43 for ; Sun, 20 Dec 2020 22:16:37 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608498995; 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=WRq+bjhtCLGG9tc5WI8EkVHypj3uwdPfKY4UFiHcB9s=; b=L0idilmc6MF2BaGGSkNgvuyhqNlJzfwUqsRMVOAJv605o4oSD3e2Ep48abxkfWcs/TWXHL G3ekXF+zxI1RUkaZaHGqqw2UAA1PDRv6bCGABLHIQRi7AtVgv6pVS+32Qyi/gcUjdj1bpU 9+Hzon78hmNU4lWQaIYSIOmAmyzgeEc= 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-540-AXn5V9zPO1qrLGmPOSJmYw-1; Sun, 20 Dec 2020 16:16:31 -0500 X-MC-Unique: AXn5V9zPO1qrLGmPOSJmYw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D27C6800D55; Sun, 20 Dec 2020 21:16:30 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8746660C43; Sun, 20 Dec 2020 21:16:27 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:13:59 +0100 Message-Id: <20201220211405.313012-35-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 34/40] net/virtio: move Vhost-user reqs to Vhost-user backend 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" Now that we have a proper isolation of the backends, we can move Vhost-user requests declaration to the Vhost-user backend file. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 25 --------------------- drivers/net/virtio/virtio_user/vhost_user.c | 25 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index 3e39fd2246..4fba203cc5 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -63,31 +63,6 @@ struct vhost_vring_addr { #define VHOST_USER_PROTOCOL_F_STATUS 16 #endif -enum vhost_user_request { - VHOST_USER_NONE = 0, - VHOST_USER_GET_FEATURES = 1, - VHOST_USER_SET_FEATURES = 2, - VHOST_USER_SET_OWNER = 3, - VHOST_USER_RESET_OWNER = 4, - VHOST_USER_SET_MEM_TABLE = 5, - VHOST_USER_SET_LOG_BASE = 6, - VHOST_USER_SET_LOG_FD = 7, - VHOST_USER_SET_VRING_NUM = 8, - VHOST_USER_SET_VRING_ADDR = 9, - VHOST_USER_SET_VRING_BASE = 10, - VHOST_USER_GET_VRING_BASE = 11, - VHOST_USER_SET_VRING_KICK = 12, - VHOST_USER_SET_VRING_CALL = 13, - VHOST_USER_SET_VRING_ERR = 14, - VHOST_USER_GET_PROTOCOL_FEATURES = 15, - VHOST_USER_SET_PROTOCOL_FEATURES = 16, - VHOST_USER_GET_QUEUE_NUM = 17, - VHOST_USER_SET_VRING_ENABLE = 18, - VHOST_USER_SET_STATUS = 39, - VHOST_USER_GET_STATUS = 40, - VHOST_USER_MAX -}; - struct vhost_memory_region { uint64_t guest_phys_addr; uint64_t memory_size; /* bytes */ diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index 0632b80050..a57106a468 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -27,6 +27,31 @@ struct vhost_memory { struct vhost_memory_region regions[VHOST_MEMORY_MAX_NREGIONS]; }; +enum vhost_user_request { + VHOST_USER_NONE = 0, + VHOST_USER_GET_FEATURES = 1, + VHOST_USER_SET_FEATURES = 2, + VHOST_USER_SET_OWNER = 3, + VHOST_USER_RESET_OWNER = 4, + VHOST_USER_SET_MEM_TABLE = 5, + VHOST_USER_SET_LOG_BASE = 6, + VHOST_USER_SET_LOG_FD = 7, + VHOST_USER_SET_VRING_NUM = 8, + VHOST_USER_SET_VRING_ADDR = 9, + VHOST_USER_SET_VRING_BASE = 10, + VHOST_USER_GET_VRING_BASE = 11, + VHOST_USER_SET_VRING_KICK = 12, + VHOST_USER_SET_VRING_CALL = 13, + VHOST_USER_SET_VRING_ERR = 14, + VHOST_USER_GET_PROTOCOL_FEATURES = 15, + VHOST_USER_SET_PROTOCOL_FEATURES = 16, + VHOST_USER_GET_QUEUE_NUM = 17, + VHOST_USER_SET_VRING_ENABLE = 18, + VHOST_USER_SET_STATUS = 39, + VHOST_USER_GET_STATUS = 40, + VHOST_USER_MAX +}; + struct vhost_user_msg { enum vhost_user_request request; From patchwork Sun Dec 20 21:14:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85559 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7879EA09FD; Sun, 20 Dec 2020 22:25:18 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 07E00CEB8; Sun, 20 Dec 2020 22:16:44 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id EBEB2CED6 for ; Sun, 20 Dec 2020 22:16:42 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608499001; 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=v9N4clUcbeV3+fDfwtPuD5EgJ+d4jB3IwnovhFhWS3Q=; b=jH+4x5C/xKmhxM0SBNQVGa5107eTEIpVwQ6rxs7AGebF1a3ZhelLxv5fd5H0k71o1m8zDI t5B8NoZMELZlEBU7INlCrXR1ALsQRitEA+mkvbp1i7BheB+i6Yq3Fmcgu2j1AO4xuF3U3f sVVZMmy4VOI20LKSGGoAV11de/V1m2w= 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-502-axQcj3FuNHWceo-jOHEx4g-1; Sun, 20 Dec 2020 16:16:39 -0500 X-MC-Unique: axQcj3FuNHWceo-jOHEx4g-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AE459805EE3; Sun, 20 Dec 2020 21:16:38 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3976E60C43; Sun, 20 Dec 2020 21:16:31 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:14:00 +0100 Message-Id: <20201220211405.313012-36-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 35/40] net/virtio: make server mode blocking 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" This patch makes the Vhost-user backend server mode blocking at init, waiting for the client connection. The goal is to make the driver more reliable, as without waiting for client connection, the Virtio driver has to assume the Vhost-user backend will support all the features it has advertized, which could lead to undefined behaviour. For example, without this patch, if the user enables packed ring Virtio feature but the backend does not support it, the ring initialized by the driver will not be compatible with the backend. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost_user.c | 9 +- .../net/virtio/virtio_user/virtio_user_dev.c | 118 +++++++----------- drivers/net/virtio/virtio_user_ethdev.c | 5 - 3 files changed, 54 insertions(+), 78 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index a57106a468..94a33326ae 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -677,6 +677,14 @@ virtio_user_start_server(struct virtio_user_dev *dev, struct sockaddr_un *un) if (ret < 0) return -1; + PMD_DRV_LOG(NOTICE, "(%s) waiting for client connection...", dev->path); + dev->vhostfd = accept(fd, NULL, NULL); + if (dev->vhostfd < 0) { + PMD_DRV_LOG(ERR, "Failed to accept initial client connection (%s)", + strerror(errno)); + return -1; + } + flag = fcntl(fd, F_GETFL); if (fcntl(fd, F_SETFL, flag | O_NONBLOCK) < 0) { PMD_DRV_LOG(ERR, "fcntl failed, %s", strerror(errno)); @@ -721,7 +729,6 @@ vhost_user_setup(struct virtio_user_dev *dev) close(fd); return -1; } - dev->vhostfd = -1; } else { if (connect(fd, (struct sockaddr *)&un, sizeof(un)) < 0) { PMD_DRV_LOG(ERR, "connect error, %s", strerror(errno)); diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index b92b7f7aae..19d59d401e 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -144,10 +144,6 @@ virtio_user_dev_set_features(struct virtio_user_dev *dev) pthread_mutex_lock(&dev->mutex); - if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER && - dev->vhostfd < 0) - goto error; - /* Step 0: tell vhost to create queues */ if (virtio_user_queue_setup(dev, virtio_user_create_queue) < 0) goto error; @@ -190,11 +186,6 @@ virtio_user_start_device(struct virtio_user_dev *dev) rte_mcfg_mem_read_lock(); pthread_mutex_lock(&dev->mutex); - /* Vhost-user client not connected yet, will start later */ - if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER && - dev->vhostfd < 0) - goto out; - /* Step 2: share memory regions */ ret = dev->ops->set_memory_table(dev); if (ret < 0) @@ -213,7 +204,7 @@ virtio_user_start_device(struct virtio_user_dev *dev) goto error; dev->started = true; -out: + pthread_mutex_unlock(&dev->mutex); rte_mcfg_mem_read_unlock(); @@ -421,36 +412,36 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) PMD_DRV_LOG(ERR, "Server mode only supports vhost-user!"); return -1; } + } + + if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) { dev->ops = &virtio_ops_user; - } else { - if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) { - dev->ops = &virtio_ops_user; - } else if (dev->backend_type == - VIRTIO_USER_BACKEND_VHOST_KERNEL) { - dev->ops = &virtio_ops_kernel; - - dev->vhostfds = malloc(dev->max_queue_pairs * - sizeof(int)); - dev->tapfds = malloc(dev->max_queue_pairs * - sizeof(int)); - if (!dev->vhostfds || !dev->tapfds) { - PMD_INIT_LOG(ERR, "(%s) Failed to allocate FDs", dev->path); - return -1; - } - - for (q = 0; q < dev->max_queue_pairs; ++q) { - dev->vhostfds[q] = -1; - dev->tapfds[q] = -1; - } - } else if (dev->backend_type == - VIRTIO_USER_BACKEND_VHOST_VDPA) { - dev->ops = &virtio_ops_vdpa; - } else { - PMD_DRV_LOG(ERR, "(%s) Unknown backend type", dev->path); + } else if (dev->backend_type == + VIRTIO_USER_BACKEND_VHOST_KERNEL) { + dev->ops = &virtio_ops_kernel; + + dev->vhostfds = malloc(dev->max_queue_pairs * + sizeof(int)); + dev->tapfds = malloc(dev->max_queue_pairs * + sizeof(int)); + if (!dev->vhostfds || !dev->tapfds) { + PMD_INIT_LOG(ERR, "(%s) Failed to allocate FDs", dev->path); return -1; } + + for (q = 0; q < dev->max_queue_pairs; ++q) { + dev->vhostfds[q] = -1; + dev->tapfds[q] = -1; + } + } else if (dev->backend_type == + VIRTIO_USER_BACKEND_VHOST_VDPA) { + dev->ops = &virtio_ops_vdpa; + } else { + PMD_DRV_LOG(ERR, "(%s) Unknown backend type", dev->path); + return -1; } + if (dev->ops->setup(dev) < 0) { PMD_INIT_LOG(ERR, "(%s) Failed to setup backend\n", dev->path); return -1; @@ -533,52 +524,35 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, dev->unsupported_features |= (1ULL << VHOST_USER_F_PROTOCOL_FEATURES); - if (!dev->is_server) { - if (dev->ops->set_owner(dev) < 0) { - PMD_INIT_LOG(ERR, "(%s) Failed to set backend owner", dev->path); - return -1; - } + if (dev->ops->set_owner(dev) < 0) { + PMD_INIT_LOG(ERR, "(%s) Failed to set backend owner", dev->path); + return -1; + } + + if (dev->ops->get_features(dev, &dev->device_features) < 0) { + PMD_INIT_LOG(ERR, "(%s) Failed to get backend features", dev->path); + return -1; + } - if (dev->ops->get_features(dev, &dev->device_features) < 0) { - PMD_INIT_LOG(ERR, "(%s) Failed to get backend features", dev->path); + if (dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) { + if (dev->ops->get_protocol_features(dev, &protocol_features)) { + PMD_INIT_LOG(ERR, "(%s) Failed to get backend protocol features", + dev->path); return -1; } - if (dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) { - if (dev->ops->get_protocol_features(dev, &protocol_features)) { - PMD_INIT_LOG(ERR, "(%s) Failed to get backend protocol features", - dev->path); - return -1; - } - - dev->protocol_features &= protocol_features; - - if (dev->ops->set_protocol_features(dev, dev->protocol_features)) { - PMD_INIT_LOG(ERR, "(%s) Failed to set backend protocol features", - dev->path); - return -1; - } + dev->protocol_features &= protocol_features; - if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) - dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ); + if (dev->ops->set_protocol_features(dev, dev->protocol_features)) { + PMD_INIT_LOG(ERR, "(%s) Failed to set backend protocol features", + dev->path); + return -1; } - } else { - /* We just pretend vhost-user can support all these features. - * Note that this could be problematic that if some feature is - * negotiated but not supported by the vhost-user which comes - * later. - */ - dev->device_features = VIRTIO_USER_SUPPORTED_FEATURES; - /* We cannot assume VHOST_USER_PROTOCOL_F_STATUS is supported - * until it's negotiated - */ - dev->protocol_features &= - ~(1ULL << VHOST_USER_PROTOCOL_F_STATUS); + if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) + dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ); } - - if (!mrg_rxbuf) dev->unsupported_features |= (1ull << VIRTIO_NET_F_MRG_RXBUF); diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index c63d010e16..c4cfd3daed 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -174,11 +174,6 @@ virtio_user_delayed_handler(void *param) if (dev->vhostfd >= 0) { close(dev->vhostfd); dev->vhostfd = -1; - /* Until the featuers are negotiated again, don't assume - * the backend supports VHOST_USER_PROTOCOL_F_STATUS - */ - dev->protocol_features &= - ~(1ULL << VHOST_USER_PROTOCOL_F_STATUS); } eth_dev->intr_handle->fd = dev->listenfd; rte_intr_callback_register(eth_dev->intr_handle, From patchwork Sun Dec 20 21:14:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85560 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7BA8FA09FD; Sun, 20 Dec 2020 22:25:36 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 52C1ECE4E; Sun, 20 Dec 2020 22:16:48 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 9C5B5CE4E for ; Sun, 20 Dec 2020 22:16:45 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608499004; 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=8zga5XzF1U/r3Tdo32CW2W1X6U3VrD3x2Nd0AE0Lw9Y=; b=iLFxLe2vjuRNpH3xKO4RrSSH7fGcV1A8Gxn95rMg+a41rxKagB5vrg0rCOPt+pV354oUzc X0u3rEBtzifK7wT6G4Wwx3dIhcT5oPuQUgqOZtAz2o4GHZp+5TWDbqA621+PnoysjW7NQd c29DGF6cVgZ9D4cWo1ffNZCCKGJ+/M8= 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-182-7gL9GrZaPVe7liRlSjfZ8Q-1; Sun, 20 Dec 2020 16:16:41 -0500 X-MC-Unique: 7gL9GrZaPVe7liRlSjfZ8Q-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C3143BBEE1; Sun, 20 Dec 2020 21:16:40 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 09CA960C43; Sun, 20 Dec 2020 21:16:38 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:14:01 +0100 Message-Id: <20201220211405.313012-37-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 36/40] net/virtio: move protocol features to Vhost-user 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" Since only protocol features are specific to Vhost-user backend, this patch moves all related code to Vhost-user file. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 20 +---- drivers/net/virtio/virtio_user/vhost_kernel.c | 9 +++ drivers/net/virtio/virtio_user/vhost_user.c | 79 +++++++++++++++---- drivers/net/virtio/virtio_user/vhost_vdpa.c | 9 +++ .../net/virtio/virtio_user/virtio_user_dev.c | 39 ++------- .../net/virtio/virtio_user/virtio_user_dev.h | 5 +- drivers/net/virtio/virtio_user_ethdev.c | 17 ---- 7 files changed, 92 insertions(+), 86 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index 4fba203cc5..b488ac78a1 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -46,23 +46,6 @@ struct vhost_vring_addr { uint64_t log_guest_addr; }; -#ifndef VHOST_USER_F_PROTOCOL_FEATURES -#define VHOST_USER_F_PROTOCOL_FEATURES 30 -#endif - -/** Protocol features. */ -#ifndef VHOST_USER_PROTOCOL_F_MQ -#define VHOST_USER_PROTOCOL_F_MQ 0 -#endif - -#ifndef VHOST_USER_PROTOCOL_F_REPLY_ACK -#define VHOST_USER_PROTOCOL_F_REPLY_ACK 3 -#endif - -#ifndef VHOST_USER_PROTOCOL_F_STATUS -#define VHOST_USER_PROTOCOL_F_STATUS 16 -#endif - struct vhost_memory_region { uint64_t guest_phys_addr; uint64_t memory_size; /* bytes */ @@ -74,11 +57,10 @@ struct virtio_user_dev; struct virtio_user_backend_ops { int (*setup)(struct virtio_user_dev *dev); + int (*get_backend_features)(uint64_t *features); int (*set_owner)(struct virtio_user_dev *dev); int (*get_features)(struct virtio_user_dev *dev, uint64_t *features); int (*set_features)(struct virtio_user_dev *dev, uint64_t features); - int (*get_protocol_features)(struct virtio_user_dev *dev, uint64_t *features); - int (*set_protocol_features)(struct virtio_user_dev *dev, uint64_t features); int (*set_memory_table)(struct virtio_user_dev *dev); int (*set_vring_enable)(struct virtio_user_dev *dev, struct vhost_vring_state *state); int (*set_vring_num)(struct virtio_user_dev *dev, struct vhost_vring_state *state); diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index c4c9c9d085..2fd00afa84 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -445,8 +445,17 @@ vhost_kernel_enable_queue_pair(struct virtio_user_dev *dev, return 0; } +static int +vhost_kernel_get_backend_features(uint64_t *features) +{ + *features = 0; + + return 0; +} + struct virtio_user_backend_ops virtio_ops_kernel = { .setup = vhost_kernel_setup, + .get_backend_features = vhost_kernel_get_backend_features, .set_owner = vhost_kernel_set_owner, .get_features = vhost_kernel_get_features, .set_features = vhost_kernel_set_features, diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index 94a33326ae..f67c40e047 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -17,6 +17,29 @@ #include "vhost.h" #include "virtio_user_dev.h" + +#ifndef VHOST_USER_F_PROTOCOL_FEATURES +#define VHOST_USER_F_PROTOCOL_FEATURES 30 +#endif + +/** Protocol features. */ +#ifndef VHOST_USER_PROTOCOL_F_MQ +#define VHOST_USER_PROTOCOL_F_MQ 0 +#endif + +#ifndef VHOST_USER_PROTOCOL_F_REPLY_ACK +#define VHOST_USER_PROTOCOL_F_REPLY_ACK 3 +#endif + +#ifndef VHOST_USER_PROTOCOL_F_STATUS +#define VHOST_USER_PROTOCOL_F_STATUS 16 +#endif + +#define VHOST_USER_SUPPORTED_PROTOCOL_FEATURES \ + (1ULL << VHOST_USER_PROTOCOL_F_MQ | \ + 1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK | \ + 1ULL << VHOST_USER_PROTOCOL_F_STATUS) + /* The version of the protocol we support */ #define VHOST_USER_VERSION 0x1 @@ -192,11 +215,11 @@ vhost_user_set_owner(struct virtio_user_dev *dev) } static int -vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features) +vhost_user_get_protocol_features(struct virtio_user_dev *dev, uint64_t *features) { int ret; struct vhost_user_msg msg = { - .request = VHOST_USER_GET_FEATURES, + .request = VHOST_USER_GET_PROTOCOL_FEATURES, .flags = VHOST_USER_VERSION, }; @@ -208,7 +231,7 @@ vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features) if (ret < 0) goto err; - if (msg.request != VHOST_USER_GET_FEATURES) { + if (msg.request != VHOST_USER_GET_PROTOCOL_FEATURES) { PMD_DRV_LOG(ERR, "Unexpected request type (%d)", msg.request); goto err; } @@ -222,17 +245,17 @@ vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features) return 0; err: - PMD_DRV_LOG(ERR, "Failed to get backend features"); + PMD_DRV_LOG(ERR, "Failed to get backend protocol features"); return -1; } static int -vhost_user_set_features(struct virtio_user_dev *dev, uint64_t features) +vhost_user_set_protocol_features(struct virtio_user_dev *dev, uint64_t features) { int ret; struct vhost_user_msg msg = { - .request = VHOST_USER_SET_FEATURES, + .request = VHOST_USER_SET_PROTOCOL_FEATURES, .flags = VHOST_USER_VERSION, .size = sizeof(features), .payload.u64 = features, @@ -240,7 +263,7 @@ vhost_user_set_features(struct virtio_user_dev *dev, uint64_t features) ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); if (ret < 0) { - PMD_DRV_LOG(ERR, "Failed to set features"); + PMD_DRV_LOG(ERR, "Failed to set protocol features"); return -1; } @@ -248,11 +271,11 @@ vhost_user_set_features(struct virtio_user_dev *dev, uint64_t features) } static int -vhost_user_get_protocol_features(struct virtio_user_dev *dev, uint64_t *features) +vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features) { int ret; struct vhost_user_msg msg = { - .request = VHOST_USER_GET_PROTOCOL_FEATURES, + .request = VHOST_USER_GET_FEATURES, .flags = VHOST_USER_VERSION, }; @@ -264,7 +287,7 @@ vhost_user_get_protocol_features(struct virtio_user_dev *dev, uint64_t *features if (ret < 0) goto err; - if (msg.request != VHOST_USER_GET_PROTOCOL_FEATURES) { + if (msg.request != VHOST_USER_GET_FEATURES) { PMD_DRV_LOG(ERR, "Unexpected request type (%d)", msg.request); goto err; } @@ -276,19 +299,36 @@ vhost_user_get_protocol_features(struct virtio_user_dev *dev, uint64_t *features *features = msg.payload.u64; + if (!(*features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES))) + return 0; + + /* Negotiate protocol features */ + ret = vhost_user_get_protocol_features(dev, &dev->protocol_features); + if (ret < 0) + goto err; + + dev->protocol_features &= VHOST_USER_SUPPORTED_PROTOCOL_FEATURES; + + ret = vhost_user_set_protocol_features(dev, dev->protocol_features); + if (ret < 0) + goto err; + + if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) + dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ); + return 0; err: - PMD_DRV_LOG(ERR, "Failed to get backend protocol features"); + PMD_DRV_LOG(ERR, "Failed to get backend features"); return -1; } static int -vhost_user_set_protocol_features(struct virtio_user_dev *dev, uint64_t features) +vhost_user_set_features(struct virtio_user_dev *dev, uint64_t features) { int ret; struct vhost_user_msg msg = { - .request = VHOST_USER_SET_PROTOCOL_FEATURES, + .request = VHOST_USER_SET_FEATURES, .flags = VHOST_USER_VERSION, .size = sizeof(features), .payload.u64 = features, @@ -296,7 +336,7 @@ vhost_user_set_protocol_features(struct virtio_user_dev *dev, uint64_t features) ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); if (ret < 0) { - PMD_DRV_LOG(ERR, "Failed to set protocol features"); + PMD_DRV_LOG(ERR, "Failed to set features"); return -1; } @@ -765,13 +805,20 @@ vhost_user_enable_queue_pair(struct virtio_user_dev *dev, return 0; } +static int +vhost_user_get_backend_features(uint64_t *features) +{ + *features = 1ULL << VHOST_USER_F_PROTOCOL_FEATURES; + + return 0; +} + struct virtio_user_backend_ops virtio_ops_user = { .setup = vhost_user_setup, + .get_backend_features = vhost_user_get_backend_features, .set_owner = vhost_user_set_owner, .get_features = vhost_user_get_features, .set_features = vhost_user_set_features, - .get_protocol_features = vhost_user_get_protocol_features, - .set_protocol_features = vhost_user_set_protocol_features, .set_memory_table = vhost_user_set_memory_table, .set_vring_enable = vhost_user_set_vring_enable, .set_vring_num = vhost_user_set_vring_num, diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index ecfaeaf814..c826f333e0 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -312,8 +312,17 @@ vhost_vdpa_enable_queue_pair(struct virtio_user_dev *dev, return 0; } +static int +vhost_vdpa_get_backend_features(uint64_t *features) +{ + *features = 0; + + return 0; +} + struct virtio_user_backend_ops virtio_ops_vdpa = { .setup = vhost_vdpa_setup, + .get_backend_features = vhost_vdpa_get_backend_features, .set_owner = vhost_vdpa_set_owner, .get_features = vhost_vdpa_get_features, .set_features = vhost_vdpa_set_features, diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 19d59d401e..974de133bc 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -479,13 +479,7 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) 1ULL << VIRTIO_NET_F_GUEST_TSO6 | \ 1ULL << VIRTIO_F_IN_ORDER | \ 1ULL << VIRTIO_F_VERSION_1 | \ - 1ULL << VIRTIO_F_RING_PACKED | \ - 1ULL << VHOST_USER_F_PROTOCOL_FEATURES) - -#define VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES \ - (1ULL << VHOST_USER_PROTOCOL_F_MQ | \ - 1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK | \ - 1ULL << VHOST_USER_PROTOCOL_F_STATUS) + 1ULL << VIRTIO_F_RING_PACKED) int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, @@ -493,7 +487,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, int server, int mrg_rxbuf, int in_order, int packed_vq, enum virtio_user_backend_type backend_type) { - uint64_t protocol_features = 0; + uint64_t backend_features; pthread_mutex_init(&dev->mutex, NULL); strlcpy(dev->path, path, PATH_MAX); @@ -504,8 +498,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, dev->is_server = server; dev->mac_specified = 0; dev->frontend_features = 0; - dev->unsupported_features = ~VIRTIO_USER_SUPPORTED_FEATURES; - dev->protocol_features = VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES; + dev->unsupported_features = 0; dev->backend_type = backend_type; parse_mac(dev, mac); @@ -520,37 +513,21 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, return -1; } - if (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) - dev->unsupported_features |= - (1ULL << VHOST_USER_F_PROTOCOL_FEATURES); - if (dev->ops->set_owner(dev) < 0) { PMD_INIT_LOG(ERR, "(%s) Failed to set backend owner", dev->path); return -1; } - if (dev->ops->get_features(dev, &dev->device_features) < 0) { + if (dev->ops->get_backend_features(&backend_features) < 0) { PMD_INIT_LOG(ERR, "(%s) Failed to get backend features", dev->path); return -1; } - if (dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) { - if (dev->ops->get_protocol_features(dev, &protocol_features)) { - PMD_INIT_LOG(ERR, "(%s) Failed to get backend protocol features", - dev->path); - return -1; - } - - dev->protocol_features &= protocol_features; + dev->unsupported_features = ~(VIRTIO_USER_SUPPORTED_FEATURES | backend_features); - if (dev->ops->set_protocol_features(dev, dev->protocol_features)) { - PMD_INIT_LOG(ERR, "(%s) Failed to set backend protocol features", - dev->path); - return -1; - } - - if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) - dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ); + if (dev->ops->get_features(dev, &dev->device_features) < 0) { + PMD_INIT_LOG(ERR, "(%s) Failed to get device features", dev->path); + return -1; } if (!mrg_rxbuf) diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index 0eb481ae21..b2da2944e9 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -30,6 +30,7 @@ struct virtio_user_dev { int vhostfd; int listenfd; /* listening fd */ bool is_server; /* server or client mode */ + uint64_t protocol_features; /* negotiated protocol features*/ /* for vhost_kernel backend */ char *ifname; @@ -49,9 +50,7 @@ struct virtio_user_dev { uint64_t device_features; /* supported features by device */ uint64_t frontend_features; /* enabled frontend features */ uint64_t unsupported_features; /* unsupported features mask */ - uint64_t protocol_features; /* negotiated protocol features - * (Vhost-user only) - */ + uint8_t status; uint16_t net_status; uint16_t port_id; diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index c4cfd3daed..77ad468768 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -70,7 +70,6 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) int ret, connectfd, old_status; struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id]; struct virtio_hw *hw = &dev->hw; - uint64_t protocol_features; connectfd = accept(dev->listenfd, NULL, NULL); if (connectfd < 0) @@ -91,22 +90,6 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev) return -1; } - if (dev->device_features & - (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)) { - if (dev->ops->get_protocol_features(dev, &protocol_features)) - return -1; - - /* Offer VHOST_USER_PROTOCOL_F_STATUS */ - dev->protocol_features |= (1ULL << VHOST_USER_PROTOCOL_F_STATUS); - dev->protocol_features &= protocol_features; - - if (dev->ops->set_protocol_features(dev, dev->protocol_features)) - return -1; - - if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) - dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ); - } - dev->device_features |= dev->frontend_features; /* umask vhost-user unsupported features */ From patchwork Sun Dec 20 21:14:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85561 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7E96AA09FD; Sun, 20 Dec 2020 22:25:53 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D8091CEEE; Sun, 20 Dec 2020 22:16:50 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by dpdk.org (Postfix) with ESMTP id 766D1CEE0 for ; Sun, 20 Dec 2020 22:16:49 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608499007; 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=l3zITSi7OoQVuppah+RVIxGZTK4BmjHp7Npgct7rNIU=; b=Yspif/uJJKAqeeGykt91YgkrCNWAgnCcO8LTQXR95Vj1JLXmXU0I8LwqXSlC3VJpTblSnx ty0K+X0+zsq+Pnvs2CgMKYCApeBszaYlyGKHZNPLDvYSeiAXn6kXC3mWI5oJDXHtq7PsVq MNYt9jX6AkCSsX63WroszDkUUzTEZUo= 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-531-o9WM2IXiMJ2KEdmiBk9yZg-1; Sun, 20 Dec 2020 16:16:46 -0500 X-MC-Unique: o9WM2IXiMJ2KEdmiBk9yZg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CD1DA1005504; Sun, 20 Dec 2020 21:16:44 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3739060C43; Sun, 20 Dec 2020 21:16:41 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:14:02 +0100 Message-Id: <20201220211405.313012-38-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 37/40] net/virtio: introduce backend data 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" The goal of this patch is to introduce backend-specific data in order to better isolate what is backend-specific from what is generic to Virtio-user. For now, only Vhost-user protocol features are moved to Vhost-user backend data. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 1 + drivers/net/virtio/virtio_user/vhost_kernel.c | 7 +++ drivers/net/virtio/virtio_user/vhost_user.c | 46 +++++++++++++++---- drivers/net/virtio/virtio_user/vhost_vdpa.c | 8 ++++ .../net/virtio/virtio_user/virtio_user_dev.c | 2 + .../net/virtio/virtio_user/virtio_user_dev.h | 3 +- 6 files changed, 58 insertions(+), 9 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index b488ac78a1..ee5598226d 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -57,6 +57,7 @@ struct virtio_user_dev; struct virtio_user_backend_ops { int (*setup)(struct virtio_user_dev *dev); + int (*destroy)(struct virtio_user_dev *dev); int (*get_backend_features)(uint64_t *features); int (*set_owner)(struct virtio_user_dev *dev); int (*get_features)(struct virtio_user_dev *dev, uint64_t *features); diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index 2fd00afa84..023fddcd69 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -357,6 +357,12 @@ vhost_kernel_setup(struct virtio_user_dev *dev) return 0; } +static int +vhost_kernel_destroy(struct virtio_user_dev *dev) +{ + return 0; +} + static int vhost_kernel_set_backend(int vhostfd, int tapfd) { @@ -455,6 +461,7 @@ vhost_kernel_get_backend_features(uint64_t *features) struct virtio_user_backend_ops virtio_ops_kernel = { .setup = vhost_kernel_setup, + .destroy = vhost_kernel_destroy, .get_backend_features = vhost_kernel_get_backend_features, .set_owner = vhost_kernel_set_owner, .get_features = vhost_kernel_get_features, diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index f67c40e047..e96b1d8b9c 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -17,6 +17,9 @@ #include "vhost.h" #include "virtio_user_dev.h" +struct vhost_user_data { + uint64_t protocol_features; +}; #ifndef VHOST_USER_F_PROTOCOL_FEATURES #define VHOST_USER_F_PROTOCOL_FEATURES 30 @@ -274,6 +277,7 @@ static int vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features) { int ret; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = VHOST_USER_GET_FEATURES, .flags = VHOST_USER_VERSION, @@ -303,17 +307,17 @@ vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features) return 0; /* Negotiate protocol features */ - ret = vhost_user_get_protocol_features(dev, &dev->protocol_features); + ret = vhost_user_get_protocol_features(dev, &data->protocol_features); if (ret < 0) goto err; - dev->protocol_features &= VHOST_USER_SUPPORTED_PROTOCOL_FEATURES; + data->protocol_features &= VHOST_USER_SUPPORTED_PROTOCOL_FEATURES; - ret = vhost_user_set_protocol_features(dev, dev->protocol_features); + ret = vhost_user_set_protocol_features(dev, data->protocol_features); if (ret < 0) goto err; - if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) + if (!(data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ))) dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ); return 0; @@ -429,12 +433,13 @@ vhost_user_set_memory_table(struct virtio_user_dev *dev) struct walk_arg wa; int fds[VHOST_MEMORY_MAX_NREGIONS]; int ret, fd_num; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = VHOST_USER_SET_MEM_TABLE, .flags = VHOST_USER_VERSION, }; - if (dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)) + if (data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)) msg.flags |= VHOST_USER_NEED_REPLY_MASK; wa.region_nr = 0; @@ -613,6 +618,7 @@ static int vhost_user_get_status(struct virtio_user_dev *dev, uint8_t *status) { int ret; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = VHOST_USER_GET_STATUS, .flags = VHOST_USER_VERSION, @@ -629,7 +635,7 @@ vhost_user_get_status(struct virtio_user_dev *dev, uint8_t *status) if (!(dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES))) return -ENOTSUP; - if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) + if (!(data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) return -ENOTSUP; ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); @@ -666,6 +672,7 @@ static int vhost_user_set_status(struct virtio_user_dev *dev, uint8_t status) { int ret; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = VHOST_USER_SET_STATUS, .flags = VHOST_USER_VERSION, @@ -673,7 +680,7 @@ vhost_user_set_status(struct virtio_user_dev *dev, uint8_t status) .payload.u64 = status, }; - if (dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)) + if (data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)) msg.flags |= VHOST_USER_NEED_REPLY_MASK; /* @@ -687,7 +694,7 @@ vhost_user_set_status(struct virtio_user_dev *dev, uint8_t status) if (!(dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES))) return -ENOTSUP; - if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) + if (!(data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) return -ENOTSUP; ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); @@ -747,6 +754,17 @@ vhost_user_setup(struct virtio_user_dev *dev) int fd; int flag; struct sockaddr_un un; + struct vhost_user_data *data; + + data = malloc(sizeof(*data)); + if (!data) { + PMD_DRV_LOG(ERR, "(%s) Failed to allocate Vhost-user data\n", dev->path); + return -1; + } + + memset(data, 0, sizeof(*data)); + + dev->backend_data = data; fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) { @@ -781,6 +799,17 @@ vhost_user_setup(struct virtio_user_dev *dev) return 0; } +static int +vhost_user_destroy(struct virtio_user_dev *dev) +{ + if (dev->backend_data) { + free(dev->backend_data); + dev->backend_data = NULL; + } + + return 0; +} + static int vhost_user_enable_queue_pair(struct virtio_user_dev *dev, uint16_t pair_idx, @@ -815,6 +844,7 @@ vhost_user_get_backend_features(uint64_t *features) struct virtio_user_backend_ops virtio_ops_user = { .setup = vhost_user_setup, + .destroy = vhost_user_destroy, .get_backend_features = vhost_user_get_backend_features, .set_owner = vhost_user_set_owner, .get_features = vhost_user_get_features, diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index c826f333e0..b29426d767 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -287,6 +287,13 @@ vhost_vdpa_setup(struct virtio_user_dev *dev) return 0; } +static int +vhost_vdpa_destroy(struct virtio_user_dev *dev __rte_unused) +{ + return; + return 0; +} + static int vhost_vdpa_enable_queue_pair(struct virtio_user_dev *dev, uint16_t pair_idx, @@ -322,6 +329,7 @@ vhost_vdpa_get_backend_features(uint64_t *features) struct virtio_user_backend_ops virtio_ops_vdpa = { .setup = vhost_vdpa_setup, + .destroy = vhost_vdpa_destroy, .get_backend_features = vhost_vdpa_get_backend_features, .set_owner = vhost_vdpa_set_owner, .get_features = vhost_vdpa_get_features, diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 974de133bc..8d19a0addd 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -620,6 +620,8 @@ virtio_user_dev_uninit(struct virtio_user_dev *dev) if (dev->is_server) unlink(dev->path); + + dev->ops->destroy(dev); } uint8_t diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index b2da2944e9..ec73d5de11 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -30,7 +30,6 @@ struct virtio_user_dev { int vhostfd; int listenfd; /* listening fd */ bool is_server; /* server or client mode */ - uint64_t protocol_features; /* negotiated protocol features*/ /* for vhost_kernel backend */ char *ifname; @@ -66,6 +65,8 @@ struct virtio_user_dev { struct virtio_user_backend_ops *ops; pthread_mutex_t mutex; bool started; + + void *backend_data; }; int virtio_user_dev_set_features(struct virtio_user_dev *dev); From patchwork Sun Dec 20 21:14:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85563 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8E6C0A09FD; Sun, 20 Dec 2020 22:26:24 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9DF4ECF0A; Sun, 20 Dec 2020 22:16:55 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id D936ECD46 for ; Sun, 20 Dec 2020 22:16:52 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608499011; 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=FymulNvUaPHU80Vp9vo+sTwH5MfRqRdHAkWkQAE7U2k=; b=hXi8IDB+8PWeR1vxXMKWZDngyPMfBBOYZnFDal13B0TEYCiV1zvnd2Vay7O4lHpv74MVHg LA/hZ3LyNLo5992ioczGROW0xZR4LkjeJ1bO0pCNYeFHD68vz02qL2XYRT5jiwzcQ3D98C icsNk3lE4IPF9kRzyaTLiDbV6oGXS20= 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-88-2z-Q8MBSNmmvAjaoP7z2PA-1; Sun, 20 Dec 2020 16:16:47 -0500 X-MC-Unique: 2z-Q8MBSNmmvAjaoP7z2PA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AA837BBEE0; Sun, 20 Dec 2020 21:16:46 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 27EB660C43; Sun, 20 Dec 2020 21:16:44 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:14:03 +0100 Message-Id: <20201220211405.313012-39-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 38/40] net/virtio: move Vhost-user specifics to its backend 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" This patch moves all the Vhost-user backend specific logic like Vhost FD, listen FD and interrupt handling to the vhost-user backend implementation. In order to achieve that, new ops are created to update the link status, disconnect and reconnect the server, and fetch the link state interrupt FD. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost.h | 4 + drivers/net/virtio/virtio_user/vhost_kernel.c | 18 +- drivers/net/virtio/virtio_user/vhost_user.c | 169 ++++++++++++++--- drivers/net/virtio/virtio_user/vhost_vdpa.c | 16 ++ .../net/virtio/virtio_user/virtio_user_dev.c | 175 ++++++++++++++--- .../net/virtio/virtio_user/virtio_user_dev.h | 9 +- drivers/net/virtio/virtio_user_ethdev.c | 179 +----------------- 7 files changed, 340 insertions(+), 230 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index ee5598226d..6001d7a164 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -75,6 +75,10 @@ struct virtio_user_backend_ops { int (*enable_qp)(struct virtio_user_dev *dev, uint16_t pair_idx, int enable); int (*dma_map)(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len); int (*dma_unmap)(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len); + int (*update_link_state)(struct virtio_user_dev *dev); + int (*server_disconnect)(struct virtio_user_dev *dev); + int (*server_reconnect)(struct virtio_user_dev *dev); + int (*get_intr_fd)(struct virtio_user_dev *dev); }; extern struct virtio_user_backend_ops virtio_ops_user; diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index 023fddcd69..0ba37b23dc 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -459,6 +459,20 @@ vhost_kernel_get_backend_features(uint64_t *features) return 0; } +static int +vhost_kernel_update_link_state(struct virtio_user_dev *dev __rte_unused) +{ + /* Nothing to update (Maybe get TAP interface link state?) */ + return 0; +} + +static int +vhost_kernel_get_intr_fd(struct virtio_user_dev *dev __rte_unused) +{ + /* No link state interrupt with Vhost-kernel */ + return -1; +} + struct virtio_user_backend_ops virtio_ops_kernel = { .setup = vhost_kernel_setup, .destroy = vhost_kernel_destroy, @@ -475,5 +489,7 @@ struct virtio_user_backend_ops virtio_ops_kernel = { .set_vring_addr = vhost_kernel_set_vring_addr, .get_status = vhost_kernel_get_status, .set_status = vhost_kernel_set_status, - .enable_qp = vhost_kernel_enable_queue_pair + .enable_qp = vhost_kernel_enable_queue_pair, + .update_link_state = vhost_kernel_update_link_state, + .get_intr_fd = vhost_kernel_get_intr_fd, }; diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index e96b1d8b9c..9892135bce 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -18,6 +19,8 @@ #include "virtio_user_dev.h" struct vhost_user_data { + int vhostfd; + int listenfd; uint64_t protocol_features; }; @@ -179,13 +182,14 @@ vhost_user_read(int fd, struct vhost_user_msg *msg) static int vhost_user_check_reply_ack(struct virtio_user_dev *dev, struct vhost_user_msg *msg) { + struct vhost_user_data *data = dev->backend_data; enum vhost_user_request req = msg->request; int ret; if (!(msg->flags & VHOST_USER_NEED_REPLY_MASK)) return 0; - ret = vhost_user_read(dev->vhostfd, msg); + ret = vhost_user_read(data->vhostfd, msg); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to read reply-ack"); return -1; @@ -203,12 +207,13 @@ static int vhost_user_set_owner(struct virtio_user_dev *dev) { int ret; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = VHOST_USER_SET_OWNER, .flags = VHOST_USER_VERSION, }; - ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + ret = vhost_user_write(data->vhostfd, &msg, NULL, 0); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to set owner"); return -1; @@ -221,16 +226,17 @@ static int vhost_user_get_protocol_features(struct virtio_user_dev *dev, uint64_t *features) { int ret; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = VHOST_USER_GET_PROTOCOL_FEATURES, .flags = VHOST_USER_VERSION, }; - ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + ret = vhost_user_write(data->vhostfd, &msg, NULL, 0); if (ret < 0) goto err; - ret = vhost_user_read(dev->vhostfd, &msg); + ret = vhost_user_read(data->vhostfd, &msg); if (ret < 0) goto err; @@ -257,6 +263,7 @@ static int vhost_user_set_protocol_features(struct virtio_user_dev *dev, uint64_t features) { int ret; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = VHOST_USER_SET_PROTOCOL_FEATURES, .flags = VHOST_USER_VERSION, @@ -264,7 +271,7 @@ vhost_user_set_protocol_features(struct virtio_user_dev *dev, uint64_t features) .payload.u64 = features, }; - ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + ret = vhost_user_write(data->vhostfd, &msg, NULL, 0); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to set protocol features"); return -1; @@ -283,11 +290,11 @@ vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features) .flags = VHOST_USER_VERSION, }; - ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + ret = vhost_user_write(data->vhostfd, &msg, NULL, 0); if (ret < 0) goto err; - ret = vhost_user_read(dev->vhostfd, &msg); + ret = vhost_user_read(data->vhostfd, &msg); if (ret < 0) goto err; @@ -331,6 +338,7 @@ static int vhost_user_set_features(struct virtio_user_dev *dev, uint64_t features) { int ret; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = VHOST_USER_SET_FEATURES, .flags = VHOST_USER_VERSION, @@ -338,7 +346,7 @@ vhost_user_set_features(struct virtio_user_dev *dev, uint64_t features) .payload.u64 = features, }; - ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + ret = vhost_user_write(data->vhostfd, &msg, NULL, 0); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to set features"); return -1; @@ -462,7 +470,7 @@ vhost_user_set_memory_table(struct virtio_user_dev *dev) msg.size += sizeof(msg.payload.memory.padding); msg.size += fd_num * sizeof(struct vhost_memory_region); - ret = vhost_user_write(dev->vhostfd, &msg, fds, fd_num); + ret = vhost_user_write(data->vhostfd, &msg, fds, fd_num); if (ret < 0) goto err; @@ -477,6 +485,7 @@ vhost_user_set_vring(struct virtio_user_dev *dev, enum vhost_user_request req, struct vhost_vring_state *state) { int ret; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = req, .flags = VHOST_USER_VERSION, @@ -484,7 +493,7 @@ vhost_user_set_vring(struct virtio_user_dev *dev, enum vhost_user_request req, .payload.state = *state, }; - ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + ret = vhost_user_write(data->vhostfd, &msg, NULL, 0); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to set vring state (request %d)", req); return -1; @@ -516,6 +525,7 @@ vhost_user_get_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state { int ret; struct vhost_user_msg msg; + struct vhost_user_data *data = dev->backend_data; unsigned int index = state->index; ret = vhost_user_set_vring(dev, VHOST_USER_GET_VRING_BASE, state); @@ -524,7 +534,7 @@ vhost_user_get_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state goto err; } - ret = vhost_user_read(dev->vhostfd, &msg); + ret = vhost_user_read(data->vhostfd, &msg); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to read reply"); goto err; @@ -560,6 +570,7 @@ vhost_user_set_vring_file(struct virtio_user_dev *dev, enum vhost_user_request r int ret; int fd = file->fd; int num_fd = 0; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = req, .flags = VHOST_USER_VERSION, @@ -572,7 +583,7 @@ vhost_user_set_vring_file(struct virtio_user_dev *dev, enum vhost_user_request r else msg.payload.u64 |= VHOST_USER_VRING_NOFD_MASK; - ret = vhost_user_write(dev->vhostfd, &msg, &fd, num_fd); + ret = vhost_user_write(data->vhostfd, &msg, &fd, num_fd); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to set vring file (request %d)", req); return -1; @@ -598,6 +609,7 @@ static int vhost_user_set_vring_addr(struct virtio_user_dev *dev, struct vhost_vring_addr *addr) { int ret; + struct vhost_user_data *data = dev->backend_data; struct vhost_user_msg msg = { .request = VHOST_USER_SET_VRING_ADDR, .flags = VHOST_USER_VERSION, @@ -605,7 +617,7 @@ vhost_user_set_vring_addr(struct virtio_user_dev *dev, struct vhost_vring_addr * .payload.addr = *addr, }; - ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + ret = vhost_user_write(data->vhostfd, &msg, NULL, 0); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to send vring addresses"); return -1; @@ -638,13 +650,13 @@ vhost_user_get_status(struct virtio_user_dev *dev, uint8_t *status) if (!(data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) return -ENOTSUP; - ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + ret = vhost_user_write(data->vhostfd, &msg, NULL, 0); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to send request"); goto err; } - ret = vhost_user_read(dev->vhostfd, &msg); + ret = vhost_user_read(data->vhostfd, &msg); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to recv request"); goto err; @@ -697,7 +709,7 @@ vhost_user_set_status(struct virtio_user_dev *dev, uint8_t status) if (!(data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) return -ENOTSUP; - ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0); + ret = vhost_user_write(data->vhostfd, &msg, NULL, 0); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to send get status request"); return -1; @@ -708,11 +720,12 @@ vhost_user_set_status(struct virtio_user_dev *dev, uint8_t status) #define MAX_VIRTIO_USER_BACKLOG 1 static int -virtio_user_start_server(struct virtio_user_dev *dev, struct sockaddr_un *un) +vhost_user_start_server(struct virtio_user_dev *dev, struct sockaddr_un *un) { int ret; int flag; - int fd = dev->listenfd; + struct vhost_user_data *data = dev->backend_data; + int fd = data->listenfd; ret = bind(fd, (struct sockaddr *)un, sizeof(*un)); if (ret < 0) { @@ -725,8 +738,8 @@ virtio_user_start_server(struct virtio_user_dev *dev, struct sockaddr_un *un) return -1; PMD_DRV_LOG(NOTICE, "(%s) waiting for client connection...", dev->path); - dev->vhostfd = accept(fd, NULL, NULL); - if (dev->vhostfd < 0) { + data->vhostfd = accept(fd, NULL, NULL); + if (data->vhostfd < 0) { PMD_DRV_LOG(ERR, "Failed to accept initial client connection (%s)", strerror(errno)); return -1; @@ -741,6 +754,37 @@ virtio_user_start_server(struct virtio_user_dev *dev, struct sockaddr_un *un) return 0; } +static int +vhost_user_server_disconnect(struct virtio_user_dev *dev) +{ + struct vhost_user_data *data = dev->backend_data; + + if (data->vhostfd < 0) { + PMD_DRV_LOG(ERR, "(%s) Expected valid Vhost FD", dev->path); + return -1; + } + + close(data->vhostfd); + data->vhostfd = -1; + + return 0; +} + +static int +vhost_user_server_reconnect(struct virtio_user_dev *dev) +{ + struct vhost_user_data *data = dev->backend_data; + int fd; + + fd = accept(data->listenfd, NULL, NULL); + if (fd < 0) + return -1; + + data->vhostfd = fd; + + return 0; +} + /** * Set up environment to talk with a vhost user backend. * @@ -766,6 +810,8 @@ vhost_user_setup(struct virtio_user_dev *dev) dev->backend_data = data; + data->vhostfd = -1; + fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) { PMD_DRV_LOG(ERR, "socket() error, %s", strerror(errno)); @@ -781,8 +827,8 @@ vhost_user_setup(struct virtio_user_dev *dev) strlcpy(un.sun_path, dev->path, sizeof(un.sun_path)); if (dev->is_server) { - dev->listenfd = fd; - if (virtio_user_start_server(dev, &un) < 0) { + data->listenfd = fd; + if (vhost_user_start_server(dev, &un) < 0) { PMD_DRV_LOG(ERR, "virtio-user startup fails in server mode"); close(fd); return -1; @@ -793,7 +839,7 @@ vhost_user_setup(struct virtio_user_dev *dev) close(fd); return -1; } - dev->vhostfd = fd; + data->vhostfd = fd; } return 0; @@ -802,6 +848,18 @@ vhost_user_setup(struct virtio_user_dev *dev) static int vhost_user_destroy(struct virtio_user_dev *dev) { + struct vhost_user_data *data = dev->backend_data; + + if (data->vhostfd >= 0) { + close(data->vhostfd); + data->vhostfd = -1; + } + + if (data->listenfd >= 0) { + close(data->listenfd); + data->listenfd = -1; + } + if (dev->backend_data) { free(dev->backend_data); dev->backend_data = NULL; @@ -815,8 +873,12 @@ vhost_user_enable_queue_pair(struct virtio_user_dev *dev, uint16_t pair_idx, int enable) { + struct vhost_user_data *data = dev->backend_data; int i; + if (data->vhostfd < 0) + return 0; + if (dev->qp_enabled[pair_idx] == enable) return 0; @@ -842,6 +904,61 @@ vhost_user_get_backend_features(uint64_t *features) return 0; } +static int +vhost_user_update_link_state(struct virtio_user_dev *dev) +{ + struct vhost_user_data *data = dev->backend_data; + char buf[128]; + + if (data->vhostfd >= 0) { + int r; + int flags; + + flags = fcntl(data->vhostfd, F_GETFL); + if (fcntl(data->vhostfd, F_SETFL, flags | O_NONBLOCK) == -1) { + PMD_DRV_LOG(ERR, "error setting O_NONBLOCK flag"); + return -1; + } + + r = recv(data->vhostfd, buf, 128, MSG_PEEK); + if (r == 0 || (r < 0 && errno != EAGAIN)) { + dev->net_status &= (~VIRTIO_NET_S_LINK_UP); + PMD_DRV_LOG(ERR, "virtio-user port %u is down", dev->port_id); + + /* This function could be called in the process + * of interrupt handling, callback cannot be + * unregistered here, set an alarm to do it. + */ + rte_eal_alarm_set(1, virtio_user_dev_delayed_handler, (void *)dev); + } else { + dev->net_status |= VIRTIO_NET_S_LINK_UP; + } + + if (fcntl(data->vhostfd, F_SETFL, + flags & ~O_NONBLOCK) == -1) { + PMD_DRV_LOG(ERR, "error clearing O_NONBLOCK flag"); + return -1; + } + } else if (dev->is_server) { + dev->net_status &= (~VIRTIO_NET_S_LINK_UP); + if (virtio_user_dev_server_reconnect(dev) >= 0) + dev->net_status |= VIRTIO_NET_S_LINK_UP; + } + + return 0; +} + +static int +vhost_user_get_intr_fd(struct virtio_user_dev *dev) +{ + struct vhost_user_data *data = dev->backend_data; + + if (dev->is_server && data->vhostfd == -1) + return data->listenfd; + + return data->vhostfd; +} + struct virtio_user_backend_ops virtio_ops_user = { .setup = vhost_user_setup, .destroy = vhost_user_destroy, @@ -859,5 +976,9 @@ struct virtio_user_backend_ops virtio_ops_user = { .set_vring_addr = vhost_user_set_vring_addr, .get_status = vhost_user_get_status, .set_status = vhost_user_set_status, - .enable_qp = vhost_user_enable_queue_pair + .enable_qp = vhost_user_enable_queue_pair, + .update_link_state = vhost_user_update_link_state, + .server_disconnect = vhost_user_server_disconnect, + .server_reconnect = vhost_user_server_reconnect, + .get_intr_fd = vhost_user_get_intr_fd, }; diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index b29426d767..0f422ae84a 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -327,6 +327,20 @@ vhost_vdpa_get_backend_features(uint64_t *features) return 0; } +static int +vhost_vdpa_update_link_state(struct virtio_user_dev *dev __rte_unused) +{ + /* Nothing to update (for now?) */ + return 0; +} + +static int +vhost_vdpa_get_intr_fd(struct virtio_user_dev *dev __rte_unused) +{ + /* No link state interrupt with Vhost-vDPA */ + return -1; +} + struct virtio_user_backend_ops virtio_ops_vdpa = { .setup = vhost_vdpa_setup, .destroy = vhost_vdpa_destroy, @@ -347,4 +361,6 @@ struct virtio_user_backend_ops virtio_ops_vdpa = { .enable_qp = vhost_vdpa_enable_queue_pair, .dma_map = vhost_vdpa_dma_map, .dma_unmap = vhost_vdpa_dma_unmap, + .update_link_state = vhost_vdpa_update_link_state, + .get_intr_fd = vhost_vdpa_get_intr_fd, }; diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 8d19a0addd..93a9ce2cd2 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -342,11 +342,7 @@ virtio_user_fill_intr_handle(struct virtio_user_dev *dev) eth_dev->intr_handle->type = RTE_INTR_HANDLE_VDEV; /* For virtio vdev, no need to read counter for clean */ eth_dev->intr_handle->efd_counter_size = 0; - eth_dev->intr_handle->fd = -1; - if (dev->vhostfd >= 0) - eth_dev->intr_handle->fd = dev->vhostfd; - else if (dev->is_server) - eth_dev->intr_handle->fd = dev->listenfd; + eth_dev->intr_handle->fd = dev->ops->get_intr_fd(dev); return 0; } @@ -403,7 +399,6 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) { uint32_t q; - dev->vhostfd = -1; dev->vhostfds = NULL; dev->tapfds = NULL; @@ -597,15 +592,6 @@ virtio_user_dev_uninit(struct virtio_user_dev *dev) close(dev->callfds[i]); close(dev->kickfds[i]); } - - if (dev->vhostfd >= 0) - close(dev->vhostfd); - - if (dev->is_server && dev->listenfd >= 0) { - close(dev->listenfd); - dev->listenfd = -1; - } - if (dev->vhostfds) { for (i = 0; i < dev->max_queue_pairs; ++i) { close(dev->vhostfds[i]); @@ -636,15 +622,11 @@ virtio_user_handle_mq(struct virtio_user_dev *dev, uint16_t q_pairs) return -1; } - /* Server mode can't enable queue pairs if vhostfd is invalid, - * always return 0 in this case. - */ - if (!dev->is_server || dev->vhostfd >= 0) { - for (i = 0; i < q_pairs; ++i) - ret |= dev->ops->enable_qp(dev, i, 1); - for (i = q_pairs; i < dev->max_queue_pairs; ++i) - ret |= dev->ops->enable_qp(dev, i, 0); - } + for (i = 0; i < q_pairs; ++i) + ret |= dev->ops->enable_qp(dev, i, 1); + for (i = q_pairs; i < dev->max_queue_pairs; ++i) + ret |= dev->ops->enable_qp(dev, i, 0); + dev->queue_pairs = q_pairs; return ret; @@ -859,3 +841,148 @@ virtio_user_dev_update_status(struct virtio_user_dev *dev) pthread_mutex_unlock(&dev->mutex); return ret; } + +int +virtio_user_dev_update_link_state(struct virtio_user_dev *dev) +{ + if (dev->ops->update_link_state) + return dev->ops->update_link_state(dev); + + return 0; +} + +static void +virtio_user_dev_reset_queues_packed(struct rte_eth_dev *eth_dev) +{ + struct virtio_user_dev *dev = eth_dev->data->dev_private; + struct virtio_hw *hw = &dev->hw; + struct virtnet_rx *rxvq; + struct virtnet_tx *txvq; + uint16_t i; + + /* Add lock to avoid queue contention. */ + rte_spinlock_lock(&hw->state_lock); + hw->started = 0; + + /* + * Waitting for datapath to complete before resetting queues. + * 1 ms should be enough for the ongoing Tx/Rx function to finish. + */ + rte_delay_ms(1); + + /* Vring reset for each Tx queue and Rx queue. */ + for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { + rxvq = eth_dev->data->rx_queues[i]; + virtqueue_rxvq_reset_packed(rxvq->vq); + virtio_dev_rx_queue_setup_finish(eth_dev, i); + } + + for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { + txvq = eth_dev->data->tx_queues[i]; + virtqueue_txvq_reset_packed(txvq->vq); + } + + hw->started = 1; + rte_spinlock_unlock(&hw->state_lock); +} + +void +virtio_user_dev_delayed_handler(void *param) +{ + struct virtio_user_dev *dev = param; + struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id]; + + if (rte_intr_disable(eth_dev->intr_handle) < 0) { + PMD_DRV_LOG(ERR, "interrupt disable failed"); + return; + } + rte_intr_callback_unregister(eth_dev->intr_handle, + virtio_interrupt_handler, eth_dev); + if (dev->is_server) { + dev->ops->server_disconnect(dev); + eth_dev->intr_handle->fd = dev->ops->get_intr_fd(dev); + rte_intr_callback_register(eth_dev->intr_handle, + virtio_interrupt_handler, eth_dev); + if (rte_intr_enable(eth_dev->intr_handle) < 0) { + PMD_DRV_LOG(ERR, "interrupt enable failed"); + return; + } + } +} + +int +virtio_user_dev_server_reconnect(struct virtio_user_dev *dev) +{ + int ret, old_status; + struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id]; + struct virtio_hw *hw = &dev->hw; + + if (!dev->ops->server_reconnect) { + PMD_DRV_LOG(ERR, "(%s) Missing server reconnect callback", dev->path); + return -1; + } + + old_status = virtio_get_status(hw); + + virtio_reset(hw); + + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_ACK); + + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); + + if (dev->ops->get_features(dev, &dev->device_features) < 0) { + PMD_INIT_LOG(ERR, "get_features failed: %s", + strerror(errno)); + return -1; + } + + dev->device_features |= dev->frontend_features; + + /* umask vhost-user unsupported features */ + dev->device_features &= ~(dev->unsupported_features); + + dev->features &= dev->device_features; + + /* For packed ring, resetting queues is required in reconnection. */ + if (virtio_with_packed_queue(hw) && + (old_status & VIRTIO_CONFIG_STATUS_DRIVER_OK)) { + PMD_INIT_LOG(NOTICE, "Packets on the fly will be dropped" + " when packed ring reconnecting."); + virtio_user_dev_reset_queues_packed(eth_dev); + } + + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); + + /* Start the device */ + virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK); + if (!dev->started) + return -1; + + if (dev->queue_pairs > 1) { + ret = virtio_user_handle_mq(dev, dev->queue_pairs); + if (ret != 0) { + PMD_INIT_LOG(ERR, "Fails to enable multi-queue pairs!"); + return -1; + } + } + if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) { + if (rte_intr_disable(eth_dev->intr_handle) < 0) { + PMD_DRV_LOG(ERR, "interrupt disable failed"); + return -1; + } + rte_intr_callback_unregister(eth_dev->intr_handle, + virtio_interrupt_handler, + eth_dev); + + eth_dev->intr_handle->fd = dev->ops->get_intr_fd(dev); + rte_intr_callback_register(eth_dev->intr_handle, + virtio_interrupt_handler, eth_dev); + + if (rte_intr_enable(eth_dev->intr_handle) < 0) { + PMD_DRV_LOG(ERR, "interrupt enable failed"); + return -1; + } + } + PMD_INIT_LOG(NOTICE, "server mode virtio-user reconnection succeeds!"); + return 0; +} diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index ec73d5de11..a429dcc57c 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -26,11 +26,11 @@ struct virtio_user_queue { struct virtio_user_dev { struct virtio_hw hw; enum virtio_user_backend_type backend_type; - /* for vhost_user backend */ - int vhostfd; - int listenfd; /* listening fd */ bool is_server; /* server or client mode */ + /* for vhost_vdpa backend */ + int vhostfd; + /* for vhost_kernel backend */ char *ifname; int *vhostfds; @@ -84,5 +84,8 @@ void virtio_user_handle_cq_packed(struct virtio_user_dev *dev, uint8_t virtio_user_handle_mq(struct virtio_user_dev *dev, uint16_t q_pairs); int virtio_user_dev_set_status(struct virtio_user_dev *dev, uint8_t status); int virtio_user_dev_update_status(struct virtio_user_dev *dev); +int virtio_user_dev_update_link_state(struct virtio_user_dev *dev); +void virtio_user_dev_delayed_handler(void *param); +int virtio_user_dev_server_reconnect(struct virtio_user_dev *dev); extern const char * const virtio_user_backend_strings[]; #endif diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 77ad468768..a287805cf2 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -28,146 +28,6 @@ #define virtio_user_get_dev(hw) container_of(hw, struct virtio_user_dev, hw) -static void -virtio_user_reset_queues_packed(struct rte_eth_dev *eth_dev) -{ - struct virtio_user_dev *dev = eth_dev->data->dev_private; - struct virtio_hw *hw = &dev->hw; - struct virtnet_rx *rxvq; - struct virtnet_tx *txvq; - uint16_t i; - - /* Add lock to avoid queue contention. */ - rte_spinlock_lock(&hw->state_lock); - hw->started = 0; - - /* - * Waitting for datapath to complete before resetting queues. - * 1 ms should be enough for the ongoing Tx/Rx function to finish. - */ - rte_delay_ms(1); - - /* Vring reset for each Tx queue and Rx queue. */ - for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { - rxvq = eth_dev->data->rx_queues[i]; - virtqueue_rxvq_reset_packed(rxvq->vq); - virtio_dev_rx_queue_setup_finish(eth_dev, i); - } - - for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { - txvq = eth_dev->data->tx_queues[i]; - virtqueue_txvq_reset_packed(txvq->vq); - } - - hw->started = 1; - rte_spinlock_unlock(&hw->state_lock); -} - - -static int -virtio_user_server_reconnect(struct virtio_user_dev *dev) -{ - int ret, connectfd, old_status; - struct rte_eth_dev *eth_dev = &rte_eth_devices[dev->port_id]; - struct virtio_hw *hw = &dev->hw; - - connectfd = accept(dev->listenfd, NULL, NULL); - if (connectfd < 0) - return -1; - - dev->vhostfd = connectfd; - old_status = virtio_get_status(hw); - - virtio_reset(hw); - - virtio_set_status(hw, VIRTIO_CONFIG_STATUS_ACK); - - virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER); - - if (dev->ops->get_features(dev, &dev->device_features) < 0) { - PMD_INIT_LOG(ERR, "get_features failed: %s", - strerror(errno)); - return -1; - } - - dev->device_features |= dev->frontend_features; - - /* umask vhost-user unsupported features */ - dev->device_features &= ~(dev->unsupported_features); - - dev->features &= dev->device_features; - - /* For packed ring, resetting queues is required in reconnection. */ - if (virtio_with_packed_queue(hw) && - (old_status & VIRTIO_CONFIG_STATUS_DRIVER_OK)) { - PMD_INIT_LOG(NOTICE, "Packets on the fly will be dropped" - " when packed ring reconnecting."); - virtio_user_reset_queues_packed(eth_dev); - } - - virtio_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK); - - /* Start the device */ - virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK); - if (!dev->started) - return -1; - - if (dev->queue_pairs > 1) { - ret = virtio_user_handle_mq(dev, dev->queue_pairs); - if (ret != 0) { - PMD_INIT_LOG(ERR, "Fails to enable multi-queue pairs!"); - return -1; - } - } - if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) { - if (rte_intr_disable(eth_dev->intr_handle) < 0) { - PMD_DRV_LOG(ERR, "interrupt disable failed"); - return -1; - } - rte_intr_callback_unregister(eth_dev->intr_handle, - virtio_interrupt_handler, - eth_dev); - eth_dev->intr_handle->fd = connectfd; - rte_intr_callback_register(eth_dev->intr_handle, - virtio_interrupt_handler, eth_dev); - - if (rte_intr_enable(eth_dev->intr_handle) < 0) { - PMD_DRV_LOG(ERR, "interrupt enable failed"); - return -1; - } - } - PMD_INIT_LOG(NOTICE, "server mode virtio-user reconnection succeeds!"); - return 0; -} - -static void -virtio_user_delayed_handler(void *param) -{ - struct virtio_hw *hw = (struct virtio_hw *)param; - struct rte_eth_dev *eth_dev = &rte_eth_devices[hw->port_id]; - struct virtio_user_dev *dev = virtio_user_get_dev(hw); - - if (rte_intr_disable(eth_dev->intr_handle) < 0) { - PMD_DRV_LOG(ERR, "interrupt disable failed"); - return; - } - rte_intr_callback_unregister(eth_dev->intr_handle, - virtio_interrupt_handler, eth_dev); - if (dev->is_server) { - if (dev->vhostfd >= 0) { - close(dev->vhostfd); - dev->vhostfd = -1; - } - eth_dev->intr_handle->fd = dev->listenfd; - rte_intr_callback_register(eth_dev->intr_handle, - virtio_interrupt_handler, eth_dev); - if (rte_intr_enable(eth_dev->intr_handle) < 0) { - PMD_DRV_LOG(ERR, "interrupt enable failed"); - return; - } - } -} - static void virtio_user_read_dev_config(struct virtio_hw *hw, size_t offset, void *dst, int length) @@ -183,44 +43,7 @@ virtio_user_read_dev_config(struct virtio_hw *hw, size_t offset, } if (offset == offsetof(struct virtio_net_config, status)) { - char buf[128]; - - if (dev->vhostfd >= 0) { - int r; - int flags; - - flags = fcntl(dev->vhostfd, F_GETFL); - if (fcntl(dev->vhostfd, F_SETFL, - flags | O_NONBLOCK) == -1) { - PMD_DRV_LOG(ERR, "error setting O_NONBLOCK flag"); - return; - } - r = recv(dev->vhostfd, buf, 128, MSG_PEEK); - if (r == 0 || (r < 0 && errno != EAGAIN)) { - dev->net_status &= (~VIRTIO_NET_S_LINK_UP); - PMD_DRV_LOG(ERR, "virtio-user port %u is down", - hw->port_id); - - /* This function could be called in the process - * of interrupt handling, callback cannot be - * unregistered here, set an alarm to do it. - */ - rte_eal_alarm_set(1, - virtio_user_delayed_handler, - (void *)hw); - } else { - dev->net_status |= VIRTIO_NET_S_LINK_UP; - } - if (fcntl(dev->vhostfd, F_SETFL, - flags & ~O_NONBLOCK) == -1) { - PMD_DRV_LOG(ERR, "error clearing O_NONBLOCK flag"); - return; - } - } else if (dev->is_server) { - dev->net_status &= (~VIRTIO_NET_S_LINK_UP); - if (virtio_user_server_reconnect(dev) >= 0) - dev->net_status |= VIRTIO_NET_S_LINK_UP; - } + virtio_user_dev_update_link_state(dev); *(uint16_t *)dst = dev->net_status; } From patchwork Sun Dec 20 21:14:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85562 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id B9767A09FD; Sun, 20 Dec 2020 22:26:09 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 64431CEF4; Sun, 20 Dec 2020 22:16:54 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id EDDC0CEF4 for ; Sun, 20 Dec 2020 22:16:52 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608499011; 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=AjK9vAD8Iqn/DPPcUZTKj9bIBq7JhCZPgKj/Bwk9XPY=; b=Y3YToF/kTbQCcK/gESkmC1npFQOg3Hfxf14jRv9/1VPmdaBeEsKhYdwAH93eZrp/tCksul lGTj9Mcn8BcuwDudl39ujZ0NT5Qdkd1XOmpPIA0pWjFJTaWhxDlVtj5GQbO+Ilk4SwXaUH gv6R+QHEKULuCO6o8H2T2vQ4kV6I1/g= 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-436-r5dpp9QPM82CG26bRra4Mg-1; Sun, 20 Dec 2020 16:16:49 -0500 X-MC-Unique: r5dpp9QPM82CG26bRra4Mg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B2F8C805EF2; Sun, 20 Dec 2020 21:16:48 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0F5BE60C43; Sun, 20 Dec 2020 21:16:46 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:14:04 +0100 Message-Id: <20201220211405.313012-40-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 39/40] net/virtio: move Vhost-kernel data to its backend 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" As done earlier for Vhost-user, this patch moves the Vhost-Kernel specific data to its backend file. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost_kernel.c | 78 +++++++++++++++---- .../net/virtio/virtio_user/virtio_user_dev.c | 43 ++-------- .../net/virtio/virtio_user/virtio_user_dev.h | 7 +- 3 files changed, 72 insertions(+), 56 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c index 0ba37b23dc..b8f5391733 100644 --- a/drivers/net/virtio/virtio_user/vhost_kernel.c +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c @@ -14,6 +14,11 @@ #include "virtio_user_dev.h" #include "vhost_kernel_tap.h" +struct vhost_kernel_data { + int *vhostfds; + int *tapfds; +}; + struct vhost_memory_kernel { uint32_t nregions; uint32_t padding; @@ -96,7 +101,9 @@ vhost_kernel_ioctl(int fd, uint64_t request, void *arg) static int vhost_kernel_set_owner(struct virtio_user_dev *dev) { - return vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_OWNER, NULL); + struct vhost_kernel_data *data = dev->backend_data; + + return vhost_kernel_ioctl(data->vhostfds[0], VHOST_SET_OWNER, NULL); } static int @@ -104,8 +111,9 @@ vhost_kernel_get_features(struct virtio_user_dev *dev, uint64_t *features) { int ret; unsigned int tap_features; + struct vhost_kernel_data *data = dev->backend_data; - ret = vhost_kernel_ioctl(dev->vhostfds[0], VHOST_GET_FEATURES, features); + ret = vhost_kernel_ioctl(data->vhostfds[0], VHOST_GET_FEATURES, features); if (ret < 0) { PMD_DRV_LOG(ERR, "Failed to get features"); return -1; @@ -138,6 +146,8 @@ vhost_kernel_get_features(struct virtio_user_dev *dev, uint64_t *features) static int vhost_kernel_set_features(struct virtio_user_dev *dev, uint64_t features) { + struct vhost_kernel_data *data = dev->backend_data; + /* We don't need memory protection here */ features &= ~(1ULL << VIRTIO_F_IOMMU_PLATFORM); /* VHOST kernel does not know about below flags */ @@ -145,7 +155,7 @@ vhost_kernel_set_features(struct virtio_user_dev *dev, uint64_t features) features &= ~VHOST_KERNEL_HOST_OFFLOADS_MASK; features &= ~(1ULL << VIRTIO_NET_F_MQ); - return vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_FEATURES, &features); + return vhost_kernel_ioctl(data->vhostfds[0], VHOST_SET_FEATURES, &features); } static int @@ -185,6 +195,7 @@ add_memseg_list(const struct rte_memseg_list *msl, void *arg) static int vhost_kernel_set_memory_table(struct virtio_user_dev *dev) { + struct vhost_kernel_data *data = dev->backend_data; struct vhost_memory_kernel *vm; int ret; @@ -205,7 +216,7 @@ vhost_kernel_set_memory_table(struct virtio_user_dev *dev) if (ret < 0) goto err_free; - ret = vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_MEM_TABLE, vm); + ret = vhost_kernel_ioctl(data->vhostfds[0], VHOST_SET_MEM_TABLE, vm); if (ret < 0) goto err_free; @@ -224,9 +235,10 @@ vhost_kernel_set_vring(struct virtio_user_dev *dev, uint64_t req, struct vhost_v { int ret, fd; uint32_t index = state->index; + struct vhost_kernel_data *data = dev->backend_data; /* Convert from queue index to queue-pair & offset */ - fd = dev->vhostfds[state->index / 2]; + fd = data->vhostfds[state->index / 2]; state->index %= 2; ret = vhost_kernel_ioctl(fd, req, state); @@ -265,9 +277,10 @@ vhost_kernel_set_vring_file(struct virtio_user_dev *dev, uint64_t req, { int ret, fd; uint32_t index = file->index; + struct vhost_kernel_data *data = dev->backend_data; /* Convert from queue index to queue-pair & offset */ - fd = dev->vhostfds[file->index / 2]; + fd = data->vhostfds[file->index / 2]; file->index %= 2; ret = vhost_kernel_ioctl(fd, req, file); @@ -299,9 +312,10 @@ vhost_kernel_set_vring_addr(struct virtio_user_dev *dev, struct vhost_vring_addr { int ret, fd; uint32_t index = addr->index; + struct vhost_kernel_data *data = dev->backend_data; /* Convert from queue index to queue-pair & offset */ - fd = dev->vhostfds[addr->index / 2]; + fd = data->vhostfds[addr->index / 2]; addr->index %= 2; ret = vhost_kernel_ioctl(fd, VHOST_SET_VRING_ADDR, addr); @@ -339,19 +353,37 @@ static int vhost_kernel_setup(struct virtio_user_dev *dev) { int vhostfd; - uint32_t i; + uint32_t q, i; + struct vhost_kernel_data *data; + + data = malloc(sizeof(*data)); + if (!data) { + PMD_INIT_LOG(ERR, "(%s) Failed to allocate Vhost-kernel data", dev->path); + return -1; + } + + data->vhostfds = malloc(dev->max_queue_pairs * sizeof(int)); + data->tapfds = malloc(dev->max_queue_pairs * sizeof(int)); + if (!data->vhostfds || !data->tapfds) { + PMD_INIT_LOG(ERR, "(%s) Failed to allocate FDs", dev->path); + return -1; + } + + for (q = 0; q < dev->max_queue_pairs; ++q) { + data->vhostfds[q] = -1; + data->tapfds[q] = -1; + } get_vhost_kernel_max_regions(); for (i = 0; i < dev->max_queue_pairs; ++i) { vhostfd = open(dev->path, O_RDWR); if (vhostfd < 0) { - PMD_DRV_LOG(ERR, "fail to open %s, %s", - dev->path, strerror(errno)); + PMD_DRV_LOG(ERR, "fail to open %s, %s", dev->path, strerror(errno)); return -1; } - dev->vhostfds[i] = vhostfd; + data->vhostfds[i] = vhostfd; } return 0; @@ -360,6 +392,19 @@ vhost_kernel_setup(struct virtio_user_dev *dev) static int vhost_kernel_destroy(struct virtio_user_dev *dev) { + struct vhost_kernel_data *data = dev->backend_data; + uint32_t i; + + for (i = 0; i < dev->max_queue_pairs; ++i) { + close(data->vhostfds[i]); + if (data->tapfds[i] >= 0) + close(data->tapfds[i]); + } + + free(data->vhostfds); + free(data->tapfds); + free(data); + return 0; } @@ -395,14 +440,15 @@ vhost_kernel_enable_queue_pair(struct virtio_user_dev *dev, int vhostfd; int tapfd; int req_mq = (dev->max_queue_pairs > 1); + struct vhost_kernel_data *data = dev->backend_data; - vhostfd = dev->vhostfds[pair_idx]; + vhostfd = data->vhostfds[pair_idx]; if (dev->qp_enabled[pair_idx] == enable) return 0; if (!enable) { - tapfd = dev->tapfds[pair_idx]; + tapfd = data->tapfds[pair_idx]; if (vhost_kernel_set_backend(vhostfd, -1) < 0) { PMD_DRV_LOG(ERR, "fail to set backend for vhost kernel"); return -1; @@ -415,8 +461,8 @@ vhost_kernel_enable_queue_pair(struct virtio_user_dev *dev, return 0; } - if (dev->tapfds[pair_idx] >= 0) { - tapfd = dev->tapfds[pair_idx]; + if (data->tapfds[pair_idx] >= 0) { + tapfd = data->tapfds[pair_idx]; if (vhost_kernel_tap_set_offload(tapfd, dev->features) == -1) return -1; if (req_mq && vhost_kernel_tap_set_queue(tapfd, true) < 0) { @@ -439,7 +485,7 @@ vhost_kernel_enable_queue_pair(struct virtio_user_dev *dev, return -1; } - dev->tapfds[pair_idx] = tapfd; + data->tapfds[pair_idx] = tapfd; set_backend: if (vhost_kernel_set_backend(vhostfd, tapfd) < 0) { diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 93a9ce2cd2..154aecc209 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -397,11 +397,6 @@ virtio_user_mem_event_cb(enum rte_mem_event type __rte_unused, static int virtio_user_dev_setup(struct virtio_user_dev *dev) { - uint32_t q; - - dev->vhostfds = NULL; - dev->tapfds = NULL; - if (dev->is_server) { if (dev->backend_type != VIRTIO_USER_BACKEND_VHOST_USER) { PMD_DRV_LOG(ERR, "Server mode only supports vhost-user!"); @@ -409,34 +404,21 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) } } - if (dev->backend_type == VIRTIO_USER_BACKEND_VHOST_USER) { + switch (dev->backend_type) { + case VIRTIO_USER_BACKEND_VHOST_USER: dev->ops = &virtio_ops_user; - } else if (dev->backend_type == - VIRTIO_USER_BACKEND_VHOST_KERNEL) { + break; + case VIRTIO_USER_BACKEND_VHOST_KERNEL: dev->ops = &virtio_ops_kernel; - - dev->vhostfds = malloc(dev->max_queue_pairs * - sizeof(int)); - dev->tapfds = malloc(dev->max_queue_pairs * - sizeof(int)); - if (!dev->vhostfds || !dev->tapfds) { - PMD_INIT_LOG(ERR, "(%s) Failed to allocate FDs", dev->path); - return -1; - } - - for (q = 0; q < dev->max_queue_pairs; ++q) { - dev->vhostfds[q] = -1; - dev->tapfds[q] = -1; - } - } else if (dev->backend_type == - VIRTIO_USER_BACKEND_VHOST_VDPA) { + break; + case VIRTIO_USER_BACKEND_VHOST_VDPA: dev->ops = &virtio_ops_vdpa; - } else { + break; + default: PMD_DRV_LOG(ERR, "(%s) Unknown backend type", dev->path); return -1; } - if (dev->ops->setup(dev) < 0) { PMD_INIT_LOG(ERR, "(%s) Failed to setup backend\n", dev->path); return -1; @@ -592,15 +574,6 @@ virtio_user_dev_uninit(struct virtio_user_dev *dev) close(dev->callfds[i]); close(dev->kickfds[i]); } - if (dev->vhostfds) { - for (i = 0; i < dev->max_queue_pairs; ++i) { - close(dev->vhostfds[i]); - if (dev->tapfds[i] >= 0) - close(dev->tapfds[i]); - } - free(dev->vhostfds); - free(dev->tapfds); - } free(dev->ifname); diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index a429dcc57c..5a2c9d38dd 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -31,11 +31,6 @@ struct virtio_user_dev { /* for vhost_vdpa backend */ int vhostfd; - /* for vhost_kernel backend */ - char *ifname; - int *vhostfds; - int *tapfds; - /* for both vhost_user and vhost_kernel */ int callfds[VIRTIO_MAX_VIRTQUEUES]; int kickfds[VIRTIO_MAX_VIRTQUEUES]; @@ -55,6 +50,8 @@ struct virtio_user_dev { uint16_t port_id; uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; char path[PATH_MAX]; + char *ifname; + union { struct vring vrings[VIRTIO_MAX_VIRTQUEUES]; struct vring_packed packed_vrings[VIRTIO_MAX_VIRTQUEUES]; From patchwork Sun Dec 20 21:14:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 85564 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6C7E3A09FD; Sun, 20 Dec 2020 22:26:43 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6E873CF35; Sun, 20 Dec 2020 22:16:57 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by dpdk.org (Postfix) with ESMTP id 32BC2CBD5 for ; Sun, 20 Dec 2020 22:16:55 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1608499013; 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=Du6jgHnLunRZTqxTD+BLL6HlxAimplNRvn1H5akPA0I=; b=JWj4NnYeZdlr25lLNaW0T83gdmpMJU09/Skrsdn0qZRQGzjNLizkT8MgxFg0jBJzkl7WlX A+wU/B0A7wlr+UbQ2zTs66UB06lnZf+90FwcHOETaqogU/skOTcdifOvKtLaRC5IOtELc8 JSN1NBOObR0v0hqz1IZ7xqP01DYhxbo= 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-266-xWEizeeFOgO_h7GgV4BfUA-1; Sun, 20 Dec 2020 16:16:51 -0500 X-MC-Unique: xWEizeeFOgO_h7GgV4BfUA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CADFE107ACE4; Sun, 20 Dec 2020 21:16:50 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.36.110.43]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2F4D760C43; Sun, 20 Dec 2020 21:16:49 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, olivier.matz@6wind.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Sun, 20 Dec 2020 22:14:05 +0100 Message-Id: <20201220211405.313012-41-maxime.coquelin@redhat.com> In-Reply-To: <20201220211405.313012-1-maxime.coquelin@redhat.com> References: <20201220211405.313012-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 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 40/40] net/virtio: move Vhost-vDPA data to its backend 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" As done earlier for Vhost-user and Vhost-kernel, this patch moves the Vhost-vDPA specific data to its backend file. Signed-off-by: Maxime Coquelin --- drivers/net/virtio/virtio_user/vhost_vdpa.c | 77 ++++++++++++++----- .../net/virtio/virtio_user/virtio_user_dev.h | 3 - 2 files changed, 58 insertions(+), 22 deletions(-) diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c index 0f422ae84a..c9738b462a 100644 --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c @@ -13,6 +13,10 @@ #include "vhost.h" #include "virtio_user_dev.h" +struct vhost_vdpa_data { + int vhostfd; +}; + /* vhost kernel & vdpa ioctls */ #define VHOST_VIRTIO 0xAF #define VHOST_GET_FEATURES _IOR(VHOST_VIRTIO, 0x00, __u64) @@ -80,15 +84,18 @@ vhost_vdpa_ioctl(int fd, uint64_t request, void *arg) static int vhost_vdpa_set_owner(struct virtio_user_dev *dev) { - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_OWNER, NULL); + struct vhost_vdpa_data *data = dev->backend_data; + + return vhost_vdpa_ioctl(data->vhostfd, VHOST_SET_OWNER, NULL); } static int vhost_vdpa_get_features(struct virtio_user_dev *dev, uint64_t *features) { + struct vhost_vdpa_data *data = dev->backend_data; int ret; - ret = vhost_vdpa_ioctl(dev->vhostfd, VHOST_GET_FEATURES, features); + ret = vhost_vdpa_ioctl(data->vhostfd, VHOST_GET_FEATURES, features); if (ret) { PMD_DRV_LOG(ERR, "Failed to get features"); return -1; @@ -103,16 +110,19 @@ vhost_vdpa_get_features(struct virtio_user_dev *dev, uint64_t *features) static int vhost_vdpa_set_features(struct virtio_user_dev *dev, uint64_t features) { + struct vhost_vdpa_data *data = dev->backend_data; + /* WORKAROUND */ features |= 1ULL << VIRTIO_F_IOMMU_PLATFORM; - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_FEATURES, &features); + return vhost_vdpa_ioctl(data->vhostfd, VHOST_SET_FEATURES, &features); } static int vhost_vdpa_dma_map(struct virtio_user_dev *dev, void *addr, uint64_t iova, size_t len) { + struct vhost_vdpa_data *data = dev->backend_data; struct vhost_msg msg = {}; msg.type = VHOST_IOTLB_MSG_V2; @@ -122,7 +132,7 @@ vhost_vdpa_dma_map(struct virtio_user_dev *dev, void *addr, msg.iotlb.size = len; msg.iotlb.perm = VHOST_ACCESS_RW; - if (write(dev->vhostfd, &msg, sizeof(msg)) != sizeof(msg)) { + if (write(data->vhostfd, &msg, sizeof(msg)) != sizeof(msg)) { PMD_DRV_LOG(ERR, "Failed to send IOTLB update (%s)", strerror(errno)); return -1; @@ -135,6 +145,7 @@ static int vhost_vdpa_dma_unmap(struct virtio_user_dev *dev, __rte_unused void *addr, uint64_t iova, size_t len) { + struct vhost_vdpa_data *data = dev->backend_data; struct vhost_msg msg = {}; msg.type = VHOST_IOTLB_MSG_V2; @@ -142,7 +153,7 @@ vhost_vdpa_dma_unmap(struct virtio_user_dev *dev, __rte_unused void *addr, msg.iotlb.iova = iova; msg.iotlb.size = len; - if (write(dev->vhostfd, &msg, sizeof(msg)) != sizeof(msg)) { + if (write(data->vhostfd, &msg, sizeof(msg)) != sizeof(msg)) { PMD_DRV_LOG(ERR, "Failed to send IOTLB invalidate (%s)", strerror(errno)); return -1; @@ -208,55 +219,73 @@ vhost_vdpa_set_memory_table(struct virtio_user_dev *dev) static int vhost_vdpa_set_vring_enable(struct virtio_user_dev *dev, struct vhost_vring_state *state) { - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_VDPA_SET_VRING_ENABLE, state); + struct vhost_vdpa_data *data = dev->backend_data; + + return vhost_vdpa_ioctl(data->vhostfd, VHOST_VDPA_SET_VRING_ENABLE, state); } static int vhost_vdpa_set_vring_num(struct virtio_user_dev *dev, struct vhost_vring_state *state) { - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_NUM, state); + struct vhost_vdpa_data *data = dev->backend_data; + + return vhost_vdpa_ioctl(data->vhostfd, VHOST_SET_VRING_NUM, state); } static int vhost_vdpa_set_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state *state) { - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_BASE, state); + struct vhost_vdpa_data *data = dev->backend_data; + + return vhost_vdpa_ioctl(data->vhostfd, VHOST_SET_VRING_BASE, state); } static int vhost_vdpa_get_vring_base(struct virtio_user_dev *dev, struct vhost_vring_state *state) { - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_GET_VRING_BASE, state); + struct vhost_vdpa_data *data = dev->backend_data; + + return vhost_vdpa_ioctl(data->vhostfd, VHOST_GET_VRING_BASE, state); } static int vhost_vdpa_set_vring_call(struct virtio_user_dev *dev, struct vhost_vring_file *file) { - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_CALL, file); + struct vhost_vdpa_data *data = dev->backend_data; + + return vhost_vdpa_ioctl(data->vhostfd, VHOST_SET_VRING_CALL, file); } static int vhost_vdpa_set_vring_kick(struct virtio_user_dev *dev, struct vhost_vring_file *file) { - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_KICK, file); + struct vhost_vdpa_data *data = dev->backend_data; + + return vhost_vdpa_ioctl(data->vhostfd, VHOST_SET_VRING_KICK, file); } static int vhost_vdpa_set_vring_addr(struct virtio_user_dev *dev, struct vhost_vring_addr *addr) { - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_VRING_ADDR, addr); + struct vhost_vdpa_data *data = dev->backend_data; + + return vhost_vdpa_ioctl(data->vhostfd, VHOST_SET_VRING_ADDR, addr); } static int vhost_vdpa_get_status(struct virtio_user_dev *dev, uint8_t *status) { - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_VDPA_GET_STATUS, status); + struct vhost_vdpa_data *data = dev->backend_data; + + return vhost_vdpa_ioctl(data->vhostfd, VHOST_VDPA_GET_STATUS, status); } static int vhost_vdpa_set_status(struct virtio_user_dev *dev, uint8_t status) { - return vhost_vdpa_ioctl(dev->vhostfd, VHOST_VDPA_SET_STATUS, &status); + struct vhost_vdpa_data *data = dev->backend_data; + + return vhost_vdpa_ioctl(data->vhostfd, VHOST_VDPA_SET_STATUS, &status); } /** @@ -269,16 +298,23 @@ vhost_vdpa_set_status(struct virtio_user_dev *dev, uint8_t status) static int vhost_vdpa_setup(struct virtio_user_dev *dev) { + struct vhost_vdpa_data *data; uint32_t did = (uint32_t)-1; - dev->vhostfd = open(dev->path, O_RDWR); - if (dev->vhostfd < 0) { + data = malloc(sizeof(*data)); + if (!data) { + PMD_DRV_LOG(ERR, "(%s) Faidle to allocate backend data", dev->path); + return -1; + } + + data->vhostfd = open(dev->path, O_RDWR); + if (data->vhostfd < 0) { PMD_DRV_LOG(ERR, "Failed to open %s: %s\n", dev->path, strerror(errno)); return -1; } - if (ioctl(dev->vhostfd, VHOST_VDPA_GET_DEVICE_ID, &did) < 0 || + if (ioctl(data->vhostfd, VHOST_VDPA_GET_DEVICE_ID, &did) < 0 || did != VIRTIO_ID_NETWORK) { PMD_DRV_LOG(ERR, "Invalid vdpa device ID: %u\n", did); return -1; @@ -288,9 +324,12 @@ vhost_vdpa_setup(struct virtio_user_dev *dev) } static int -vhost_vdpa_destroy(struct virtio_user_dev *dev __rte_unused) +vhost_vdpa_destroy(struct virtio_user_dev *dev ) { - return; + struct vhost_vdpa_data *data = dev->backend_data; + + close(data->vhostfd); + return 0; } diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index 5a2c9d38dd..2e0d6504f6 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -28,9 +28,6 @@ struct virtio_user_dev { enum virtio_user_backend_type backend_type; bool is_server; /* server or client mode */ - /* for vhost_vdpa backend */ - int vhostfd; - /* for both vhost_user and vhost_kernel */ int callfds[VIRTIO_MAX_VIRTQUEUES]; int kickfds[VIRTIO_MAX_VIRTQUEUES];