Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: pmcraid: use sg helper to iterate over scatterlist

Unlike the legacy I/O path, scsi-mq preallocates a large array to hold
the scatterlist for each request. This static allocation can consume
substantial amounts of memory on modern controllers which support a
large number of concurrently outstanding requests.

To facilitate a switch to a smaller static allocation combined with a
dynamic allocation for requests that need it, we need to make sure all
SCSI drivers handle chained scatterlists correctly.

Convert remaining drivers that directly dereference the scatterlist
array to using the iterator functions.

[mkp: clarified commit message]

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Ming Lei and committed by
Martin K. Petersen
74eb7446 c71ae886

+7 -7
+7 -7
drivers/scsi/pmcraid.c
··· 3270 3270 int direction 3271 3271 ) 3272 3272 { 3273 - struct scatterlist *scatterlist; 3273 + struct scatterlist *sg; 3274 3274 void *kaddr; 3275 3275 int bsize_elem; 3276 3276 int i; ··· 3279 3279 /* Determine the actual number of bytes per element */ 3280 3280 bsize_elem = PAGE_SIZE * (1 << sglist->order); 3281 3281 3282 - scatterlist = sglist->scatterlist; 3282 + sg = sglist->scatterlist; 3283 3283 3284 - for (i = 0; i < (len / bsize_elem); i++, buffer += bsize_elem) { 3285 - struct page *page = sg_page(&scatterlist[i]); 3284 + for (i = 0; i < (len / bsize_elem); i++, sg = sg_next(sg), buffer += bsize_elem) { 3285 + struct page *page = sg_page(sg); 3286 3286 3287 3287 kaddr = kmap(page); 3288 3288 if (direction == DMA_TO_DEVICE) ··· 3297 3297 return -EFAULT; 3298 3298 } 3299 3299 3300 - scatterlist[i].length = bsize_elem; 3300 + sg->length = bsize_elem; 3301 3301 } 3302 3302 3303 3303 if (len % bsize_elem) { 3304 - struct page *page = sg_page(&scatterlist[i]); 3304 + struct page *page = sg_page(sg); 3305 3305 3306 3306 kaddr = kmap(page); 3307 3307 ··· 3312 3312 3313 3313 kunmap(page); 3314 3314 3315 - scatterlist[i].length = len % bsize_elem; 3315 + sg->length = len % bsize_elem; 3316 3316 } 3317 3317 3318 3318 if (rc) {