From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0073.outbound.protection.outlook.com [104.47.1.73]) by dpdk.org (Postfix) with ESMTP id B98CA2C58 for ; Mon, 20 Nov 2017 14:59:40 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=V2hA8meAe+9TPd2z3v2EShw9aCv/sNiKWKtDb6QDMBY=; b=EoCCgzyQ7Tz1cnf/L/HShG5s87v228/URZlV6sIFKf4S1pWAaCUUvNLbWJUo3AA8DJ5j54dx7ugDzGL7Ay28bIweJyalpgA3XCA544EL3aXTygkeLuFEqA83YKg4YnQnTFyaCxjGFOt+ad+6hcog5ywlO2Y56FAC7kM29EhJVsM= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=motih@mellanox.com; Received: from mellanox.com (37.142.13.130) by VI1PR05MB1919.eurprd05.prod.outlook.com (2a01:111:e400:7b79::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.239.5; Mon, 20 Nov 2017 13:59:37 +0000 From: Moti Haimovsky To: pascal.mazon@6wind.com Cc: dev@dpdk.org, Moti Haimovsky Date: Mon, 20 Nov 2017 15:59:22 +0200 Message-Id: <1511186362-72289-1-git-send-email-motih@mellanox.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: AM5PR0502CA0001.eurprd05.prod.outlook.com (2603:10a6:203:91::11) To VI1PR05MB1919.eurprd05.prod.outlook.com (2a01:111:e400:7b79::18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f911fd5f-54a1-41af-6190-08d5301ef069 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(48565401081)(2017052603258); SRVR:VI1PR05MB1919; X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1919; 3:BNEIt6PtSruxpeqgBSimhEfnJ2sljbnVsMydg2VzyhseW2Fw1aFZjxKk620l7hsdZzoxJb8QGg30T7HEMjSOAwUHtQ412WcfsyP7JFd2sbbazNprLW2usi1q6bsA06HYqCVkAtjpXFHqzxpa5CDWlTP2o/vVkWedNJ4sU8JW8kVCQloJOrmtg+OWi10n8TWYPFym7aP/PqP4aa2Vl7MW0xUXuN+mIiUHpRvwiYybZMuIJo1vfFE611SyQ5RVwvpF; 25:C7k9cBS6O9bb2r+JALGRMoJTcA2LT/BkG55NiqV6kFCY5p52Z30whZzxMM+oGv4swjRRb6SDq1mN9sntfxB2ST1UHki2o2XTRYUjy1wc9vOGhb2rkoMybY/ohkO7DpHUpQXSibDGGD34bo3ZbvXm27S3YGQU6xuh/iA6FJtaB9Oi5LffT+7vRCWA5WtxU4y60+Rz/2UW9o+2K4N88VMGJye0e4OUTmupv8exJbUV0IiUlMMYlJwAJM5I2n03p4wI5pIUYgm+elDGb3TOiFGKr2GGcsp4B+4nfH/nhf/c8YqBOrVRqLM6GllyjqNxSvau631i+cpLWKmI10C7nsMVKA==; 31:ct+c+PuNGvGTIXvi5GVHoFzwHAE5P05OjY4K5UNA6Pg1SHaIn/mHFAilrFs5zDEJ6rYWRFYrAhvhYClQ3hZ6xmQzvRyb43Kb29q+JYHlz3flnxKmk8OZ9OMcZrQOTQ1/IbHa5MNZgUwECANaCws9mFQOhyJF4R/MZTbNlnt+MjK623LZMa7KBv1JHHAtHbX40miCEggCg8omPuf0oLLoNXBC8t9G4xzIZZwoeWNE0tk= X-MS-TrafficTypeDiagnostic: VI1PR05MB1919: X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1919; 20:LRWKwyYoG8+gQ7rgYEu7EuOYVGn3M8CcPBjpIXEm4gqvbJxeF+meuw/zMgN2MjLJR5l7ZFZ9iTjb0ZKyIP0TIQ/NussewprHZ9QYGLIM7fcfXuiQ73taRcbAsR8FCtGqovSB6Gvp+W7EzUYREzqqXSY1hrXr+YXMlde3BGqb0NprH2QyBokuwIJL8Jmvg5OeFGhQvghk+HO7FNwNTLMhFhdQtTt0A4zDb4SIkTuNwqE2jm9a+M5SHZwuiCb8WhSNBSG5vQUONQIkTQqOg8lC/WiHDyTfvahd/UFjQ9QFLoxcoMZKRx4dCECcGZBxflucmvtjhLWxpeyyPjYa4LHyjNfYv9LLQdfjz3SHgoePXTbxqZ69wTY3meNctX/2MjL0gHdHH3Al75+2+w2Qn1JCEYvODIi+OVaVqbqn0kkIYYTG/y0/oZwr2yyjUgipXvaAMeM5/9XuROu5irEBDYM6ruCeQGV+YOVF5ZB0cHZ37lBUubMaxJx26zy1ay+miti8; 4:7ykt5vH16P3AKYVlJNOgVRT/E5oDKMKWDzfIJ3Q423hH/kHdOAgvb7uddHesrNxSx7svjMP0v2dCKdyOVMcet0KEOEp0pCz1DYc64PjQiyiZ3euFb7qP4Y1xN32hPUQAJchUYfKhFrdktUH8hrofEEWGPfAiu9A/B28ylc/VT0VA8uxZnx9VAflrLsM0xb1rf5gfSWXshvEby0I+eH0D6l53qy3IWw/U3EVmTE72N2xfm36R1g3ULPntSZ+iXprTeHvF0IYXXDnjTKVGIpva7HggAzmB3lkmUebC49Xa1g+hiiE0O/XwR050mGToV+rJ X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(278428928389397); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(100000703101)(100105400095)(93006095)(93001095)(3231022)(10201501046)(3002001)(6055026)(6041248)(20161123562025)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123555025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:VI1PR05MB1919; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:VI1PR05MB1919; X-Forefront-PRVS: 04976078F0 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(346002)(376002)(39860400002)(199003)(189002)(21086003)(5660300001)(101416001)(50466002)(68736007)(48376002)(2351001)(81166006)(81156014)(8676002)(50986999)(33646002)(97736004)(16586007)(107886003)(53936002)(25786009)(55016002)(66066001)(47776003)(4326008)(305945005)(2361001)(106356001)(7736002)(316002)(478600001)(189998001)(16526018)(33026002)(36756003)(575784001)(86362001)(5003940100001)(4720700003)(69596002)(2906002)(50226002)(3846002)(6116002)(8936002)(105586002)(6666003)(6916009); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB1919; H:mellanox.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB1919; 23:8T4qXw/901DuLkKa1NzpwRMKG0Fxz+dzBUSKIsj0t?= =?us-ascii?Q?EMN1inh1QXWeAsfJt157bTIuSqZ13P/HZbrROiykpN1BQr1pRG52HFeqK1qU?= =?us-ascii?Q?iIm9AyaHRcJSd5bkVT4+iY0mhfYTZt7QnXuqiYzLnkMxjPtlJH+tY/i3EWwr?= =?us-ascii?Q?+lU606kckJHfzv2O1P3mPQP33FqTqMtfI+fkzMvF+ieinTxrEV6s/Kf/lyEy?= =?us-ascii?Q?Nwsf57Hx+rUvQq/VXvuT05hEiphiSX0/Ajr7NYJU2kWa4rQjaeR/KNvFQU3t?= =?us-ascii?Q?xxP8CNo+Tn705sqtvm+ChlAATSMFWCznplCk04bXfkRE1NXMfLGL8hlSCgzh?= =?us-ascii?Q?dfTgmmhHlLBAK1dnlV3n63AcBOwGNAW5xdGH7exXxg/4ku2Aa3iR0VWVObaL?= =?us-ascii?Q?ovpq/V+DcQR7UmsdbVELgrU5Q4fCQ+fDKX0sRo6vL5sIv9iofnxux0CjMVBU?= =?us-ascii?Q?ygiKekeobdIEnLmsJ2dWTFknN/9c/jfelHyuw622UUoPgJ0BO1Dzn+Vuo+SG?= =?us-ascii?Q?dC0ezJJvwtyzf+5VttoHmGsqdg0DlXMmbvmqMSXFIOVUJ0P4Z5PNi65XGUv8?= =?us-ascii?Q?D0IBDZon64U3Wae5S9TQ6jownVj+9WiHAmme7VFStbLhAn8IBs4j4L9vrO14?= =?us-ascii?Q?yztgbXrKinxI/J8WI4cQ5edKbl57h3uLk5XnsmF5TPxRMubcChGvkgDAhOXW?= =?us-ascii?Q?0PipaGMVggAN+RZIX1EDfOEwvSoohS/6NH77V7Yu56Sez/tnSXj/qgGPGDfT?= =?us-ascii?Q?1tYoXnORsGE6m1oHfwlNP6K89EGH4BjXh4qgWs2HtgtYOGT+IRJnsLglXfgV?= =?us-ascii?Q?34oxCyEdtr8YfYMmixeSxOHM/PnbHwkNnCmUaEvVwYy8LNxcIclKIZjByWLH?= =?us-ascii?Q?syHPRzNFlHhB0ThK2q2OWg6I6x2viwefNKmCmN3KPujIX2UP2XWtf8Snx6zp?= =?us-ascii?Q?uFJ5H6su+IXgXcMM8cqLzj7WXB0PIcV4qmnhqM+s+kkMvPbYqFy78E5y1K5G?= =?us-ascii?Q?6X1l0z2OUMj3g2ZQHMiLU26u1dOQpQnewBj5L7qbYrnA81+VmZYeYcdyndGU?= =?us-ascii?Q?7PfmBMayl9GL1b7u8kjnaLeihjFWB/ShwU50tKmAuy5KA+Ca111WTlINhPkE?= =?us-ascii?Q?nVJJ3qEgLK8a1QMrzp9M6JDWoYl9dbrsaZDPCBhwgkHNuMNekbGA5JJbWA2Q?= =?us-ascii?Q?T6kj7fe/eMGPrQ=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1919; 6:NKG8jb2sOWxJA1kOgHa+8uwvk9cpUMG9PiPuHNCu2tEaLB23AMe3DoWAx4eE2WAT4yiLFKS16Y3c2aEKY8jl2cfjP/PgK6+FGRMypgwIaDHsAGFmSl8HUQn/GAaEYXzbGdRBoO8gVxiW+l0c6iZMQBBxH+rpWXasEn/fDxe+IbdC9xUJCUfXSk/iwcqwuoQ6+mv758nFHvoeJ+fZPzO94fVtWGbqJNtktrhJLpHqKfbKsDAwEwUnUNGTf2pCjlO84263M2Wy5FQJE7Da1aSXjj1YjVXND5/Quq1nhoDYKRhkYrOQZD4WnjEY4vcbK7DHthJeHRKJAlIj+6vLEzfvY64C8SKJ4CIQ81iT2mZFdvI=; 5:KZlSkKReofvn7VEgiKCjeDzkrfg/WynDNT05iKmfs1fHgLm3JhoxYQLkh2/l2SqMREiE7pHh7HgD1fiyEnk2+3hdnHbudBmnuULFYIELSPAU5DVsLnBlnoSLMEFXqFg0YuG7c6E7UpoygnEmPDwscuzsqNnS1hPxKAuhCuZiDmA=; 24:fv9kfpz+JApAsOUYqh2yLF6IZCpHtQzaq2ILQYQDOYMxnYN2FwHiWP9PoQT+taTynu8Z3mz518jPcUTQrK1sRZi6f5HHpFdIRegbCl+4zYc=; 7:kT3iiAzLGpIcBCsXlUcG0gjRgZqmjK8E67eOpHdvx9PYXxCxA3B0h19qqw9DY+fWTYUKHo5qf6zXtGjwkM2544t8Ny651YW3bm3OUi8zSN2CRMDzTEmBKSnzM2DYnkynHfgyuOUFaiEcFK5wSq+HwYFdOD/qn0A5SRj32YC1Rky4R4nTrYj1J9A7IXYDOQBTRySnoMi6boSxS1GZ2o0gKd0xo4LtWYX/s5EjOudpfVT8iUHSvTmlBLkp7PPBQwqF SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Nov 2017 13:59:37.6820 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f911fd5f-54a1-41af-6190-08d5301ef069 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB1919 Subject: [dpdk-dev] [PATCH] net/tap: add Rx interrupts 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: , X-List-Received-Date: Mon, 20 Nov 2017 13:59:40 -0000 This patch adds support for registering and waiting for Rx interrupts. This allows applications to wait for Rx events from the PMD using the DPDK rte_epoll subsystem. Signed-off-by: Moti Haimovsky --- doc/guides/nics/features/tap.ini | 1 + drivers/net/tap/Makefile | 1 + drivers/net/tap/rte_eth_tap.c | 17 ++++- drivers/net/tap/rte_eth_tap.h | 4 ++ drivers/net/tap/tap_intr.c | 147 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 drivers/net/tap/tap_intr.c diff --git a/doc/guides/nics/features/tap.ini b/doc/guides/nics/features/tap.ini index f0e893d..8bc5187 100644 --- a/doc/guides/nics/features/tap.ini +++ b/doc/guides/nics/features/tap.ini @@ -7,6 +7,7 @@ Speed capabilities = P Link status = Y Link status event = Y +Rx interrupt = Y Jumbo frame = Y Promiscuous mode = Y Allmulticast mode = Y diff --git a/drivers/net/tap/Makefile b/drivers/net/tap/Makefile index 405b49e..6636b77 100644 --- a/drivers/net/tap/Makefile +++ b/drivers/net/tap/Makefile @@ -54,6 +54,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_netlink.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_tcmsgs.c +SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_intr.c include $(RTE_SDK)/mk/rte.lib.mk diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 6b27679..7e6de68 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -1127,7 +1127,7 @@ enum ioctl_mode { } static int -tap_intr_handle_set(struct rte_eth_dev *dev, int set) +tap_lsc_intr_handle_set(struct rte_eth_dev *dev, int set) { struct pmd_internals *pmd = dev->data->dev_private; @@ -1152,6 +1152,20 @@ enum ioctl_mode { tap_dev_intr_handler, dev); } +static int +tap_intr_handle_set(struct rte_eth_dev *dev, int set) +{ + int err; + + err = tap_lsc_intr_handle_set(dev, set); + if (err) + return err; + err = tap_rx_intr_vec_set(dev, set); + if (err && set) + tap_lsc_intr_handle_set(dev, 0); + return err; +} + static const uint32_t* tap_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused) { @@ -1284,6 +1298,7 @@ enum ioctl_mode { pmd->intr_handle.type = RTE_INTR_HANDLE_EXT; pmd->intr_handle.fd = -1; + dev->intr_handle = &pmd->intr_handle; /* Presetup the fds to -1 as being not valid */ for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) { diff --git a/drivers/net/tap/rte_eth_tap.h b/drivers/net/tap/rte_eth_tap.h index 829f32f..fccc4b8 100644 --- a/drivers/net/tap/rte_eth_tap.h +++ b/drivers/net/tap/rte_eth_tap.h @@ -98,4 +98,8 @@ struct pmd_internals { struct rte_intr_handle intr_handle; /* LSC interrupt handle. */ }; +/* tap_intr.c */ + +int tap_rx_intr_vec_set(struct rte_eth_dev *dev, int set); + #endif /* _RTE_ETH_TAP_H_ */ diff --git a/drivers/net/tap/tap_intr.c b/drivers/net/tap/tap_intr.c new file mode 100644 index 0000000..ef25ca6 --- /dev/null +++ b/drivers/net/tap/tap_intr.c @@ -0,0 +1,147 @@ +/*- + * BSD LICENSE + * + * Copyright 2017 Mellanox + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * Interrupts handling for tap driver. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +/** + * Unregister Rx interrupts free the queue interrupt vector. + * + * @param dev + * Pointer to the tap rte_eth_dev structure. + */ +static void +tap_rx_intr_vec_uninstall(struct rte_eth_dev *dev) +{ + struct pmd_internals *pmd = dev->data->dev_private; + struct rte_intr_handle *intr_handle = &pmd->intr_handle; + + rte_intr_free_epoll_fd(intr_handle); + free(intr_handle->intr_vec); + intr_handle->intr_vec = NULL; + intr_handle->nb_efd = 0; +} + +/** + * Allocate Rx queue interrupt vector and register Rx interrupts. + * + * @param dev + * Pointer to the tap rte_eth_dev device structure. + * + * @return + * 0 on success, negative errno value otherwise and rte_errno is set. + */ +static int +tap_rx_intr_vec_install(struct rte_eth_dev *dev) +{ + struct pmd_internals *pmd = dev->data->dev_private; + unsigned int rxqs_n = pmd->dev->data->nb_rx_queues; + struct rte_intr_handle *intr_handle = &pmd->intr_handle; + unsigned int n = RTE_MIN(rxqs_n, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID); + unsigned int i; + unsigned int count = 0; + + if (!dev->data->dev_conf.intr_conf.rxq) + return 0; + intr_handle->intr_vec = malloc(sizeof(intr_handle->intr_vec[rxqs_n])); + if (intr_handle->intr_vec == NULL) { + rte_errno = ENOMEM; + RTE_LOG(ERR, PMD, + "failed to allocate memory for interrupt vector," + " Rx interrupts will not be supported"); + return -rte_errno; + } + for (i = 0; i < n; i++) { + struct rx_queue *rxq = pmd->dev->data->rx_queues[i]; + + /* Skip queues that cannot request interrupts. */ + if (!rxq || (rxq->fd <= 0)) { + /* Use invalid intr_vec[] index to disable entry. */ + intr_handle->intr_vec[i] = + RTE_INTR_VEC_RXTX_OFFSET + + RTE_MAX_RXTX_INTR_VEC_ID; + continue; + } + if (count >= RTE_MAX_RXTX_INTR_VEC_ID) { + rte_errno = E2BIG; + RTE_LOG(ERR, PMD, + "too many Rx queues for interrupt vector size" + " (%d), Rx interrupts cannot be enabled", + RTE_MAX_RXTX_INTR_VEC_ID); + tap_rx_intr_vec_uninstall(dev); + return -rte_errno; + } + intr_handle->intr_vec[i] = RTE_INTR_VEC_RXTX_OFFSET + count; + intr_handle->efds[count] = rxq->fd; + count++; + } + if (!count) + tap_rx_intr_vec_uninstall(dev); + else + intr_handle->nb_efd = count; + return 0; +} + +/** + * Register or unregister the Rx interrupts. + * + * @param dev + * Pointer to the tap rte_eth_dev device structure. + * @param set + * should the operation be register or unregister the interrupts. + * + * @return + * 0 on success, negative errno value otherwise and rte_errno is set. + */ +int +tap_rx_intr_vec_set(struct rte_eth_dev *dev, int set) +{ + tap_rx_intr_vec_uninstall(dev); + if (set) + return tap_rx_intr_vec_install(dev); + return 0; +} -- 1.8.3.1