Re: [Xen-devel] [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW-IOMMU.
-Original Message- From: Konrad Rzeszutek Wilk [mailto:konrad.w...@oracle.com] Sent: Friday, March 6, 2015 11:20 PM To: Wang, Xiaoming Cc: Jan Beulich; l...@aserp2030.oracle.com; zh...@aserp2030.oracle.com; ch...@chris-wilson.co.uk; david.vra...@citrix.com; lau...@codeaurora.org; heiko.carst...@de.ibm.com; li...@horizon.com; Liu, Chuansheng; Zhang, Dongxing; takahiro.aka...@linaro.org; a...@linux-foundation.org; linux- m...@linux-mips.org; r...@linux-mips.org; xen-de...@lists.xenproject.org; boris.ostrov...@oracle.com; d.kasat...@samsung.com; pebo...@tiscali.nl; linux-ker...@vger.kernel.org; jkos...@suse.cz Subject: Re: [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW- IOMMU. . snip.. Format: { int,force,int,int} is suitable I think. And fixing force is follow the code design previously in setup_io_tlb_npages. It is a bug. It should have been smart enough to deal with the 'force' being in any order. If you are willing to make a patch to fix this - either folded into this patch I am responding to or as a seperate one - that would be most excellent! OK, I will try to make a patch to deal with the 'force' in any order. However, I can also do it - but my plate is full so it will take me some time to get to it. ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW-IOMMU.
. snip.. Format: { int,force,int,int} is suitable I think. And fixing force is follow the code design previously in setup_io_tlb_npages. It is a bug. It should have been smart enough to deal with the 'force' being in any order. If you are willing to make a patch to fix this - either folded into this patch I am responding to or as a seperate one - that would be most excellent! However, I can also do it - but my plate is full so it will take me some time to get to it. ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW-IOMMU.
Dear Jan -Original Message- From: Jan Beulich [mailto:jbeul...@suse.com] Sent: Thursday, March 5, 2015 5:00 PM To: Wang, Xiaoming Cc: l...@aserp2030.oracle.com; zh...@aserp2030.oracle.com; chris@chris- wilson.co.uk; david.vra...@citrix.com; lau...@codeaurora.org; heiko.carst...@de.ibm.com; li...@horizon.com; Liu, Chuansheng; Zhang, Dongxing; takahiro.aka...@linaro.org; a...@linux-foundation.org; linux- m...@linux-mips.org; r...@linux-mips.org; xen-de...@lists.xenproject.org; boris.ostrov...@oracle.com; Konrad RzeszutekWilk; d.kasat...@samsung.com; pebo...@tiscali.nl; linux-ker...@vger.kernel.org Subject: RE: [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW- IOMMU. On 05.03.15 at 09:52, xiaoming.w...@intel.com wrote: From: Jan Beulich [mailto:jbeul...@suse.com] Sent: Thursday, March 5, 2015 4:40 PM On 05.03.15 at 04:53, xiaoming.w...@intel.com wrote: From: Konrad Rzeszutek Wilk [mailto:konrad.w...@oracle.com] Sent: Thursday, March 5, 2015 3:43 AM On Tue, Mar 03, 2015 at 04:11:09PM +0800, Wang Xiaoming wrote: @@ -101,13 +119,32 @@ setup_io_tlb_npages(char *str) { if (isdigit(*str)) { io_tlb_nslabs = simple_strtoul(str, str, 0); - /* avoid tail segment of size IO_TLB_SEGSIZE */ - io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE); } if (*str == ',') ++str; - if (!strcmp(str, force)) + if (!strncmp(str, force, 5)) { swiotlb_force = 1; + str += 5; + } So the format is now: Format: { int | force | int | int} which means I can do 32,22323,force Or force,32 Or 32,force If I use Format: { int,force,int,int} 32,22323,force can't acceptable. There are three int here, if there are out of order, that will cause confuse. Only 32,force,32323 Or 32,,32323,2322 Or ,,323222,3232 Are available. You need to make sure that all previously valid variants are still usable, i.e. force alone, a number alone, force,number and number,force. How many variants you want to support with your additions is mostly up to you; I'd recommend permitting force in any position. I don't think it's suitable to accept that force in any position. If we defined Format: { int,force,int,int} force must be located in second position. And we add comment for each int also. Every position may be defined specifically. As said, with the old format allowing force in either first or second position, you have to at least accept that in the new version too. Accepting force in any position would be a (desirable) courtesy to the user. I have checked the code and do some test. First | in Format means *or* in Documentation/kernel-parameters.txt For example: acpi= [HW,ACPI,X86] Advanced Configuration and Power Interface Format: { force | off | strict | noirq | rsdt } acpi_sci= [HW,ACPI] ACPI System Control Interrupt trigger mode Format: { level | edge | high | low } Second the code in lib/swiotlb.c can't realize the function that force in either first or second position with the Format swiotlb=[ARM,IA-64,PPC,MIPS,X86] Format: { int | force } int -- Number of I/O TLB slabs I test with parameter BOARD_KERNEL_CMDLINE += swiotlb=force,500 The result is io_tlb_nslabs=32768, swiotlb_force=0x0, io_tlb_nslabs=32768 because that if io_tlb_nslabs can't get from early_param(swiotlb, setup_io_tlb_npages); It will be valued at swiotlb_init with default. So both int and force can't recognized with original code below. static int __init setup_io_tlb_npages(char *str) { if (isdigit(*str)) { io_tlb_nslabs = simple_strtoul(str, str, 0); /* avoid tail segment of size IO_TLB_SEGSIZE */ io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE); } if (*str == ',') ++str; if (!strcmp(str, force)) swiotlb_force = 1; return 0; } early_param(swiotlb, setup_io_tlb_npages); So we can't use Format: { int | force | int | int} any more as there are four parameters. Format: { int,force,int,int} is suitable I think. And fixing force is follow the code design previously in setup_io_tlb_npages. Jan ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW-IOMMU.
On 05.03.15 at 04:53, xiaoming.w...@intel.com wrote: From: Konrad Rzeszutek Wilk [mailto:konrad.w...@oracle.com] Sent: Thursday, March 5, 2015 3:43 AM On Tue, Mar 03, 2015 at 04:11:09PM +0800, Wang Xiaoming wrote: @@ -101,13 +119,32 @@ setup_io_tlb_npages(char *str) { if (isdigit(*str)) { io_tlb_nslabs = simple_strtoul(str, str, 0); - /* avoid tail segment of size IO_TLB_SEGSIZE */ - io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE); } if (*str == ',') ++str; - if (!strcmp(str, force)) + if (!strncmp(str, force, 5)) { swiotlb_force = 1; + str += 5; + } So the format is now: Format: { int | force | int | int} which means I can do 32,22323,force Or force,32 Or 32,force If I use Format: { int,force,int,int} 32,22323,force can't acceptable. There are three int here, if there are out of order, that will cause confuse. Only 32,force,32323 Or32,,32323,2322 Or,,323222,3232 Are available. You need to make sure that all previously valid variants are still usable, i.e. force alone, a number alone, force,number and number,force. How many variants you want to support with your additions is mostly up to you; I'd recommend permitting force in any position. Jan ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW-IOMMU.
Dear Jan -Original Message- From: Jan Beulich [mailto:jbeul...@suse.com] Sent: Thursday, March 5, 2015 4:40 PM To: Wang, Xiaoming Cc: l...@aserp2030.oracle.com; zh...@aserp2030.oracle.com; chris@chris- wilson.co.uk; david.vra...@citrix.com; lau...@codeaurora.org; heiko.carst...@de.ibm.com; li...@horizon.com; Liu, Chuansheng; Zhang, Dongxing; takahiro.aka...@linaro.org; a...@linux-foundation.org; linux- m...@linux-mips.org; r...@linux-mips.org; xen-de...@lists.xenproject.org; boris.ostrov...@oracle.com; Konrad Rzeszutek Wilk; d.kasat...@samsung.com; pebo...@tiscali.nl; linux-ker...@vger.kernel.org Subject: RE: [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW- IOMMU. On 05.03.15 at 04:53, xiaoming.w...@intel.com wrote: From: Konrad Rzeszutek Wilk [mailto:konrad.w...@oracle.com] Sent: Thursday, March 5, 2015 3:43 AM On Tue, Mar 03, 2015 at 04:11:09PM +0800, Wang Xiaoming wrote: @@ -101,13 +119,32 @@ setup_io_tlb_npages(char *str) { if (isdigit(*str)) { io_tlb_nslabs = simple_strtoul(str, str, 0); -/* avoid tail segment of size IO_TLB_SEGSIZE */ -io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE); } if (*str == ',') ++str; -if (!strcmp(str, force)) +if (!strncmp(str, force, 5)) { swiotlb_force = 1; +str += 5; +} So the format is now: Format: { int | force | int | int} which means I can do 32,22323,force Or force,32 Or 32,force If I use Format: { int,force,int,int} 32,22323,force can't acceptable. There are three int here, if there are out of order, that will cause confuse. Only32,force,32323 Or 32,,32323,2322 Or ,,323222,3232 Are available. You need to make sure that all previously valid variants are still usable, i.e. force alone, a number alone, force,number and number,force. How many variants you want to support with your additions is mostly up to you; I'd recommend permitting force in any position. I don't think it's suitable to accept that force in any position. If we defined Format: { int,force,int,int} force must be located in second position. And we add comment for each int also. Every position may be defined specifically. Jan ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW-IOMMU.
On 05.03.15 at 09:52, xiaoming.w...@intel.com wrote: From: Jan Beulich [mailto:jbeul...@suse.com] Sent: Thursday, March 5, 2015 4:40 PM On 05.03.15 at 04:53, xiaoming.w...@intel.com wrote: From: Konrad Rzeszutek Wilk [mailto:konrad.w...@oracle.com] Sent: Thursday, March 5, 2015 3:43 AM On Tue, Mar 03, 2015 at 04:11:09PM +0800, Wang Xiaoming wrote: @@ -101,13 +119,32 @@ setup_io_tlb_npages(char *str) { if (isdigit(*str)) { io_tlb_nslabs = simple_strtoul(str, str, 0); - /* avoid tail segment of size IO_TLB_SEGSIZE */ - io_tlb_nslabs = ALIGN(io_tlb_nslabs, IO_TLB_SEGSIZE); } if (*str == ',') ++str; - if (!strcmp(str, force)) + if (!strncmp(str, force, 5)) { swiotlb_force = 1; + str += 5; + } So the format is now: Format: { int | force | int | int} which means I can do 32,22323,force Or force,32 Or 32,force If I use Format: { int,force,int,int} 32,22323,force can't acceptable. There are three int here, if there are out of order, that will cause confuse. Only 32,force,32323 Or 32,,32323,2322 Or ,,323222,3232 Are available. You need to make sure that all previously valid variants are still usable, i.e. force alone, a number alone, force,number and number,force. How many variants you want to support with your additions is mostly up to you; I'd recommend permitting force in any position. I don't think it's suitable to accept that force in any position. If we defined Format: { int,force,int,int} force must be located in second position. And we add comment for each int also. Every position may be defined specifically. As said, with the old format allowing force in either first or second position, you have to at least accept that in the new version too. Accepting force in any position would be a (desirable) courtesy to the user. Jan ___ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Re: [Xen-devel] [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW-IOMMU.
On Tue, Mar 03, 2015 at 04:11:09PM +0800, Wang Xiaoming wrote: The maximum of SW-IOMMU is limited to 2^11*128 = 256K. And the size of IO_TLB_DEFAULT_SIZE is limited to (64UL20) 64M now. While in different platform and different requirement this seems improper. So modifing the IO_TLB_SEGSIZE to io_tlb_segsize and IO_TLB_DEFAULT_SIZE to io_tlb_default_size which can configure by kernel cmdline. This can meet different requirement. Signed-off-by: Chuansheng Liu chuansheng@intel.com Signed-off-by: Zhang Dongxing dongxing.zh...@intel.com Signed-off-by: Wang Xiaoming xiaoming.w...@intel.com --- patch v1 make this change at Kconfig which needs to edit the .config manually. https://lkml.org/lkml/2015/1/25/571 patch v2 only change IO_TLB_SEGSIZE configurable. https://lkml.org/lkml/2015/2/5/812 patch v3 parsing io_tlb_segsize and io_tlb_default_size independently. https://lkml.org/lkml/2015/2/15/217 patch v4 hasn't validated the data from command line. Thank you for redoing this per review. https://lkml.org/lkml/2015/2/17/114 Documentation/kernel-parameters.txt |9 - arch/mips/cavium-octeon/dma-octeon.c |2 +- arch/mips/netlogic/common/nlm-dma.c |2 +- drivers/xen/swiotlb-xen.c|6 +-- include/linux/swiotlb.h |8 +--- lib/swiotlb.c| 68 +- 6 files changed, 65 insertions(+), 30 deletions(-) diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 4df73da..1f50e86 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -3438,10 +3438,17 @@ bytes respectively. Such letter suffixes can also be entirely omitted. it if 0 is given (See Documentation/cgroups/memory.txt) swiotlb=[ARM,IA-64,PPC,MIPS,X86] - Format: { int | force } + Format: { int | force | int | int} , s/|/,/ int -- Number of I/O TLB slabs force -- force using of bounce buffers even if they wouldn't be automatically used by the kernel + int -- Maximum allowable number of contiguous slabs to map + int -- The size of SW-MMU mapped. + Using , to separate them one by one. Use ',' to seperate them. + Example: + BOARD_KERNEL_CMDLINE += swiotlb=32768,force,512,268435456 + io_tlb_nslabs=32768, swiotlb_force=1, + io_tlb_segsize=512, io_tlb_default_size=268435456 I think you can remove the example - and just have it in the C code. switches= [HW,M68k] diff --git a/arch/mips/cavium-octeon/dma-octeon.c b/arch/mips/cavium-octeon/dma-octeon.c index 3778655..a521af6 100644 --- a/arch/mips/cavium-octeon/dma-octeon.c +++ b/arch/mips/cavium-octeon/dma-octeon.c @@ -312,7 +312,7 @@ void __init plat_swiotlb_setup(void) swiotlbsize = 64 * (120); #endif swiotlb_nslabs = swiotlbsize IO_TLB_SHIFT; - swiotlb_nslabs = ALIGN(swiotlb_nslabs, IO_TLB_SEGSIZE); + swiotlb_nslabs = ALIGN(swiotlb_nslabs, io_tlb_segsize); swiotlbsize = swiotlb_nslabs IO_TLB_SHIFT; octeon_swiotlb = alloc_bootmem_low_pages(swiotlbsize); diff --git a/arch/mips/netlogic/common/nlm-dma.c b/arch/mips/netlogic/common/nlm-dma.c index f3d4ae8..eeffa8f 100644 --- a/arch/mips/netlogic/common/nlm-dma.c +++ b/arch/mips/netlogic/common/nlm-dma.c @@ -99,7 +99,7 @@ void __init plat_swiotlb_setup(void) swiotlbsize = 1 20; /* 1 MB for now */ swiotlb_nslabs = swiotlbsize IO_TLB_SHIFT; - swiotlb_nslabs = ALIGN(swiotlb_nslabs, IO_TLB_SEGSIZE); + swiotlb_nslabs = ALIGN(swiotlb_nslabs, io_tlb_segsize); swiotlbsize = swiotlb_nslabs IO_TLB_SHIFT; nlm_swiotlb = alloc_bootmem_low_pages(swiotlbsize); diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c index 810ad41..3b3e9fe 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c @@ -164,11 +164,11 @@ xen_swiotlb_fixup(void *buf, size_t size, unsigned long nslabs) dma_addr_t dma_handle; phys_addr_t p = virt_to_phys(buf); - dma_bits = get_order(IO_TLB_SEGSIZE IO_TLB_SHIFT) + PAGE_SHIFT; + dma_bits = get_order(io_tlb_segsize IO_TLB_SHIFT) + PAGE_SHIFT; i = 0; do { - int slabs = min(nslabs - i, (unsigned long)IO_TLB_SEGSIZE); + int slabs = min(nslabs - i, (unsigned long)io_tlb_segsize); do { rc = xen_create_contiguous_region( @@ -187,7 +187,7 @@ static unsigned long xen_set_nslabs(unsigned long nr_tbl) { if (!nr_tbl) { xen_io_tlb_nslabs = (64 * 1024 * 1024 IO_TLB_SHIFT); -
Re: [Xen-devel] [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW-IOMMU.
-Original Message- From: Konrad Rzeszutek Wilk [mailto:konrad.w...@oracle.com] Sent: Thursday, March 5, 2015 3:43 AM To: Wang, Xiaoming Cc: ch...@chris-wilson.co.uk; david.vra...@citrix.com; lau...@codeaurora.org; heiko.carst...@de.ibm.com; li...@horizon.com; l...@aserp2030.oracle.com; Liu, Chuansheng; zh...@aserp2030.oracle.com; Zhang, Dongxing; takahiro.aka...@linaro.org; a...@linux-foundation.org; linux-m...@linux-mips.org; r...@linux-mips.org; xen- de...@lists.xenproject.org; boris.ostrov...@oracle.com; d.kasat...@samsung.com; pebo...@tiscali.nl; linux-ker...@vger.kernel.org; jbeul...@suse.com Subject: Re: [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW- IOMMU. On Tue, Mar 03, 2015 at 04:11:09PM +0800, Wang Xiaoming wrote: The maximum of SW-IOMMU is limited to 2^11*128 = 256K. And the size of IO_TLB_DEFAULT_SIZE is limited to (64UL20) 64M now. While in different platform and different requirement this seems improper. So modifing the IO_TLB_SEGSIZE to io_tlb_segsize and IO_TLB_DEFAULT_SIZE to io_tlb_default_size which can configure by kernel cmdline. This can meet different requirement. Signed-off-by: Chuansheng Liu chuansheng@intel.com Signed-off-by: Zhang Dongxing dongxing.zh...@intel.com Signed-off-by: Wang Xiaoming xiaoming.w...@intel.com --- patch v1 make this change at Kconfig which needs to edit the .config manually. https://lkml.org/lkml/2015/1/25/571 patch v2 only change IO_TLB_SEGSIZE configurable. https://lkml.org/lkml/2015/2/5/812 patch v3 parsing io_tlb_segsize and io_tlb_default_size independently. https://lkml.org/lkml/2015/2/15/217 patch v4 hasn't validated the data from command line. Thank you for redoing this per review. https://lkml.org/lkml/2015/2/17/114 Documentation/kernel-parameters.txt |9 - arch/mips/cavium-octeon/dma-octeon.c |2 +- arch/mips/netlogic/common/nlm-dma.c |2 +- drivers/xen/swiotlb-xen.c|6 +-- include/linux/swiotlb.h |8 +--- lib/swiotlb.c| 68 +- 6 files changed, 65 insertions(+), 30 deletions(-) diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 4df73da..1f50e86 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -3438,10 +3438,17 @@ bytes respectively. Such letter suffixes can also be entirely omitted. it if 0 is given (See Documentation/cgroups/memory.txt) swiotlb=[ARM,IA-64,PPC,MIPS,X86] - Format: { int | force } + Format: { int | force | int | int} , s/|/,/ How about change the Format to Format: { int,force,int,int} Force the parameter input in consecutive order. int -- Number of I/O TLB slabs force -- force using of bounce buffers even if they wouldn't be automatically used by the kernel + int -- Maximum allowable number of contiguous slabs to map + int -- The size of SW-MMU mapped. + Using , to separate them one by one. Use ',' to seperate them. + Example: + BOARD_KERNEL_CMDLINE += swiotlb=32768,force,512,268435456 + io_tlb_nslabs=32768, swiotlb_force=1, + io_tlb_segsize=512, io_tlb_default_size=268435456 I think you can remove the example - and just have it in the C code. switches= [HW,M68k] diff --git a/arch/mips/cavium-octeon/dma-octeon.c b/arch/mips/cavium-octeon/dma-octeon.c index 3778655..a521af6 100644 --- a/arch/mips/cavium-octeon/dma-octeon.c +++ b/arch/mips/cavium-octeon/dma-octeon.c @@ -312,7 +312,7 @@ void __init plat_swiotlb_setup(void) swiotlbsize = 64 * (120); #endif swiotlb_nslabs = swiotlbsize IO_TLB_SHIFT; - swiotlb_nslabs = ALIGN(swiotlb_nslabs, IO_TLB_SEGSIZE); + swiotlb_nslabs = ALIGN(swiotlb_nslabs, io_tlb_segsize); swiotlbsize = swiotlb_nslabs IO_TLB_SHIFT; octeon_swiotlb = alloc_bootmem_low_pages(swiotlbsize); diff --git a/arch/mips/netlogic/common/nlm-dma.c b/arch/mips/netlogic/common/nlm-dma.c index f3d4ae8..eeffa8f 100644 --- a/arch/mips/netlogic/common/nlm-dma.c +++ b/arch/mips/netlogic/common/nlm-dma.c @@ -99,7 +99,7 @@ void __init plat_swiotlb_setup(void) swiotlbsize = 1 20; /* 1 MB for now */ swiotlb_nslabs = swiotlbsize IO_TLB_SHIFT; - swiotlb_nslabs = ALIGN(swiotlb_nslabs, IO_TLB_SEGSIZE); + swiotlb_nslabs = ALIGN(swiotlb_nslabs, io_tlb_segsize); swiotlbsize = swiotlb_nslabs IO_TLB_SHIFT; nlm_swiotlb = alloc_bootmem_low_pages(swiotlbsize); diff
[Xen-devel] [PATCH v5] modify the IO_TLB_SEGSIZE and IO_TLB_DEFAULT_SIZE configurable as flexible requirement about SW-IOMMU.
The maximum of SW-IOMMU is limited to 2^11*128 = 256K. And the size of IO_TLB_DEFAULT_SIZE is limited to (64UL20) 64M now. While in different platform and different requirement this seems improper. So modifing the IO_TLB_SEGSIZE to io_tlb_segsize and IO_TLB_DEFAULT_SIZE to io_tlb_default_size which can configure by kernel cmdline. This can meet different requirement. Signed-off-by: Chuansheng Liu chuansheng@intel.com Signed-off-by: Zhang Dongxing dongxing.zh...@intel.com Signed-off-by: Wang Xiaoming xiaoming.w...@intel.com --- patch v1 make this change at Kconfig which needs to edit the .config manually. https://lkml.org/lkml/2015/1/25/571 patch v2 only change IO_TLB_SEGSIZE configurable. https://lkml.org/lkml/2015/2/5/812 patch v3 parsing io_tlb_segsize and io_tlb_default_size independently. https://lkml.org/lkml/2015/2/15/217 patch v4 hasn't validated the data from command line. https://lkml.org/lkml/2015/2/17/114 Documentation/kernel-parameters.txt |9 - arch/mips/cavium-octeon/dma-octeon.c |2 +- arch/mips/netlogic/common/nlm-dma.c |2 +- drivers/xen/swiotlb-xen.c|6 +-- include/linux/swiotlb.h |8 +--- lib/swiotlb.c| 68 +- 6 files changed, 65 insertions(+), 30 deletions(-) diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 4df73da..1f50e86 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -3438,10 +3438,17 @@ bytes respectively. Such letter suffixes can also be entirely omitted. it if 0 is given (See Documentation/cgroups/memory.txt) swiotlb=[ARM,IA-64,PPC,MIPS,X86] - Format: { int | force } + Format: { int | force | int | int} int -- Number of I/O TLB slabs force -- force using of bounce buffers even if they wouldn't be automatically used by the kernel + int -- Maximum allowable number of contiguous slabs to map + int -- The size of SW-MMU mapped. + Using , to separate them one by one. + Example: + BOARD_KERNEL_CMDLINE += swiotlb=32768,force,512,268435456 + io_tlb_nslabs=32768, swiotlb_force=1, + io_tlb_segsize=512, io_tlb_default_size=268435456 switches= [HW,M68k] diff --git a/arch/mips/cavium-octeon/dma-octeon.c b/arch/mips/cavium-octeon/dma-octeon.c index 3778655..a521af6 100644 --- a/arch/mips/cavium-octeon/dma-octeon.c +++ b/arch/mips/cavium-octeon/dma-octeon.c @@ -312,7 +312,7 @@ void __init plat_swiotlb_setup(void) swiotlbsize = 64 * (120); #endif swiotlb_nslabs = swiotlbsize IO_TLB_SHIFT; - swiotlb_nslabs = ALIGN(swiotlb_nslabs, IO_TLB_SEGSIZE); + swiotlb_nslabs = ALIGN(swiotlb_nslabs, io_tlb_segsize); swiotlbsize = swiotlb_nslabs IO_TLB_SHIFT; octeon_swiotlb = alloc_bootmem_low_pages(swiotlbsize); diff --git a/arch/mips/netlogic/common/nlm-dma.c b/arch/mips/netlogic/common/nlm-dma.c index f3d4ae8..eeffa8f 100644 --- a/arch/mips/netlogic/common/nlm-dma.c +++ b/arch/mips/netlogic/common/nlm-dma.c @@ -99,7 +99,7 @@ void __init plat_swiotlb_setup(void) swiotlbsize = 1 20; /* 1 MB for now */ swiotlb_nslabs = swiotlbsize IO_TLB_SHIFT; - swiotlb_nslabs = ALIGN(swiotlb_nslabs, IO_TLB_SEGSIZE); + swiotlb_nslabs = ALIGN(swiotlb_nslabs, io_tlb_segsize); swiotlbsize = swiotlb_nslabs IO_TLB_SHIFT; nlm_swiotlb = alloc_bootmem_low_pages(swiotlbsize); diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c index 810ad41..3b3e9fe 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c @@ -164,11 +164,11 @@ xen_swiotlb_fixup(void *buf, size_t size, unsigned long nslabs) dma_addr_t dma_handle; phys_addr_t p = virt_to_phys(buf); - dma_bits = get_order(IO_TLB_SEGSIZE IO_TLB_SHIFT) + PAGE_SHIFT; + dma_bits = get_order(io_tlb_segsize IO_TLB_SHIFT) + PAGE_SHIFT; i = 0; do { - int slabs = min(nslabs - i, (unsigned long)IO_TLB_SEGSIZE); + int slabs = min(nslabs - i, (unsigned long)io_tlb_segsize); do { rc = xen_create_contiguous_region( @@ -187,7 +187,7 @@ static unsigned long xen_set_nslabs(unsigned long nr_tbl) { if (!nr_tbl) { xen_io_tlb_nslabs = (64 * 1024 * 1024 IO_TLB_SHIFT); - xen_io_tlb_nslabs = ALIGN(xen_io_tlb_nslabs, IO_TLB_SEGSIZE); + xen_io_tlb_nslabs = ALIGN(xen_io_tlb_nslabs, io_tlb_segsize); } else xen_io_tlb_nslabs = nr_tbl; diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h index e7a018e..13506db 100644 ---