[alsa-devel] [PATCH 0/3] ALSA: Add the explicit appl_ptr sync support
Takashi Sakamoto
o-takashi at sakamocchi.jp
Wed Jun 21 22:08:40 CEST 2017
Hi,
On Jun 21 2017 22:10, Takashi Iwai wrote:
>> However, when running with patched alsa-lib[1], due to a commit
>> f8ff2f28ba49 ("ALSA: pcm: Skip ack callback without actual appl_ptr
>> update")[2], callback functions in driver side for .ack are not called
>> from ioctl handler in ALSA PCM core. When page frames for control data
>> of PCM substream is mapped to VMA of the application, the application
>> updates the value of pointer in the frame, then transfer the value via
>> ioctl. Comparing these two values should be the same and ALSA PCM core
>> skip the callback.
>
> Oh, that's a damn good point.
>
> Currently alsa-lib issues sync_ptr() also for obtaining the PCM state
> from the kernel, and this also triggers ack unless SYNC_APPL_PTR flag
> is set. The commit f8ff2f28ba49 tried to reduce the ack calls by
> filtering in pcm_lib_apply_appl_ptr() side, but it has a side-effect
> as you noticed.
>
> There can be a few options to cover this for the newer alsa-lib, for
> example:
>
> A. Add a new bit flag to sync_ptr() allowing only the state update
> and/or the explicit applptr update.
>
> B. Introduce a completely new ioctl for the appl_ptr sync.
>
> C. Keep disabling control mmap while allowing state mmap.
>
> D. Track the last appl_ptr individually from runtime->control->appl_ptr
> and compare/update with this value in pcm_lib_apply_appl_ptr().
>
> E. Remove the filtering from pcm_lib_apply_appl_ptr(), let each driver
> optimize if needed.
>
> Currently I'm thinking of (A), but open for all and other possible
> options. All these may need the check of user_pversion so that the
> old code still works as is.
I prefer C) and I'm working for it, because protocol validation of
userland is not needed in kernel land, as long as I understand. But if
allowed to add more changes to protocol/interface, A) and B) could be
within my candidates.
> ... and, while testing the patchset today, I noticed a bug in the
> user_pversion check. Namely, the user_pversion check must not be done
> against a substream. A substream may be shared among multiple
> processes (typically by dmix), and changing from one process may hit
> others when it's set in the substream object. For identifying the
> setup for each stream (from the user-space POV), the flag has to be
> stored in snd_pcm_file instead, just like no_compat_mmap flag.
Oh, I overlooked a case of open(2) with O_APPEND, as well. I also think
it reasonable to utilize the private data of file descriptor for this
purpose, good.
> That said, I have to respin a new patch in anyway, at least for the
> patches 2 & 3 :) I'll leave your reviewed-by tag from these, please
> review the new patchset again. Sorry for doubly works.
No worry.
Thanks
Takashi Sakamoto
More information about the Alsa-devel
mailing list