Commit adfaa888 authored by Michael S. Tsirkin's avatar Michael S. Tsirkin Committed by Linus Torvalds
Browse files

[PATCH] fmr pool: remove unnecessary pointer dereference



ib_fmr_pool_map_phys gets the virtual address by pointer but never writes
there, and users (e.g.  srp) seem to assume this and ignore the value
returned.  This patch cleans up the API to get the VA by value, and updates
all users.

Signed-off-by: default avatarMichael S. Tsirkin <mst@mellanox.co.il>
Acked-by: default avatarRoland Dreier <rolandd@cisco.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 74f76fba
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -426,7 +426,7 @@ EXPORT_SYMBOL(ib_flush_fmr_pool);
struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle,
					 u64                *page_list,
					 int                 list_len,
					 u64                *io_virtual_address)
					 u64                 io_virtual_address)
{
	struct ib_fmr_pool *pool = pool_handle;
	struct ib_pool_fmr *fmr;
@@ -440,7 +440,7 @@ struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle,
	fmr = ib_fmr_cache_lookup(pool,
				  page_list,
				  list_len,
				  *io_virtual_address);
				  io_virtual_address);
	if (fmr) {
		/* found in cache */
		++fmr->ref_count;
@@ -464,7 +464,7 @@ struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle,
	spin_unlock_irqrestore(&pool->pool_lock, flags);

	result = ib_map_phys_fmr(fmr->fmr, page_list, list_len,
				 *io_virtual_address);
				 io_virtual_address);

	if (result) {
		spin_lock_irqsave(&pool->pool_lock, flags);
@@ -481,7 +481,7 @@ struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle,
	fmr->ref_count = 1;

	if (pool->cache_bucket) {
		fmr->io_virtual_address = *io_virtual_address;
		fmr->io_virtual_address = io_virtual_address;
		fmr->page_list_len      = list_len;
		memcpy(fmr->page_list, page_list, list_len * sizeof(*page_list));

+1 −1
Original line number Diff line number Diff line
@@ -594,7 +594,7 @@ int iser_reg_page_vec(struct iser_conn *ib_conn,
	mem  = ib_fmr_pool_map_phys(ib_conn->fmr_pool,
				    page_list,
				    page_vec->length,
				    &io_addr);
				    io_addr);

	if (IS_ERR(mem)) {
		status = (int)PTR_ERR(mem);
+1 −1
Original line number Diff line number Diff line
@@ -615,7 +615,7 @@ static int srp_map_fmr(struct srp_device *dev, struct scatterlist *scat,
				(sg_dma_address(&scat[i]) & dev->fmr_page_mask) + j;

	req->fmr = ib_fmr_pool_map_phys(dev->fmr_pool,
					dma_pages, page_cnt, &io_addr);
					dma_pages, page_cnt, io_addr);
	if (IS_ERR(req->fmr)) {
		ret = PTR_ERR(req->fmr);
		req->fmr = NULL;
+1 −1
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ int ib_flush_fmr_pool(struct ib_fmr_pool *pool);
struct ib_pool_fmr *ib_fmr_pool_map_phys(struct ib_fmr_pool *pool_handle,
					 u64                *page_list,
					 int                 list_len,
					 u64                *io_virtual_address);
					 u64                 io_virtual_address);

int ib_fmr_pool_unmap(struct ib_pool_fmr *fmr);