From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752522AbcFWMba (ORCPT ); Thu, 23 Jun 2016 08:31:30 -0400 Received: from foss.arm.com ([217.140.101.70]:53357 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752046AbcFWMb3 (ORCPT ); Thu, 23 Jun 2016 08:31:29 -0400 Subject: Re: [PATCH] arm64:swiotlb:Enable only when Input size through command line To: Manjeet Pawar , corbet@lwn.net, catalin.marinas@arm.com, will.deacon@arm.com, konrad.wilk@oracle.com, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, r.thapliyal@samsung.com, akhilesh.k@samsung.com, ajeet.y@samsung.com References: <1466684020-5224-1-git-send-email-manjeet.p@samsung.com> Cc: pankaj.m@samsung.com From: Robin Murphy Message-ID: <576BD69D.2090107@arm.com> Date: Thu, 23 Jun 2016 13:31:25 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 In-Reply-To: <1466684020-5224-1-git-send-email-manjeet.p@samsung.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 23/06/16 13:13, Manjeet Pawar wrote: > From: Rohit Thapliyal > > swiotlb default size of 64M is too big as > default value therefore it is made configurable > through command line through swiotlb_size parameter. > swiotlb allocation shall be done only when the > swiotlb size is given through command line. > Otherwise no swiotlb is allocated. So all platforms with most memory physically above 4GB (which is quite a lot of them) are suddenly broken unless they go and muck about with their bootloader? If anyone's got to muck about with their bootloader, why can't it be the memory-constrained platforms just passing "swiotlb=1" instead? Robin. > Signed-off-by: Rohit Thapliyal > Signed-off-by: Manjeet Pawar > Reviewed-by: Akhilesh Kumar > Reviewed-by: Ajeet Kumar Yadav > --- > Documentation/kernel-parameters.txt | 3 +++ > arch/arm64/mm/init.c | 3 ++- > include/linux/swiotlb.h | 1 + > lib/swiotlb.c | 33 +++++++++++++++++++++++++++++---- > 4 files changed, 35 insertions(+), 5 deletions(-) > > diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt > index 82b42c9..12b680f 100644 > --- a/Documentation/kernel-parameters.txt > +++ b/Documentation/kernel-parameters.txt > @@ -3875,6 +3875,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted. > force -- force using of bounce buffers even if they > wouldn't be automatically used by the kernel > > + swiotlb_sz= [KNL] enter swiotlb size. > + Sets the swiotlb size for eg. swiotlb_sz=64M > + > switches= [HW,M68k] > > sysfs.deprecated=0|1 [KNL] > diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c > index d45f862..89c6b39 100644 > --- a/arch/arm64/mm/init.c > +++ b/arch/arm64/mm/init.c > @@ -403,7 +403,8 @@ static void __init free_unused_memmap(void) > */ > void __init mem_init(void) > { > - swiotlb_init(1); > + if (swiotlb_enabled) > + swiotlb_init(1); > > set_max_mapnr(pfn_to_page(max_pfn) - mem_map); > > diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h > index 017fced..c7eb146 100644 > --- a/include/linux/swiotlb.h > +++ b/include/linux/swiotlb.h > @@ -11,6 +11,7 @@ struct page; > struct scatterlist; > > extern int swiotlb_force; > +extern int swiotlb_enabled; > > /* > * Maximum allowable number of contiguous slabs to map, > diff --git a/lib/swiotlb.c b/lib/swiotlb.c > index 76f29ec..e89296a 100644 > --- a/lib/swiotlb.c > +++ b/lib/swiotlb.c > @@ -54,6 +54,7 @@ > #define IO_TLB_MIN_SLABS ((1<<20) >> IO_TLB_SHIFT) > > int swiotlb_force; > +int swiotlb_enabled; > > /* > * Used to do a quick range check in swiotlb_tbl_unmap_single and > @@ -96,6 +97,9 @@ static DEFINE_SPINLOCK(io_tlb_lock); > > static int late_alloc; > > +unsigned long swiotlb_sz; > +unsigned int swiotlb_sz_shift; > + > static int __init > setup_io_tlb_npages(char *str) > { > @@ -112,6 +116,24 @@ setup_io_tlb_npages(char *str) > return 0; > } > early_param("swiotlb", setup_io_tlb_npages); > + > +static int __init > +setup_io_tlb_size(char *str) > +{ > + int len = strlen(str); > + > + if (str[len-1] == 'M') > + swiotlb_sz_shift = 20; > + else if (str[len-1] == 'K') > + swiotlb_sz_shift = 10; > + str[len-1] = '\0'; > + if (isdigit(*str)) > + swiotlb_sz = kstrtoul(str, &str, 0); > + > + swiotlb_enabled = 1; > + return 0; > +} > +early_param("swiotlb_sz", setup_io_tlb_size); > /* make io_tlb_overflow tunable too? */ > > unsigned long swiotlb_nr_tbl(void) > @@ -120,8 +142,9 @@ unsigned long swiotlb_nr_tbl(void) > } > EXPORT_SYMBOL_GPL(swiotlb_nr_tbl); > > -/* default to 64MB */ > -#define IO_TLB_DEFAULT_SIZE (64UL<<20) > +/* Pass from command line as swiotlb_sz=64M (for eg.)*/ > +#define IO_TLB_DEFAULT_SIZE (swiotlb_sz< + > unsigned long swiotlb_size_or_default(void) > { > unsigned long size; > @@ -153,10 +176,12 @@ void swiotlb_print_info(void) > vstart = phys_to_virt(io_tlb_start); > vend = phys_to_virt(io_tlb_end); > > - printk(KERN_INFO "software IO TLB [mem %#010llx-%#010llx] (%luMB) mapped at [%p-%p]\n", > + pr_info("software IO TLB [mem %#010llx-%#010llx] (%lu%cB) mapped at [%p-%p]\n", > (unsigned long long)io_tlb_start, > (unsigned long long)io_tlb_end, > - bytes >> 20, vstart, vend - 1); > + bytes >> swiotlb_sz_shift, > + swiotlb_sz_shift == 20 ? 'M' : 'K', > + vstart, vend - 1); > } > > int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose) >