Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp1299466pxu; Thu, 17 Dec 2020 06:59:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJz3hrcpu67yKQVXay9fjEZq/RBsyjS1BWO+BSXohwaPKT4NAH2Qeg1Y40wMPkiqCb1pct8M X-Received: by 2002:aa7:d5d6:: with SMTP id d22mr38651837eds.160.1608217162922; Thu, 17 Dec 2020 06:59:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1608217162; cv=none; d=google.com; s=arc-20160816; b=zyswtmWBCG0SG6YG/2gowz94+SdO+2rRHTc+bXz8oaXqEDIuqfh0vCfZ8qIVZaPfHv eISqPZb5fQ7x1EC731HqVwFqAfXj+8zEz9FU4S1Q/EsiEd0MeDSJc6oss9RFxxJT0W0b /9GqHsn+cByDf5qU7NYxSPWa/GZVwB+PLQZAe90Fr0rtljqbb6et5qxYCNml6xI045K1 EC0w6Zg8+2+52bNsTQD370o8Wlg3TC7gOWj4KaYju4V/as3qUbm5xbeSy2LaZ1MZILgP lYxqI3WXRMcwH5UfccCrW67DCnaLVjvERQoN4BITKYduVwzkFTK3M2iWEd1cdy3JJtDV 5isw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-language:content-transfer-encoding :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject:dkim-signature; bh=+wEP/J/NPkJK/JzQ5t+YuRXzjvZxB21EzmXcGJJV1Rw=; b=ueWPaaQdL9vua+Mg+w5Hl94X7t613k28eIHuYV47BIVe2lMGhGOB5pQAV3cVSYRify 0Vdg46sXuvz1BilSxmEs6gIy4V7/HiI75SzopQgiDaQtM4HMQNMrYP3Q6s+iQrWEAyD9 nhL+vKDYHtgQ2i8VUcspRhDBw/jXH2ND3NxlA5LfCJs1tWGmR7FAvQfEbT97waAfpLw6 hCkCsRMdKNDB8Uj3UfyUmm+WDZIlqyt21zk6Rx/duHFBR/qPkNOaAgK1kC2OjeciPs3t rVNIBvLuOQm062l9Guowgle2G2Bu4cGDy5IK0wX0H6Otv6jOsFj8Ldwv9c6kTWvB3xoM xuyw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@metafoo.de header.s=default2002 header.b=KehhMYv5; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=metafoo.de Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b27si2652744eje.466.2020.12.17.06.58.59; Thu, 17 Dec 2020 06:59:22 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@metafoo.de header.s=default2002 header.b=KehhMYv5; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=metafoo.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727246AbgLQO5t (ORCPT + 99 others); Thu, 17 Dec 2020 09:57:49 -0500 Received: from www381.your-server.de ([78.46.137.84]:54778 "EHLO www381.your-server.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726983AbgLQO5s (ORCPT ); Thu, 17 Dec 2020 09:57:48 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=metafoo.de; s=default2002; h=Content-Transfer-Encoding:Content-Type:In-Reply-To: MIME-Version:Date:Message-ID:From:References:Cc:To:Subject:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID; bh=+wEP/J/NPkJK/JzQ5t+YuRXzjvZxB21EzmXcGJJV1Rw=; b=KehhMYv5lvjMPqm7/hKCKrNFIQ 8+gVJR04x6S4u0RXCp29xmXw5XsDR9/VFoDOvRtyOY0ma7bljJZtvHvFSzfAXJ1K/I9WGMWjKh4nX Y2D4fH/a+Ag3EhOvYrCbPU0DP9oO1pUqL5b9u7x1ObTp8mgLgtRHXPdXmBQhOARrGiQxjSFH1NiUH gj3id8yJ+Ja7REuXmmmuQPqwq78OqmIEANjGEbeLOttX8YfEJE5pyB3vkT1oa/XEFsPywH6b5ZGBn eo/kgxJvF1Olgd8yquXjHSRc4Lpl4BvxIV86nxQbqET1XxiKiZrGimKqTEyGRGgiyhCkTFs6LW4gv 9E4yuwjw==; Received: from sslproxy06.your-server.de ([78.46.172.3]) by www381.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92.3) (envelope-from ) id 1kpuiE-0000Pj-LJ; Thu, 17 Dec 2020 15:57:02 +0100 Received: from [62.216.202.54] (helo=[192.168.178.20]) by sslproxy06.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kpuiE-000WcE-Du; Thu, 17 Dec 2020 15:57:02 +0100 Subject: Re: [PATCH v1 ] ALSA: core: memalloc: add page alignment for iram To: Takashi Iwai Cc: alsa-devel@alsa-project.org, gustavoars@kernel.org, linux-kernel@vger.kernel.org, shengjiu.wang@nxp.com, tiwai@suse.com, pierre-louis.bossart@linux.intel.com, xiang@kernel.org, Robin Gong , akpm@linux-foundation.org References: <1608221747-3474-1-git-send-email-yibin.gong@nxp.com> <05c824e5-0c33-4182-26fa-b116a42b10d6@metafoo.de> <70074f62-954a-9b40-ab4a-cb438925060c@metafoo.de> <8e103a2b-1097-6d54-7266-34743321efac@metafoo.de> From: Lars-Peter Clausen Message-ID: <1fc18b56-effa-9dbc-8263-00c632e163e7@metafoo.de> Date: Thu, 17 Dec 2020 15:57:02 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US X-Authenticated-Sender: lars@metafoo.de X-Virus-Scanned: Clear (ClamAV 0.102.4/26019/Wed Dec 16 15:36:02 2020) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 12/17/20 3:24 PM, Takashi Iwai wrote: > On Thu, 17 Dec 2020 14:16:48 +0100, > Lars-Peter Clausen wrote: >> On 12/17/20 12:06 PM, Takashi Iwai wrote: >>> On Thu, 17 Dec 2020 11:59:23 +0100, >>> Lars-Peter Clausen wrote: >>>> On 12/17/20 10:55 AM, Takashi Iwai wrote: >>>>> On Thu, 17 Dec 2020 10:43:45 +0100, >>>>> Lars-Peter Clausen wrote: >>>>>> On 12/17/20 5:15 PM, Robin Gong wrote: >>>>>>> Since mmap for userspace is based on page alignment, add page alignment >>>>>>> for iram alloc from pool, otherwise, some good data located in the same >>>>>>> page of dmab->area maybe touched wrongly by userspace like pulseaudio. >>>>>>> >>>>>> I wonder, do we also have to align size to be a multiple of PAGE_SIZE >>>>>> to avoid leaking unrelated data? >>>>> Hm, a good question. Basically the PCM buffer size itself shouldn't >>>>> be influenced by that (i.e. no hw-constraint or such is needed), but >>>>> the padding should be cleared indeed. I somehow left those to the >>>>> allocator side, but maybe it's safer to clear the whole buffer in >>>>> sound/core/memalloc.c commonly. >>>> What I meant was that most of the APIs that we use to allocate memory >>>> work on a PAGE_SIZE granularity. I.e. if you request a buffer that >>>> where the size is not a multiple of PAGE_SIZE internally they will >>>> still allocate a buffer that is a multiple of PAGE_SIZE and mark the >>>> unused bytes as reserved. >>>> >>>> But I believe that is not the case gen_pool_dma_alloc(). It will >>>> happily allocate those extra bytes to some other allocation request. >>>> >>>> That we need to zero out the reserved bytes even for those other APIs >>>> is a very good additional point! >>>> >>>> I looked at this a few years ago and I'm pretty sure that we cleared >>>> out the allocated area, but I can't find that anymore in the current >>>> code. Which is not so great I guess. >>> IIRC, we used GFP_ZERO in the past for the normal page allocations, >>> but this was dropped as it's no longer supported or so. >>> >>> Also, we clear out the PCM buffer in hw_params call, but this is for >>> the requested size, not the actual allocated size, hence the padding >>> bytes will remain uncleared. >> Ah! That memset() in hw_params is new. >>> So I believe it's safer to add an extra memset() like my test patch. >> Yea, we definitely want that. >> >> Do we care about leaking audio samples from a previous >> application. I.e. application 'A' allocates a buffer plays back some >> data and then closes the device again. Application 'B' then opens the >> same audio devices allocates a slightly smaller buffer, so that it >> still uses the same number of pages. The buffer from the previous >> allocation get reused, but the remainder of the last page wont get >> cleared in hw_params(). > That's true. On the second though, it might be better to extend that > memset() in hw_params to assure clearing the whole allocated buffer. > We can check runtime->dma_buffer_p->bytes for the actual size. > > Also, in the PCM memory allocator, we make sure that the allocation is > performed for page size. > > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index 47b155a49226..6aabad070abf 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -755,8 +755,15 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream, > runtime->boundary *= 2; > > /* clear the buffer for avoiding possible kernel info leaks */ > - if (runtime->dma_area && !substream->ops->copy_user) > - memset(runtime->dma_area, 0, runtime->dma_bytes); > + if (runtime->dma_area && !substream->ops->copy_user) { > + size_t size; > + > + if (runtime->dma_buffer_p) > + size = runtime->dma_buffer_p->bytes; > + else > + size = runtime->dma_bytes; I'm not sure. Not all drivers use snd_pcm_lib_malloc_pages() and runtime->dma_buffer_p->bytes might not be a multiple of PAGE_SIZE. On the other hand if it is mmap-able, the underlying buffer must be a multiple of PAGE_SIZE. So a simple memset(..., PAGE_ALIGN(size)) should work. But we'd risk breaking drivers that do not reserve the remainder of the page and use it for something else. Maybe what we need is a check that runtime->dma_area is page aligned and runtime->dma_bytes is a multiple of PAGE_SIZE. With a warning at first and then turn this into a error a year later or so. > + memset(runtime->dma_area, 0, size); > + } > > snd_pcm_timer_resolution_change(substream); > snd_pcm_set_state(substream, SNDRV_PCM_STATE_SETUP);