On Tue, 6 Oct 2020 11:41:54 +0530 Allen Pais wrote: > From: Allen Pais <ap...@linux.microsoft.com> > > In preparation for unconditionally passing the > struct tasklet_struct pointer to all tasklet > callbacks, switch to using the new tasklet_setup() > and from_tasklet() to pass the tasklet pointer explicitly.
> @@ -815,7 +815,7 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct > usb_interface *intf, u8 data_ > > hrtimer_init(&ctx->tx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); > ctx->tx_timer.function = &cdc_ncm_tx_timer_cb; > - tasklet_init(&ctx->bh, cdc_ncm_txpath_bh, (unsigned long)dev); > + tasklet_setup(&ctx->bh, cdc_ncm_txpath_bh); > atomic_set(&ctx->stop, 0); > spin_lock_init(&ctx->mtx); > > @@ -1468,9 +1468,9 @@ static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct > hrtimer *timer) > return HRTIMER_NORESTART; > } > > -static void cdc_ncm_txpath_bh(unsigned long param) > +static void cdc_ncm_txpath_bh(struct tasklet_struct *t) > { > - struct usbnet *dev = (struct usbnet *)param; > + struct usbnet *dev = from_tasklet(dev, t, bh); > struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0]; > > spin_lock_bh(&ctx->mtx); This one is wrong. ctx is struct cdc_ncm_ctx, but you from_tasklet() struct usbdev. They both happen to have a tasklet called bh in 'em.