From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 9648BC32C for ; Tue, 16 Jun 2015 13:30:46 +0200 (CEST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP; 16 Jun 2015 04:30:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,626,1427785200"; d="scan'208";a="509103111" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by FMSMGA003.fm.intel.com with ESMTP; 16 Jun 2015 04:30:44 -0700 Received: from sivswdev01.ir.intel.com (sivswdev01.ir.intel.com [10.237.217.45]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id t5GBUh6O004810; Tue, 16 Jun 2015 12:30:44 +0100 Received: from sivswdev01.ir.intel.com (localhost [127.0.0.1]) by sivswdev01.ir.intel.com with ESMTP id t5GBUhoq013438; Tue, 16 Jun 2015 12:30:43 +0100 Received: (from bairemon@localhost) by sivswdev01.ir.intel.com with id t5GBUhs5013434; Tue, 16 Jun 2015 12:30:43 +0100 From: Bernard Iremonger To: dev@dpdk.org Date: Tue, 16 Jun 2015 12:30:22 +0100 Message-Id: <1434454223-13000-2-git-send-email-bernard.iremonger@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1434454223-13000-1-git-send-email-bernard.iremonger@intel.com> References: <1434454223-13000-1-git-send-email-bernard.iremonger@intel.com> Subject: [dpdk-dev] [PATCH v3 1/2] virtio: add support for PCI Port Hotplug X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Jun 2015 11:30:47 -0000 This patch depends on the Port Hotplug Framework. It implements the eth_dev_uninit_t() function for virtio pmd. Signed-off-by: Bernard Iremonger --- drivers/net/virtio/virtio_ethdev.c | 83 +++++++++++++++++++++++++++++++++--- 1 files changed, 76 insertions(+), 7 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index fe5f9a1..cb35220 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -63,6 +64,7 @@ static int eth_virtio_dev_init(struct rte_eth_dev *eth_dev); +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 void virtio_dev_stop(struct rte_eth_dev *dev); @@ -324,8 +326,12 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev, mz = rte_memzone_reserve_aligned(vq_name, vq->vq_ring_size, socket_id, 0, VIRTIO_PCI_VRING_ALIGN); if (mz == NULL) { - rte_free(vq); - return -ENOMEM; + if (rte_errno == EEXIST) + mz = rte_memzone_lookup(vq_name); + if (mz == NULL) { + rte_free(vq); + return -ENOMEM; + } } /* @@ -358,8 +364,13 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev, vq_size * hw->vtnet_hdr_size, socket_id, 0, RTE_CACHE_LINE_SIZE); if (vq->virtio_net_hdr_mz == NULL) { - rte_free(vq); - return -ENOMEM; + if (rte_errno == EEXIST) + vq->virtio_net_hdr_mz = + rte_memzone_lookup(vq_name); + if (vq->virtio_net_hdr_mz == NULL) { + rte_free(vq); + return -ENOMEM; + } } vq->virtio_net_hdr_mem = vq->virtio_net_hdr_mz->phys_addr; @@ -372,8 +383,13 @@ int virtio_dev_queue_setup(struct rte_eth_dev *dev, vq->virtio_net_hdr_mz = rte_memzone_reserve_aligned(vq_name, PAGE_SIZE, socket_id, 0, RTE_CACHE_LINE_SIZE); if (vq->virtio_net_hdr_mz == NULL) { - rte_free(vq); - return -ENOMEM; + if (rte_errno == EEXIST) + vq->virtio_net_hdr_mz = + rte_memzone_lookup(vq_name); + if (vq->virtio_net_hdr_mz == NULL) { + rte_free(vq); + return -ENOMEM; + } } vq->virtio_net_hdr_mem = vq->virtio_net_hdr_mz->phys_addr; @@ -1250,12 +1266,63 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) return 0; } +static int +eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev) +{ + struct rte_pci_device *pci_dev; + struct virtio_hw *hw = eth_dev->data->dev_private; + unsigned int i; + + PMD_INIT_FUNC_TRACE(); + + if (rte_eal_process_type() == RTE_PROC_SECONDARY) + return -EPERM; + + if (hw->started == 1) { + virtio_dev_stop(eth_dev); + virtio_dev_close(eth_dev); + } + pci_dev = eth_dev->pci_dev; + + eth_dev->dev_ops = NULL; + eth_dev->tx_pkt_burst = NULL; + eth_dev->rx_pkt_burst = NULL; + + rte_free(hw->cvq); + hw->cvq = NULL; + + for (i = 0; i < eth_dev->data->nb_rx_queues; i++) { + rte_free(eth_dev->data->rx_queues[i]); + eth_dev->data->rx_queues[i] = NULL; + } + + for (i = 0; i < eth_dev->data->nb_tx_queues; i++) { + rte_free(eth_dev->data->tx_queues[i]); + eth_dev->data->tx_queues[i] = NULL; + } + + rte_free(eth_dev->data->mac_addrs); + eth_dev->data->mac_addrs = NULL; + + /* reset interrupt callback */ + if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC) + rte_intr_callback_unregister(&pci_dev->intr_handle, + virtio_interrupt_handler, + eth_dev); + + PMD_INIT_LOG(DEBUG, "dev_uninit completed"); + + return 0; +} + static struct eth_driver rte_virtio_pmd = { .pci_drv = { .name = "rte_virtio_pmd", .id_table = pci_id_virtio_map, + .drv_flags = RTE_PCI_DRV_DETACHABLE, }, .eth_dev_init = eth_virtio_dev_init, + .eth_dev_uninit = eth_virtio_dev_uninit, .dev_private_size = sizeof(struct virtio_hw), }; @@ -1398,6 +1465,8 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev) "Before freeing rxq[%d] used and unused buf", i); VIRTQUEUE_DUMP((struct virtqueue *)dev->data->rx_queues[i]); + PMD_INIT_LOG(DEBUG, "rx_queues[%d]=%p", + i, dev->data->rx_queues[i]); while ((buf = (struct rte_mbuf *)virtqueue_detatch_unused( dev->data->rx_queues[i])) != NULL) { rte_pktmbuf_free(buf); -- 1.7.4.1