diff options
author | Huacai Chen <chenhc@lemote.com> | 2017-11-21 08:23:38 -0500 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2017-11-21 23:05:57 -0500 |
commit | 90addc6b3c9cda0146fbd62a08e234c2b224a80c (patch) | |
tree | 7cdc0b3f4b87d26c8f91125edaea8723764526bf | |
parent | 860dd4424f344400b491b212ee4acb3a358ba9d9 (diff) |
scsi: use dma_get_cache_alignment() as minimum DMA alignment
In non-coherent DMA mode, kernel uses cache flushing operations to
maintain I/O coherency, so scsi's block queue should be aligned to the
value returned by dma_get_cache_alignment(). Otherwise, If a DMA buffer
and a kernel structure share a same cache line, and if the kernel
structure has dirty data, cache_invalidate (no writeback) will cause
data corruption.
Cc: stable@vger.kernel.org
Signed-off-by: Huacai Chen <chenhc@lemote.com>
[hch: rebased and updated the comment and changelog]
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/scsi_lib.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 1cbc497e00bd..00742c50cd44 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -2148,11 +2148,13 @@ void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q) | |||
2148 | q->limits.cluster = 0; | 2148 | q->limits.cluster = 0; |
2149 | 2149 | ||
2150 | /* | 2150 | /* |
2151 | * set a reasonable default alignment on word boundaries: the | 2151 | * Set a reasonable default alignment: The larger of 32-byte (dword), |
2152 | * host and device may alter it using | 2152 | * which is a common minimum for HBAs, and the minimum DMA alignment, |
2153 | * blk_queue_update_dma_alignment() later. | 2153 | * which is set by the platform. |
2154 | * | ||
2155 | * Devices that require a bigger alignment can increase it later. | ||
2154 | */ | 2156 | */ |
2155 | blk_queue_dma_alignment(q, 0x03); | 2157 | blk_queue_dma_alignment(q, max(4, dma_get_cache_alignment()) - 1); |
2156 | } | 2158 | } |
2157 | EXPORT_SYMBOL_GPL(__scsi_init_queue); | 2159 | EXPORT_SYMBOL_GPL(__scsi_init_queue); |
2158 | 2160 | ||