Message ID | 1373665694-7580-4-git-send-email-santosh.shilimkar@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hello. On 07/13/2013 01:48 AM, Santosh Shilimkar wrote: > DMA bounce limit is the maximum direct DMA'able memory beyond which > bounce buffers has to be used to perform dma operations. SCSI driver > relies on dma_mask but its calculation is based on max_*pfn which > don't have uniform meaning across architectures. So make use of > dma_max_pfn() which is expected to return the DMAable maximum pfn > value across architectures. > Cc: Russell King <linux@arm.linux.org.uk> > Cc: linux-scsi@vger.kernel.org > Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> > --- > drivers/scsi/scsi_lib.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c > index 86d5220..e8275fa 100644 > --- a/drivers/scsi/scsi_lib.c > +++ b/drivers/scsi/scsi_lib.c > @@ -1668,7 +1668,7 @@ u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost) > > host_dev = scsi_get_device(shost); > if (host_dev && host_dev->dma_mask) > - bounce_limit = *host_dev->dma_mask; > + bounce_limit = dma_max_pfn(host_dev) << PAGE_SHIFT; You definitely forgot -1 here. WBR, Sergei
On Sat, Jul 13, 2013 at 01:55:58AM +0400, Sergei Shtylyov wrote: > Hello. > > On 07/13/2013 01:48 AM, Santosh Shilimkar wrote: > >> DMA bounce limit is the maximum direct DMA'able memory beyond which >> bounce buffers has to be used to perform dma operations. SCSI driver >> relies on dma_mask but its calculation is based on max_*pfn which >> don't have uniform meaning across architectures. So make use of >> dma_max_pfn() which is expected to return the DMAable maximum pfn >> value across architectures. > >> Cc: Russell King <linux@arm.linux.org.uk> >> Cc: linux-scsi@vger.kernel.org > >> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> >> --- >> drivers/scsi/scsi_lib.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) > >> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c >> index 86d5220..e8275fa 100644 >> --- a/drivers/scsi/scsi_lib.c >> +++ b/drivers/scsi/scsi_lib.c >> @@ -1668,7 +1668,7 @@ u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost) >> >> host_dev = scsi_get_device(shost); >> if (host_dev && host_dev->dma_mask) >> - bounce_limit = *host_dev->dma_mask; >> + bounce_limit = dma_max_pfn(host_dev) << PAGE_SHIFT; > > You definitely forgot -1 here. Please explain your point.
Hello. On 07/13/2013 02:25 AM, Russell King - ARM Linux wrote: >>> DMA bounce limit is the maximum direct DMA'able memory beyond which >>> bounce buffers has to be used to perform dma operations. SCSI driver >>> relies on dma_mask but its calculation is based on max_*pfn which >>> don't have uniform meaning across architectures. So make use of >>> dma_max_pfn() which is expected to return the DMAable maximum pfn >>> value across architectures. >>> Cc: Russell King <linux@arm.linux.org.uk> >>> Cc: linux-scsi@vger.kernel.org >>> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> >>> --- >>> drivers/scsi/scsi_lib.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c >>> index 86d5220..e8275fa 100644 >>> --- a/drivers/scsi/scsi_lib.c >>> +++ b/drivers/scsi/scsi_lib.c >>> @@ -1668,7 +1668,7 @@ u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost) >>> >>> host_dev = scsi_get_device(shost); >>> if (host_dev && host_dev->dma_mask) >>> - bounce_limit = *host_dev->dma_mask; >>> + bounce_limit = dma_max_pfn(host_dev) << PAGE_SHIFT; >> You definitely forgot -1 here. > Please explain your point. Previously, 'bounce_limit' would look like 0xffffffff (unless I'm mistaken), now it would look like 0xfffff000 which is hardly what we're looking for, no? WBR, Sergei
On 07/13/2013 03:08 AM, Sergei Shtylyov wrote: >>>> DMA bounce limit is the maximum direct DMA'able memory beyond which >>>> bounce buffers has to be used to perform dma operations. SCSI driver >>>> relies on dma_mask but its calculation is based on max_*pfn which >>>> don't have uniform meaning across architectures. So make use of >>>> dma_max_pfn() which is expected to return the DMAable maximum pfn >>>> value across architectures. >>>> Cc: Russell King <linux@arm.linux.org.uk> >>>> Cc: linux-scsi@vger.kernel.org >>>> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> >>>> --- >>>> drivers/scsi/scsi_lib.c | 2 +- >>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c >>>> index 86d5220..e8275fa 100644 >>>> --- a/drivers/scsi/scsi_lib.c >>>> +++ b/drivers/scsi/scsi_lib.c >>>> @@ -1668,7 +1668,7 @@ u64 scsi_calculate_bounce_limit(struct >>>> Scsi_Host *shost) >>>> >>>> host_dev = scsi_get_device(shost); >>>> if (host_dev && host_dev->dma_mask) >>>> - bounce_limit = *host_dev->dma_mask; >>>> + bounce_limit = dma_max_pfn(host_dev) << PAGE_SHIFT; >>> You definitely forgot -1 here. >> Please explain your point. > Previously, 'bounce_limit' would look like 0xffffffff (unless I'm > mistaken), now it would look like 0xfffff000 which is hardly what we're > looking for, no? Although, -1 won't give us the correct result in this case, it's more like + PAGE_SIZE - 1. WBR, Sergei
On Sat, Jul 13, 2013 at 03:42:55AM +0400, Sergei Shtylyov wrote: >>>>> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c >>>>> index 86d5220..e8275fa 100644 >>>>> --- a/drivers/scsi/scsi_lib.c >>>>> +++ b/drivers/scsi/scsi_lib.c >>>>> @@ -1668,7 +1668,7 @@ u64 scsi_calculate_bounce_limit(struct >>>>> Scsi_Host *shost) >>>>> >>>>> host_dev = scsi_get_device(shost); >>>>> if (host_dev && host_dev->dma_mask) >>>>> - bounce_limit = *host_dev->dma_mask; >>>>> + bounce_limit = dma_max_pfn(host_dev) << PAGE_SHIFT; > >>>> You definitely forgot -1 here. > >>> Please explain your point. > >> Previously, 'bounce_limit' would look like 0xffffffff (unless I'm >> mistaken), now it would look like 0xfffff000 which is hardly what we're >> looking for, no? > > Although, -1 won't give us the correct result in this case, it's more > like + PAGE_SIZE - 1. And where it's used is blk_bounce_limit(), the first which that does is convert it back to a PFN, losing the bottom bits again... I'm tempted to suggest converting the whole thing to just deal with PFNs rather than bytes since we only deal with "can we DMA to this" on a per-page basis.
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 86d5220..e8275fa 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -1668,7 +1668,7 @@ u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost) host_dev = scsi_get_device(shost); if (host_dev && host_dev->dma_mask) - bounce_limit = *host_dev->dma_mask; + bounce_limit = dma_max_pfn(host_dev) << PAGE_SHIFT; return bounce_limit; }
DMA bounce limit is the maximum direct DMA'able memory beyond which bounce buffers has to be used to perform dma operations. SCSI driver relies on dma_mask but its calculation is based on max_*pfn which don't have uniform meaning across architectures. So make use of dma_max_pfn() which is expected to return the DMAable maximum pfn value across architectures. Cc: Russell King <linux@arm.linux.org.uk> Cc: linux-scsi@vger.kernel.org Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> --- drivers/scsi/scsi_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)