Thread (46 messages) flat view 46 messages, 9 authors, 2007-07-18

Re: [patch 5/6] ps3: BD/DVD/CD-ROM Storage Driver

From: Jens Axboe <hidden>
Date: 2007-07-13 14:51:55
Also in: linux-scsi, lkml

On Fri, Jul 13 2007, Geert Uytterhoeven wrote:
On Fri, 13 Jul 2007, Jens Axboe wrote:
quoted
On Fri, Jul 13 2007, James Bottomley wrote:
quoted
On Wed, 2007-07-04 at 15:22 +0200, Geert Uytterhoeven wrote:
quoted
+                       kaddr = kmap_atomic(sgpnt->page, KM_USER0);
+                       if (!kaddr)
+                               return -1;
+                       len = sgpnt->length;
+                       if ((req_len + len) > buflen) {
+                               active = 0;
+                               len = buflen - req_len;
+                       }
+                       memcpy(kaddr + sgpnt->offset, buf + req_len,
len);
+                       kunmap_atomic(kaddr, KM_USER0);
This isn't a SCSI objection, but this sequence appears several times in
this driver.  It's wrong for a non-PIPT architecture (and I believe the
PS3 is VIPT) because you copy into the kernel alias for the page, which
dirties the line in the cache of that alias (the user alias cache line
was already invalidated).  However, unless you flush the kernel alias to
main memory, the user could read stale data.  The way this is supposed
to be done is to do a 

flush_kernel_dcache_page(kaddr)

before doing the kunmap.

Otherwise it looks OK from the SCSI point of view.
kmap() just returns page_address() on ppc64, as there's no highmem.
kunmap() is a no-op.

So technically I could just use page_address() directly, but Christoph wanted
me to keep the kmap()/kunmap() sequence because it's considered a good
practice.
If you have the kmap sequence there, put the flush in as well. People
copy code, you know... Or put a big comment explaining why it isn't
needed.
quoted
Well, even worse is that fact that it's using KM_USER0 from interrupt
context.
So should I replace it by e.g. KM_IRQ0?
I'm not so familiar with these parts, and I couldn't find what these values
really mean.
You corrupt data, using KM_USER0 from interrupt context. So it's a big
flaw right now. Use KM_IRQ0 for code where interrupts are always
disabled.

-- 
Jens Axboe
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help