* Re: [PATCH 4/5] SCSI: add cpu cache flushes after kmapping and modifying a page
@ 2007-05-29 16:53 Salyzyn, Mark
2007-06-20 15:04 ` [PATCH] aacraid: add cpu cache flush " Salyzyn, Mark
0 siblings, 1 reply; 3+ messages in thread
From: Salyzyn, Mark @ 2007-05-29 16:53 UTC (permalink / raw)
To: James Bottomley, Tejun Heo; +Cc: linux-scsi
[-- Attachment #1: Type: text/plain, Size: 6557 bytes --]
What ever became of the following patch? I have enclosed the incremental
aacraid version of this patch to permit closure if the following was
rejected because of another portion.
This attached aacraid specific portion of the patch is against current
scsi-misc-2.6.
ObligatoryDisclaimer: Please accept my condolences regarding Outlook's
handling of patch content.
Signed-off-by: Mark Salyzyn <aacraid@adaptec.com>
Sincerely -- Mark Salyzyn
-----Original Message-----
From: linux-scsi-owner@vger.kernel.org
[mailto:linux-scsi-owner@vger.kernel.org] On Behalf Of Tejun Heo
Sent: Saturday, June 03, 2006 11:41 PM
To: Jens Axboe; James Bottomley; Dave Miller; bzolnier@gmail.com;
james.steward@dynamicratings.com; jgarzik@pobox.com;
mattjreimer@gmail.com; Guennadi Liakhovetski; rmk@arm.linux.org.uk;
lkml; linux-ide@vger.kernel.org; linux-scsi@vger.kernel.org;
htejun@gmail.com
Cc: Tejun Heo
Subject: [PATCH 4/5] SCSI: add cpu cache flushes after kmapping and
modifying a page
Add calls to flush_kernel_dcache_page() after CPU has kmapped and
modified a page. This fixes PIO cache coherency bugs on architectures
with aliased caches.
Signed-off-by: Tejun Heo <htejun@gmail.com>
---
drivers/scsi/3w-9xxx.c | 1 +
drivers/scsi/3w-xxxx.c | 1 +
drivers/scsi/aacraid/aachba.c | 4 +++-
drivers/scsi/ide-scsi.c | 1 +
drivers/scsi/ips.c | 2 ++
drivers/scsi/iscsi_tcp.c | 1 +
drivers/scsi/megaraid.c | 2 ++
drivers/scsi/qlogicpti.c | 1 +
drivers/scsi/scsi_debug.c | 1 +
drivers/scsi/scsi_lib.c | 1 +
10 files changed, 14 insertions(+), 1 deletions(-)
9b4bdd1409efb726d4a6561a4f7e2aff878ab4f4
diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c
index caeb6d2..172f16b 100644
--- a/drivers/scsi/3w-9xxx.c
+++ b/drivers/scsi/3w-9xxx.c
@@ -1948,6 +1948,7 @@ static void twa_scsiop_execute_scsi_comp
local_irq_save(flags);
buf = kmap_atomic(sg->page, KM_IRQ0) +
sg->offset;
memcpy(buf,
tw_dev->generic_buffer_virt[request_id], sg->length);
+ flush_kernel_dcache_page(kmap_atomic_to_page(buf
- sg->offset));
kunmap_atomic(buf - sg->offset, KM_IRQ0);
local_irq_restore(flags);
}
diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c
index e8e41e6..8449551 100644
--- a/drivers/scsi/3w-xxxx.c
+++ b/drivers/scsi/3w-xxxx.c
@@ -1527,6 +1527,7 @@ static void tw_transfer_internal(TW_Devi
struct scatterlist *sg;
sg = (struct scatterlist *)cmd->request_buffer;
+ flush_kernel_dcache_page(kmap_atomic_to_page(buf -
sg->offset));
kunmap_atomic(buf - sg->offset, KM_IRQ0);
local_irq_restore(flags);
}
diff --git a/drivers/scsi/aacraid/aachba.c
b/drivers/scsi/aacraid/aachba.c
index 642a3b4..b7c00b8 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -376,8 +376,10 @@ static void aac_internal_transfer(struct
memcpy(buf + offset, data, transfer_len - offset);
- if (scsicmd->use_sg)
+ if (scsicmd->use_sg) {
+ flush_kernel_dcache_page(kmap_atomic_to_page(buf -
sg->offset));
kunmap_atomic(buf - sg->offset, KM_IRQ0);
+ }
}
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
index 39b760a..9c28b95 100644
--- a/drivers/scsi/ide-scsi.c
+++ b/drivers/scsi/ide-scsi.c
@@ -189,6 +189,7 @@ static void idescsi_input_buffers (ide_d
pc->sg->offset;
drive->hwif->atapi_input_bytes(drive,
buf + pc->b_count,
count);
+ flush_kernel_dcache_page(kmap_atomic_to_page(buf
- pc->sg->offset));
kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
local_irq_restore(flags);
} else {
diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c
index a4c0b04..29eb3f0 100644
--- a/drivers/scsi/ips.c
+++ b/drivers/scsi/ips.c
@@ -3682,6 +3682,8 @@ ips_scmd_buf_write(Scsi_Cmnd * scmd, voi
local_irq_save(flags);
buffer = kmap_atomic(sg[i].page, KM_IRQ0) +
sg[i].offset;
memcpy(buffer, &cdata[xfer_cnt], min_cnt);
+ flush_kernel_dcache_page(
+ kmap_atomic_to_page(buffer -
sg[i].offset));
kunmap_atomic(buffer - sg[i].offset, KM_IRQ0);
local_irq_restore(flags);
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index 2068b66..ae9784c 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -945,6 +945,7 @@ static int iscsi_scsi_data_in(struct isc
dest = kmap_atomic(sg[i].page, KM_SOFTIRQ0);
rc = iscsi_ctask_copy(conn, ctask, dest + sg[i].offset,
sg[i].length, offset);
+ flush_kernel_dcache_page(kmap_atomic_to_page(dest));
kunmap_atomic(dest, KM_SOFTIRQ0);
if (rc == -EAGAIN)
/* continue with the next SKB/PDU */
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index de35ffe..7cb7590 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -671,6 +671,8 @@ #endif
struct scatterlist *sg;
sg = (struct scatterlist
*)cmd->request_buffer;
+ flush_kernel_dcache_page(
+ kmap_atomic_to_page(buf -
sg->offset));
kunmap_atomic(buf - sg->offset,
KM_IRQ0);
}
cmd->result = (DID_OK << 16);
diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c
index c7e78dc..f8201f2 100644
--- a/drivers/scsi/qlogicpti.c
+++ b/drivers/scsi/qlogicpti.c
@@ -1146,6 +1146,7 @@ static void scsi_rbuf_put(struct scsi_cm
struct scatterlist *sg;
sg = (struct scatterlist *) cmd->request_buffer;
+ flush_kernel_dcache_page(kmap_atomic_to_page(buf -
sg->offset));
kunmap_atomic(buf - sg->offset, KM_IRQ0);
}
}
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 5a5d2af..88543db 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -511,6 +511,7 @@ static int fill_from_dev_buffer(struct s
len = arr_len - req_len;
}
memcpy(kaddr_off, arr + req_len, len);
+
flush_kernel_dcache_page(kmap_atomic_to_page(kaddr));
kunmap_atomic(kaddr, KM_USER0);
act_len += len;
}
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 764a8b3..8bb2f6c 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -945,6 +945,7 @@ void scsi_io_completion(struct scsi_cmnd
unsigned long flags;
char *to = bio_kmap_irq(req->bio, &flags);
memcpy(to, cmd->buffer, cmd->bufflen);
+
flush_kernel_dcache_page(kmap_atomic_to_page(to));
bio_kunmap_irq(to, &flags);
}
kfree(cmd->buffer);
--
1.3.2
[-- Attachment #2: aacraid_flush_dcache.patch --]
[-- Type: application/octet-stream, Size: 762 bytes --]
diff -ru a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
--- a/drivers/scsi/aacraid/aachba.c 2007-05-29 11:57:47.332437519 -0400
+++ b/drivers/scsi/aacraid/aachba.c 2007-05-29 12:37:04.581386639 -0400
@@ -31,9 +31,9 @@
#include <linux/slab.h>
#include <linux/completion.h>
#include <linux/blkdev.h>
-#include <linux/dma-mapping.h>
#include <asm/semaphore.h>
#include <asm/uaccess.h>
+#include <linux/highmem.h> /* For flush_kernel_dcache_page */
#include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h>
@@ -355,7 +355,9 @@
memcpy(buf + offset, data, transfer_len);
- if (scsicmd->use_sg)
+ if (scsicmd->use_sg) {
+ flush_kernel_dcache_page(kmap_atomic_to_page(buf - sg->offset));
kunmap_atomic(buf - sg->offset, KM_IRQ0);
+ }
}
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH] aacraid: add cpu cache flush after kmapping and modifying a page
2007-05-29 16:53 [PATCH 4/5] SCSI: add cpu cache flushes after kmapping and modifying a page Salyzyn, Mark
@ 2007-06-20 15:04 ` Salyzyn, Mark
2007-06-21 5:41 ` Tejun Heo
0 siblings, 1 reply; 3+ messages in thread
From: Salyzyn, Mark @ 2007-06-20 15:04 UTC (permalink / raw)
To: Tejun Heo, linux-scsi
[-- Attachment #1: Type: text/plain, Size: 7812 bytes --]
Updated patch to address overlap with patches introduced by FUJITA
Tomonori <fujita.tomonori@lab.ntt.co.jp>. Tejun, please inspect.
This attached aacraid specific portion of the patch is against current
scsi-misc-2.6.
ObligatoryDisclaimer: Please accept my condolences regarding Outlook's
handling of patch content.
Signed-off-by: Mark Salyzyn <aacraid@adaptec.com>
drivers/scsi/aacraid/aachba.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
Sincerely -- Mark Salyzyn
> -----Original Message-----
> From: linux-scsi-owner@vger.kernel.org
> [mailto:linux-scsi-owner@vger.kernel.org] On Behalf Of Salyzyn, Mark
> Sent: Tuesday, May 29, 2007 12:54 PM
> To: James Bottomley; Tejun Heo
> Cc: linux-scsi@vger.kernel.org
> Subject: Re: [PATCH 4/5] SCSI: add cpu cache flushes after
> kmapping and modifying a page
>
>
> What ever became of the following patch? I have enclosed the
> incremental
> aacraid version of this patch to permit closure if the following was
> rejected because of another portion.
>
> This attached aacraid specific portion of the patch is against current
> scsi-misc-2.6.
>
> ObligatoryDisclaimer: Please accept my condolences regarding Outlook's
> handling of patch content.
>
> Signed-off-by: Mark Salyzyn <aacraid@adaptec.com>
>
> Sincerely -- Mark Salyzyn
>
> -----Original Message-----
> From: linux-scsi-owner@vger.kernel.org
> [mailto:linux-scsi-owner@vger.kernel.org] On Behalf Of Tejun Heo
> Sent: Saturday, June 03, 2006 11:41 PM
> To: Jens Axboe; James Bottomley; Dave Miller; bzolnier@gmail.com;
> james.steward@dynamicratings.com; jgarzik@pobox.com;
> mattjreimer@gmail.com; Guennadi Liakhovetski; rmk@arm.linux.org.uk;
> lkml; linux-ide@vger.kernel.org; linux-scsi@vger.kernel.org;
> htejun@gmail.com
> Cc: Tejun Heo
> Subject: [PATCH 4/5] SCSI: add cpu cache flushes after kmapping and
> modifying a page
>
>
> Add calls to flush_kernel_dcache_page() after CPU has kmapped and
> modified a page. This fixes PIO cache coherency bugs on architectures
> with aliased caches.
>
> Signed-off-by: Tejun Heo <htejun@gmail.com>
>
> ---
>
> drivers/scsi/3w-9xxx.c | 1 +
> drivers/scsi/3w-xxxx.c | 1 +
> drivers/scsi/aacraid/aachba.c | 4 +++-
> drivers/scsi/ide-scsi.c | 1 +
> drivers/scsi/ips.c | 2 ++
> drivers/scsi/iscsi_tcp.c | 1 +
> drivers/scsi/megaraid.c | 2 ++
> drivers/scsi/qlogicpti.c | 1 +
> drivers/scsi/scsi_debug.c | 1 +
> drivers/scsi/scsi_lib.c | 1 +
> 10 files changed, 14 insertions(+), 1 deletions(-)
>
> 9b4bdd1409efb726d4a6561a4f7e2aff878ab4f4
> diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c
> index caeb6d2..172f16b 100644
> --- a/drivers/scsi/3w-9xxx.c
> +++ b/drivers/scsi/3w-9xxx.c
> @@ -1948,6 +1948,7 @@ static void twa_scsiop_execute_scsi_comp
> local_irq_save(flags);
> buf = kmap_atomic(sg->page, KM_IRQ0) +
> sg->offset;
> memcpy(buf,
> tw_dev->generic_buffer_virt[request_id], sg->length);
> + flush_kernel_dcache_page(kmap_atomic_to_page(buf
> - sg->offset));
> kunmap_atomic(buf - sg->offset, KM_IRQ0);
> local_irq_restore(flags);
> }
> diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c
> index e8e41e6..8449551 100644
> --- a/drivers/scsi/3w-xxxx.c
> +++ b/drivers/scsi/3w-xxxx.c
> @@ -1527,6 +1527,7 @@ static void tw_transfer_internal(TW_Devi
> struct scatterlist *sg;
>
> sg = (struct scatterlist *)cmd->request_buffer;
> + flush_kernel_dcache_page(kmap_atomic_to_page(buf -
> sg->offset));
> kunmap_atomic(buf - sg->offset, KM_IRQ0);
> local_irq_restore(flags);
> }
> diff --git a/drivers/scsi/aacraid/aachba.c
> b/drivers/scsi/aacraid/aachba.c
> index 642a3b4..b7c00b8 100644
> --- a/drivers/scsi/aacraid/aachba.c
> +++ b/drivers/scsi/aacraid/aachba.c
> @@ -376,8 +376,10 @@ static void aac_internal_transfer(struct
>
> memcpy(buf + offset, data, transfer_len - offset);
>
> - if (scsicmd->use_sg)
> + if (scsicmd->use_sg) {
> + flush_kernel_dcache_page(kmap_atomic_to_page(buf -
> sg->offset));
> kunmap_atomic(buf - sg->offset, KM_IRQ0);
> + }
>
> }
>
> diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
> index 39b760a..9c28b95 100644
> --- a/drivers/scsi/ide-scsi.c
> +++ b/drivers/scsi/ide-scsi.c
> @@ -189,6 +189,7 @@ static void idescsi_input_buffers (ide_d
> pc->sg->offset;
> drive->hwif->atapi_input_bytes(drive,
> buf + pc->b_count,
> count);
> + flush_kernel_dcache_page(kmap_atomic_to_page(buf
> - pc->sg->offset));
> kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
> local_irq_restore(flags);
> } else {
> diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c
> index a4c0b04..29eb3f0 100644
> --- a/drivers/scsi/ips.c
> +++ b/drivers/scsi/ips.c
> @@ -3682,6 +3682,8 @@ ips_scmd_buf_write(Scsi_Cmnd * scmd, voi
> local_irq_save(flags);
> buffer = kmap_atomic(sg[i].page, KM_IRQ0) +
> sg[i].offset;
> memcpy(buffer, &cdata[xfer_cnt], min_cnt);
> + flush_kernel_dcache_page(
> + kmap_atomic_to_page(buffer -
> sg[i].offset));
> kunmap_atomic(buffer - sg[i].offset, KM_IRQ0);
> local_irq_restore(flags);
>
> diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
> index 2068b66..ae9784c 100644
> --- a/drivers/scsi/iscsi_tcp.c
> +++ b/drivers/scsi/iscsi_tcp.c
> @@ -945,6 +945,7 @@ static int iscsi_scsi_data_in(struct isc
> dest = kmap_atomic(sg[i].page, KM_SOFTIRQ0);
> rc = iscsi_ctask_copy(conn, ctask, dest + sg[i].offset,
> sg[i].length, offset);
> + flush_kernel_dcache_page(kmap_atomic_to_page(dest));
> kunmap_atomic(dest, KM_SOFTIRQ0);
> if (rc == -EAGAIN)
> /* continue with the next SKB/PDU */
> diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
> index de35ffe..7cb7590 100644
> --- a/drivers/scsi/megaraid.c
> +++ b/drivers/scsi/megaraid.c
> @@ -671,6 +671,8 @@ #endif
> struct scatterlist *sg;
>
> sg = (struct scatterlist
> *)cmd->request_buffer;
> + flush_kernel_dcache_page(
> + kmap_atomic_to_page(buf -
> sg->offset));
> kunmap_atomic(buf - sg->offset,
> KM_IRQ0);
> }
> cmd->result = (DID_OK << 16);
> diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c
> index c7e78dc..f8201f2 100644
> --- a/drivers/scsi/qlogicpti.c
> +++ b/drivers/scsi/qlogicpti.c
> @@ -1146,6 +1146,7 @@ static void scsi_rbuf_put(struct scsi_cm
> struct scatterlist *sg;
>
> sg = (struct scatterlist *) cmd->request_buffer;
> + flush_kernel_dcache_page(kmap_atomic_to_page(buf -
> sg->offset));
> kunmap_atomic(buf - sg->offset, KM_IRQ0);
> }
> }
> diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
> index 5a5d2af..88543db 100644
> --- a/drivers/scsi/scsi_debug.c
> +++ b/drivers/scsi/scsi_debug.c
> @@ -511,6 +511,7 @@ static int fill_from_dev_buffer(struct s
> len = arr_len - req_len;
> }
> memcpy(kaddr_off, arr + req_len, len);
> +
> flush_kernel_dcache_page(kmap_atomic_to_page(kaddr));
> kunmap_atomic(kaddr, KM_USER0);
> act_len += len;
> }
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index 764a8b3..8bb2f6c 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -945,6 +945,7 @@ void scsi_io_completion(struct scsi_cmnd
> unsigned long flags;
> char *to = bio_kmap_irq(req->bio, &flags);
> memcpy(to, cmd->buffer, cmd->bufflen);
> +
> flush_kernel_dcache_page(kmap_atomic_to_page(to));
> bio_kunmap_irq(to, &flags);
> }
> kfree(cmd->buffer);
> --
> 1.3.2
>
[-- Attachment #2: aacraid_flush_dcache2.patch --]
[-- Type: application/octet-stream, Size: 736 bytes --]
diff -ru a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
--- a/drivers/scsi/aacraid/aachba.c 2007-06-20 10:46:14.370166427 -0400
+++ b/drivers/scsi/aacraid/aachba.c 2007-06-20 10:50:12.883010740 -0400
@@ -31,9 +31,9 @@
#include <linux/slab.h>
#include <linux/completion.h>
#include <linux/blkdev.h>
-#include <linux/dma-mapping.h>
#include <asm/semaphore.h>
#include <asm/uaccess.h>
+#include <linux/highmem.h> /* For flush_kernel_dcache_page */
#include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h>
@@ -364,6 +364,7 @@
if (buf && transfer_len > 0)
memcpy(buf + offset, data, transfer_len);
+ flush_kernel_dcache_page(kmap_atomic_to_page(buf - sg->offset));
kunmap_atomic(buf - sg->offset, KM_IRQ0);
}
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] aacraid: add cpu cache flush after kmapping and modifying a page
2007-06-20 15:04 ` [PATCH] aacraid: add cpu cache flush " Salyzyn, Mark
@ 2007-06-21 5:41 ` Tejun Heo
0 siblings, 0 replies; 3+ messages in thread
From: Tejun Heo @ 2007-06-21 5:41 UTC (permalink / raw)
To: Salyzyn, Mark; +Cc: linux-scsi, James Bottomley
Salyzyn, Mark wrote:
> Updated patch to address overlap with patches introduced by FUJITA
> Tomonori <fujita.tomonori@lab.ntt.co.jp>. Tejun, please inspect.
I'm sorry but this patch is really out of my hand. James?
--
tejun
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-06-21 5:41 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-29 16:53 [PATCH 4/5] SCSI: add cpu cache flushes after kmapping and modifying a page Salyzyn, Mark
2007-06-20 15:04 ` [PATCH] aacraid: add cpu cache flush " Salyzyn, Mark
2007-06-21 5:41 ` Tejun Heo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).