From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by dpdk.org (Postfix) with ESMTP id BAB0AC34E for ; Tue, 4 Aug 2015 13:32:37 +0200 (CEST) Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout4.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0NSK01PYU2QCNCB0@mailout4.samsung.com> for dev@dpdk.org; Tue, 04 Aug 2015 20:32:36 +0900 (KST) Received: from epcpsbgm1new.samsung.com ( [172.20.52.125]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id C3.F8.29324.3D2A0C55; Tue, 4 Aug 2015 20:32:36 +0900 (KST) X-AuditID: cbfee68d-f79106d00000728c-37-55c0a2d32e89 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1new.samsung.com (EPCPMTA) with SMTP id 27.26.23663.3D2A0C55; Tue, 4 Aug 2015 20:32:35 +0900 (KST) Received: from ubuntu.sisodomain.com ([107.108.207.86]) by mmp2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0NSK00HV52NGTF00@mmp2.samsung.com>; Tue, 04 Aug 2015 20:32:35 +0900 (KST) From: Harpal Singh To: dev@dpdk.org Date: Tue, 04 Aug 2015 17:08:51 +0530 Message-id: <1438688332-3392-3-git-send-email-harpal.sd@samsung.com> X-Mailer: git-send-email 1.8.3.2 In-reply-to: <1438688332-3392-1-git-send-email-harpal.sd@samsung.com> References: <1438688332-3392-1-git-send-email-harpal.sd@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrILMWRmVeSWpSXmKPExsWyRsSkVvfKogOhBlvuMVm8+7SdyWLrQSkH Jo9fC5ayevRtWcUYwBTFZZOSmpNZllqkb5fAlXHp8irmgmPyFTf6CxsY50h1MXJySAiYSOx+ 3MwMYYtJXLi3nq2LkYtDSGAFo0T3x99MXYwcYEXv3/BAxGcxSvQ8/ssE4fxklFgw5QkrSDeb gJbE4RPbWUBsEQEBic+di9lAbGYBDYnejasYQWxhAWuJoy3/2ECGsgioSrzqrwUJ8wq4SNx7 fQvqCAWJZV/WgtmcAq4SDW0vwcYLAdV8u38K7DgJgedsEr//9LODJFiAdn2bfIgF4lBZiU0H oOZIShxccYNlAqPwAkaGVYyiqQXJBcVJ6UWGesWJucWleel6yfm5mxiBIXn637PeHYy3D1gf YhTgYFTi4d3xbH+oEGtiWXFl7iFGU6ANE5mlRJPzgYGfVxJvaGxmZGFqYmpsZG5ppiTOqyj1 M1hIID2xJDU7NbUgtSi+qDQntfgQIxMHp1QDY0t6knXyXoPZ/8+oOFp7PX6dt9d9StHM18Wv fVyDPZ/L8S5lvhHtdJJ98yXpbh6let8nXy65xK08t3XFFn9WNrW18V9f+T7bdkGO9+nr1Lg3 W6dJl/z7euqkh0vw1vLZe38c7tgZMS34/nJFvvNFRccneS/jXS674LTwhfIzc6c8uxSbkHQ8 PliJpTgj0VCLuag4EQDBNIa0RAIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrHLMWRmVeSWpSXmKPExsVy+t9jQd3Liw6EGvzqNrZ492k7k8XWg1IO TB6/Fixl9ejbsooxgCmqgdEmIzUxJbVIITUvOT8lMy/dVsk7ON453tTMwFDX0NLCXEkhLzE3 1VbJxSdA1y0zB2i+kkJZYk4pUCggsbhYSd8O04TQEDddC5jGCF3fkCC4HiMDNJCwhjHj0uVV zAXH5Ctu9Bc2MM6R6mLk4JAQMJF4/4ani5ETyBSTuHBvPVsXIxeHkMAsRomex3+ZIJyfjBIL pjxhBaliE9CSOHxiOwuILSIgIPG5czEbiM0soCHRu3EVI4gtLGAtcbTlHxvIAhYBVYlX/bUg YV4BF4l7r28xQyxTkFj2ZS2YzSngKtHQ9hJsvBBQzbf7p9gmMPIuYGRYxSiRWpBcUJyUnmuY l1quV5yYW1yal66XnJ+7iREc9s+kdjAe3OV+iFGAg1GJh1fg5f5QIdbEsuLK3EOMEhzMSiK8 BlUHQoV4UxIrq1KL8uOLSnNSiw8xmgLdNZFZSjQ5HxiTeSXxhsYm5qbGppYmFiZmlkrivLIb NocKCaQnlqRmp6YWpBbB9DFxcEo1MO5rXvF5z/6+hBbW1bvklD6ce1n7QHYXF2shh1rhHHEV jinFG/fVVD7L/7bv7MX/C9kdgthWpGz8GMfzi3EPlwK3xuXGdT/vah6bejbK5CXfqUhz5Xgr +SPT1HWU1rkyWvvwfX4UpjqxeUu73duVWxcYWU/yf7svMsg0e8ZNlok3ZM61cl2zqFdiKc5I NNRiLipOBABO/R5YkQIAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Mailman-Approved-At: Tue, 04 Aug 2015 14:10:06 +0200 Cc: Harpal Singh Subject: [dpdk-dev] [PATCH 2/3] vfio: Added vfio req interrupt support 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, 04 Aug 2015 11:32:38 -0000 From: Harpal Singh This patch will add support for req interrupt which will be used by vfio kernel module to request user space to release allocated resources. It will provide addtional mechanism in user space to get system notification about when to release vfio resources. Signed-off-by: Harpal Singh --- lib/librte_eal/linuxapp/eal/eal_interrupts.c | 67 ++++++++++++++++++++++ .../linuxapp/eal/include/exec-env/rte_interrupts.h | 1 + 2 files changed, 68 insertions(+) diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c index 3f87875..6aca45f 100644 --- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c +++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c @@ -346,6 +346,63 @@ vfio_disable_msix(struct rte_intr_handle *intr_handle) { return ret; } + +/* enable req interrupts */ +static int +vfio_enable_req(struct rte_intr_handle *intr_handle) { + struct vfio_irq_set *irq_set; + char irq_set_buf[IRQ_SET_BUF_LEN]; + int len, ret =0; + int *fd_ptr; + len = sizeof(irq_set_buf); + + /* enable REQx */ + irq_set = (struct vfio_irq_set *) irq_set_buf; + irq_set->argsz = len; + irq_set->count = 1; + irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER; + irq_set->index = VFIO_PCI_REQ_IRQ_INDEX; + irq_set->start = 0; + fd_ptr = (int *) &irq_set->data; + *fd_ptr = intr_handle->fd; + ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set); + + if (ret) { + RTE_LOG(ERR, EAL, "Error enabling Req interrupts for fd %d\n", + intr_handle->fd); + return -1; + } + + return ret; +} + +/* disable req interrupts */ +static int +vfio_disable_req(struct rte_intr_handle *intr_handle) { + struct vfio_irq_set *irq_set; + char irq_set_buf[IRQ_SET_BUF_LEN]; + int len, ret; + int *fd_ptr; + len = sizeof(irq_set_buf); + + /* mask interrupts before disabling */ + irq_set = (struct vfio_irq_set *) irq_set_buf; + irq_set->argsz = len; + irq_set->count = 1; + irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER; + irq_set->index = VFIO_PCI_REQ_IRQ_INDEX; + irq_set->start = 0; + fd_ptr = (int *) &irq_set->data; + *fd_ptr = -1; + ret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set); + + if (ret) { + RTE_LOG(ERR, EAL, "Error disableing Req interrupts for fd %d\n", + intr_handle->fd); + return -1; + } + return 0; +} #endif static int @@ -592,6 +649,11 @@ rte_intr_enable(struct rte_intr_handle *intr_handle) if (vfio_enable_intx(intr_handle)) return -1; break; + + case RTE_INTR_HANDLE_VFIO_REQ: + if (vfio_enable_req(intr_handle)) + return -1; + break; #endif /* unknown handle type */ default: @@ -636,6 +698,10 @@ rte_intr_disable(struct rte_intr_handle *intr_handle) if (vfio_disable_intx(intr_handle)) return -1; break; + case RTE_INTR_HANDLE_VFIO_REQ: + if (vfio_disable_req(intr_handle)) + return -1; + break; #endif /* unknown handle type */ default: @@ -696,6 +762,7 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds) case RTE_INTR_HANDLE_VFIO_MSIX: case RTE_INTR_HANDLE_VFIO_MSI: case RTE_INTR_HANDLE_VFIO_LEGACY: + case RTE_INTR_HANDLE_VFIO_REQ: bytes_read = sizeof(buf.vfio_intr_count); break; #endif diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h index b05f4c8..e9c4729 100644 --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h @@ -48,6 +48,7 @@ enum rte_intr_handle_type { RTE_INTR_HANDLE_VFIO_MSI, /**< vfio device handle (MSI) */ RTE_INTR_HANDLE_VFIO_MSIX, /**< vfio device handle (MSIX) */ RTE_INTR_HANDLE_ALARM, /**< alarm handle */ + RTE_INTR_HANDLE_VFIO_REQ, /**< request device handle */ RTE_INTR_HANDLE_MAX }; -- 1.9.1