OSDN Git Service

ALSA: usb-audio: Replace tasklet with work
authorTakashi Iwai <tiwai@suse.de>
Thu, 3 Sep 2020 10:41:23 +0000 (12:41 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 9 Sep 2020 16:33:03 +0000 (18:33 +0200)
The tasklet is an old API that should be deprecated, usually can be
converted to another decent API.  In USB-audio driver, a tasklet is
still used in MIDI interface code for handling the output byte
stream.  It can be achieved gracefully with a work queued in the
high-prio system workqueue.

This patch replaces the tasklet usage in USB-audio driver with a
simple work.

Link: https://lore.kernel.org/r/20200903104131.21097-4-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/midi.c

index e8287a0..c821365 100644 (file)
@@ -142,7 +142,7 @@ struct snd_usb_midi_out_endpoint {
        unsigned int active_urbs;
        unsigned int drain_urbs;
        int max_transfer;               /* size of urb buffer */
-       struct tasklet_struct tasklet;
+       struct work_struct work;
        unsigned int next_urb;
        spinlock_t buffer_lock;
 
@@ -344,9 +344,10 @@ static void snd_usbmidi_do_output(struct snd_usb_midi_out_endpoint *ep)
        spin_unlock_irqrestore(&ep->buffer_lock, flags);
 }
 
-static void snd_usbmidi_out_tasklet(struct tasklet_struct *t)
+static void snd_usbmidi_out_work(struct work_struct *work)
 {
-       struct snd_usb_midi_out_endpoint *ep = from_tasklet(ep, t, tasklet);
+       struct snd_usb_midi_out_endpoint *ep =
+               container_of(work, struct snd_usb_midi_out_endpoint, work);
 
        snd_usbmidi_do_output(ep);
 }
@@ -1177,7 +1178,7 @@ static void snd_usbmidi_output_trigger(struct snd_rawmidi_substream *substream,
                        snd_rawmidi_proceed(substream);
                        return;
                }
-               tasklet_schedule(&port->ep->tasklet);
+               queue_work(system_highpri_wq, &port->ep->work);
        }
 }
 
@@ -1440,7 +1441,7 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi *umidi,
        }
 
        spin_lock_init(&ep->buffer_lock);
-       tasklet_setup(&ep->tasklet, snd_usbmidi_out_tasklet);
+       INIT_WORK(&ep->work, snd_usbmidi_out_work);
        init_waitqueue_head(&ep->drain_wait);
 
        for (i = 0; i < 0x10; ++i)
@@ -1503,7 +1504,7 @@ void snd_usbmidi_disconnect(struct list_head *p)
        for (i = 0; i < MIDI_MAX_ENDPOINTS; ++i) {
                struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i];
                if (ep->out)
-                       tasklet_kill(&ep->out->tasklet);
+                       cancel_work_sync(&ep->out->work);
                if (ep->out) {
                        for (j = 0; j < OUTPUT_URBS; ++j)
                                usb_kill_urb(ep->out->urbs[j].urb);