Skip to content

Commit

Permalink
SG: Change sg_set_page() to take length and offset argument
Browse files Browse the repository at this point in the history
Most drivers need to set length and offset as well, so may as well fold
those three lines into one.

Add sg_assign_page() for those two locations that only needed to set
the page, where the offset/length is set outside of the function context.

Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Jens Axboe committed Oct 24, 2007
1 parent bd6dee6 commit 642f149
Show file tree
Hide file tree
Showing 31 changed files with 98 additions and 161 deletions.
4 changes: 1 addition & 3 deletions block/ll_rw_blk.c
Original file line number Diff line number Diff line change
Expand Up @@ -1366,9 +1366,7 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
sg = sg_next(sg);
}

sg_set_page(sg, bvec->bv_page);
sg->length = nbytes;
sg->offset = bvec->bv_offset;
sg_set_page(sg, bvec->bv_page, nbytes, bvec->bv_offset);
nsegs++;
}
bvprv = bvec;
Expand Down
3 changes: 1 addition & 2 deletions crypto/hmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,7 @@ static int hmac_digest(struct hash_desc *pdesc, struct scatterlist *sg,

sg_set_buf(sg1, ipad, bs);

sg_set_page(&sg[1], (void *) sg);
sg1[1].length = 0;
sg_set_page(&sg[1], (void *) sg, 0, 0);
sg_set_buf(sg2, opad, bs + ds);

err = crypto_hash_digest(&desc, sg1, nbytes + bs, digest);
Expand Down
4 changes: 2 additions & 2 deletions drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -4689,8 +4689,8 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
* data in this function or read data in ata_sg_clean.
*/
offset = lsg->offset + lsg->length - qc->pad_len;
sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT));
psg->offset = offset_in_page(offset);
sg_set_page(psg, nth_page(sg_page(lsg), offset >> PAGE_SHIFT),
qc->pad_len, offset_in_page(offset));

if (qc->tf.flags & ATA_TFLAG_WRITE) {
void *addr = kmap_atomic(sg_page(psg), KM_IRQ0);
Expand Down
9 changes: 2 additions & 7 deletions drivers/block/cryptoloop.c
Original file line number Diff line number Diff line change
Expand Up @@ -150,13 +150,8 @@ cryptoloop_transfer(struct loop_device *lo, int cmd,
u32 iv[4] = { 0, };
iv[0] = cpu_to_le32(IV & 0xffffffff);

sg_set_page(&sg_in, in_page);
sg_in.offset = in_offs;
sg_in.length = sz;

sg_set_page(&sg_out, out_page);
sg_out.offset = out_offs;
sg_out.length = sz;
sg_set_page(&sg_in, in_page, sz, in_offs);
sg_set_page(&sg_out, out_page, sz, out_offs);

desc.info = iv;
err = encdecfunc(&desc, &sg_out, &sg_in, sz);
Expand Down
9 changes: 3 additions & 6 deletions drivers/block/ub.c
Original file line number Diff line number Diff line change
Expand Up @@ -1428,9 +1428,8 @@ static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd)
scmd->state = UB_CMDST_INIT;
scmd->nsg = 1;
sg = &scmd->sgv[0];
sg_set_page(sg, virt_to_page(sc->top_sense));
sg->offset = (unsigned long)sc->top_sense & (PAGE_SIZE-1);
sg->length = UB_SENSE_SIZE;
sg_set_page(sg, virt_to_page(sc->top_sense), UB_SENSE_SIZE,
(unsigned long)sc->top_sense & (PAGE_SIZE-1));
scmd->len = UB_SENSE_SIZE;
scmd->lun = cmd->lun;
scmd->done = ub_top_sense_done;
Expand Down Expand Up @@ -1864,9 +1863,7 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun,
cmd->state = UB_CMDST_INIT;
cmd->nsg = 1;
sg = &cmd->sgv[0];
sg_set_page(sg, virt_to_page(p));
sg->offset = (unsigned long)p & (PAGE_SIZE-1);
sg->length = 8;
sg_set_page(sg, virt_to_page(p), 8, (unsigned long)p & (PAGE_SIZE-1));
cmd->len = 8;
cmd->lun = lun;
cmd->done = ub_probe_done;
Expand Down
4 changes: 2 additions & 2 deletions drivers/ieee1394/dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ int dma_region_alloc(struct dma_region *dma, unsigned long n_bytes,
unsigned long va =
(unsigned long)dma->kvirt + (i << PAGE_SHIFT);

sg_set_page(&dma->sglist[i], vmalloc_to_page((void *)va));
dma->sglist[i].length = PAGE_SIZE;
sg_set_page(&dma->sglist[i], vmalloc_to_page((void *)va),
PAGE_SIZE, 0);
}

/* map sglist to the IOMMU */
Expand Down
4 changes: 1 addition & 3 deletions drivers/infiniband/core/umem.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +171,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
if (vma_list &&
!is_vm_hugetlb_page(vma_list[i + off]))
umem->hugetlb = 0;
sg_set_page(&chunk->page_list[i], page_list[i + off]);
chunk->page_list[i].offset = 0;
chunk->page_list[i].length = PAGE_SIZE;
sg_set_page(&chunk->page_list[i], page_list[i + off], PAGE_SIZE, 0);
}

chunk->nmap = ib_dma_map_sg(context->device,
Expand Down
9 changes: 3 additions & 6 deletions drivers/infiniband/hw/mthca/mthca_memfree.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,7 @@ static int mthca_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_m
if (!page)
return -ENOMEM;

sg_set_page(mem, page);
mem->length = PAGE_SIZE << order;
mem->offset = 0;
sg_set_page(mem, page, PAGE_SIZE << order, 0);
return 0;
}

Expand Down Expand Up @@ -481,9 +479,8 @@ int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar,
if (ret < 0)
goto out;

sg_set_page(&db_tab->page[i].mem, pages[0]);
db_tab->page[i].mem.length = MTHCA_ICM_PAGE_SIZE;
db_tab->page[i].mem.offset = uaddr & ~PAGE_MASK;
sg_set_page(&db_tab->page[i].mem, pages[0], MTHCA_ICM_PAGE_SIZE,
uaddr & ~PAGE_MASK);

ret = pci_map_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE);
if (ret < 0) {
Expand Down
8 changes: 2 additions & 6 deletions drivers/md/dm-crypt.c
Original file line number Diff line number Diff line change
Expand Up @@ -351,14 +351,10 @@ static int crypt_convert(struct crypt_config *cc,
struct scatterlist sg_in, sg_out;

sg_init_table(&sg_in, 1);
sg_set_page(&sg_in, bv_in->bv_page);
sg_in.offset = bv_in->bv_offset + ctx->offset_in;
sg_in.length = 1 << SECTOR_SHIFT;
sg_set_page(&sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT, bv_in->bv_offset + ctx->offset_in);

sg_init_table(&sg_out, 1);
sg_set_page(&sg_out, bv_out->bv_page);
sg_out.offset = bv_out->bv_offset + ctx->offset_out;
sg_out.length = 1 << SECTOR_SHIFT;
sg_set_page(&sg_out, bv_out->bv_page, 1 << SECTOR_SHIFT, bv_out->bv_offset + ctx->offset_out);

ctx->offset_in += sg_in.length;
if (ctx->offset_in >= bv_in->bv_len) {
Expand Down
3 changes: 1 addition & 2 deletions drivers/media/common/saa7146_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,7 @@ static struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
if (NULL == pg)
goto err;
BUG_ON(PageHighMem(pg));
sg_set_page(&sglist[i], pg);
sglist[i].length = PAGE_SIZE;
sg_set_page(&sglist[i], pg, PAGE_SIZE, 0);
}
return sglist;

Expand Down
6 changes: 2 additions & 4 deletions drivers/media/video/ivtv/ivtv-udma.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@ int ivtv_udma_fill_sg_list (struct ivtv_user_dma *dma, struct ivtv_dma_page_info
unsigned int len = (i == dma_page->page_count - 1) ?
dma_page->tail : PAGE_SIZE - offset;

dma->SGlist[map_offset].length = len;
dma->SGlist[map_offset].offset = offset;
if (PageHighMem(dma->map[map_offset])) {
void *src;

Expand All @@ -63,10 +61,10 @@ int ivtv_udma_fill_sg_list (struct ivtv_user_dma *dma, struct ivtv_dma_page_info
memcpy(page_address(dma->bouncemap[map_offset]) + offset, src, len);
kunmap_atomic(src, KM_BOUNCE_READ);
local_irq_restore(flags);
sg_set_page(&dma->SGlist[map_offset], dma->bouncemap[map_offset]);
sg_set_page(&dma->SGlist[map_offset], dma->bouncemap[map_offset], len, offset);
}
else {
sg_set_page(&dma->SGlist[map_offset], dma->map[map_offset]);
sg_set_page(&dma->SGlist[map_offset], dma->map[map_offset], len, offset);
}
offset = 0;
map_offset++;
Expand Down
10 changes: 3 additions & 7 deletions drivers/media/video/videobuf-dma-sg.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,7 @@ videobuf_vmalloc_to_sg(unsigned char *virt, int nr_pages)
if (NULL == pg)
goto err;
BUG_ON(PageHighMem(pg));
sg_set_page(&sglist[i], pg);
sglist[i].length = PAGE_SIZE;
sg_set_page(&sglist[i], pg, PAGE_SIZE, 0);
}
return sglist;

Expand All @@ -95,16 +94,13 @@ videobuf_pages_to_sg(struct page **pages, int nr_pages, int offset)
if (PageHighMem(pages[0]))
/* DMA to highmem pages might not work */
goto highmem;
sg_set_page(&sglist[0], pages[0]);
sglist[0].offset = offset;
sglist[0].length = PAGE_SIZE - offset;
sg_set_page(&sglist[0], pages[0], PAGE_SIZE - offset, offset);
for (i = 1; i < nr_pages; i++) {
if (NULL == pages[i])
goto nopage;
if (PageHighMem(pages[i]))
goto highmem;
sg_set_page(&sglist[i], pages[i]);
sglist[i].length = PAGE_SIZE;
sg_set_page(&sglist[i], pages[i], PAGE_SIZE, 0);
}
return sglist;

Expand Down
4 changes: 1 addition & 3 deletions drivers/net/mlx4/icm.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,7 @@ static int mlx4_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_ma
if (!page)
return -ENOMEM;

sg_set_page(mem, page);
mem->length = PAGE_SIZE << order;
mem->offset = 0;
sg_set_page(mem, page, PAGE_SIZE << order, 0);
return 0;
}

Expand Down
10 changes: 3 additions & 7 deletions drivers/s390/scsi/zfcp_aux.c
Original file line number Diff line number Diff line change
Expand Up @@ -562,16 +562,14 @@ zfcp_sg_list_alloc(struct zfcp_sg_list *sg_list, size_t size)
sg_init_table(sg_list->sg, sg_list->count);

for (i = 0, sg = sg_list->sg; i < sg_list->count; i++, sg++) {
sg->length = min(size, PAGE_SIZE);
sg->offset = 0;
address = (void *) get_zeroed_page(GFP_KERNEL);
if (address == NULL) {
sg_list->count = i;
zfcp_sg_list_free(sg_list);
retval = -ENOMEM;
goto out;
}
zfcp_address_to_sg(address, sg);
zfcp_address_to_sg(address, sg, min(size, PAGE_SIZE));
size -= sg->length;
}

Expand Down Expand Up @@ -1523,10 +1521,8 @@ zfcp_gid_pn_buffers_alloc(struct zfcp_gid_pn_data **gid_pn, mempool_t *pool)
data->ct.req = &data->req;
data->ct.resp = &data->resp;
data->ct.req_count = data->ct.resp_count = 1;
zfcp_address_to_sg(&data->ct_iu_req, &data->req);
zfcp_address_to_sg(&data->ct_iu_resp, &data->resp);
data->req.length = sizeof(struct ct_iu_gid_pn_req);
data->resp.length = sizeof(struct ct_iu_gid_pn_resp);
zfcp_address_to_sg(&data->ct_iu_req, &data->req, sizeof(struct ct_iu_gid_pn_req));
zfcp_address_to_sg(&data->ct_iu_resp, &data->resp, sizeof(struct ct_iu_gid_pn_resp));

*gid_pn = data;
return 0;
Expand Down
3 changes: 1 addition & 2 deletions drivers/s390/scsi/zfcp_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,7 @@ zfcp_sg_to_address(struct scatterlist *list)
static inline void
zfcp_address_to_sg(void *address, struct scatterlist *list)
{
sg_set_page(list, virt_to_page(address));
list->offset = ((unsigned long) address) & (PAGE_SIZE - 1);
sg_set_buf(list, address, 0);
}

#define REQUEST_LIST_SIZE 128
Expand Down
7 changes: 2 additions & 5 deletions drivers/s390/scsi/zfcp_erp.c
Original file line number Diff line number Diff line change
Expand Up @@ -322,9 +322,9 @@ zfcp_erp_adisc(struct zfcp_port *port)
if (address == NULL)
goto nomem;

zfcp_address_to_sg(address, send_els->req);
zfcp_address_to_sg(address, send_els->req, sizeof(struct zfcp_ls_adisc));
address += PAGE_SIZE >> 1;
zfcp_address_to_sg(address, send_els->resp);
zfcp_address_to_sg(address, send_els->resp, sizeof(struct zfcp_ls_adisc_acc));
send_els->req_count = send_els->resp_count = 1;

send_els->adapter = adapter;
Expand All @@ -336,9 +336,6 @@ zfcp_erp_adisc(struct zfcp_port *port)
adisc = zfcp_sg_to_address(send_els->req);
send_els->ls_code = adisc->code = ZFCP_LS_ADISC;

send_els->req->length = sizeof(struct zfcp_ls_adisc);
send_els->resp->length = sizeof(struct zfcp_ls_adisc_acc);

/* acc. to FC-FS, hard_nport_id in ADISC should not be set for ports
without FC-AL-2 capability, so we don't set it */
adisc->wwpn = fc_host_port_name(adapter->scsi_host);
Expand Down
2 changes: 1 addition & 1 deletion drivers/scsi/ipr.c
Original file line number Diff line number Diff line change
Expand Up @@ -2890,7 +2890,7 @@ static struct ipr_sglist *ipr_alloc_ucode_buffer(int buf_len)
return NULL;
}

sg_set_page(&scatterlist[i], page);
sg_set_page(&scatterlist[i], page, 0, 0);
}

return sglist;
Expand Down
4 changes: 1 addition & 3 deletions drivers/scsi/iscsi_tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,7 @@ static inline void
iscsi_buf_init_sg(struct iscsi_buf *ibuf, struct scatterlist *sg)
{
sg_init_table(&ibuf->sg, 1);
sg_set_page(&ibuf->sg, sg_page(sg));
ibuf->sg.offset = sg->offset;
ibuf->sg.length = sg->length;
sg_set_page(&ibuf->sg, sg_page(sg), sg->length, sg->offset);
/*
* Fastpath: sg element fits into single page
*/
Expand Down
6 changes: 2 additions & 4 deletions drivers/scsi/osst.c
Original file line number Diff line number Diff line change
Expand Up @@ -5256,8 +5256,7 @@ static int enlarge_buffer(struct osst_buffer *STbuffer, int need_dma)

STbuffer->sg[0].offset = 0;
if (page != NULL) {
sg_set_page(&STbuffer->sg[0], page);
STbuffer->sg[0].length = b_size;
sg_set_page(&STbuffer->sg[0], page, b_size, 0);
STbuffer->b_data = page_address(page);
break;
}
Expand Down Expand Up @@ -5285,8 +5284,7 @@ static int enlarge_buffer(struct osst_buffer *STbuffer, int need_dma)
normalize_buffer(STbuffer);
return 0;
}
sg_set_page(&STbuffer->sg[segs], page);
STbuffer->sg[segs].length = (OS_FRAME_SIZE - got <= PAGE_SIZE / 2) ? (OS_FRAME_SIZE - got) : b_size;
sg_set_page(&STbuffer->sg[segs], page, (OS_FRAME_SIZE - got <= PAGE_SIZE / 2) ? (OS_FRAME_SIZE - got) : b_size, 0);
got += STbuffer->sg[segs].length;
STbuffer->buffer_size = got;
STbuffer->sg_segs = ++segs;
Expand Down
13 changes: 4 additions & 9 deletions drivers/scsi/sg.c
Original file line number Diff line number Diff line change
Expand Up @@ -1717,16 +1717,12 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages,
goto out_unlock; */
}

sg_set_page(sgl, pages[0]);
sgl[0].offset = uaddr & ~PAGE_MASK;
sg_set_page(sgl, pages[0], 0, uaddr & ~PAGE_MASK);
if (nr_pages > 1) {
sgl[0].length = PAGE_SIZE - sgl[0].offset;
count -= sgl[0].length;
for (i=1; i < nr_pages ; i++) {
sg_set_page(&sgl[i], pages[i]);
sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE;
count -= PAGE_SIZE;
}
for (i=1; i < nr_pages ; i++)
sg_set_page(&sgl[i], pages[i], count < PAGE_SIZE ? count : PAGE_SIZE, 0);
}
else {
sgl[0].length = count;
Expand Down Expand Up @@ -1854,8 +1850,7 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size)
scatter_elem_sz_prev = ret_sz;
}
}
sg_set_page(sg, p);
sg->length = (ret_sz > num) ? num : ret_sz;
sg_set_page(sg, p, (ret_sz > num) ? num : ret_sz, 0);

SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k=%d, num=%d, "
"ret_sz=%d\n", k, num, ret_sz));
Expand Down
14 changes: 5 additions & 9 deletions drivers/scsi/st.c
Original file line number Diff line number Diff line change
Expand Up @@ -3797,13 +3797,11 @@ static void buf_to_sg(struct st_buffer *STbp, unsigned int length)
sg = &(STbp->sg[0]);
frp = STbp->frp;
for (i=count=0; count < length; i++) {
sg_set_page(&sg[i], frp[i].page);
if (length - count > frp[i].length)
sg[i].length = frp[i].length;
sg_set_page(&sg[i], frp[i].page, frp[i].length, 0);
else
sg[i].length = length - count;
sg_set_page(&sg[i], frp[i].page, length - count, 0);
count += sg[i].length;
sg[i].offset = 0;
}
STbp->sg_segs = i;
STbp->frp_sg_current = length;
Expand Down Expand Up @@ -4446,15 +4444,13 @@ static int sgl_map_user_pages(struct scatterlist *sgl, const unsigned int max_pa
}

/* Populate the scatter/gather list */
sg_set_page(&sgl[0], pages[0]);
sgl[0].offset = uaddr & ~PAGE_MASK;
sg_set_page(&sgl[0], pages[0], 0, uaddr & ~PAGE_MASK);
if (nr_pages > 1) {
sgl[0].length = PAGE_SIZE - sgl[0].offset;
count -= sgl[0].length;
for (i=1; i < nr_pages ; i++) {
sg_set_page(&sgl[i], pages[i]);;
sgl[i].offset = 0;
sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE;
sg_set_page(&sgl[i], pages[i],
count < PAGE_SIZE ? count : PAGE_SIZE, 0);;
count -= PAGE_SIZE;
}
}
Expand Down
Loading

0 comments on commit 642f149

Please sign in to comment.