[alsa-devel] Question about the right fix for a sparse warning
Takashi Iwai
tiwai at suse.de
Wed Jan 29 18:14:26 CET 2020
On Wed, 29 Jan 2020 18:07:20 +0100,
Takashi Iwai wrote:
>
> On Wed, 29 Jan 2020 18:01:00 +0100,
> Pierre-Louis Bossart wrote:
> >
> >
> >
> > >>>> We're seeing the following sparse warning in the SOF code:
> > >>>>
> > >>>> sound/soc/sof/sof-audio.c:86:31: warning: incorrect type in assignment (different base types)
> > >>>> sound/soc/sof/sof-audio.c:86:31: expected restricted snd_pcm_state_t [usertype] state
> > >>>> sound/soc/sof/sof-audio.c:86:31: got signed int [signed] [usertype] [explicitly-signed] state
> > >>>>
> > >>>> The line under scrutiny where we assign "state" is as follows:
> > >>>>
> > >>>> state = substream->runtime->status->state;
> > >>>>
> > >>>> and it is defined as
> > >>>> snd_pcm_state_t state;
> > >>>>
> > >>>> There are other places (ex pcm_oss.c) where a similar assignment has been used
> > >>>> as well.
> > >>>>
> > >>>> What fixes the issue is a forced cast to snd_pcm_state_t as below before
> > >>>> assigning:
> > >>>> state = (__force snd_pcm_state_t)substream->runtime->status->state;
> > >>>>
> > >>>> Do you think this is acceptable? If not, could you please suggest an
> > >>>> alternative?
> > >>>
> > >>> Hm, I don't see the warning in my code. Did you merge all upstream
> > >>> stuff and still get it?
> > >>
> > >> It's been merged in the SOF tree (topic/sof-dev) and it'll be in the
> > >> next batch I send. It's not upstream just yet because we want to
> > >> remove the warning to make the patch nice and shiny :-)
> > >
> > > I still wonder why I couldn't get it on my tree. I guess the code
> > > around that hasn't changed, right?
> > >
> > > Wait... Is it a test on 32bit arch? If so, it might be a new thing
> > > for y2038 support. Then we may fix the uapi definition instead.
> >
> > It's actually in your tree already, my mistake, see:
> >
> > ee1e79b72e3cf ("ASoC: SOF: partition audio-related parts from SOF core")
> >
> > It's with plain-vanilla x86_64, I can share the config.
>
> Sorry, my bad, it seems that my sparse program was too old. After
> upgrading to the latest version, I could see the warning, too.
... and the cause was what I suspected: it's a 64bit compat type that
defines the fields explicitly with __s32. I overlooked that it's
always used for __KERNEL__. The tentative fix is below.
thanks,
Takashi
--- a/include/uapi/sound/asound.h
+++ b/include/uapi/sound/asound.h
@@ -564,13 +564,13 @@ typedef char __pad_after_uframe[sizeof(__u64) - sizeof(snd_pcm_uframes_t)];
#endif
struct __snd_pcm_mmap_status64 {
- __s32 state; /* RO: state - SNDRV_PCM_STATE_XXXX */
+ snd_pcm_state_t state; /* RO: state - SNDRV_PCM_STATE_XXXX */
__u32 pad1; /* Needed for 64 bit alignment */
__pad_before_uframe __pad1;
snd_pcm_uframes_t hw_ptr; /* RO: hw ptr (0...boundary-1) */
__pad_after_uframe __pad2;
struct __snd_timespec64 tstamp; /* Timestamp */
- __s32 suspended_state; /* RO: suspended stream state */
+ snd_pcm_state_t suspended_state; /* RO: suspended stream state */
__u32 pad3; /* Needed for 64 bit alignment */
struct __snd_timespec64 audio_tstamp; /* sample counter or wall clock */
};
More information about the Alsa-devel
mailing list