Received: by 2002:a05:7412:8d09:b0:fa:4c10:6cad with SMTP id bj9csp326550rdb; Tue, 16 Jan 2024 01:07:36 -0800 (PST) X-Google-Smtp-Source: AGHT+IH2zJFIXtu66qrtEirqDXTQPtNG4z63EwfhhnHX6onPZXW1XvVg2gTIWyak0mFkiQzLh57I X-Received: by 2002:ac8:5c0e:0:b0:429:c9b7:9a25 with SMTP id i14-20020ac85c0e000000b00429c9b79a25mr9029719qti.58.1705396056770; Tue, 16 Jan 2024 01:07:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1705396056; cv=none; d=google.com; s=arc-20160816; b=r6bpON0+OmPicGbrWyXFQHqu8t+G/1L5LKM1EkDbFimrQw6AyK3yGEuHLMwjyi42In 7Lx+MRxHA1yPG1MY9RHDpeYs1EnbzkfkMc+ivlPs2fY0xAtwJXlRwz3xcIIifBodPwWb Rp7ArsN8F4iZY5ZgiR+DEoisMk9rC/dC/DZGiCxbHPrYmYkSKgJ4B6mHrZh3AOPyanrt VlcSF4XFB4EyQjpWFwyzPLFe5NJ+6G2Io2g5HlD5RrXSeBDkfMUElOZr1jY3LOlpy5tY Pol5sRDKu5r0pmIJjDQ0eN/FGtroK99aa4zuGpXcXNxGT1i1eQmMt3NFwGmsv+0Z7og+ noMA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:date:message-id; bh=ZUfbOxKVQldjJ2G0O2mGVO5uVmcQntrYA02moHhycgk=; fh=H4lu9Z6XU6Z2fZ72kUDEHt69ja1SxY3m2UtCxpu5seg=; b=Ad5na0wVcy0YX0jmYpY7IIK9eFxfqDZmfxrqPJMMxSqyvR0bBrRhiVpEKa+e4Wr5nz YCEcgpPVuBALT5Cm3kyomOaDfzkAissE/xNiCLKMj+nt+Q+Xt/dt1SYV/L0FEoUdGxGU efZD4z4Xm5dPmsjfr+oKSeasJFu/urJzgSpfGCRtJawYhjiwWe0Ri1n7t+W51LeCzQxc VpCTCs7HtLMxus40wv3yG6DG5ahQn+uK+9jvkSD0JfaIUIrNE9oZScoJSACnFtjLDpJn xjiPIaPmGbKQujGADmxOIZIsZyXLLWzS52eWW1MGARHSWEZoaIgPHS6aUHXbpNQ6BkW4 5Vbg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-27152-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-27152-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id a10-20020a05622a064a00b00429c8eb3fa8si8725646qtb.417.2024.01.16.01.07.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Jan 2024 01:07:36 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-27152-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-27152-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-27152-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 856CC1C22DB5 for ; Tue, 16 Jan 2024 09:07:36 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id EFC2A125CF; Tue, 16 Jan 2024 09:07:30 +0000 (UTC) Received: from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net [217.70.183.200]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E4E37125BA for ; Tue, 16 Jan 2024 09:07:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ghiti.fr Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ghiti.fr Received: by mail.gandi.net (Postfix) with ESMTPSA id E533B20013; Tue, 16 Jan 2024 09:07:16 +0000 (UTC) Message-ID: Date: Tue, 16 Jan 2024 10:07:16 +0100 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2] riscv: mm: still create swiotlb buffer for kmalloc() bouncing if required Content-Language: en-US To: Jisheng Zhang Cc: Paul Walmsley , Palmer Dabbelt , Albert Ou , linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org References: <20231202134224.4029-1-jszhang@kernel.org> From: Alexandre Ghiti In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-GND-Sasl: alex@ghiti.fr On 16/01/2024 09:47, Jisheng Zhang wrote: > On Tue, Jan 16, 2024 at 09:23:47AM +0100, Alexandre Ghiti wrote: >> Hi Jisheng, >> >> On 02/12/2023 14:42, Jisheng Zhang wrote: >>> After commit f51f7a0fc2f4 ("riscv: enable DMA_BOUNCE_UNALIGNED_KMALLOC >>> for !dma_coherent"), for non-coherent platforms with less than 4GB >>> memory, we rely on users to pass "swiotlb=mmnn,force" kernel parameters >>> to enable DMA bouncing for unaligned kmalloc() buffers. Now let's go >>> further: If no bouncing needed for ZONE_DMA, let kernel automatically >>> allocate 1MB swiotlb buffer per 1GB of RAM for kmalloc() bouncing on >>> non-coherent platforms, so that no need to pass "swiotlb=mmnn,force" >>> any more. >> IIUC, DMA_BOUNCE_UNALIGNED_KMALLOC is enabled for all non-coherent >> platforms, even those with less than 4GB of memory. But the DMA bouncing >> (which is necessary to enable kmalloc-8/16/32/96...) was not enabled unless >> the user specified "swiotlb=mmnn,force" on the kernel command line. But does >> that mean that if the user did not specify "swiotlb=mmnn,force", the >> kmalloc-8/16/32/96 were enabled anyway and the behaviour was wrong (by lack >> of DMA bouncing)? > Hi Alex, > > For coherent platforms, kmalloc-8/16/32/96 was enabled. > > For non-coherent platforms, if memory is more than 4GB, kmalloc-8/16/32/96 was enabled. > > For non-coherent platforms, if memory is less than 4GB, kmalloc-8/16/32/96 was not > enabled. If users want kmalloc-8/16/32/96, we rely on users to pass "swiotlb=mmnn,force" That's what I was unsure of :) > > This patch tries to remove the "swiotlb=mmnn,force" requirement for the > last case. After this patch, kernel automatically uses "1MB swiotlb buffer per > 1GB of RAM for kmalloc() bouncing" by default. > > So this is an enhancement. Great, so you can add: Reviewed-by: Alexandre Ghiti Thanks, Alex > > Thanks >> I'm trying to understand if that's a fix or an enhancement. >> >> Thanks, >> >> Alex >> >> >>> The math of "1MB swiotlb buffer per 1GB of RAM for kmalloc() bouncing" >>> is taken from arm64. Users can still force smaller swiotlb buffer by >>> passing "swiotlb=mmnn". >>> >>> Signed-off-by: Jisheng Zhang >>> --- >>> >>> since v2: >>> - fix build error if CONFIG_RISCV_DMA_NONCOHERENT=n >>> >>> arch/riscv/include/asm/cache.h | 2 +- >>> arch/riscv/mm/init.c | 16 +++++++++++++++- >>> 2 files changed, 16 insertions(+), 2 deletions(-) >>> >>> diff --git a/arch/riscv/include/asm/cache.h b/arch/riscv/include/asm/cache.h >>> index 2174fe7bac9a..570e9d8acad1 100644 >>> --- a/arch/riscv/include/asm/cache.h >>> +++ b/arch/riscv/include/asm/cache.h >>> @@ -26,8 +26,8 @@ >>> #ifndef __ASSEMBLY__ >>> -#ifdef CONFIG_RISCV_DMA_NONCOHERENT >>> extern int dma_cache_alignment; >>> +#ifdef CONFIG_RISCV_DMA_NONCOHERENT >>> #define dma_get_cache_alignment dma_get_cache_alignment >>> static inline int dma_get_cache_alignment(void) >>> { >>> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c >>> index 2e011cbddf3a..cbcb9918f721 100644 >>> --- a/arch/riscv/mm/init.c >>> +++ b/arch/riscv/mm/init.c >>> @@ -162,11 +162,25 @@ static void print_vm_layout(void) { } >>> void __init mem_init(void) >>> { >>> + bool swiotlb = max_pfn > PFN_DOWN(dma32_phys_limit); >>> #ifdef CONFIG_FLATMEM >>> BUG_ON(!mem_map); >>> #endif /* CONFIG_FLATMEM */ >>> - swiotlb_init(max_pfn > PFN_DOWN(dma32_phys_limit), SWIOTLB_VERBOSE); >>> + if (IS_ENABLED(CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC) && !swiotlb && >>> + dma_cache_alignment != 1) { >>> + /* >>> + * If no bouncing needed for ZONE_DMA, allocate 1MB swiotlb >>> + * buffer per 1GB of RAM for kmalloc() bouncing on >>> + * non-coherent platforms. >>> + */ >>> + unsigned long size = >>> + DIV_ROUND_UP(memblock_phys_mem_size(), 1024); >>> + swiotlb_adjust_size(min(swiotlb_size_or_default(), size)); >>> + swiotlb = true; >>> + } >>> + >>> + swiotlb_init(swiotlb, SWIOTLB_VERBOSE); >>> memblock_free_all(); >>> print_vm_layout();