Patch "usb/gadget: f_midi: Replace tasklet with work" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    usb/gadget: f_midi: Replace tasklet with work

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     usb-gadget-f_midi-replace-tasklet-with-work.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 2da9d545c53c48d6a441242a8de0f88efc2238af
Author: Davidlohr Bueso <dave@xxxxxxxxxxxx>
Date:   Sun Jan 10 20:28:55 2021 -0800

    usb/gadget: f_midi: Replace tasklet with work
    
    [ Upstream commit 8653d71ce3763aedcf3d2331f59beda3fecd79e4 ]
    
    Currently a tasklet is used to transmit input substream buffer
    data. However, tasklets have long been deprecated as being too
    heavy on the system by running in irq context - and this is not
    a performance critical path. If a higher priority process wants
    to run, it must wait for the tasklet to finish before doing so.
    
    Deferring work to a workqueue and executing in process context
    should be fine considering the callback already does
    f_midi_do_transmit() under the transmit_lock and thus changes in
    semantics are ok regarding concurrency - tasklets being serialized
    against itself.
    
    Cc: Takashi Iwai <tiwai@xxxxxxx>
    Reviewed-by: Takashi Iwai <tiwai@xxxxxxx>
    Acked-by: Felipe Balbi <balbi@xxxxxxxxxx>
    Signed-off-by: Davidlohr Bueso <dbueso@xxxxxxx>
    Link: https://lore.kernel.org/r/20210111042855.73289-1-dave@xxxxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Stable-dep-of: 4ab37fcb4283 ("USB: gadget: f_midi: f_midi_complete to call queue_work")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c
index 71aeaa2302edd..01c5736d381ef 100644
--- a/drivers/usb/gadget/function/f_midi.c
+++ b/drivers/usb/gadget/function/f_midi.c
@@ -87,7 +87,7 @@ struct f_midi {
 	struct snd_rawmidi_substream *out_substream[MAX_PORTS];
 
 	unsigned long		out_triggered;
-	struct tasklet_struct	tasklet;
+	struct work_struct	work;
 	unsigned int in_ports;
 	unsigned int out_ports;
 	int index;
@@ -698,9 +698,11 @@ static void f_midi_transmit(struct f_midi *midi)
 	f_midi_drop_out_substreams(midi);
 }
 
-static void f_midi_in_tasklet(struct tasklet_struct *t)
+static void f_midi_in_work(struct work_struct *work)
 {
-	struct f_midi *midi = from_tasklet(midi, t, tasklet);
+	struct f_midi *midi;
+
+	midi = container_of(work, struct f_midi, work);
 	f_midi_transmit(midi);
 }
 
@@ -737,7 +739,7 @@ static void f_midi_in_trigger(struct snd_rawmidi_substream *substream, int up)
 	VDBG(midi, "%s() %d\n", __func__, up);
 	midi->in_ports_array[substream->number].active = up;
 	if (up)
-		tasklet_hi_schedule(&midi->tasklet);
+		queue_work(system_highpri_wq, &midi->work);
 }
 
 static int f_midi_out_open(struct snd_rawmidi_substream *substream)
@@ -875,7 +877,7 @@ static int f_midi_bind(struct usb_configuration *c, struct usb_function *f)
 	int status, n, jack = 1, i = 0, endpoint_descriptor_index = 0;
 
 	midi->gadget = cdev->gadget;
-	tasklet_setup(&midi->tasklet, f_midi_in_tasklet);
+	INIT_WORK(&midi->work, f_midi_in_work);
 	status = f_midi_register_card(midi);
 	if (status < 0)
 		goto fail_register;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux