IB/srp: Remove use_mr argument from srp_map_sg_entry()
Move the srp_map_desc() call from inside srp_map_sg_entry() to srp_map_sg() such that the use_mr argument can be removed from srp_map_sg_entry(). Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
0e0d3a4800
commit
3ae95da883
|
@ -1260,6 +1260,8 @@ static void srp_map_desc(struct srp_map_state *state, dma_addr_t dma_addr,
|
||||||
{
|
{
|
||||||
struct srp_direct_buf *desc = state->desc;
|
struct srp_direct_buf *desc = state->desc;
|
||||||
|
|
||||||
|
WARN_ON_ONCE(!dma_len);
|
||||||
|
|
||||||
desc->va = cpu_to_be64(dma_addr);
|
desc->va = cpu_to_be64(dma_addr);
|
||||||
desc->key = cpu_to_be32(rkey);
|
desc->key = cpu_to_be32(rkey);
|
||||||
desc->len = cpu_to_be32(dma_len);
|
desc->len = cpu_to_be32(dma_len);
|
||||||
|
@ -1366,29 +1368,17 @@ static int srp_finish_mapping(struct srp_map_state *state,
|
||||||
|
|
||||||
static int srp_map_sg_entry(struct srp_map_state *state,
|
static int srp_map_sg_entry(struct srp_map_state *state,
|
||||||
struct srp_rdma_ch *ch,
|
struct srp_rdma_ch *ch,
|
||||||
struct scatterlist *sg, int sg_index,
|
struct scatterlist *sg, int sg_index)
|
||||||
bool use_mr)
|
|
||||||
{
|
{
|
||||||
struct srp_target_port *target = ch->target;
|
struct srp_target_port *target = ch->target;
|
||||||
struct srp_device *dev = target->srp_host->srp_dev;
|
struct srp_device *dev = target->srp_host->srp_dev;
|
||||||
struct ib_device *ibdev = dev->dev;
|
struct ib_device *ibdev = dev->dev;
|
||||||
dma_addr_t dma_addr = ib_sg_dma_address(ibdev, sg);
|
dma_addr_t dma_addr = ib_sg_dma_address(ibdev, sg);
|
||||||
unsigned int dma_len = ib_sg_dma_len(ibdev, sg);
|
unsigned int dma_len = ib_sg_dma_len(ibdev, sg);
|
||||||
unsigned int len;
|
unsigned int len = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!dma_len)
|
WARN_ON_ONCE(!dma_len);
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!use_mr) {
|
|
||||||
/*
|
|
||||||
* Once we're in direct map mode for a request, we don't
|
|
||||||
* go back to FMR or FR mode, so no need to update anything
|
|
||||||
* other than the descriptor.
|
|
||||||
*/
|
|
||||||
srp_map_desc(state, dma_addr, dma_len, target->rkey);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (dma_len) {
|
while (dma_len) {
|
||||||
unsigned offset = dma_addr & ~dev->mr_page_mask;
|
unsigned offset = dma_addr & ~dev->mr_page_mask;
|
||||||
|
@ -1441,16 +1431,20 @@ static int srp_map_sg(struct srp_map_state *state, struct srp_rdma_ch *ch,
|
||||||
use_mr = !!ch->fmr_pool;
|
use_mr = !!ch->fmr_pool;
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_sg(scat, sg, count, i) {
|
|
||||||
ret = srp_map_sg_entry(state, ch, sg, i, use_mr);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (use_mr) {
|
if (use_mr) {
|
||||||
|
for_each_sg(scat, sg, count, i) {
|
||||||
|
ret = srp_map_sg_entry(state, ch, sg, i);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
ret = srp_finish_mapping(state, ch);
|
ret = srp_finish_mapping(state, ch);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
} else {
|
||||||
|
for_each_sg(scat, sg, count, i) {
|
||||||
|
srp_map_desc(state, ib_sg_dma_address(dev->dev, sg),
|
||||||
|
ib_sg_dma_len(dev->dev, sg), target->rkey);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
req->nmdesc = state->nmdesc;
|
req->nmdesc = state->nmdesc;
|
||||||
|
|
Loading…
Reference in New Issue