Commit b1a31a5f authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Ingo Molnar

usb/gadget/NCM: Replace tasklet with softirq hrtimer

The tx_tasklet tasklet is used in invoke the hrtimer (task_timer) in
softirq context. This can be also achieved without the tasklet but
with HRTIMER_MODE_SOFT as hrtimer mode.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAnna-Maria Gleixner <anna-maria@linutronix.de>
Acked-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Felipe Balbi <balbi@kernel.org>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: keescook@chromium.org
Cc: linux-usb@vger.kernel.org
Link: http://lkml.kernel.org/r/20171221104205.7269-36-anna-maria@linutronix.deSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent b03bbbe0
...@@ -73,9 +73,7 @@ struct f_ncm { ...@@ -73,9 +73,7 @@ struct f_ncm {
struct sk_buff *skb_tx_ndp; struct sk_buff *skb_tx_ndp;
u16 ndp_dgram_count; u16 ndp_dgram_count;
bool timer_force_tx; bool timer_force_tx;
struct tasklet_struct tx_tasklet;
struct hrtimer task_timer; struct hrtimer task_timer;
bool timer_stopping; bool timer_stopping;
}; };
...@@ -1104,7 +1102,7 @@ static struct sk_buff *ncm_wrap_ntb(struct gether *port, ...@@ -1104,7 +1102,7 @@ static struct sk_buff *ncm_wrap_ntb(struct gether *port,
/* Delay the timer. */ /* Delay the timer. */
hrtimer_start(&ncm->task_timer, TX_TIMEOUT_NSECS, hrtimer_start(&ncm->task_timer, TX_TIMEOUT_NSECS,
HRTIMER_MODE_REL); HRTIMER_MODE_REL_SOFT);
/* Add the datagram position entries */ /* Add the datagram position entries */
ntb_ndp = skb_put_zero(ncm->skb_tx_ndp, dgram_idx_len); ntb_ndp = skb_put_zero(ncm->skb_tx_ndp, dgram_idx_len);
...@@ -1148,17 +1146,15 @@ static struct sk_buff *ncm_wrap_ntb(struct gether *port, ...@@ -1148,17 +1146,15 @@ static struct sk_buff *ncm_wrap_ntb(struct gether *port,
} }
/* /*
* This transmits the NTB if there are frames waiting. * The transmit should only be run if no skb data has been sent
* for a certain duration.
*/ */
static void ncm_tx_tasklet(unsigned long data) static enum hrtimer_restart ncm_tx_timeout(struct hrtimer *data)
{ {
struct f_ncm *ncm = (void *)data; struct f_ncm *ncm = container_of(data, struct f_ncm, task_timer);
if (ncm->timer_stopping)
return;
/* Only send if data is available. */ /* Only send if data is available. */
if (ncm->skb_tx_data) { if (!ncm->timer_stopping && ncm->skb_tx_data) {
ncm->timer_force_tx = true; ncm->timer_force_tx = true;
/* XXX This allowance of a NULL skb argument to ndo_start_xmit /* XXX This allowance of a NULL skb argument to ndo_start_xmit
...@@ -1171,16 +1167,6 @@ static void ncm_tx_tasklet(unsigned long data) ...@@ -1171,16 +1167,6 @@ static void ncm_tx_tasklet(unsigned long data)
ncm->timer_force_tx = false; ncm->timer_force_tx = false;
} }
}
/*
* The transmit should only be run if no skb data has been sent
* for a certain duration.
*/
static enum hrtimer_restart ncm_tx_timeout(struct hrtimer *data)
{
struct f_ncm *ncm = container_of(data, struct f_ncm, task_timer);
tasklet_schedule(&ncm->tx_tasklet);
return HRTIMER_NORESTART; return HRTIMER_NORESTART;
} }
...@@ -1513,8 +1499,7 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) ...@@ -1513,8 +1499,7 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f)
ncm->port.open = ncm_open; ncm->port.open = ncm_open;
ncm->port.close = ncm_close; ncm->port.close = ncm_close;
tasklet_init(&ncm->tx_tasklet, ncm_tx_tasklet, (unsigned long) ncm); hrtimer_init(&ncm->task_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_SOFT);
hrtimer_init(&ncm->task_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
ncm->task_timer.function = ncm_tx_timeout; ncm->task_timer.function = ncm_tx_timeout;
DBG(cdev, "CDC Network: %s speed IN/%s OUT/%s NOTIFY/%s\n", DBG(cdev, "CDC Network: %s speed IN/%s OUT/%s NOTIFY/%s\n",
...@@ -1623,7 +1608,6 @@ static void ncm_unbind(struct usb_configuration *c, struct usb_function *f) ...@@ -1623,7 +1608,6 @@ static void ncm_unbind(struct usb_configuration *c, struct usb_function *f)
DBG(c->cdev, "ncm unbind\n"); DBG(c->cdev, "ncm unbind\n");
hrtimer_cancel(&ncm->task_timer); hrtimer_cancel(&ncm->task_timer);
tasklet_kill(&ncm->tx_tasklet);
ncm_string_defs[0].id = 0; ncm_string_defs[0].id = 0;
usb_free_all_descriptors(f); usb_free_all_descriptors(f);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment