[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