[alsa-devel] [PATCH RFC 16/21] ALSA: pcm/oss: refer to parameters instead of copying to reduce usage of kernel stack

Takashi Iwai tiwai at suse.de
Mon May 15 11:15:49 CEST 2017


On Mon, 15 May 2017 11:10:14 +0200,
Takashi Iwai wrote:
> 
> On Sun, 14 May 2017 10:57:51 +0200,
> Takashi Sakamoto wrote:
> > 
> > Some functions in compatibility layer for Open Sound System interface has
> > local variable to copy some parameters in runtime of PCM substream, while
> > this can be replaced with reference of pointers to parameter itself. This
> > brings an advantage to reduce usage of kernel stack.
> > 
> > This commit applies this idea.
> 
> Are you sure that this patch won't break anything?
> Using the local copy is for not changing the values at evaluation
> before actually trying to set.

Never mind, I understand that it's about format_mask and it's
consitfied.


Takashi

> 
> 
> thanks,
> 
> Takashi
> 
> > 
> > Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
> > ---
> >  sound/core/oss/pcm_oss.c    | 16 ++++++++--------
> >  sound/core/oss/pcm_plugin.c |  5 +++--
> >  sound/core/oss/pcm_plugin.h |  2 +-
> >  3 files changed, 12 insertions(+), 11 deletions(-)
> > 
> > diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
> > index 2a47351..e306f05 100644
> > --- a/sound/core/oss/pcm_oss.c
> > +++ b/sound/core/oss/pcm_oss.c
> > @@ -848,7 +848,7 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream,
> >  	int direct;
> >  	snd_pcm_format_t format, sformat;
> >  	int n;
> > -	struct snd_mask sformat_mask;
> > +	const struct snd_mask *sformat_mask;
> >  	struct snd_mask mask;
> >  
> >  	if (trylock) {
> > @@ -891,18 +891,18 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream,
> >  
> >  	format = snd_pcm_oss_format_from(runtime->oss.format);
> >  
> > -	sformat_mask = *hw_param_mask(sparams, SNDRV_PCM_HW_PARAM_FORMAT);
> > +	sformat_mask = hw_param_mask_c(sparams, SNDRV_PCM_HW_PARAM_FORMAT);
> >  	if (direct)
> >  		sformat = format;
> >  	else
> > -		sformat = snd_pcm_plug_slave_format(format, &sformat_mask);
> > +		sformat = snd_pcm_plug_slave_format(format, sformat_mask);
> >  
> >  	if ((__force int)sformat < 0 ||
> > -	    !snd_mask_test(&sformat_mask, (__force int)sformat)) {
> > +	    !snd_mask_test(sformat_mask, (__force int)sformat)) {
> >  		for (sformat = (__force snd_pcm_format_t)0;
> >  		     (__force int)sformat <= (__force int)SNDRV_PCM_FORMAT_LAST;
> >  		     sformat = (__force snd_pcm_format_t)((__force int)sformat + 1)) {
> > -			if (snd_mask_test(&sformat_mask, (__force int)sformat) &&
> > +			if (snd_mask_test(sformat_mask, (__force int)sformat) &&
> >  			    snd_pcm_oss_format_to(sformat) >= 0)
> >  				break;
> >  		}
> > @@ -1780,7 +1780,7 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file)
> >  	int direct;
> >  	struct snd_pcm_hw_params *params;
> >  	unsigned int formats = 0;
> > -	struct snd_mask format_mask;
> > +	const struct snd_mask *format_mask;
> >  	int fmt;
> >  
> >  	if ((err = snd_pcm_oss_get_active_substream(pcm_oss_file, &substream)) < 0)
> > @@ -1802,12 +1802,12 @@ static int snd_pcm_oss_get_formats(struct snd_pcm_oss_file *pcm_oss_file)
> >  		return -ENOMEM;
> >  	_snd_pcm_hw_params_any(params);
> >  	err = snd_pcm_hw_refine(substream, params);
> > -	format_mask = *hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); 
> > +	format_mask = hw_param_mask_c(params, SNDRV_PCM_HW_PARAM_FORMAT);
> >  	kfree(params);
> >  	if (err < 0)
> >  		return err;
> >  	for (fmt = 0; fmt < 32; ++fmt) {
> > -		if (snd_mask_test(&format_mask, fmt)) {
> > +		if (snd_mask_test(format_mask, fmt)) {
> >  			int f = snd_pcm_oss_format_to(fmt);
> >  			if (f >= 0)
> >  				formats |= f;
> > diff --git a/sound/core/oss/pcm_plugin.c b/sound/core/oss/pcm_plugin.c
> > index 727ac44..cadc937 100644
> > --- a/sound/core/oss/pcm_plugin.c
> > +++ b/sound/core/oss/pcm_plugin.c
> > @@ -266,7 +266,8 @@ snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *plug, snd_pc
> >  	return frames;
> >  }
> >  
> > -static int snd_pcm_plug_formats(struct snd_mask *mask, snd_pcm_format_t format)
> > +static int snd_pcm_plug_formats(const struct snd_mask *mask,
> > +				snd_pcm_format_t format)
> >  {
> >  	struct snd_mask formats = *mask;
> >  	u64 linfmts = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8 |
> > @@ -309,7 +310,7 @@ static snd_pcm_format_t preferred_formats[] = {
> >  };
> >  
> >  snd_pcm_format_t snd_pcm_plug_slave_format(snd_pcm_format_t format,
> > -					   struct snd_mask *format_mask)
> > +					   const struct snd_mask *format_mask)
> >  {
> >  	int i;
> >  
> > diff --git a/sound/core/oss/pcm_plugin.h b/sound/core/oss/pcm_plugin.h
> > index a5035c2..38e2c14 100644
> > --- a/sound/core/oss/pcm_plugin.h
> > +++ b/sound/core/oss/pcm_plugin.h
> > @@ -126,7 +126,7 @@ int snd_pcm_plug_format_plugins(struct snd_pcm_substream *substream,
> >  				struct snd_pcm_hw_params *slave_params);
> >  
> >  snd_pcm_format_t snd_pcm_plug_slave_format(snd_pcm_format_t format,
> > -					   struct snd_mask *format_mask);
> > +					   const struct snd_mask *format_mask);
> >  
> >  int snd_pcm_plugin_append(struct snd_pcm_plugin *plugin);
> >  
> > -- 
> > 2.9.3
> > 


More information about the Alsa-devel mailing list