[alsa-devel] [PATCH] ALSA: oxfw: use workqueue instead of tasklet for scs1x
Takashi Iwai
tiwai at suse.de
Thu Feb 18 15:30:26 CET 2016
On Wed, 17 Feb 2016 17:24:36 +0100,
Takashi Sakamoto wrote:
>
> This commit replaces tasklet with workqueue for scs1x functionality of
> ALSA oxfw driver.
>
> This driver transfers MIDI message specific for SCS.1m and SCS.1d. This
> task is currently done in software IRQ context of tasklet. In a view of
> system, this context is limited resources and some important drivers (at
> least, more important than ALSA oxfw driver) use the context as its
> bottom-harf.
>
> If the work to transfer MIDI messages is done within a time, it's better
> to use the other context for the work. Actually, with recent CPUs, the
> work will be scheduled within a time. This is a reason of this commit.
>
> Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
Applied, thanks.
Takashi
> ---
> sound/firewire/oxfw/oxfw-scs1x.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/sound/firewire/oxfw/oxfw-scs1x.c b/sound/firewire/oxfw/oxfw-scs1x.c
> index bb53eb3..f7ac124 100644
> --- a/sound/firewire/oxfw/oxfw-scs1x.c
> +++ b/sound/firewire/oxfw/oxfw-scs1x.c
> @@ -26,7 +26,7 @@ struct fw_scs1x {
> u8 output_bytes;
> bool output_escaped;
> bool output_escape_high_nibble;
> - struct tasklet_struct tasklet;
> + struct work_struct work;
> wait_queue_head_t idle_wait;
> u8 buffer[HSS1394_MAX_PACKET_SIZE];
> bool transaction_running;
> @@ -129,7 +129,7 @@ static void scs_write_callback(struct fw_card *card, int rcode,
> ; /* TODO: retry this packet */
>
> scs->transaction_running = false;
> - tasklet_schedule(&scs->tasklet);
> + schedule_work(&scs->work);
> }
>
> static bool is_valid_running_status(u8 status)
> @@ -165,9 +165,9 @@ static bool is_invalid_cmd(u8 status)
> status == 0xfd;
> }
>
> -static void scs_output_tasklet(unsigned long data)
> +static void scs_output_work(struct work_struct *work)
> {
> - struct fw_scs1x *scs = (struct fw_scs1x *)data;
> + struct fw_scs1x *scs = container_of(work, struct fw_scs1x, work);
> struct snd_rawmidi_substream *stream;
> unsigned int i;
> u8 byte;
> @@ -311,7 +311,7 @@ static void midi_playback_trigger(struct snd_rawmidi_substream *stream, int up)
> scs->output_idle = false;
>
> ACCESS_ONCE(scs->output) = stream;
> - tasklet_schedule(&scs->tasklet);
> + schedule_work(&scs->work);
> } else {
> ACCESS_ONCE(scs->output) = NULL;
> }
> @@ -395,7 +395,7 @@ int snd_oxfw_scs1x_add(struct snd_oxfw *oxfw)
> snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT,
> &midi_playback_ops);
>
> - tasklet_init(&scs->tasklet, scs_output_tasklet, (unsigned long)scs);
> + INIT_WORK(&scs->work, scs_output_work);
> init_waitqueue_head(&scs->idle_wait);
> scs->output_idle = true;
>
> --
> 2.5.0
>
More information about the Alsa-devel
mailing list