All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional
@ 2020-06-23 15:49 Takashi Iwai
  2020-06-23 15:49 ` [PATCH alsa-lib v2 1/2] pcm: dmix: make " Takashi Iwai
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Takashi Iwai @ 2020-06-23 15:49 UTC (permalink / raw)
  To: alsa-devel

Hi,

this is a revised patch set for the PCM dmix, to make the lockless
operation optional and fix the semaphore usage in the lockless mode.

Unfortunately I got a server problem in the last week and lost many
posts during the weekend, so I couldn't follow up to the thread (I
just read from the lore archive).

In this patch set, to make my intention clearer, I swapped the
patches: the first to disable the lockless operation as default and
the second to fix the semaphore usage in the lockless mode.

In the first patch, the magic number is changed as Jaroslav suggested,
and the description has been updated.  The second patch is equivalent
with the previous one.


thanks,

Takashi

===

Takashi Iwai (2):
  pcm: dmix: make lockless operation optional
  pcm: dmix: Fix semaphore usage with lockless operation

 configure.ac               | 13 +++++++++++++
 src/pcm/pcm_direct.c       | 16 +++++++++++++---
 src/pcm/pcm_direct.h       |  1 +
 src/pcm/pcm_dmix.c         | 18 +++++++++++-------
 src/pcm/pcm_dmix_generic.c |  2 +-
 src/pcm/pcm_dmix_i386.c    |  1 +
 src/pcm/pcm_dmix_x86_64.c  |  1 +
 7 files changed, 41 insertions(+), 11 deletions(-)

-- 
2.16.4


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH alsa-lib v2 1/2] pcm: dmix: make lockless operation optional
  2020-06-23 15:49 [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional Takashi Iwai
@ 2020-06-23 15:49 ` Takashi Iwai
  2020-06-23 15:49 ` [PATCH alsa-lib v2 2/2] pcm: dmix: Fix semaphore usage with lockless operation Takashi Iwai
  2020-07-01 14:59 ` [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional Jaroslav Kysela
  2 siblings, 0 replies; 5+ messages in thread
From: Takashi Iwai @ 2020-06-23 15:49 UTC (permalink / raw)
  To: alsa-devel

The recently reported (but a long-standing) bug about the
unconditional semaphore usage in the dmix implies that basically we've
had no problem with the locking in the practical usages over years.
Although the lockless operation has a clear merit, it's a much higher
CPU usage (especially on some uncached pages), and it might lead to a
potential deadlock in theory (which is hard to reproduce at will,
though).

This patch introduces a new configure option "--enable-lockless-dmix"
or "--disable-lockless-dmix" to let user choose the default dmix
operation mode.  The usage of the lockless mixing has been already
conditionally enabled via asoundrc and card config
"direct_memory_access", so we just need to set the default value based
on it.

In this patch, the default is set off to the lockless mixing, i.e. the
generic mixing is chosen.  It makes more sense from the performance
POV.  For any users who still require the lockless operation, it can
be enabled either via configure option or the asoundrc.

The magic number used in the shmem is also changed depending on the
operation mode.  It's just for safety, not to conflict both operation
modes with each other.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 configure.ac         | 13 +++++++++++++
 src/pcm/pcm_direct.c | 16 +++++++++++++---
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/configure.ac b/configure.ac
index 4577c417037a..75d037d5509a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -629,6 +629,19 @@ if test "$build_pcm_mmap_emul" = "yes"; then
   AC_DEFINE([BUILD_PCM_PLUGIN_MMAP_EMUL], "1", [Build PCM mmap-emul plugin])
 fi
 
+if test "$build_pcm_dmix" = "yes"; then
+AC_MSG_CHECKING(for default lockless dmix)
+AC_ARG_ENABLE(lockless-dmix,
+  AS_HELP_STRING([--enable-lockless-dmix],
+    [use lockless dmix as default on x86]),
+  lockless_dmix="$enableval", lockless_dmix="no")
+if test "$lockless_dmix" = "yes"; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE([LOCKLESS_DMIX_DEFAULT], "1", [Lockless dmix as default])
+else
+  AC_MSG_RESULT(no)
+fi
+fi
 
 dnl Create PCM plugin symbol list for static library
 rm -f "$srcdir"/src/pcm/pcm_symbols_list.c
diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c
index 665340954cf3..19c5a811262f 100644
--- a/src/pcm/pcm_direct.c
+++ b/src/pcm/pcm_direct.c
@@ -82,7 +82,13 @@ int snd_pcm_direct_semaphore_create_or_connect(snd_pcm_direct_t *dmix)
 	return 0;
 }
 
-#define SND_PCM_DIRECT_MAGIC	(0xa15ad300 + sizeof(snd_pcm_direct_share_t))
+static unsigned int snd_pcm_direct_magic(snd_pcm_direct_t *dmix)
+{
+	if (!dmix->direct_memory_access)
+		return 0xa15ad300 + sizeof(snd_pcm_direct_share_t);
+	else
+		return 0xb15ad300 + sizeof(snd_pcm_direct_share_t);
+}
 
 /*
  *  global shared memory area 
@@ -132,10 +138,10 @@ retryget:
 			buf.shm_perm.gid = dmix->ipc_gid;
 			shmctl(dmix->shmid, IPC_SET, &buf);
 		}
-		dmix->shmptr->magic = SND_PCM_DIRECT_MAGIC;
+		dmix->shmptr->magic = snd_pcm_direct_magic(dmix);
 		return 1;
 	} else {
-		if (dmix->shmptr->magic != SND_PCM_DIRECT_MAGIC) {
+		if (dmix->shmptr->magic != snd_pcm_direct_magic(dmix)) {
 			snd_pcm_direct_shm_discard(dmix);
 			return -EINVAL;
 		}
@@ -1892,7 +1898,11 @@ int snd_pcm_direct_parse_open_conf(snd_config_t *root, snd_config_t *conf,
 	rec->slowptr = 1;
 	rec->max_periods = 0;
 	rec->var_periodsize = 0;
+#ifdef LOCKLESS_DMIX_DEFAULT
 	rec->direct_memory_access = 1;
+#else
+	rec->direct_memory_access = 0;
+#endif
 	rec->hw_ptr_alignment = SND_PCM_HW_PTR_ALIGNMENT_AUTO;
 	rec->tstamp_type = -1;
 
-- 
2.16.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH alsa-lib v2 2/2] pcm: dmix: Fix semaphore usage with lockless operation
  2020-06-23 15:49 [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional Takashi Iwai
  2020-06-23 15:49 ` [PATCH alsa-lib v2 1/2] pcm: dmix: make " Takashi Iwai
@ 2020-06-23 15:49 ` Takashi Iwai
  2020-07-01 14:59 ` [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional Jaroslav Kysela
  2 siblings, 0 replies; 5+ messages in thread
From: Takashi Iwai @ 2020-06-23 15:49 UTC (permalink / raw)
  To: alsa-devel

As Maarten Baert recently reported, the current dmix code applies the
semaphore unnecessarily around mixing streams even when the lockless
mix operation is used on x86.  This was rather introduced mistakenly
at the commit 267d7c728196 ("Add support of little-endian on
i386/x86_64 dmix") where the generic dmix code was included on x86,
too.

For achieving the original performance back, this patch changes the
semaphore handling to be checked at run time instead of statically at
compile time.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 src/pcm/pcm_direct.h       |  1 +
 src/pcm/pcm_dmix.c         | 18 +++++++++++-------
 src/pcm/pcm_dmix_generic.c |  2 +-
 src/pcm/pcm_dmix_i386.c    |  1 +
 src/pcm/pcm_dmix_x86_64.c  |  1 +
 5 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/pcm/pcm_direct.h b/src/pcm/pcm_direct.h
index 8a236970a3a1..2150bce15449 100644
--- a/src/pcm/pcm_direct.h
+++ b/src/pcm/pcm_direct.h
@@ -186,6 +186,7 @@ struct snd_pcm_direct {
 			mix_areas_32_t *remix_areas_32;
 			mix_areas_24_t *remix_areas_24;
 			mix_areas_u8_t *remix_areas_u8;
+			unsigned int use_sem;
 		} dmix;
 		struct {
 			unsigned long long chn_mask;
diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
index 843fa3168756..e9343b19a536 100644
--- a/src/pcm/pcm_dmix.c
+++ b/src/pcm/pcm_dmix.c
@@ -292,13 +292,17 @@ static void remix_areas(snd_pcm_direct_t *dmix,
  * the area via semaphore
  */
 #ifndef DOC_HIDDEN
-#ifdef NO_CONCURRENT_ACCESS
-#define dmix_down_sem(dmix) snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT)
-#define dmix_up_sem(dmix) snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT)
-#else
-#define dmix_down_sem(dmix)
-#define dmix_up_sem(dmix)
-#endif
+static void dmix_down_sem(snd_pcm_direct_t *dmix)
+{
+	if (dmix->u.dmix.use_sem)
+		snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT);
+}
+
+static void dmix_up_sem(snd_pcm_direct_t *dmix)
+{
+	if (dmix->u.dmix.use_sem)
+		snd_pcm_direct_semaphore_up(dmix, DIRECT_IPC_SEM_CLIENT);
+}
 #endif
 
 /*
diff --git a/src/pcm/pcm_dmix_generic.c b/src/pcm/pcm_dmix_generic.c
index 40c08747a74a..8a5b6f148556 100644
--- a/src/pcm/pcm_dmix_generic.c
+++ b/src/pcm/pcm_dmix_generic.c
@@ -43,7 +43,6 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
 #ifndef ARCH_ADD
 #define ARCH_ADD(p,a) (*(p) += (a))
 #define ARCH_CMPXCHG(p,a,b) (*(p)) /* fake */
-#define NO_CONCURRENT_ACCESS	/* use semaphore to avoid race */
 #define IS_CONCURRENT	0	/* no race check */
 #endif
 
@@ -530,6 +529,7 @@ static void generic_mix_select_callbacks(snd_pcm_direct_t *dmix)
 	dmix->u.dmix.mix_areas_u8 = generic_mix_areas_u8;
 	dmix->u.dmix.remix_areas_24 = generic_remix_areas_24;
 	dmix->u.dmix.remix_areas_u8 = generic_remix_areas_u8;
+	dmix->u.dmix.use_sem = 1;
 }
 
 #endif
diff --git a/src/pcm/pcm_dmix_i386.c b/src/pcm/pcm_dmix_i386.c
index 1ab983a8a373..82a91c5c2897 100644
--- a/src/pcm/pcm_dmix_i386.c
+++ b/src/pcm/pcm_dmix_i386.c
@@ -135,4 +135,5 @@ static void mix_select_callbacks(snd_pcm_direct_t *dmix)
 		dmix->u.dmix.mix_areas_24 = smp > 1 ? mix_areas_24_smp: mix_areas_24;
 		dmix->u.dmix.remix_areas_24 = smp > 1 ? remix_areas_24_smp: remix_areas_24;
 	}
+	dmix->u.dmix.use_sem = 0;
 }
diff --git a/src/pcm/pcm_dmix_x86_64.c b/src/pcm/pcm_dmix_x86_64.c
index 34c40d4e9d1d..4d882bfd01bf 100644
--- a/src/pcm/pcm_dmix_x86_64.c
+++ b/src/pcm/pcm_dmix_x86_64.c
@@ -102,4 +102,5 @@ static void mix_select_callbacks(snd_pcm_direct_t *dmix)
 	dmix->u.dmix.remix_areas_32 = smp > 1 ? remix_areas_32_smp : remix_areas_32;
 	dmix->u.dmix.mix_areas_24 = smp > 1 ? mix_areas_24_smp : mix_areas_24;
 	dmix->u.dmix.remix_areas_24 = smp > 1 ? remix_areas_24_smp : remix_areas_24;
+	dmix->u.dmix.use_sem = 0;
 }
-- 
2.16.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional
  2020-06-23 15:49 [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional Takashi Iwai
  2020-06-23 15:49 ` [PATCH alsa-lib v2 1/2] pcm: dmix: make " Takashi Iwai
  2020-06-23 15:49 ` [PATCH alsa-lib v2 2/2] pcm: dmix: Fix semaphore usage with lockless operation Takashi Iwai
@ 2020-07-01 14:59 ` Jaroslav Kysela
  2020-07-07  9:58   ` Takashi Iwai
  2 siblings, 1 reply; 5+ messages in thread
From: Jaroslav Kysela @ 2020-07-01 14:59 UTC (permalink / raw)
  To: Takashi Iwai, alsa-devel

Dne 23. 06. 20 v 17:49 Takashi Iwai napsal(a):
> Hi,
> 
> this is a revised patch set for the PCM dmix, to make the lockless
> operation optional and fix the semaphore usage in the lockless mode.
> 
> Unfortunately I got a server problem in the last week and lost many
> posts during the weekend, so I couldn't follow up to the thread (I
> just read from the lore archive).
> 
> In this patch set, to make my intention clearer, I swapped the
> patches: the first to disable the lockless operation as default and
> the second to fix the semaphore usage in the lockless mode.
> 
> In the first patch, the magic number is changed as Jaroslav suggested,
> and the description has been updated.  The second patch is equivalent
> with the previous one.

All looks good now, thanks:

Reviewed-by: Jaroslav Kysela <perex@perex.cz>

				Jaroslav

> 
> 
> thanks,
> 
> Takashi
> 
> ===
> 
> Takashi Iwai (2):
>    pcm: dmix: make lockless operation optional
>    pcm: dmix: Fix semaphore usage with lockless operation
> 
>   configure.ac               | 13 +++++++++++++
>   src/pcm/pcm_direct.c       | 16 +++++++++++++---
>   src/pcm/pcm_direct.h       |  1 +
>   src/pcm/pcm_dmix.c         | 18 +++++++++++-------
>   src/pcm/pcm_dmix_generic.c |  2 +-
>   src/pcm/pcm_dmix_i386.c    |  1 +
>   src/pcm/pcm_dmix_x86_64.c  |  1 +
>   7 files changed, 41 insertions(+), 11 deletions(-)
> 


-- 
Jaroslav Kysela <perex@perex.cz>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional
  2020-07-01 14:59 ` [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional Jaroslav Kysela
@ 2020-07-07  9:58   ` Takashi Iwai
  0 siblings, 0 replies; 5+ messages in thread
From: Takashi Iwai @ 2020-07-07  9:58 UTC (permalink / raw)
  To: Jaroslav Kysela; +Cc: alsa-devel

On Wed, 01 Jul 2020 16:59:49 +0200,
Jaroslav Kysela wrote:
> 
> Dne 23. 06. 20 v 17:49 Takashi Iwai napsal(a):
> > Hi,
> >
> > this is a revised patch set for the PCM dmix, to make the lockless
> > operation optional and fix the semaphore usage in the lockless mode.
> >
> > Unfortunately I got a server problem in the last week and lost many
> > posts during the weekend, so I couldn't follow up to the thread (I
> > just read from the lore archive).
> >
> > In this patch set, to make my intention clearer, I swapped the
> > patches: the first to disable the lockless operation as default and
> > the second to fix the semaphore usage in the lockless mode.
> >
> > In the first patch, the magic number is changed as Jaroslav suggested,
> > and the description has been updated.  The second patch is equivalent
> > with the previous one.
> 
> All looks good now, thanks:
> 
> Reviewed-by: Jaroslav Kysela <perex@perex.cz>

Thanks, now pushed out.


Takashi

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-07-07  9:59 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-23 15:49 [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional Takashi Iwai
2020-06-23 15:49 ` [PATCH alsa-lib v2 1/2] pcm: dmix: make " Takashi Iwai
2020-06-23 15:49 ` [PATCH alsa-lib v2 2/2] pcm: dmix: Fix semaphore usage with lockless operation Takashi Iwai
2020-07-01 14:59 ` [PATCH alsa-lib v2 0/2] Make dmix lockless operation optional Jaroslav Kysela
2020-07-07  9:58   ` Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.