From patchwork Fri Jun 29 01:54:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 41901 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 32CCF1B525; Fri, 29 Jun 2018 03:55:51 +0200 (CEST) Received: from mail-oi0-f66.google.com (mail-oi0-f66.google.com [209.85.218.66]) by dpdk.org (Postfix) with ESMTP id A24C31B51D for ; Fri, 29 Jun 2018 03:55:49 +0200 (CEST) Received: by mail-oi0-f66.google.com with SMTP id v8-v6so7049085oie.5 for ; Thu, 28 Jun 2018 18:55:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=OQf1xzRsloSmaaOq3NyvPQSYZQh//yOoNl7ygYWXcz0=; b=VJxhlYnMCukbIuFIpYu18WZ8kKKDLC1u7jcRu9DwUbYm5P1AiOsx1brAFc+4a72NAR SHva7uBAq96G5lzpbz70v4WIWEDcAJ6JUTay6NdRhJLr9u1jzsSxEboI57bFOIgQb9dP 3lMTKJm4wBvAtLoEFCz/TewLCHQ+sLn1XTJ+xC3//555BVm/pJwM4fC7PYISQHMmtRBY 7oc/vWVZV6sIpqxGNrcT3H1nNx610BayqtBhLzzGOiK6r1nsZBLdGMzkxdC28opMTgoD 0pS1+aLjCEDqcsdqu3U7LdsqComhD/RhqzywfnKrV6fT1dhL+6D5cQnsEl2Gjy+n2RYh Diuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=OQf1xzRsloSmaaOq3NyvPQSYZQh//yOoNl7ygYWXcz0=; b=OBcU5ybX8yKwTOgatxUFsqM899bKihI1AxR6jk7IgfTzu1YAhoOPaIN8gCObWHjc/l q7xVcrkX2DQbQRcfyit8uWbE/gneW8ADEJKceqOAo4RKIvjw2eSSn1mT0zlM9mIknXIJ Ngg8rNmv/blZDGaIRSMTPY5Gm7h2ZRzP/xMKqb2TdkOchxbhoTong4h5wQrCIU1UhCy5 /3rSaLNcDMpNwXZ+SZCs9jpbpkzUIG49hdLJcfeivJc0oxhm+CiohlRMDlBd8Aiip0Sa dR8shWzHcdYQmIvMrN23fVSLHH1+UVXrl0lgKOV+AsEFPjuup9sWanKd2ymGtnMTjjsG FNWA== X-Gm-Message-State: APt69E0Sq2R3/0MtlGT/wwYggfqns7mxm3g6kIS9Md8IO+aw25316Mav L8GIGPvhCuLVN7k1MgPcajY= X-Google-Smtp-Source: AAOMgpfO/SFDWh+4d0sIyhyzkV/CZnIBFArYpxPQd/A468hH7rrk30/Z+afYdvHDuW5Oyg/fH9hf9w== X-Received: by 2002:aca:d80b:: with SMTP id p11-v6mr6839957oig.210.1530237348834; Thu, 28 Jun 2018 18:55:48 -0700 (PDT) Received: from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net. [172.11.198.60]) by smtp.gmail.com with ESMTPSA id n3-v6sm3941288otk.38.2018.06.28.18.55.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 Jun 2018 18:55:48 -0700 (PDT) From: Dan Gora To: ferruh.yigit@intel.com Cc: dev@dpdk.org, Dan Gora Date: Thu, 28 Jun 2018 18:54:59 -0700 Message-Id: <20180629015508.26599-2-dg@adax.com> X-Mailer: git-send-email 2.18.0.rc1.1.g6f333ff2f In-Reply-To: <20180629015508.26599-1-dg@adax.com> References: <20180628224513.18391-1-dg@adax.com> <20180629015508.26599-1-dg@adax.com> Subject: [dpdk-dev] [PATCH v2 01/10] kni: remove unused variables from struct kni_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" Remove the unused fields 'status' and 'synchro' from the struct kni_dev. Signed-off-by: Dan Gora Acked-by: Ferruh Yigit --- kernel/linux/kni/kni_dev.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/kernel/linux/kni/kni_dev.h b/kernel/linux/kni/kni_dev.h index 6275ef27f..ed42989cc 100644 --- a/kernel/linux/kni/kni_dev.h +++ b/kernel/linux/kni/kni_dev.h @@ -37,7 +37,6 @@ struct kni_dev { struct list_head list; struct net_device_stats stats; - int status; uint16_t group_id; /* Group ID of a group of KNI devices */ uint32_t core_id; /* Core ID to bind */ char name[RTE_KNI_NAMESIZE]; /* Network device name */ @@ -82,9 +81,6 @@ struct kni_dev { /* mbuf size */ uint32_t mbuf_size; - /* synchro for request processing */ - unsigned long synchro; - /* buffers */ void *pa[MBUF_BURST_SZ]; void *va[MBUF_BURST_SZ]; From patchwork Fri Jun 29 01:55:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 41902 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 875B81B53E; Fri, 29 Jun 2018 03:55:53 +0200 (CEST) Received: from mail-oi0-f67.google.com (mail-oi0-f67.google.com [209.85.218.67]) by dpdk.org (Postfix) with ESMTP id 188C81B51D for ; Fri, 29 Jun 2018 03:55:51 +0200 (CEST) Received: by mail-oi0-f67.google.com with SMTP id c2-v6so7060217oic.1 for ; Thu, 28 Jun 2018 18:55:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=ytOC7mp7wKfFaY5qMuyGH7qZSDHYGCEQGPP3dfwcCDQ=; b=huHb1NHLLSvLUP+i+6vNVhqHnSGBjajqrIgMqdIwj1MGclIHL4QYRACZQ7IrWgZcXu w8TXrNkGWiTncavIZu0tSCWVIqr95Kodi6Ww3DAhBdrR32SgB5dOwJi/XrvXQ0MkQLMS LsLm3y2wcOeVQ7c7BclPV26yNo9BaPNXbXxJg6ZFz8MJCyyGoSYg6PP9SgAzDq1397yc LiHbFTNAhMeV8BEQ18liBb7XpBTZ+vuhl1VZSfawNORJbNt2pi8pKq8pHa5g5cf9BFyl efMqXdM5TIMEVbaMgE7osoNNKVAH2Hr4vFhPlrHYSx8/k/9EkjK70eUMCfNvMr99Gvqw e4vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=ytOC7mp7wKfFaY5qMuyGH7qZSDHYGCEQGPP3dfwcCDQ=; b=MQN6sMcG3wQbaxB4LjTu9lCG6gsIjzqVh5YtTjyEdUZ4ZCSMqGpWIel0fXklntBMrz 9IP9pW9m8AyUu0OVGrYH8dRbmw0p+YCUJUKTm92huOijZR6yXp3W3G7CPZUQh9K4Cg4E BIfBjuFVut3hyPdbqLuTlup6x2ATxK/QBeps9BO2c2I3vu/aw0e6/RIl/nr9VLstYWVO otpPNpKW6p3weXxmjLfRtjzTAXQW3m2cH5k/jgYdz5tGmPVpb1fIXQvfwKCX/TAHyLsX OYTRWQ6WL2zEfqENW85jbjYtPj81qLHtTOdEVUcEVo+/C0B5bPU4+ID0s5oQ96zSXHeX KSrg== X-Gm-Message-State: APt69E20I3PCUA7lqLB8NsdC9OniOrG8V9gfMlXHa+hQRGbCacjWGWEt 7j4wRVcPYsjBPDCjobLrvYY= X-Google-Smtp-Source: AAOMgpeLI717oN0XODjdUaVW/L2ceaz0Bi0SSTHZ9AV1Ui8CIbBiSSeTHr3DWvHys7ta0Wc94e2Dhg== X-Received: by 2002:aca:686:: with SMTP id 128-v6mr7364284oig.31.1530237350263; Thu, 28 Jun 2018 18:55:50 -0700 (PDT) Received: from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net. [172.11.198.60]) by smtp.gmail.com with ESMTPSA id n3-v6sm3941288otk.38.2018.06.28.18.55.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 Jun 2018 18:55:49 -0700 (PDT) From: Dan Gora To: ferruh.yigit@intel.com Cc: dev@dpdk.org, Dan Gora Date: Thu, 28 Jun 2018 18:55:00 -0700 Message-Id: <20180629015508.26599-3-dg@adax.com> X-Mailer: git-send-email 2.18.0.rc1.1.g6f333ff2f In-Reply-To: <20180629015508.26599-1-dg@adax.com> References: <20180628224513.18391-1-dg@adax.com> <20180629015508.26599-1-dg@adax.com> Subject: [dpdk-dev] [PATCH v2 02/10] kni: separate releasing netdev from freeing KNI interface 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" Currently the rte_kni kernel driver suffers from a problem where when the interface is released, it generates a callback to the DPDK application to change the interface state to Down. However, after the DPDK application handles the callback and generates a response back to the kernel, the rte_kni driver cannot wake the thread which is asleep waiting for the response, because it is holding the kni_link_lock semaphore and it has already removed the 'struct kni_dev' from the list of interfaces to poll for responses. This means that if the KNI interface is in the Up state when rte_kni_release() is called, it will always sleep for three seconds until kni_net_release gives up waiting for a response from the DPDK application. To fix this, we must separate the step to release the kernel network interface from the steps to remove the KNI interface from the list of interfaces to poll. When the kernel network interface is removed with unregister_netdev(), if the interface is up, it will generate a callback to mark the interface down, which calls kni_net_release(). kni_net_release() will block waiting for the DPDK application to call rte_kni_handle_request() to handle the callback, but it also needs the thread in the KNI driver (either the per-dev thread for multi-thread or the per-driver thread) to call kni_net_poll_resp() in order to wake the thread sleeping in kni_net_release (actually kni_net_process_request()). So now, KNI interfaces should be removed as such: 1) The user calls rte_kni_release(). This only unregisters the netdev in the kernel, but touches nothing else. This allows all the threads to run which are necessary to handle the callback into the DPDK application to mark the interface down. 2) The user stops the thread running rte_kni_handle_request(). After rte_kni_release() has been called, there will be no more callbacks for that interface so it is not necessary. It cannot be running at the same time that rte_kni_free() frees all of the FIFOs and DPDK memory for that KNI interface. 3) The user calls rte_kni_free(). This performs the RTE_KNI_IOCTL_FREE ioctl which calls kni_ioctl_free(). This function removes the struct kni_dev from the list of interfaces to poll (and kills the per-dev kthread, if configured for multi-thread), then frees the memory in the FIFOs. Signed-off-by: Dan Gora --- kernel/linux/kni/kni_misc.c | 69 +++++++++++++++---- .../eal/include/exec-env/rte_kni_common.h | 1 + 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c index fa69f8e63..d889ffc4b 100644 --- a/kernel/linux/kni/kni_misc.c +++ b/kernel/linux/kni/kni_misc.c @@ -192,8 +192,6 @@ kni_dev_remove(struct kni_dev *dev) free_netdev(dev->net_dev); } - kni_net_release_fifo_phy(dev); - return 0; } @@ -224,6 +222,7 @@ kni_release(struct inode *inode, struct file *file) } kni_dev_remove(dev); + kni_net_release_fifo_phy(dev); list_del(&dev->list); } up_write(&knet->kni_list_lock); @@ -263,7 +262,6 @@ kni_run_thread(struct kni_net *knet, struct kni_dev *kni, uint8_t force_bind) kni->pthread = kthread_create(kni_thread_multiple, (void *)kni, "kni_%s", kni->name); if (IS_ERR(kni->pthread)) { - kni_dev_remove(kni); return -ECANCELED; } @@ -278,7 +276,6 @@ kni_run_thread(struct kni_net *knet, struct kni_dev *kni, uint8_t force_bind) (void *)knet, "kni_single"); if (IS_ERR(knet->kni_kthread)) { mutex_unlock(&knet->kni_kthread_lock); - kni_dev_remove(kni); return -ECANCELED; } @@ -460,15 +457,17 @@ kni_ioctl_create(struct net *net, uint32_t ioctl_num, if (ret) { pr_err("error %i registering device \"%s\"\n", ret, dev_info.name); - kni->net_dev = NULL; - kni_dev_remove(kni); + kni_net_release_fifo_phy(kni); free_netdev(net_dev); return -ENODEV; } ret = kni_run_thread(knet, kni, dev_info.force_bind); - if (ret != 0) + if (ret != 0) { + kni_dev_remove(kni); + kni_net_release_fifo_phy(kni); return ret; + } down_write(&knet->kni_list_lock); list_add(&kni->list, &knet->kni_list_head); @@ -495,6 +494,46 @@ kni_ioctl_release(struct net *net, uint32_t ioctl_num, return -EIO; } + /* Release the network device according to its name */ + if (strlen(dev_info.name) == 0) + return ret; + + down_read(&knet->kni_list_lock); + list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) { + if (strncmp(dev->name, dev_info.name, RTE_KNI_NAMESIZE) != 0) + continue; + + kni_dev_remove(dev); + up_read(&knet->kni_list_lock); + pr_info("Successfully released kni interface: %s\n", + dev_info.name); + return 0; + } + up_read(&knet->kni_list_lock); + pr_info("Error: failed to find kni interface: %s\n", + dev_info.name); + + return ret; +} + +static int +kni_ioctl_free(struct net *net, uint32_t ioctl_num, + unsigned long ioctl_param) +{ + struct kni_net *knet = net_generic(net, kni_net_id); + int ret = -EINVAL; + struct kni_dev *dev, *n; + struct rte_kni_device_info dev_info; + + if (_IOC_SIZE(ioctl_num) > sizeof(dev_info)) + return -EINVAL; + + ret = copy_from_user(&dev_info, (void *)ioctl_param, sizeof(dev_info)); + if (ret) { + pr_err("copy_from_user in kni_ioctl_release"); + return -EIO; + } + /* Release the network device according to its name */ if (strlen(dev_info.name) == 0) return ret; @@ -509,14 +548,17 @@ kni_ioctl_release(struct net *net, uint32_t ioctl_num, dev->pthread = NULL; } - kni_dev_remove(dev); + kni_net_release_fifo_phy(dev); list_del(&dev->list); - ret = 0; - break; + up_write(&knet->kni_list_lock); + pr_info("Successfully freed kni interface: %s\n", + dev_info.name); + return 0; } up_write(&knet->kni_list_lock); - pr_info("%s release kni named %s\n", - (ret == 0 ? "Successfully" : "Unsuccessfully"), dev_info.name); + + pr_info("Error: failed to find kni interface: %s\n", + dev_info.name); return ret; } @@ -542,6 +584,9 @@ kni_ioctl(struct inode *inode, uint32_t ioctl_num, unsigned long ioctl_param) case _IOC_NR(RTE_KNI_IOCTL_RELEASE): ret = kni_ioctl_release(net, ioctl_num, ioctl_param); break; + case _IOC_NR(RTE_KNI_IOCTL_FREE): + ret = kni_ioctl_free(net, ioctl_num, ioctl_param); + break; default: pr_debug("IOCTL default\n"); break; diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h index cfa9448bd..318a3f939 100644 --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h @@ -129,5 +129,6 @@ struct rte_kni_device_info { #define RTE_KNI_IOCTL_TEST _IOWR(0, 1, int) #define RTE_KNI_IOCTL_CREATE _IOWR(0, 2, struct rte_kni_device_info) #define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct rte_kni_device_info) +#define RTE_KNI_IOCTL_FREE _IOWR(0, 4, struct rte_kni_device_info) #endif /* _RTE_KNI_COMMON_H_ */ From patchwork Fri Jun 29 01:55:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 41903 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 167261B54D; Fri, 29 Jun 2018 03:55:56 +0200 (CEST) Received: from mail-oi0-f65.google.com (mail-oi0-f65.google.com [209.85.218.65]) by dpdk.org (Postfix) with ESMTP id 7402A1B532 for ; Fri, 29 Jun 2018 03:55:52 +0200 (CEST) Received: by mail-oi0-f65.google.com with SMTP id k81-v6so7044861oib.4 for ; Thu, 28 Jun 2018 18:55:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=fGC1/toUFvY8asYAO6HL+f7p7INZeOaqNCTBQH8reiw=; b=WBLo+UUeLp65fwHeCzu+NwE3buAJJzDkHhVFJLqE57AMDX3OXutBmsxJa9drUsHLNv 530csrwr81LfDeodVP2ryXaHHb/X+vrGhOXfT5gqU2RUEZuMU5JUSOFasIF8aAvRI+Ef Xa28BXT1J1GO6nr1HcaHbSejHDmFOKCTHzEz++Y1DVY5ys6TPwFNR3R3ZcqyR5iYb5t+ Ilrsyiit5dH/01sXgNb8nHBPcJ2/Oxr+5aDC0oFK0NNbpnJ6O59vkFzqU1Usm2nWlrXH lWujXR09zm9olBqgNlQMwYwA3EIWP3euB8KwYsjlYH/vz10X0y20Yn9Ov91/kJjG8xX0 8Z8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=fGC1/toUFvY8asYAO6HL+f7p7INZeOaqNCTBQH8reiw=; b=VlfCtBlXtscNvOmDKFvWuvL9tw5w2CPUJIzVw8K1mjfEdL2v3gW7R/cghVNCfYEynv B4giW1sBAx8xwov9uMh/iqwhr35z/yWe6h/5n0M0y/LMQottyTHGbqJnTuhibckZyNj/ M3YiDVRv0r3uMVzq2rrFQ3vVxsEMZ6/kEMuRJDBgDAMu5aJ+QBMAeswa8evlAGgoaXw6 yEQ/97ZSUc4mLZXMWfxUKc6CLyKyb82jYNISqTXec0dm5b8qQSKlM0c4wZafGl9gSxAy r5+4qfASiJcU56c4MCsE6IML+KEaMvizDG24RbmHEWei7xJkhLjfvdiU9A9hJJSyUU3A drXA== X-Gm-Message-State: APt69E0dDgujYwcNflouwrgX7x3ZH5jFI0qh16C+F3dL9QOoYy8GG/BI X01f140mJI+H8X3XMnJbOZw= X-Google-Smtp-Source: AAOMgpdXfWCpxXMq7VvmXL+m8/X+4ORonQE9NTT+FGe2afbwu/dSrz6LDDlLX6dIM2UAxe6Y0Zug8Q== X-Received: by 2002:aca:a93:: with SMTP id k19-v6mr7492877oiy.83.1530237351653; Thu, 28 Jun 2018 18:55:51 -0700 (PDT) Received: from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net. [172.11.198.60]) by smtp.gmail.com with ESMTPSA id n3-v6sm3941288otk.38.2018.06.28.18.55.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 Jun 2018 18:55:50 -0700 (PDT) From: Dan Gora To: ferruh.yigit@intel.com Cc: dev@dpdk.org, Dan Gora Date: Thu, 28 Jun 2018 18:55:01 -0700 Message-Id: <20180629015508.26599-4-dg@adax.com> X-Mailer: git-send-email 2.18.0.rc1.1.g6f333ff2f In-Reply-To: <20180629015508.26599-1-dg@adax.com> References: <20180628224513.18391-1-dg@adax.com> <20180629015508.26599-1-dg@adax.com> Subject: [dpdk-dev] [PATCH v2 03/10] kni: don't touch struct kni_dev after freeing 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 the struct kni_dev is allocated as part of the netdev with alloc_netdev, when free_netdev is called, this also frees the struct kni_dev embedded in it. This means that we cannot touch struct kni_dev after calling free_netdev since that memory was already deallocated. Separate unregistering the net_dev with unregister_netdev from freeing the net_device and kni_dev structures into separate functions and ensure that we do not touch anything in the kni_dev structure after freeing it (ie don't call list_del(), etc...). Signed-off-by: Dan Gora --- kernel/linux/kni/kni_dev.h | 1 + kernel/linux/kni/kni_misc.c | 28 +++++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/kernel/linux/kni/kni_dev.h b/kernel/linux/kni/kni_dev.h index ed42989cc..f9aa90ff9 100644 --- a/kernel/linux/kni/kni_dev.h +++ b/kernel/linux/kni/kni_dev.h @@ -37,6 +37,7 @@ struct kni_dev { struct list_head list; struct net_device_stats stats; + uint16_t registered; /* 0 if already released, 1 otherwise */ uint16_t group_id; /* Group ID of a group of KNI devices */ uint32_t core_id; /* Core ID to bind */ char name[RTE_KNI_NAMESIZE]; /* Network device name */ diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c index d889ffc4b..1c38cfa1a 100644 --- a/kernel/linux/kni/kni_misc.c +++ b/kernel/linux/kni/kni_misc.c @@ -184,17 +184,34 @@ kni_dev_remove(struct kni_dev *dev) ixgbe_kni_remove(dev->pci_dev); else if (pci_match_id(igb_pci_tbl, dev->pci_dev)) igb_kni_remove(dev->pci_dev); + dev->pci_dev = NULL; } #endif - if (dev->net_dev) { + if (dev->registered) { unregister_netdev(dev->net_dev); - free_netdev(dev->net_dev); + dev->registered = 0; } return 0; } +static void +kni_dev_free(struct kni_dev *dev) +{ + struct net_device *net_dev; + /* + * Remember that struct kni_dev is part of the netdev + * structure, so we free *both* with free_netdev. + */ + if (dev == NULL) + return; + net_dev = dev->net_dev; + dev->net_dev = NULL; + if (net_dev) + free_netdev(net_dev); +} + static int kni_release(struct inode *inode, struct file *file) { @@ -224,6 +241,7 @@ kni_release(struct inode *inode, struct file *file) kni_dev_remove(dev); kni_net_release_fifo_phy(dev); list_del(&dev->list); + kni_dev_free(dev); } up_write(&knet->kni_list_lock); @@ -457,15 +475,18 @@ kni_ioctl_create(struct net *net, uint32_t ioctl_num, if (ret) { pr_err("error %i registering device \"%s\"\n", ret, dev_info.name); + kni_dev_remove(kni); kni_net_release_fifo_phy(kni); - free_netdev(net_dev); + kni_dev_free(kni); return -ENODEV; } + kni->registered = 1; ret = kni_run_thread(knet, kni, dev_info.force_bind); if (ret != 0) { kni_dev_remove(kni); kni_net_release_fifo_phy(kni); + kni_dev_free(kni); return ret; } @@ -550,6 +571,7 @@ kni_ioctl_free(struct net *net, uint32_t ioctl_num, kni_net_release_fifo_phy(dev); list_del(&dev->list); + kni_dev_free(dev); up_write(&knet->kni_list_lock); pr_info("Successfully freed kni interface: %s\n", dev_info.name); From patchwork Fri Jun 29 01:55:02 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 41904 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C698D1B554; Fri, 29 Jun 2018 03:56:00 +0200 (CEST) Received: from mail-oi0-f65.google.com (mail-oi0-f65.google.com [209.85.218.65]) by dpdk.org (Postfix) with ESMTP id D90F71B547 for ; Fri, 29 Jun 2018 03:55:53 +0200 (CEST) Received: by mail-oi0-f65.google.com with SMTP id y207-v6so7023675oie.13 for ; Thu, 28 Jun 2018 18:55:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=djh6S5mwETgXxisTt962bYrDK6hsNfq1oEedVn8n42k=; b=Ka7fMH//SLn057O89CkrHjB2NegL3j09B/tMHS0Pe7+uxHnOXCqr95BgG3OshdCHVM w2Sle/QCU9MHDU+QDrtO3tU0HeNGthko6whc2LuFbeM6PMdBcu4S2QoMOkiTaSKngh6/ t60U8UL68vdz944CMC5RhRCUZkJiWA33D4ICwkaCtlrvzZdLB5Nilqkks2J7ORveFc3f /gHiKXZ3l9AtoWDxNiOTUYd5lauKM6LHhZ0IpSG5wVhzL1xuTXcLNNrwFWdWlnEEUXT8 x8kKGm7s798M3mbqegBKZykZawHrAb3c8gqgVlvUzbUXaKhelQwovTyZjT0WAg9lnZJl aEig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=djh6S5mwETgXxisTt962bYrDK6hsNfq1oEedVn8n42k=; b=QBcUIlsCWcSVy2ICzWAMQ6NnemrFOU0AWh6eT8wOAVEBmrRQVO23F6okpA/m+suPCJ P9W/CJzjms6x96FO7QANxbVleSq0ups6W+240gKjXlT4NlopqCX16TnzanoHdcq4Qg14 KyqxV+ipDaaHI3qDkmqF5bfuOTiLSVEn0hxDToE4vY1BVl2zdqGHup9n1qVllPn5yvIw UOzGF76N3K1m+LwMaXvfuQkB63iX2RxfwCdSn9Z3spVH/RX8p0o0b9yiNpzorTJDgQvO ufnpgQRiR91dbREyYzbuTa/DiYL5ZeHMHSAPADAyWq8M0/PFcec21PoiyxP+VeuG8xnc HyGg== X-Gm-Message-State: APt69E0wIQVhrpnmyyoygCjnGrsVybqMtkGHEw3GoAu905kzepirf4gT hI7v4C/PicojIVwA5Tgh2/uuYQ== X-Google-Smtp-Source: AAOMgpeQx+Sg82B5guPaI7alE2OtxZh3S6TaE9d4EjN4fjUvfmXAXg2X7WOAcYih0bbzqNPY6by9Ow== X-Received: by 2002:aca:bdc1:: with SMTP id n184-v6mr6727047oif.305.1530237353076; Thu, 28 Jun 2018 18:55:53 -0700 (PDT) Received: from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net. [172.11.198.60]) by smtp.gmail.com with ESMTPSA id n3-v6sm3941288otk.38.2018.06.28.18.55.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 Jun 2018 18:55:52 -0700 (PDT) From: Dan Gora To: ferruh.yigit@intel.com Cc: dev@dpdk.org, Dan Gora Date: Thu, 28 Jun 2018 18:55:02 -0700 Message-Id: <20180629015508.26599-5-dg@adax.com> X-Mailer: git-send-email 2.18.0.rc1.1.g6f333ff2f In-Reply-To: <20180629015508.26599-1-dg@adax.com> References: <20180628224513.18391-1-dg@adax.com> <20180629015508.26599-1-dg@adax.com> Subject: [dpdk-dev] [PATCH v2 04/10] kni: add rte_kni_free to KNI library 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" Add the new rte_kni_free() API function to the KNI library. This function will be called by DPDK applications after rte_kni_release() to free the KNI interface resources from the kernel driver. Signed-off-by: Dan Gora --- lib/librte_kni/rte_kni.c | 32 +++++++++++++++++++++++++++++--- lib/librte_kni/rte_kni.h | 31 +++++++++++++++++++++++++++---- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index 8a8f6c1cc..1d84c0b70 100644 --- a/lib/librte_kni/rte_kni.c +++ b/lib/librte_kni/rte_kni.c @@ -463,8 +463,6 @@ int rte_kni_release(struct rte_kni *kni) { struct rte_kni_device_info dev_info; - uint32_t slot_id; - uint32_t retry = 5; if (!kni || !kni->in_use) return -1; @@ -475,6 +473,34 @@ rte_kni_release(struct rte_kni *kni) return -1; } + kni->in_use = 0; + return 0; +} + +int +rte_kni_free(struct rte_kni *kni) +{ + uint32_t slot_id; + uint32_t retry = 5; + struct rte_kni_device_info dev_info; + + if (!kni) + return -EINVAL; + + /* Must call rte_kni_release() first */ + if (kni->in_use) + return -EBUSY; + + /* + * Free the FIFOs in the kernel and remove it from the list + * of devices to poll + */ + snprintf(dev_info.name, sizeof(dev_info.name), "%s", kni->name); + if (ioctl(kni_fd, RTE_KNI_IOCTL_FREE, &dev_info) < 0) { + RTE_LOG(ERR, KNI, "Fail to release kni device\n"); + return -1; + } + /* mbufs in all fifo should be released, except request/response */ /* wait until all rxq packets processed by kernel */ @@ -497,7 +523,7 @@ rte_kni_release(struct rte_kni *kni) if (slot_id > kni_memzone_pool.max_ifaces) { RTE_LOG(ERR, KNI, "KNI pool: corrupted slot ID: %d, max: %d\n", slot_id, kni_memzone_pool.max_ifaces); - return -1; + return -EINVAL; } kni_memzone_pool_release(&kni_memzone_pool.slots[slot_id]); diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h index 99055e2c2..d1a95f898 100644 --- a/lib/librte_kni/rte_kni.h +++ b/lib/librte_kni/rte_kni.h @@ -112,11 +112,17 @@ struct rte_kni *rte_kni_alloc(struct rte_mempool *pktmbuf_pool, const struct rte_kni_conf *conf, struct rte_kni_ops *ops); /** - * Release KNI interface according to the context. It will also release the - * paired KNI interface in kernel space. All processing on the specific KNI - * context need to be stopped before calling this interface. + * Release specified KNI interface. This will stop data transfer to and from + * this interface and will remove the paired KNI interface in kernel space. * - * rte_kni_release is thread safe. + * @note This function will trigger the kernel to remove the interface, which + * may trigger the RTE_KNI_REQ_CFG_NETWORK_IF KNI callback. This function will + * block until this callback is handled or times out. The user should ensure + * that rte_kni_handle_request() is called for this interface in a separate + * thread to handle this callback to avoid this delay. + * + * rte_kni_release() is thread safe, but should not be called from the same + * thread as rte_kni_handle_request(). * * @param kni * The pointer to the context of an existent KNI interface. @@ -127,6 +133,23 @@ struct rte_kni *rte_kni_alloc(struct rte_mempool *pktmbuf_pool, */ int rte_kni_release(struct rte_kni *kni); +/** + * Free specified KNI interface. It will also free the KNI interface resources + * in kernel space. No KNI functions for this interface should be called after + * or at the same time as calling this function. rte_kni_release() must be + * called before this function to release the kernel interface. + * + * @param kni + * The pointer to the context of an existent KNI interface. + * + * @return + * - 0 indicates success. + * - -EINVAL: Invalid kni structure. + * - -EBUSY: KNI interface still in use. Must call rte_kni_release(). + */ +int __rte_experimental +rte_kni_free(struct rte_kni *kni); + /** * It is used to handle the request mbufs sent from kernel space. * Then analyzes it and calls the specific actions for the specific requests. From patchwork Fri Jun 29 01:55:03 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 41905 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6E1631B55D; Fri, 29 Jun 2018 03:56:03 +0200 (CEST) Received: from mail-oi0-f65.google.com (mail-oi0-f65.google.com [209.85.218.65]) by dpdk.org (Postfix) with ESMTP id 440771B54A for ; Fri, 29 Jun 2018 03:55:55 +0200 (CEST) Received: by mail-oi0-f65.google.com with SMTP id f79-v6so7028272oib.7 for ; Thu, 28 Jun 2018 18:55:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=S1g3e3n/4fwp3C2kckm+nJ4Q8ogPllXouqe+NAUrqAU=; b=skh5/T/Z5cMGI7GHI9kbmSYOqYZnYtJxP6CQL22jH1usUUOdk5Qyn8XZAPC1ZpkESt DZu+9k6BIY3NVFUWSZxshiE8Nq/Gjp99WFqXz7hK8jmTiFlIJNUT3HQ6LWtfXaZLgiSr 2qA9KvGW+20GSfq0NnzL5fIeemvfc/ECd8+qiHmV8wqIgfRq6rkIOJwR4EKVhSEefMTz QF4aEKDDhV1Y6lmUbVkGn4TiZpGfub0pNAPundQEPJq1ovVaHi1gx3W3bnSO7MitHhbR T1mTd4Pyp8DCHu8uKuxS1d1jTcpwfaJJspxvvAybv8KpxmXtOr6TypgsTWVY/WpH0EPM p1Ww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=S1g3e3n/4fwp3C2kckm+nJ4Q8ogPllXouqe+NAUrqAU=; b=f50W7PdjFm6Z8pXcqjvKXy0M3Vhi9eSv2fRy9gBSPsrHm/AKApdems4DlQjchOfzt6 ysk9AGq3ctFO4Vk64Mpfyt+rVhQXUWBUqRSd9rTmzLADHczsQv1a8+XpgU3r0eNOXUZd 6SBe4SPWquLSN5G1IAeRSjOnJJZNA4maHvNaLzgPZNah8Eo7YZxqv962016EZVXk2ePV cZCah0AaLmfh6Q7DYzGN6cFaAuyPO09SWS094BYd529Ue0ay484eqzya37YcNPxRtGhF 6AfZnj2zWxVaX0jIr/PQFEWp/WO/CIIQ3Jp989O3L/lwluIrwjYpkKcSupere3zjIJI0 vvVQ== X-Gm-Message-State: APt69E1ngng/4iG5Cs3MrGg3Jji3ULIUfbEg1iHXNoC5OvHJSMgCauMg DCa+97fGmqANHJhFeoxXV1c= X-Google-Smtp-Source: AAOMgpfqKTrBzaJc1gjXnO8Oc3gwqAvG4HbICe47Yg+ubkJFVAH2vLNQC/8O3cX7stIXx0SLdzTecA== X-Received: by 2002:aca:3357:: with SMTP id z84-v6mr22438oiz.49.1530237354471; Thu, 28 Jun 2018 18:55:54 -0700 (PDT) Received: from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net. [172.11.198.60]) by smtp.gmail.com with ESMTPSA id n3-v6sm3941288otk.38.2018.06.28.18.55.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 Jun 2018 18:55:53 -0700 (PDT) From: Dan Gora To: ferruh.yigit@intel.com Cc: dev@dpdk.org, Dan Gora Date: Thu, 28 Jun 2018 18:55:03 -0700 Message-Id: <20180629015508.26599-6-dg@adax.com> X-Mailer: git-send-email 2.18.0.rc1.1.g6f333ff2f In-Reply-To: <20180629015508.26599-1-dg@adax.com> References: <20180628224513.18391-1-dg@adax.com> <20180629015508.26599-1-dg@adax.com> Subject: [dpdk-dev] [PATCH v2 05/10] kni: don't run rte_kni_handle_request after interface release 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" Check to ensure that the KNI interface is still in use before accessing the KNI interface FIFOs to kernel space. This will help to ensure that the user does not access the KNI interface after rte_kni_release() has been called. Signed-off-by: Dan Gora --- lib/librte_kni/rte_kni.c | 6 +++++- lib/librte_kni/rte_kni.h | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index 1d84c0b70..6ef0859bf 100644 --- a/lib/librte_kni/rte_kni.c +++ b/lib/librte_kni/rte_kni.c @@ -578,7 +578,11 @@ rte_kni_handle_request(struct rte_kni *kni) unsigned ret; struct rte_kni_request *req; - if (kni == NULL) + /* + * Don't touch the req/resp fifos after + * we've been released, we can be freed at any instant! + */ + if (kni == NULL || !kni->in_use) return -1; /* Get request mbuf */ diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h index d1a95f898..94516c38f 100644 --- a/lib/librte_kni/rte_kni.h +++ b/lib/librte_kni/rte_kni.h @@ -155,6 +155,10 @@ rte_kni_free(struct rte_kni *kni); * Then analyzes it and calls the specific actions for the specific requests. * Finally constructs the response mbuf and puts it back to the resp_q. * + * Thread Safety: This function should be called in a separate thread from the + * thread which calls rte_kni_release() for this KNI. This function must not + * be called simultaneously with rte_kni_free(). + * * @param kni * The pointer to the context of an existent KNI interface. * From patchwork Fri Jun 29 01:55:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 41906 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B343B1B567; Fri, 29 Jun 2018 03:56:05 +0200 (CEST) Received: from mail-oi0-f51.google.com (mail-oi0-f51.google.com [209.85.218.51]) by dpdk.org (Postfix) with ESMTP id A40F31B533 for ; Fri, 29 Jun 2018 03:55:56 +0200 (CEST) Received: by mail-oi0-f51.google.com with SMTP id s198-v6so3174770oih.11 for ; Thu, 28 Jun 2018 18:55:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=yk6ajylhCv2817isDp+jSmjdtU2ydbjBdyBIiIlc2qs=; b=L/Mnb74PBtl8hc2gWIzw57gMOiF0Fd0BdZHeY99QY8VhrJGN/1Ci/YYt4VWWAn1aKg KT/bTVVN2RLIk7U984GhXESJGbLoxSn3OdqnEC0hxKHapz6KMjfkKM8TRKLWudA8DkXg e3RxWWzalvDkN10Aeb1BuAK3vZfuk4PZqSBXnMwHKAWTcne10oLV7L7nszVToJmXRC9z PXRV2XPLSpSNGwrUZW9q5XELWa4F3Qs8o2jwsVbKpfHychMp3xumRh01Si7nfIwIshtQ I4++WlL0TCTutwcRFLorK5No4ivLk+3Bn95Brs5zeuHcp58VaxninI1Jzp4wvcXW5TsP 14Tg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=yk6ajylhCv2817isDp+jSmjdtU2ydbjBdyBIiIlc2qs=; b=hzux9rcTlaQJQOcwMwevVC0qUmQOr5s9ZESaZaDXDjtnosSG6YV7HzAw86b1Zg5FX3 eGgtVjCn496g+HlhsJkyrhvtnyF7s3WLQF/Yun7L54yFOeI0xC6mC6wcbtAxwzgp+mNO DaVowgwXCPqI9MnXYZndtTdFkxEuRIWezLue8xKyML62LpQsJSqPXWv1Iee5O3H4dBDn EUpot1xDple85IOM4cfwNeUN4tIo/xH8GTy8vMpWocWSlS4PDN34VsY1NVrRy7ajNJqO ezMLJsTIEnRPGvj+3ow9kBEXTbo8IUPXOcVbC4MkAifgUW6Nd0ZhU9rcvreZGZ0c8A64 +vPQ== X-Gm-Message-State: APt69E3ewVClqejpVDfEd0NZr0crGmre5sqjWlvI4QFfsr9xQPvH/ajt Yk7dYIo+7bKwflL8A4qITAxrqA== X-Google-Smtp-Source: AAOMgpfDrJd7NGXa6lverjOk3p/mk5WAPEsUWgsXRbUVirjxowlMTAYjZus6kZtKItstkHX+GCiUxw== X-Received: by 2002:aca:e142:: with SMTP id y63-v6mr7546022oig.128.1530237355886; Thu, 28 Jun 2018 18:55:55 -0700 (PDT) Received: from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net. [172.11.198.60]) by smtp.gmail.com with ESMTPSA id n3-v6sm3941288otk.38.2018.06.28.18.55.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 Jun 2018 18:55:55 -0700 (PDT) From: Dan Gora To: ferruh.yigit@intel.com Cc: dev@dpdk.org, Dan Gora Date: Thu, 28 Jun 2018 18:55:04 -0700 Message-Id: <20180629015508.26599-7-dg@adax.com> X-Mailer: git-send-email 2.18.0.rc1.1.g6f333ff2f In-Reply-To: <20180629015508.26599-1-dg@adax.com> References: <20180628224513.18391-1-dg@adax.com> <20180629015508.26599-1-dg@adax.com> Subject: [dpdk-dev] [PATCH v2 06/10] kni: increase length of timeout for KNI responses 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" Increase the timeout to receive a response for KNI events handled through kni_net_process_request to 10 seconds. Certain actions, such as calling rte_eth_dev_start() can take more than 3 seconds to return, in addition to any additional time needed for the DPDK application to call rte_kni_handle_request(). Signed-off-by: Dan Gora --- kernel/linux/kni/kni_net.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c index 7fcfa106c..0850be434 100644 --- a/kernel/linux/kni/kni_net.c +++ b/kernel/linux/kni/kni_net.c @@ -25,7 +25,7 @@ #define WD_TIMEOUT 5 /*jiffies */ -#define KNI_WAIT_RESPONSE_TIMEOUT 300 /* 3 seconds */ +#define KNI_WAIT_RESPONSE_TIMEOUT 10 /* 10 seconds */ /* typedef for rx function */ typedef void (*kni_net_rx_t)(struct kni_dev *kni); @@ -101,7 +101,8 @@ kni_net_process_request(struct kni_dev *kni, struct rte_kni_request *req) } ret_val = wait_event_interruptible_timeout(kni->wq, - kni_fifo_count(kni->resp_q), 3 * HZ); + kni_fifo_count(kni->resp_q), + KNI_WAIT_RESPONSE_TIMEOUT * HZ); if (signal_pending(current) || ret_val <= 0) { ret = -ETIME; goto fail; From patchwork Fri Jun 29 01:55:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 41907 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 197B81B571; Fri, 29 Jun 2018 03:56:08 +0200 (CEST) Received: from mail-oi0-f49.google.com (mail-oi0-f49.google.com [209.85.218.49]) by dpdk.org (Postfix) with ESMTP id 38E591B550 for ; Fri, 29 Jun 2018 03:55:58 +0200 (CEST) Received: by mail-oi0-f49.google.com with SMTP id 21-v6so7039696oip.8 for ; Thu, 28 Jun 2018 18:55:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=tgYS8jjwdQq+l5ch4bOFMmfEqsoOSUE+XJwad7xwZKw=; b=Nncoq+B/eFE4XMcf551D7N7oq53gikw1Azvqr0Am0mw7GS4fZFoajGyu2D66JLftra zHqs3lFaQET0wG4Gg06ULPs8XnzAP7Qv7QQ405RV+E9xUCD7mzZwNP87CjQEX3q/I+H7 EHhMnvQFmgdzkq13f08JOoc63/+tkHusau07ZrlDXnRkeKtjy6UYldYq0WwQPw/4//yQ FcTH+YekojnqknWOq+LDUj3VPo+wq27Tng+HN4cQDW/CtnG6b3KUs1qKNz6rZvOpDf8p fvb7J4G3leX0/ewe+sR7iCa6+w87TzQZg9uv2T+CsxIhPUeueECqkMZL4FysktsXQZsL 0YVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=tgYS8jjwdQq+l5ch4bOFMmfEqsoOSUE+XJwad7xwZKw=; b=PJRzW7Na4UGRB8CUMTvYlIBJJspMqFwE0sCMLU7Xp1qnpyNHpoYTJ/zWh2egmjFDjW vrSVtpa4isLDSh/QNT5GES35dwStPVFOiTOfCYaxmKbay7TzmgQKhUoNKT5T1onJP454 oPW3mahArGzDep25fpRjPtCIWCOVsCICXZGjrwO949ex+WjviMUwt1Im+Y1IP2yUrigI Ud6wS6PTnFDIRGjVwO8daXsVDVwTp1UVzSlYC1w5ewdGFVvtDmsH/BHY4Ryxyym1xqmu dZnMeMKPfDxIkZWbMT9WkvxICZgeoDoo9nE7dU3A6+8bJ2fP3PwYmoKAk1UZpiS91E+0 PdYg== X-Gm-Message-State: APt69E0rKP5pWAu8BIQe/r/eMApt0X7JaiiGBhYgRrPnwSNc2EqEGYvz BxFyjjNwNL47/fexGbz2bjI= X-Google-Smtp-Source: AAOMgpeEfxbjEQgmyhQknMMZxAyA7axnIygfMpr2zAA1ZtjQa4UjSbwqtbRH5/vHdx4xtRmWQvr0Dg== X-Received: by 2002:aca:402:: with SMTP id 2-v6mr6826387oie.134.1530237357442; Thu, 28 Jun 2018 18:55:57 -0700 (PDT) Received: from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net. [172.11.198.60]) by smtp.gmail.com with ESMTPSA id n3-v6sm3941288otk.38.2018.06.28.18.55.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 Jun 2018 18:55:56 -0700 (PDT) From: Dan Gora To: ferruh.yigit@intel.com Cc: dev@dpdk.org, Dan Gora Date: Thu, 28 Jun 2018 18:55:05 -0700 Message-Id: <20180629015508.26599-8-dg@adax.com> X-Mailer: git-send-email 2.18.0.rc1.1.g6f333ff2f In-Reply-To: <20180629015508.26599-1-dg@adax.com> References: <20180628224513.18391-1-dg@adax.com> <20180629015508.26599-1-dg@adax.com> Subject: [dpdk-dev] [PATCH v2 07/10] kni: update kni test for rte_kni_free 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" Add support for testing rte_kni_free() function. Signed-off-by: Dan Gora --- test/test/test_kni.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/test/test_kni.c b/test/test/test_kni.c index 56773c8a2..ec051c07e 100644 --- a/test/test/test_kni.c +++ b/test/test/test_kni.c @@ -427,6 +427,12 @@ test_kni_processing(uint16_t port_id, struct rte_mempool *mp) goto fail_kni; } + /* test of freeing an unreleased kni device */ + if (rte_kni_free(kni) == 0) { + printf("should not be able to free an unreleased kni device\n"); + return -1; + } + if (rte_kni_release(kni) < 0) { printf("fail to release kni\n"); return -1; @@ -439,6 +445,12 @@ test_kni_processing(uint16_t port_id, struct rte_mempool *mp) return -1; } + /* test of freeing a released kni device */ + if (rte_kni_free(kni) != 0) { + printf("failed to free a released kni device\n"); + return -1; + } + /* test of reusing memzone */ kni = rte_kni_alloc(mp, &conf, &ops); if (!kni) { @@ -598,6 +610,14 @@ test_kni(void) goto fail; } + /* test of freeing NULL kni context */ + ret = rte_kni_free(NULL); + if (ret == 0) { + ret = -1; + printf("unexpectedly freed kni successfully\n"); + goto fail; + } + /* test of handling request on NULL device pointer */ ret = rte_kni_handle_request(NULL); if (ret == 0) { From patchwork Fri Jun 29 01:55:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 41908 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 410E31B579; Fri, 29 Jun 2018 03:56:10 +0200 (CEST) Received: from mail-oi0-f68.google.com (mail-oi0-f68.google.com [209.85.218.68]) by dpdk.org (Postfix) with ESMTP id A81231B555 for ; Fri, 29 Jun 2018 03:55:59 +0200 (CEST) Received: by mail-oi0-f68.google.com with SMTP id v8-v6so7049347oie.5 for ; Thu, 28 Jun 2018 18:55:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=t9K0HAm7ovX56o3rCITJkVg9YocRDyAImC7Yvmmmhqo=; b=cc7ocdtZHb7Fh7HDnTAOvz8+W6bg2+senm31AM1oTWgRKlOhJTPXSN8EbMXpeMYDI4 dW9uQWL3WhYtVjzR4Wp4KbQrVy33QoMzcFaRZaOzdVk9zc0wvVLqNwikztv/vXZO87NY +v7iNFyKHXrKrOiNppEeu6yOGrQnsHsR88LCeAsMTN95CzTcb7urWTjERUKBBSfFoKaL E+V0TylKT/ce4tzPzxTqIQ/jFFZytSf7KXRyqXbYeG+7H/Zk5O1p1DbVfZpKY/3wN81v qYXoC6joeDtaT4YBDX4DvcVpncTQHghvYRrvapg+ehbLS05kUPMSfuP1uDq7iJnbWdtN DCwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=t9K0HAm7ovX56o3rCITJkVg9YocRDyAImC7Yvmmmhqo=; b=Be/R3qevwK6PJLAALdwj+PdIEXefgxkKkKt6FWDeZRRPlLta6TxxE2cpEVv9XzSN3H l+90iFEyrn3e8FED33pyyCBsAbjX8O9l01n+PGjyGwxjceICKK9tCydbPZTqj7/n6IvH wxTBVZ0sTuZVRbrEwataZ/3xqMEaFQKMVFyWKhdglSDO8VHhR7SsG9TSd7GFlfzv3/8U UIlIeiT2nidH0H4laB6YBsJPgC4euwEAaIZVDlbq4AzOO30T/TDO2bw7k2EOGcYgwMCD 6Hczl9cPFi9S1+i7geDvqH5rA69qmAvCcGC/Ga5rr6GYa0F6tVZQofkmOpbCMX/gtTek o/Kg== X-Gm-Message-State: APt69E0lzLN1CYCNKpsAvZowHqcnYSNBYj0vOuJ7wgdHTyPduidB4/wp G3FWZ8r4FVFV8tia0Iuk7tXzWA== X-Google-Smtp-Source: AAOMgpc38934ZWmKNU9vUYQP06I/8A8hMO2CTcBgszUiIryCLmCQw26gay5PQWqAogD8t6MlyL1mgw== X-Received: by 2002:aca:4c8e:: with SMTP id z136-v6mr5675800oia.170.1530237358926; Thu, 28 Jun 2018 18:55:58 -0700 (PDT) Received: from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net. [172.11.198.60]) by smtp.gmail.com with ESMTPSA id n3-v6sm3941288otk.38.2018.06.28.18.55.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 Jun 2018 18:55:58 -0700 (PDT) From: Dan Gora To: ferruh.yigit@intel.com Cc: dev@dpdk.org, Dan Gora Date: Thu, 28 Jun 2018 18:55:06 -0700 Message-Id: <20180629015508.26599-9-dg@adax.com> X-Mailer: git-send-email 2.18.0.rc1.1.g6f333ff2f In-Reply-To: <20180629015508.26599-1-dg@adax.com> References: <20180628224513.18391-1-dg@adax.com> <20180629015508.26599-1-dg@adax.com> Subject: [dpdk-dev] [PATCH v2 08/10] kni: add rte_kni_free to KNI example app 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" Add rte_kni_free to the KNI example application. Signed-off-by: Dan Gora --- examples/kni/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/kni/main.c b/examples/kni/main.c index 4b162debb..75e23cd0f 100644 --- a/examples/kni/main.c +++ b/examples/kni/main.c @@ -883,7 +883,9 @@ kni_free_kni(uint16_t port_id) for (i = 0; i < p[port_id]->nb_kni; i++) { if (rte_kni_release(p[port_id]->kni[i])) - printf("Fail to release kni\n"); + printf("Failed to release kni\n"); + if (rte_kni_free(p[port_id]->kni[i])) + printf("Failed to free kni\n"); p[port_id]->kni[i] = NULL; } rte_eth_dev_stop(port_id); From patchwork Fri Jun 29 01:55:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 41909 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5FBDD1B584; Fri, 29 Jun 2018 03:56:14 +0200 (CEST) Received: from mail-oi0-f65.google.com (mail-oi0-f65.google.com [209.85.218.65]) by dpdk.org (Postfix) with ESMTP id 3B6361B557 for ; Fri, 29 Jun 2018 03:56:01 +0200 (CEST) Received: by mail-oi0-f65.google.com with SMTP id i12-v6so2633461oik.2 for ; Thu, 28 Jun 2018 18:56:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=hXv1XyDQ9FYYvhLY7WbYWIZ0bgQgqJ+Ndpj8blSVBaE=; b=WJXWFf6nHJzFnoYv8uLbO72H38Zg1OmeE+p+iPYuCkvOVOkzvWsDYBTREq2xjjmiG+ OcOi9WyQrp0yUKtVQ9HhyaTREgeM6FQPSk3f+uhXKx+hAf28Mg8dZaDqeZzybWwLfbSp ZxIP4OqbUxvp2eiQRiwuZxCZeWeLVIG3fX7A4uu9KmEIX4F5vuI9nOhzHi/oVMEDzve/ /4EWP+I/uwJ8JRqmWJOzeRvwwABkXrrgi13rMk3GdmWBTTP3O5xPB8gQgXWV6y1gHAk2 ZtgZIYuSDAImCe6+artG26gr0dteR9vknTTZ3TewNQLcfGEx8/7/gAvAZlwVtNoRkuw/ K5mA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=hXv1XyDQ9FYYvhLY7WbYWIZ0bgQgqJ+Ndpj8blSVBaE=; b=RAbUFz1S5j+7c+49ENghJh5u/78Wjq5VPCI66/fw1YoW8F8tNVbteG9YEO8Hc37MN9 aKaVonBJpOTJMCwUvehT6ZAhqdq+On6zxIArV2M9PvfJs13cLI1P+HV7mdFNrpju1erV Am+xcu7oE1urntOSdoCSz1jLTSV699GhH/uXhKv2ErOou7oTgR9XNUE4RNTJWMLu2+kQ LYWPu8vZkR9lLTVVteBdL6q5VzMCN0zcCHWH589Oy6AeXOKMsxBtItVJgO325I5KfbGL 4AhgAj/K99elF8C+hwochLE3oiBSKAwt4KbuBy3nlhd52kISnlOjDFeEGb0IdbKCpcW4 6k+g== X-Gm-Message-State: APt69E0e5dUFapEpgtFmGOIGveRNTYFx2pL/4jyq7U7CaKL7FgdLxV0t wWKdM+RffBIZNykiaoLKgaQ= X-Google-Smtp-Source: AAOMgpfKjapXuxPhPqeCKVYuEO+r/sd8k25KyvgfXWupGM/1Iw3vtCiIoF+nLcAWUBCH8586RwNcFQ== X-Received: by 2002:aca:6144:: with SMTP id v65-v6mr7764318oib.147.1530237360417; Thu, 28 Jun 2018 18:56:00 -0700 (PDT) Received: from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net. [172.11.198.60]) by smtp.gmail.com with ESMTPSA id n3-v6sm3941288otk.38.2018.06.28.18.55.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 Jun 2018 18:55:59 -0700 (PDT) From: Dan Gora To: ferruh.yigit@intel.com Cc: dev@dpdk.org, Dan Gora Date: Thu, 28 Jun 2018 18:55:07 -0700 Message-Id: <20180629015508.26599-10-dg@adax.com> X-Mailer: git-send-email 2.18.0.rc1.1.g6f333ff2f In-Reply-To: <20180629015508.26599-1-dg@adax.com> References: <20180628224513.18391-1-dg@adax.com> <20180629015508.26599-1-dg@adax.com> Subject: [dpdk-dev] [PATCH v2 09/10] kni: add rte_kni_free to KNI vdev driver 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" Add rte_kni_free to the virual KNI device. Signed-off-by: Dan Gora --- drivers/net/kni/rte_eth_kni.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/kni/rte_eth_kni.c b/drivers/net/kni/rte_eth_kni.c index ab63ea427..24c6991e6 100644 --- a/drivers/net/kni/rte_eth_kni.c +++ b/drivers/net/kni/rte_eth_kni.c @@ -463,11 +463,13 @@ eth_kni_remove(struct rte_vdev_device *vdev) if (eth_dev == NULL) return -1; - eth_kni_dev_stop(eth_dev); - internals = eth_dev->data->dev_private; rte_kni_release(internals->kni); + eth_kni_dev_stop(eth_dev); + + rte_kni_free(internals->kni); + rte_free(internals); rte_eth_dev_release_port(eth_dev); From patchwork Fri Jun 29 01:55:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Gora X-Patchwork-Id: 41910 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4CCBB1B591; Fri, 29 Jun 2018 03:56:16 +0200 (CEST) Received: from mail-oi0-f66.google.com (mail-oi0-f66.google.com [209.85.218.66]) by dpdk.org (Postfix) with ESMTP id AAAB91B54B for ; Fri, 29 Jun 2018 03:56:02 +0200 (CEST) Received: by mail-oi0-f66.google.com with SMTP id i12-v6so2633499oik.2 for ; Thu, 28 Jun 2018 18:56:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=cdEl1hq7skaMWXoPPo1VTqfPWn0cWRE6baagA8ej7DY=; b=jLz8xkEkp3ZKTS9Odw8IECk9MhaRMtQfyAeMXu7jBKXxS4dXpOp4w2CXUlxMFJkq1i ElCcjT5C/hWxLZ66xDPDf2UzI/vDsAcqK4+0r7UqgUVjDT+DLxAZKcyRFrzgib7+cl4Y JFNumSRV+PJKe5Viue4xrkt0c86fSRmiOyjpfEdi0yzdsbKcnN5iVznV8Em+w3MjfaAP yGY7dA3XNzB849wheumZ2lIb4KXcWgntkjVn59nj9beUR1RAdFPFNAz33f3SRB/K6Ppp 2LMv/U+qOTUaahsXNObtn6EOILcaUICviteCs0ro41gWHYS1A2Rr75CLHF1on0oCDQKQ us0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=cdEl1hq7skaMWXoPPo1VTqfPWn0cWRE6baagA8ej7DY=; b=V/wCLDNUcMo4zcBWKDh3PQxzWE+5qPVFElJxS4vdgNL8MYqexJFSXW329ucw61HujV ZnEeR9tVcPog3FVDLApxSamcbn73Lo30Vlm5vs3mtCLIDynp0/v6MG9X4A1kqmXPn0NB ZQcPgmgc2mkW6lIP1Er1hwb6vFxRKxz8RByUWPakIV6lGqpnBrG1c9bX70l6SfgjL/j6 ZhtSVtErJ/AT1hG7//KOdDG+97V8Viqeh2Qkn5Ooo3ltAdH9v4CSJ7Ak69k7kFFGcaKI O32oByGvZc7mef+rkJ0eHpp9SUjjclaeyp5HUnMRoiMRvl5EcKFkhWftBVXKmPWwgnMV lvAA== X-Gm-Message-State: APt69E38C3MHnetgoglhY26xn3Gq1NCM9Q+l5e/0YOC5uByKSHvYgbR+ 2fQDLwgBTAbZ7uYxI7pUOHo= X-Google-Smtp-Source: AAOMgpcFPg5Gw9lAtaUjy7IPys0uRAwGvgI35SFQL/r1DDZsibznxEu0nU+utF2Go0Uzq7OdwB5XHA== X-Received: by 2002:aca:3d05:: with SMTP id k5-v6mr6709993oia.86.1530237361871; Thu, 28 Jun 2018 18:56:01 -0700 (PDT) Received: from linux.adax.com (172-11-198-60.lightspeed.sntcca.sbcglobal.net. [172.11.198.60]) by smtp.gmail.com with ESMTPSA id n3-v6sm3941288otk.38.2018.06.28.18.56.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 Jun 2018 18:56:01 -0700 (PDT) From: Dan Gora To: ferruh.yigit@intel.com Cc: dev@dpdk.org, Dan Gora Date: Thu, 28 Jun 2018 18:55:08 -0700 Message-Id: <20180629015508.26599-11-dg@adax.com> X-Mailer: git-send-email 2.18.0.rc1.1.g6f333ff2f In-Reply-To: <20180629015508.26599-1-dg@adax.com> References: <20180628224513.18391-1-dg@adax.com> <20180629015508.26599-1-dg@adax.com> Subject: [dpdk-dev] [PATCH v2 10/10] kni: add API to set link status on kernel interface 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" Add a new API function to KNI, rte_kni_update_link() to allow DPDK applications to update the link state for the KNI network interfaces in the linux kernel. Note that the default carrier state is set to off when the interface is opened. Signed-off-by: Dan Gora --- kernel/linux/kni/kni_misc.c | 63 +++++++++++++++++++ kernel/linux/kni/kni_net.c | 2 + .../eal/include/exec-env/rte_kni_common.h | 19 ++++++ lib/librte_kni/rte_kni.c | 37 ++++++++++- lib/librte_kni/rte_kni.h | 16 +++++ 5 files changed, 136 insertions(+), 1 deletion(-) diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c index 1c38cfa1a..b5784ad1b 100644 --- a/kernel/linux/kni/kni_misc.c +++ b/kernel/linux/kni/kni_misc.c @@ -585,6 +585,66 @@ kni_ioctl_free(struct net *net, uint32_t ioctl_num, return ret; } +static int +kni_ioctl_linkstat(struct net *net, uint32_t ioctl_num, + unsigned long ioctl_param) +{ + struct kni_net *knet = net_generic(net, kni_net_id); + int ret = -EINVAL; + struct kni_dev *dev, *n; + struct rte_kni_link_info link_info; + struct net_device *netdev; + uint16_t link; + + if (_IOC_SIZE(ioctl_num) > sizeof(link_info)) + return -EINVAL; + + ret = copy_from_user(&link_info, (void *)ioctl_param, + sizeof(link_info)); + if (ret) { + pr_err("copy_from_user in kni_ioctl_release"); + return -EIO; + } + + /* Release the network device according to its name */ + if (strlen(link_info.name) == 0) + return ret; + + down_read(&knet->kni_list_lock); + list_for_each_entry_safe(dev, n, &knet->kni_list_head, list) { + if (strncmp(dev->name, link_info.name, RTE_KNI_NAMESIZE) != 0) + continue; + + netdev = dev->net_dev; + if (netdev == NULL) { + up_read(&knet->kni_list_lock); + return ret; + } + + link = link_info.link_status; + + if (!netif_carrier_ok(netdev) && link) { + pr_info("%s NIC Link is Up %d Mbps %s.\n", + netdev->name, + link_info.link_speed, + link_info.link_duplex == + RTE_KNI_LINK_FULL_DUPLEX ? + "Full Duplex" : "Half Duplex"); + netif_carrier_on(netdev); + } else if (netif_carrier_ok(netdev) && !link) { + pr_info("%s NIC Link is Down.\n", + netdev->name); + netif_carrier_off(netdev); + } + + ret = 0; + break; + } + up_read(&knet->kni_list_lock); + + return ret; +} + static int kni_ioctl(struct inode *inode, uint32_t ioctl_num, unsigned long ioctl_param) { @@ -609,6 +669,9 @@ kni_ioctl(struct inode *inode, uint32_t ioctl_num, unsigned long ioctl_param) case _IOC_NR(RTE_KNI_IOCTL_FREE): ret = kni_ioctl_free(net, ioctl_num, ioctl_param); break; + case _IOC_NR(RTE_KNI_IOCTL_LINKSTAT): + ret = kni_ioctl_linkstat(net, ioctl_num, ioctl_param); + break; default: pr_debug("IOCTL default\n"); break; diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c index 0850be434..fea3ec7e7 100644 --- a/kernel/linux/kni/kni_net.c +++ b/kernel/linux/kni/kni_net.c @@ -134,6 +134,7 @@ kni_net_open(struct net_device *dev) struct kni_dev *kni = netdev_priv(dev); netif_start_queue(dev); + netif_carrier_off(dev); memset(&req, 0, sizeof(req)); req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF; @@ -153,6 +154,7 @@ kni_net_release(struct net_device *dev) struct kni_dev *kni = netdev_priv(dev); netif_stop_queue(dev); /* can't transmit any more */ + netif_carrier_off(dev); memset(&req, 0, sizeof(req)); req.req_id = RTE_KNI_REQ_CFG_NETWORK_IF; diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h index 318a3f939..f617d8026 100644 --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h @@ -124,11 +124,30 @@ struct rte_kni_device_info { char mac_addr[6]; }; + +struct rte_kni_link_info { + char name[RTE_KNI_NAMESIZE]; /**< Network device name for KNI */ + uint32_t link_speed; /**< ETH_SPEED_NUM_ */ + +#define RTE_KNI_LINK_HALF_DUPLEX 0 /**< Half-duplex connection. */ +#define RTE_KNI_LINK_FULL_DUPLEX 1 /**< Full-duplex connection. */ + uint16_t link_duplex : 1; /**< RTE_KNI_LINK_[HALF/FULL]_DUPLEX */ + +#define RTE_KNI_LINK_FIXED 0 /**< No autonegotiation. */ +#define RTE_KNI_LINK_AUTONEG 1 /**< Autonegotiated. */ + uint16_t link_autoneg : 1; /**< RTE_KNI_LINK_[AUTONEG/FIXED] */ + +#define RTE_KNI_LINK_DOWN 0 /**< Link is down. */ +#define RTE_KNI_LINK_UP 1 /**< Link is up. */ + uint16_t link_status : 1; /**< RTE_KNI_LINK_[DOWN/UP] */ +}; + #define KNI_DEVICE "kni" #define RTE_KNI_IOCTL_TEST _IOWR(0, 1, int) #define RTE_KNI_IOCTL_CREATE _IOWR(0, 2, struct rte_kni_device_info) #define RTE_KNI_IOCTL_RELEASE _IOWR(0, 3, struct rte_kni_device_info) #define RTE_KNI_IOCTL_FREE _IOWR(0, 4, struct rte_kni_device_info) +#define RTE_KNI_IOCTL_LINKSTAT _IOWR(0, 5, struct rte_kni_link_info) #endif /* _RTE_KNI_COMMON_H_ */ diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index 6ef0859bf..aa3559306 100644 --- a/lib/librte_kni/rte_kni.c +++ b/lib/librte_kni/rte_kni.c @@ -13,7 +13,6 @@ #include #include -#include #include #include #include @@ -817,6 +816,42 @@ rte_kni_unregister_handlers(struct rte_kni *kni) return 0; } + +int +rte_kni_update_link(struct rte_kni *kni, struct rte_eth_link *link) +{ + struct rte_kni_link_info link_info; + + if (kni == NULL || !kni->in_use || link == NULL) + return -1; + + snprintf(link_info.name, sizeof(link_info.name), "%s", kni->name); + + link_info.link_speed = link->link_speed; + if (link->link_duplex == ETH_LINK_FULL_DUPLEX) + link_info.link_duplex = RTE_KNI_LINK_FULL_DUPLEX; + else + link_info.link_duplex = RTE_KNI_LINK_FULL_DUPLEX; + + if (link->link_autoneg == ETH_LINK_FIXED) + link_info.link_autoneg = RTE_KNI_LINK_FIXED; + else + link_info.link_autoneg = RTE_KNI_LINK_AUTONEG; + + if (link->link_status == ETH_LINK_UP) + link_info.link_status = RTE_KNI_LINK_UP; + else + link_info.link_status = RTE_KNI_LINK_DOWN; + + if (ioctl(kni_fd, RTE_KNI_IOCTL_LINKSTAT, &link_info) < 0) { + RTE_LOG(ERR, KNI, + "Failed to update kni link info for dev '%s'.\n", + kni->name); + return -1; + } + return 0; +} + void rte_kni_close(void) { diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h index 94516c38f..02d781a32 100644 --- a/lib/librte_kni/rte_kni.h +++ b/lib/librte_kni/rte_kni.h @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -255,6 +256,21 @@ int rte_kni_register_handlers(struct rte_kni *kni, struct rte_kni_ops *ops); */ int rte_kni_unregister_handlers(struct rte_kni *kni); +/** + * Update link status info for KNI port. + * + * Update the linkup/linkdown status of a KNI interface in the kernel. + * + * @param kni + * pointer to struct rte_kni. + * + * @return + * On success: 0 + * On failure: -1 + */ +int __rte_experimental +rte_kni_update_link(struct rte_kni *kni, struct rte_eth_link *link); + /** * Close KNI device. */