{"id":808230,"url":"http://patchwork.ozlabs.org/api/patches/808230/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/patch/20170831105827.479650817@linutronix.de/","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/projects/7/?format=json","name":"Linux network development","link_name":"netdev","list_id":"netdev.vger.kernel.org","list_email":"netdev@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170831105827.479650817@linutronix.de>","list_archive_url":null,"date":"2017-08-31T12:23:46","name":"[24/25] net/cdc_ncm: Replace tasklet with softirq hrtimer","commit_ref":null,"pull_url":null,"state":"not-applicable","archived":true,"hash":"5536883b5bc1e7e8b2e9f2e3d45742926836c99f","submitter":{"id":68517,"url":"http://patchwork.ozlabs.org/api/people/68517/?format=json","name":"Anna-Maria Behnsen","email":"anna-maria@linutronix.de"},"delegate":{"id":34,"url":"http://patchwork.ozlabs.org/api/users/34/?format=json","username":"davem","first_name":"David","last_name":"Miller","email":"davem@davemloft.net"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/20170831105827.479650817@linutronix.de/mbox/","series":[{"id":818,"url":"http://patchwork.ozlabs.org/api/series/818/?format=json","web_url":"http://patchwork.ozlabs.org/project/netdev/list/?series=818","date":"2017-08-31T12:23:44","name":null,"version":1,"mbox":"http://patchwork.ozlabs.org/series/818/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/808230/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/808230/checks/","tags":{},"related":[],"headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":"ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xjhRH5ByFz9sNr\n\tfor <patchwork-incoming@ozlabs.org>;\n\tThu, 31 Aug 2017 22:25:31 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751406AbdHaMZU (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tThu, 31 Aug 2017 08:25:20 -0400","from Galois.linutronix.de ([146.0.238.70]:60727 \"EHLO\n\tGalois.linutronix.de\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751826AbdHaMYT (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Thu, 31 Aug 2017 08:24:19 -0400","from localhost ([127.0.0.1] helo=hypnos.tec.linutronix.de)\n\tby Galois.linutronix.de with esmtp (Exim 4.80)\n\t(envelope-from <anna-maria@linutronix.de>)\n\tid 1dnOUK-0006tW-JB; Thu, 31 Aug 2017 14:22:24 +0200"],"Message-Id":"<20170831105827.479650817@linutronix.de>","User-Agent":"quilt/0.63-1","Date":"Thu, 31 Aug 2017 12:23:46 -0000","From":"Anna-Maria Gleixner <anna-maria@linutronix.de>","To":"LKML <linux-kernel@vger.kernel.org>","Cc":"Peter Zijlstra <peterz@infradead.org>, Ingo Molnar <mingo@redhat.com>,\n\tChristoph Hellwig <hch@lst.org>, keescook@chromium.org,\n\tJohn Stultz <john.stultz@linaro.org>,\n\tThomas Gleixner <tglx@linutronix.de>, Oliver Neukum <oliver@neukum.org>,\n\tGreg Kroah-Hartman <gregkh@linuxfoundation.org>,\n\tlinux-usb@vger.kernel.org, netdev@vger.kernel.org","Subject":"[PATCH 24/25] net/cdc_ncm: Replace tasklet with softirq hrtimer","References":"<20170831105725.809317030@linutronix.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Disposition":"inline;\n\tfilename=netcdc_ncm_Replace_tasklet_with_softirq_hrtimer.patch","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"From: Thomas Gleixner <tglx@linutronix.de>\n\nThe bh tasklet is used in invoke the hrtimer (cdc_ncm_tx_timer_cb) in\nsoftirq context. This can be also achieved without the tasklet but with\nCLOCK_MONOTONIC_SOFT as hrtimer base.\n\nSigned-off-by: Thomas Gleixner <tglx@linutronix.de>\nSigned-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>\nCc: Oliver Neukum <oliver@neukum.org>\nCc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>\nCc: linux-usb@vger.kernel.org\nCc: netdev@vger.kernel.org\n---\n drivers/net/usb/cdc_ncm.c   |   37 ++++++++++++++++---------------------\n include/linux/usb/cdc_ncm.h |    2 +-\n 2 files changed, 17 insertions(+), 22 deletions(-)","diff":"--- a/drivers/net/usb/cdc_ncm.c\n+++ b/drivers/net/usb/cdc_ncm.c\n@@ -61,7 +61,6 @@ static bool prefer_mbim;\n module_param(prefer_mbim, bool, S_IRUGO | S_IWUSR);\n MODULE_PARM_DESC(prefer_mbim, \"Prefer MBIM setting on dual NCM/MBIM functions\");\n \n-static void cdc_ncm_txpath_bh(unsigned long param);\n static void cdc_ncm_tx_timeout_start(struct cdc_ncm_ctx *ctx);\n static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct hrtimer *hr_timer);\n static struct usb_driver cdc_ncm_driver;\n@@ -777,10 +776,9 @@ int cdc_ncm_bind_common(struct usbnet *d\n \tif (!ctx)\n \t\treturn -ENOMEM;\n \n-\thrtimer_init(&ctx->tx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);\n+\thrtimer_init(&ctx->tx_timer, CLOCK_MONOTONIC_SOFT, HRTIMER_MODE_REL);\n \tctx->tx_timer.function = &cdc_ncm_tx_timer_cb;\n-\tctx->bh.data = (unsigned long)dev;\n-\tctx->bh.func = cdc_ncm_txpath_bh;\n+\tctx->usbnet = dev;\n \tatomic_set(&ctx->stop, 0);\n \tspin_lock_init(&ctx->mtx);\n \n@@ -967,10 +965,7 @@ void cdc_ncm_unbind(struct usbnet *dev,\n \n \tatomic_set(&ctx->stop, 1);\n \n-\tif (hrtimer_active(&ctx->tx_timer))\n-\t\thrtimer_cancel(&ctx->tx_timer);\n-\n-\ttasklet_kill(&ctx->bh);\n+\thrtimer_cancel(&ctx->tx_timer);\n \n \t/* handle devices with combined control and data interface */\n \tif (ctx->control == ctx->data)\n@@ -1348,20 +1343,9 @@ static void cdc_ncm_tx_timeout_start(str\n \t\t\t\tHRTIMER_MODE_REL);\n }\n \n-static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct hrtimer *timer)\n+static void cdc_ncm_txpath_bh(struct cdc_ncm_ctx *ctx)\n {\n-\tstruct cdc_ncm_ctx *ctx =\n-\t\t\tcontainer_of(timer, struct cdc_ncm_ctx, tx_timer);\n-\n-\tif (!atomic_read(&ctx->stop))\n-\t\ttasklet_schedule(&ctx->bh);\n-\treturn HRTIMER_NORESTART;\n-}\n-\n-static void cdc_ncm_txpath_bh(unsigned long param)\n-{\n-\tstruct usbnet *dev = (struct usbnet *)param;\n-\tstruct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0];\n+\tstruct usbnet *dev = ctx->usbnet;\n \n \tspin_lock_bh(&ctx->mtx);\n \tif (ctx->tx_timer_pending != 0) {\n@@ -1379,6 +1363,17 @@ static void cdc_ncm_txpath_bh(unsigned l\n \t}\n }\n \n+static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct hrtimer *timer)\n+{\n+\tstruct cdc_ncm_ctx *ctx =\n+\t\t\tcontainer_of(timer, struct cdc_ncm_ctx, tx_timer);\n+\n+\tif (!atomic_read(&ctx->stop))\n+\t\tcdc_ncm_txpath_bh(ctx);\n+\n+\treturn HRTIMER_NORESTART;\n+}\n+\n struct sk_buff *\n cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)\n {\n--- a/include/linux/usb/cdc_ncm.h\n+++ b/include/linux/usb/cdc_ncm.h\n@@ -92,7 +92,6 @@\n struct cdc_ncm_ctx {\n \tstruct usb_cdc_ncm_ntb_parameters ncm_parm;\n \tstruct hrtimer tx_timer;\n-\tstruct tasklet_struct bh;\n \n \tconst struct usb_cdc_ncm_desc *func_desc;\n \tconst struct usb_cdc_mbim_desc *mbim_desc;\n@@ -101,6 +100,7 @@ struct cdc_ncm_ctx {\n \n \tstruct usb_interface *control;\n \tstruct usb_interface *data;\n+\tstruct usbnet *usbnet;\n \n \tstruct sk_buff *tx_curr_skb;\n \tstruct sk_buff *tx_rem_skb;\n","prefixes":["24/25"]}