diff options
author | Bart Van Assche <bvanassche@acm.org> | 2014-05-20 09:05:46 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-05-20 12:20:52 -0400 |
commit | 539dde6fc5c30cfa76439de03ed3ba444d2579b3 (patch) | |
tree | 0a1ad7bdfe57beb85d65cf13d87d328e9bc047a5 | |
parent | 76bc1e1ddd1ea8d4bc230fc0aa45c1d14c232531 (diff) |
IB/srp: Introduce srp_finish_mapping()
This patch does not change any functionality.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r-- | drivers/infiniband/ulp/srp/ib_srp.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index be84c94aaeae..c2e0ad399213 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
@@ -935,16 +935,6 @@ static int srp_map_finish_fmr(struct srp_map_state *state, | |||
935 | struct ib_pool_fmr *fmr; | 935 | struct ib_pool_fmr *fmr; |
936 | u64 io_addr = 0; | 936 | u64 io_addr = 0; |
937 | 937 | ||
938 | if (!state->npages) | ||
939 | return 0; | ||
940 | |||
941 | if (state->npages == 1) { | ||
942 | srp_map_desc(state, state->base_dma_addr, state->fmr_len, | ||
943 | target->rkey); | ||
944 | state->npages = state->fmr_len = 0; | ||
945 | return 0; | ||
946 | } | ||
947 | |||
948 | fmr = ib_fmr_pool_map_phys(dev->fmr_pool, state->pages, | 938 | fmr = ib_fmr_pool_map_phys(dev->fmr_pool, state->pages, |
949 | state->npages, io_addr); | 939 | state->npages, io_addr); |
950 | if (IS_ERR(fmr)) | 940 | if (IS_ERR(fmr)) |
@@ -954,10 +944,32 @@ static int srp_map_finish_fmr(struct srp_map_state *state, | |||
954 | state->nfmr++; | 944 | state->nfmr++; |
955 | 945 | ||
956 | srp_map_desc(state, 0, state->fmr_len, fmr->fmr->rkey); | 946 | srp_map_desc(state, 0, state->fmr_len, fmr->fmr->rkey); |
957 | state->npages = state->fmr_len = 0; | 947 | |
958 | return 0; | 948 | return 0; |
959 | } | 949 | } |
960 | 950 | ||
951 | static int srp_finish_mapping(struct srp_map_state *state, | ||
952 | struct srp_target_port *target) | ||
953 | { | ||
954 | int ret = 0; | ||
955 | |||
956 | if (state->npages == 0) | ||
957 | return 0; | ||
958 | |||
959 | if (state->npages == 1) | ||
960 | srp_map_desc(state, state->base_dma_addr, state->fmr_len, | ||
961 | target->rkey); | ||
962 | else | ||
963 | ret = srp_map_finish_fmr(state, target); | ||
964 | |||
965 | if (ret == 0) { | ||
966 | state->npages = 0; | ||
967 | state->fmr_len = 0; | ||
968 | } | ||
969 | |||
970 | return ret; | ||
971 | } | ||
972 | |||
961 | static void srp_map_update_start(struct srp_map_state *state, | 973 | static void srp_map_update_start(struct srp_map_state *state, |
962 | struct scatterlist *sg, int sg_index, | 974 | struct scatterlist *sg, int sg_index, |
963 | dma_addr_t dma_addr) | 975 | dma_addr_t dma_addr) |
@@ -998,7 +1010,7 @@ static int srp_map_sg_entry(struct srp_map_state *state, | |||
998 | * avoided using FMR on such page fragments. | 1010 | * avoided using FMR on such page fragments. |
999 | */ | 1011 | */ |
1000 | if (dma_addr & ~dev->fmr_page_mask || dma_len > dev->fmr_max_size) { | 1012 | if (dma_addr & ~dev->fmr_page_mask || dma_len > dev->fmr_max_size) { |
1001 | ret = srp_map_finish_fmr(state, target); | 1013 | ret = srp_finish_mapping(state, target); |
1002 | if (ret) | 1014 | if (ret) |
1003 | return ret; | 1015 | return ret; |
1004 | 1016 | ||
@@ -1017,7 +1029,7 @@ static int srp_map_sg_entry(struct srp_map_state *state, | |||
1017 | 1029 | ||
1018 | while (dma_len) { | 1030 | while (dma_len) { |
1019 | if (state->npages == SRP_FMR_SIZE) { | 1031 | if (state->npages == SRP_FMR_SIZE) { |
1020 | ret = srp_map_finish_fmr(state, target); | 1032 | ret = srp_finish_mapping(state, target); |
1021 | if (ret) | 1033 | if (ret) |
1022 | return ret; | 1034 | return ret; |
1023 | 1035 | ||
@@ -1040,7 +1052,7 @@ static int srp_map_sg_entry(struct srp_map_state *state, | |||
1040 | */ | 1052 | */ |
1041 | ret = 0; | 1053 | ret = 0; |
1042 | if (len != dev->fmr_page_size) { | 1054 | if (len != dev->fmr_page_size) { |
1043 | ret = srp_map_finish_fmr(state, target); | 1055 | ret = srp_finish_mapping(state, target); |
1044 | if (!ret) | 1056 | if (!ret) |
1045 | srp_map_update_start(state, NULL, 0, 0); | 1057 | srp_map_update_start(state, NULL, 0, 0); |
1046 | } | 1058 | } |
@@ -1083,7 +1095,7 @@ backtrack: | |||
1083 | } | 1095 | } |
1084 | } | 1096 | } |
1085 | 1097 | ||
1086 | if (use_fmr == SRP_MAP_ALLOW_FMR && srp_map_finish_fmr(state, target)) | 1098 | if (use_fmr == SRP_MAP_ALLOW_FMR && srp_finish_mapping(state, target)) |
1087 | goto backtrack; | 1099 | goto backtrack; |
1088 | 1100 | ||
1089 | req->nfmr = state->nfmr; | 1101 | req->nfmr = state->nfmr; |