diff mbox

1.1.4 bug report: dmix fails when using both 32-bit and 64-bit clients

Message ID s5hshjskdhc.wl-tiwai@suse.de (mailing list archive)
State New, archived
Headers show

Commit Message

Takashi Iwai May 25, 2017, 6:17 p.m. UTC
On Thu, 25 May 2017 18:51:10 +0200,
Cheng Sun wrote:
> 
> On 25 May 2017 at 17:31, Takashi Iwai <tiwai@suse.de> wrote:
> > On Thu, 25 May 2017 17:43:44 +0200,
> > Cheng Sun wrote:
> >>
> >> On 25 May 2017 14:49, "Takashi Iwai" <tiwai@suse.de> wrote:
> >> >
> >> > On Wed, 24 May 2017 21:13:46 +0200,
> >> > Cheng Sun wrote:
> >> > >
> >> > > Hi all,
> >> > >
> >> > > The following commit (released in v1.1.4) introduced an issue where a
> >> > > client compiled against a 32-bit (x86) compile of alsa-lib cannot use
> >> > > the same dmix as a client compiled against a 64-bit alsa-lib.
> >> > >
> >> > >     1a9bd0f0448106b917ae7f7bedccfcbf6ce84802
> >> > >
> >> > > The error message is:
> >> > >
> >> > >     ALSA lib pcm_dmix.c:1077:(snd_pcm_dmix_open) unable to create IPC
> >> > > shm instance
> >> > >
> >> > > The following forum post (not mine) describes the symptoms of the
> >> > > issue in more detail (although the git commit the poster specified is
> >> > > not correct):
> >> > >
> >> > >
> >> https://forums.gentoo.org/viewtopic-p-8072290.html?sid=c2fbca45102933ddf9ca7cf8b6713e56
> >> >
> >> > There is a known problem when you mix up two alsa-lib versions because
> >> > of the changes in dmix shmem struct.  The solution should upgrade all
> >> > users.
> >>
> >> (Apologies for duplicate email --accidentally sent the first reply to the
> >> wrong address.)
> >>
> >> Arch Linux has upgraded both its 32 and 64 bit packages to v1.1.4, and I'm
> >> still experiencing this problem.
> >>
> >> While bisecting the bug I linked against two compiles of the same alsa-lib
> >> versions each time.
> >>
> >> Let me know if I can provide any other information.
> >
> > OK, at first to see whether it's the issue of the struct size
> > mismatch, check the following patch.  If it is, you'll see the error
> > message.  To be sure, check both cases: 64bit -> 32bit, and 32bit ->
> > 64bit.
> 
> The behaviour is different for the two cases.
> 
> 1) If 64bit client is started first, then the 32bit client prints the following:
> 
> magic mismatch: shmptr=a15ad4f0, expected=a15ad4ec
> ALSA lib pcm_dmix.c:1077:(snd_pcm_dmix_open) unable to create IPC shm instance
> 
> 2) If 32bit client is started first, then the 64bit client only prints:
> 
> ALSA lib pcm_dmix.c:1077:(snd_pcm_dmix_open) unable to create IPC shm instance
> 
> I've added some further print statements and it turns out that this is
> because the "return err;" on line 115 is triggered.

Hm, so at least the struct size difference is a problem.
Doese the patch below change the behavior?


Takashi

---

Comments

Cheng Sun May 25, 2017, 6:34 p.m. UTC | #1
On 25 May 2017 at 19:17, Takashi Iwai <tiwai@suse.de> wrote:
> On Thu, 25 May 2017 18:51:10 +0200,
> Cheng Sun wrote:
>>
>> On 25 May 2017 at 17:31, Takashi Iwai <tiwai@suse.de> wrote:
>> > On Thu, 25 May 2017 17:43:44 +0200,
>> > Cheng Sun wrote:
>> >>
>> >> On 25 May 2017 14:49, "Takashi Iwai" <tiwai@suse.de> wrote:
>> >> >
>> >> > On Wed, 24 May 2017 21:13:46 +0200,
>> >> > Cheng Sun wrote:
>> >> > >
>> >> > > Hi all,
>> >> > >
>> >> > > The following commit (released in v1.1.4) introduced an issue where a
>> >> > > client compiled against a 32-bit (x86) compile of alsa-lib cannot use
>> >> > > the same dmix as a client compiled against a 64-bit alsa-lib.
>> >> > >
>> >> > >     1a9bd0f0448106b917ae7f7bedccfcbf6ce84802
>> >> > >
>> >> > > The error message is:
>> >> > >
>> >> > >     ALSA lib pcm_dmix.c:1077:(snd_pcm_dmix_open) unable to create IPC
>> >> > > shm instance
>> >> > >
>> >> > > The following forum post (not mine) describes the symptoms of the
>> >> > > issue in more detail (although the git commit the poster specified is
>> >> > > not correct):
>> >> > >
>> >> > >
>> >> https://forums.gentoo.org/viewtopic-p-8072290.html?sid=c2fbca45102933ddf9ca7cf8b6713e56
>> >> >
>> >> > There is a known problem when you mix up two alsa-lib versions because
>> >> > of the changes in dmix shmem struct.  The solution should upgrade all
>> >> > users.
>> >>
>> >> (Apologies for duplicate email --accidentally sent the first reply to the
>> >> wrong address.)
>> >>
>> >> Arch Linux has upgraded both its 32 and 64 bit packages to v1.1.4, and I'm
>> >> still experiencing this problem.
>> >>
>> >> While bisecting the bug I linked against two compiles of the same alsa-lib
>> >> versions each time.
>> >>
>> >> Let me know if I can provide any other information.
>> >
>> > OK, at first to see whether it's the issue of the struct size
>> > mismatch, check the following patch.  If it is, you'll see the error
>> > message.  To be sure, check both cases: 64bit -> 32bit, and 32bit ->
>> > 64bit.
>>
>> The behaviour is different for the two cases.
>>
>> 1) If 64bit client is started first, then the 32bit client prints the following:
>>
>> magic mismatch: shmptr=a15ad4f0, expected=a15ad4ec
>> ALSA lib pcm_dmix.c:1077:(snd_pcm_dmix_open) unable to create IPC shm instance
>>
>> 2) If 32bit client is started first, then the 64bit client only prints:
>>
>> ALSA lib pcm_dmix.c:1077:(snd_pcm_dmix_open) unable to create IPC shm instance
>>
>> I've added some further print statements and it turns out that this is
>> because the "return err;" on line 115 is triggered.
>
> Hm, so at least the struct size difference is a problem.
> Doese the patch below change the behavior?

Your patch did not change the behaviour.

However, as an experiment I added "__attribute__((__packed__))" to the
struct, which fixed the problem. So this does seem to be caused by gcc
padding structs differently when compiling 32-bit vs 64-bit.

I don't think "__attribute__((__packed__))" is necessarily the correct
solution here though.

Cheers,
Cheng
Takashi Iwai May 25, 2017, 6:55 p.m. UTC | #2
On Thu, 25 May 2017 20:34:23 +0200,
Cheng Sun wrote:
> 
> On 25 May 2017 at 19:17, Takashi Iwai <tiwai@suse.de> wrote:
> > On Thu, 25 May 2017 18:51:10 +0200,
> > Cheng Sun wrote:
> >>
> >> On 25 May 2017 at 17:31, Takashi Iwai <tiwai@suse.de> wrote:
> >> > On Thu, 25 May 2017 17:43:44 +0200,
> >> > Cheng Sun wrote:
> >> >>
> >> >> On 25 May 2017 14:49, "Takashi Iwai" <tiwai@suse.de> wrote:
> >> >> >
> >> >> > On Wed, 24 May 2017 21:13:46 +0200,
> >> >> > Cheng Sun wrote:
> >> >> > >
> >> >> > > Hi all,
> >> >> > >
> >> >> > > The following commit (released in v1.1.4) introduced an issue where a
> >> >> > > client compiled against a 32-bit (x86) compile of alsa-lib cannot use
> >> >> > > the same dmix as a client compiled against a 64-bit alsa-lib.
> >> >> > >
> >> >> > >     1a9bd0f0448106b917ae7f7bedccfcbf6ce84802
> >> >> > >
> >> >> > > The error message is:
> >> >> > >
> >> >> > >     ALSA lib pcm_dmix.c:1077:(snd_pcm_dmix_open) unable to create IPC
> >> >> > > shm instance
> >> >> > >
> >> >> > > The following forum post (not mine) describes the symptoms of the
> >> >> > > issue in more detail (although the git commit the poster specified is
> >> >> > > not correct):
> >> >> > >
> >> >> > >
> >> >> https://forums.gentoo.org/viewtopic-p-8072290.html?sid=c2fbca45102933ddf9ca7cf8b6713e56
> >> >> >
> >> >> > There is a known problem when you mix up two alsa-lib versions because
> >> >> > of the changes in dmix shmem struct.  The solution should upgrade all
> >> >> > users.
> >> >>
> >> >> (Apologies for duplicate email --accidentally sent the first reply to the
> >> >> wrong address.)
> >> >>
> >> >> Arch Linux has upgraded both its 32 and 64 bit packages to v1.1.4, and I'm
> >> >> still experiencing this problem.
> >> >>
> >> >> While bisecting the bug I linked against two compiles of the same alsa-lib
> >> >> versions each time.
> >> >>
> >> >> Let me know if I can provide any other information.
> >> >
> >> > OK, at first to see whether it's the issue of the struct size
> >> > mismatch, check the following patch.  If it is, you'll see the error
> >> > message.  To be sure, check both cases: 64bit -> 32bit, and 32bit ->
> >> > 64bit.
> >>
> >> The behaviour is different for the two cases.
> >>
> >> 1) If 64bit client is started first, then the 32bit client prints the following:
> >>
> >> magic mismatch: shmptr=a15ad4f0, expected=a15ad4ec
> >> ALSA lib pcm_dmix.c:1077:(snd_pcm_dmix_open) unable to create IPC shm instance
> >>
> >> 2) If 32bit client is started first, then the 64bit client only prints:
> >>
> >> ALSA lib pcm_dmix.c:1077:(snd_pcm_dmix_open) unable to create IPC shm instance
> >>
> >> I've added some further print statements and it turns out that this is
> >> because the "return err;" on line 115 is triggered.
> >
> > Hm, so at least the struct size difference is a problem.
> > Doese the patch below change the behavior?
> 
> Your patch did not change the behaviour.

Hmm, then it's 8 bytes alignment.

> However, as an experiment I added "__attribute__((__packed__))" to the
> struct, which fixed the problem. So this does seem to be caused by gcc
> padding structs differently when compiling 32-bit vs 64-bit.
> 
> I don't think "__attribute__((__packed__))" is necessarily the correct
> solution here though.

OK, that's at least one way to fix.  Another way would be to put
another 4 bytes integer as a padding.  Could you give it a try, too?


Takashi
diff mbox

Patch

diff --git a/src/pcm/pcm_direct.h b/src/pcm/pcm_direct.h
--- a/src/pcm/pcm_direct.h
+++ b/src/pcm/pcm_direct.h
@@ -66,7 +66,6 @@  typedef struct {
 	char socket_name[256];			/* name of communication socket */
 	snd_pcm_type_t type;			/* PCM type (currently only hw) */
 	int use_server;
-	unsigned int recoveries;		/* no of executed recoveries on slave*/
 	struct {
 		unsigned int format;
 		snd_interval_t rate;
@@ -113,6 +112,7 @@  typedef struct {
 			unsigned long long chn_mask;
 		} dshare;
 	} u;
+	unsigned int recoveries;		/* no of executed recoveries on slave*/
 } snd_pcm_direct_share_t;
 
 typedef struct snd_pcm_direct snd_pcm_direct_t;