On Fri, 17 Jan 2020 11:56:48 +0100, Keyon Jie wrote:
On 2020/1/17 下午6:30, Takashi Iwai wrote:
On Fri, 17 Jan 2020 11:13:31 +0100, Keyon Jie wrote:
On 2020/1/17 下午3:57, Takashi Iwai wrote:
On Fri, 17 Jan 2020 06:30:18 +0100, Keyon Jie wrote:
On 2020/1/17 上午4:37, Takashi Iwai wrote:
Hi Takashi, I get your concern here, but if we switch to use dma_max limit, we won't change the preallocated buffer, it will be still 64KB for each stream, user space can ask for re-allocate buffer for each stream up to 32MB, but those pinned and can't be swapped out ones are the 64KB preallocated ones only, am I wrong?
No, in general, all sound hardware buffers are pinned.
Sorry, I must have been wrong here, what I was focusing on is those allocated SG DMA buffers, I am not sure if they are those you called "hardware buffers" here.
My understanding was like this:
- in pcm_new() stage, the device PCM driver should call
snd_pcm_lib_preallocate_pages()-> snd_pcm_lib_preallocate_pages()-> preallocate_pcm_pages() and then the substream->dma_buffer is initialized with the preallocated buffer.
- in pcm_open() stage, the device PCM driver should call
snd_pcm_lib_malloc_pages()-> snd_dma_alloc_pages() //if we need to reallocate bigger buffer. *The substream->dma_buffer won't be freed, Takashi, this is what I thought you named "pinned" buffer.* And those reallocated bigger buffer via snd_dma_alloc_pages() will be freed at pcm_close() per my understanding?
What I meant as "pinned" is that the pages are not swapped out by swapper process like the user-space or anonymous pages. So if you open all streams (say 16 streams) on a machine with 32MB buffers, it'll cost a half GB. And, we have no restriction about which user may do it, so all normal users who have the access to the sound device can consume a half GB kernel space pages easily. For a big server it's no problem, but for a small system, it's costing.
Understood, you are concerning about intentional attack from user space about memory consuming, you propose that normal user should be permitted to use the default 64KB only, if larger buffer required, please use proc fs expert mode, is my understanding correct?
Well, a normal user may want 1MB or 2MB buffer, and that's not too bad. So the most distros already set the larger preallocation for HD-audio explicitly via CONFIG_SND_HDA_PREALLOC_SIZE without procfs adjustment, I believe. Then the system allows normal users buffers up to the given size.
Takashi