diff options
Diffstat (limited to 'net/sunrpc')
-rw-r--r-- | net/sunrpc/xprtrdma/verbs.c | 148 |
1 files changed, 95 insertions, 53 deletions
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index fd71501403fd..24ea6dd184e4 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c | |||
@@ -1075,6 +1075,69 @@ rpcrdma_ep_disconnect(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia) | |||
1075 | } | 1075 | } |
1076 | } | 1076 | } |
1077 | 1077 | ||
1078 | static struct rpcrdma_req * | ||
1079 | rpcrdma_create_req(struct rpcrdma_xprt *r_xprt) | ||
1080 | { | ||
1081 | struct rpcrdma_create_data_internal *cdata = &r_xprt->rx_data; | ||
1082 | size_t wlen = 1 << fls(cdata->inline_wsize + | ||
1083 | sizeof(struct rpcrdma_req)); | ||
1084 | struct rpcrdma_ia *ia = &r_xprt->rx_ia; | ||
1085 | struct rpcrdma_req *req; | ||
1086 | int rc; | ||
1087 | |||
1088 | rc = -ENOMEM; | ||
1089 | req = kmalloc(wlen, GFP_KERNEL); | ||
1090 | if (req == NULL) | ||
1091 | goto out; | ||
1092 | memset(req, 0, sizeof(struct rpcrdma_req)); | ||
1093 | |||
1094 | rc = rpcrdma_register_internal(ia, req->rl_base, wlen - | ||
1095 | offsetof(struct rpcrdma_req, rl_base), | ||
1096 | &req->rl_handle, &req->rl_iov); | ||
1097 | if (rc) | ||
1098 | goto out_free; | ||
1099 | |||
1100 | req->rl_size = wlen - sizeof(struct rpcrdma_req); | ||
1101 | req->rl_buffer = &r_xprt->rx_buf; | ||
1102 | return req; | ||
1103 | |||
1104 | out_free: | ||
1105 | kfree(req); | ||
1106 | out: | ||
1107 | return ERR_PTR(rc); | ||
1108 | } | ||
1109 | |||
1110 | static struct rpcrdma_rep * | ||
1111 | rpcrdma_create_rep(struct rpcrdma_xprt *r_xprt) | ||
1112 | { | ||
1113 | struct rpcrdma_create_data_internal *cdata = &r_xprt->rx_data; | ||
1114 | size_t rlen = 1 << fls(cdata->inline_rsize + | ||
1115 | sizeof(struct rpcrdma_rep)); | ||
1116 | struct rpcrdma_ia *ia = &r_xprt->rx_ia; | ||
1117 | struct rpcrdma_rep *rep; | ||
1118 | int rc; | ||
1119 | |||
1120 | rc = -ENOMEM; | ||
1121 | rep = kmalloc(rlen, GFP_KERNEL); | ||
1122 | if (rep == NULL) | ||
1123 | goto out; | ||
1124 | memset(rep, 0, sizeof(struct rpcrdma_rep)); | ||
1125 | |||
1126 | rc = rpcrdma_register_internal(ia, rep->rr_base, rlen - | ||
1127 | offsetof(struct rpcrdma_rep, rr_base), | ||
1128 | &rep->rr_handle, &rep->rr_iov); | ||
1129 | if (rc) | ||
1130 | goto out_free; | ||
1131 | |||
1132 | rep->rr_buffer = &r_xprt->rx_buf; | ||
1133 | return rep; | ||
1134 | |||
1135 | out_free: | ||
1136 | kfree(rep); | ||
1137 | out: | ||
1138 | return ERR_PTR(rc); | ||
1139 | } | ||
1140 | |||
1078 | static int | 1141 | static int |
1079 | rpcrdma_init_fmrs(struct rpcrdma_ia *ia, struct rpcrdma_buffer *buf) | 1142 | rpcrdma_init_fmrs(struct rpcrdma_ia *ia, struct rpcrdma_buffer *buf) |
1080 | { | 1143 | { |
@@ -1167,7 +1230,7 @@ rpcrdma_buffer_create(struct rpcrdma_xprt *r_xprt) | |||
1167 | struct rpcrdma_ia *ia = &r_xprt->rx_ia; | 1230 | struct rpcrdma_ia *ia = &r_xprt->rx_ia; |
1168 | struct rpcrdma_create_data_internal *cdata = &r_xprt->rx_data; | 1231 | struct rpcrdma_create_data_internal *cdata = &r_xprt->rx_data; |
1169 | char *p; | 1232 | char *p; |
1170 | size_t len, rlen, wlen; | 1233 | size_t len; |
1171 | int i, rc; | 1234 | int i, rc; |
1172 | 1235 | ||
1173 | buf->rb_max_requests = cdata->max_requests; | 1236 | buf->rb_max_requests = cdata->max_requests; |
@@ -1227,62 +1290,29 @@ rpcrdma_buffer_create(struct rpcrdma_xprt *r_xprt) | |||
1227 | break; | 1290 | break; |
1228 | } | 1291 | } |
1229 | 1292 | ||
1230 | /* | ||
1231 | * Allocate/init the request/reply buffers. Doing this | ||
1232 | * using kmalloc for now -- one for each buf. | ||
1233 | */ | ||
1234 | wlen = 1 << fls(cdata->inline_wsize + sizeof(struct rpcrdma_req)); | ||
1235 | rlen = 1 << fls(cdata->inline_rsize + sizeof(struct rpcrdma_rep)); | ||
1236 | dprintk("RPC: %s: wlen = %zu, rlen = %zu\n", | ||
1237 | __func__, wlen, rlen); | ||
1238 | |||
1239 | for (i = 0; i < buf->rb_max_requests; i++) { | 1293 | for (i = 0; i < buf->rb_max_requests; i++) { |
1240 | struct rpcrdma_req *req; | 1294 | struct rpcrdma_req *req; |
1241 | struct rpcrdma_rep *rep; | 1295 | struct rpcrdma_rep *rep; |
1242 | 1296 | ||
1243 | req = kmalloc(wlen, GFP_KERNEL); | 1297 | req = rpcrdma_create_req(r_xprt); |
1244 | if (req == NULL) { | 1298 | if (IS_ERR(req)) { |
1245 | dprintk("RPC: %s: request buffer %d alloc" | 1299 | dprintk("RPC: %s: request buffer %d alloc" |
1246 | " failed\n", __func__, i); | 1300 | " failed\n", __func__, i); |
1247 | rc = -ENOMEM; | 1301 | rc = PTR_ERR(req); |
1248 | goto out; | 1302 | goto out; |
1249 | } | 1303 | } |
1250 | memset(req, 0, sizeof(struct rpcrdma_req)); | ||
1251 | buf->rb_send_bufs[i] = req; | 1304 | buf->rb_send_bufs[i] = req; |
1252 | buf->rb_send_bufs[i]->rl_buffer = buf; | ||
1253 | |||
1254 | rc = rpcrdma_register_internal(ia, req->rl_base, | ||
1255 | wlen - offsetof(struct rpcrdma_req, rl_base), | ||
1256 | &buf->rb_send_bufs[i]->rl_handle, | ||
1257 | &buf->rb_send_bufs[i]->rl_iov); | ||
1258 | if (rc) | ||
1259 | goto out; | ||
1260 | 1305 | ||
1261 | buf->rb_send_bufs[i]->rl_size = wlen - | 1306 | rep = rpcrdma_create_rep(r_xprt); |
1262 | sizeof(struct rpcrdma_req); | 1307 | if (IS_ERR(rep)) { |
1263 | |||
1264 | rep = kmalloc(rlen, GFP_KERNEL); | ||
1265 | if (rep == NULL) { | ||
1266 | dprintk("RPC: %s: reply buffer %d alloc failed\n", | 1308 | dprintk("RPC: %s: reply buffer %d alloc failed\n", |
1267 | __func__, i); | 1309 | __func__, i); |
1268 | rc = -ENOMEM; | 1310 | rc = PTR_ERR(rep); |
1269 | goto out; | 1311 | goto out; |
1270 | } | 1312 | } |
1271 | memset(rep, 0, sizeof(struct rpcrdma_rep)); | ||
1272 | buf->rb_recv_bufs[i] = rep; | 1313 | buf->rb_recv_bufs[i] = rep; |
1273 | buf->rb_recv_bufs[i]->rr_buffer = buf; | ||
1274 | |||
1275 | rc = rpcrdma_register_internal(ia, rep->rr_base, | ||
1276 | rlen - offsetof(struct rpcrdma_rep, rr_base), | ||
1277 | &buf->rb_recv_bufs[i]->rr_handle, | ||
1278 | &buf->rb_recv_bufs[i]->rr_iov); | ||
1279 | if (rc) | ||
1280 | goto out; | ||
1281 | |||
1282 | } | 1314 | } |
1283 | dprintk("RPC: %s: max_requests %d\n", | 1315 | |
1284 | __func__, buf->rb_max_requests); | ||
1285 | /* done */ | ||
1286 | return 0; | 1316 | return 0; |
1287 | out: | 1317 | out: |
1288 | rpcrdma_buffer_destroy(buf); | 1318 | rpcrdma_buffer_destroy(buf); |
@@ -1290,6 +1320,26 @@ out: | |||
1290 | } | 1320 | } |
1291 | 1321 | ||
1292 | static void | 1322 | static void |
1323 | rpcrdma_destroy_rep(struct rpcrdma_ia *ia, struct rpcrdma_rep *rep) | ||
1324 | { | ||
1325 | if (!rep) | ||
1326 | return; | ||
1327 | |||
1328 | rpcrdma_deregister_internal(ia, rep->rr_handle, &rep->rr_iov); | ||
1329 | kfree(rep); | ||
1330 | } | ||
1331 | |||
1332 | static void | ||
1333 | rpcrdma_destroy_req(struct rpcrdma_ia *ia, struct rpcrdma_req *req) | ||
1334 | { | ||
1335 | if (!req) | ||
1336 | return; | ||
1337 | |||
1338 | rpcrdma_deregister_internal(ia, req->rl_handle, &req->rl_iov); | ||
1339 | kfree(req); | ||
1340 | } | ||
1341 | |||
1342 | static void | ||
1293 | rpcrdma_destroy_fmrs(struct rpcrdma_buffer *buf) | 1343 | rpcrdma_destroy_fmrs(struct rpcrdma_buffer *buf) |
1294 | { | 1344 | { |
1295 | struct rpcrdma_mw *r; | 1345 | struct rpcrdma_mw *r; |
@@ -1344,18 +1394,10 @@ rpcrdma_buffer_destroy(struct rpcrdma_buffer *buf) | |||
1344 | dprintk("RPC: %s: entering\n", __func__); | 1394 | dprintk("RPC: %s: entering\n", __func__); |
1345 | 1395 | ||
1346 | for (i = 0; i < buf->rb_max_requests; i++) { | 1396 | for (i = 0; i < buf->rb_max_requests; i++) { |
1347 | if (buf->rb_recv_bufs && buf->rb_recv_bufs[i]) { | 1397 | if (buf->rb_recv_bufs) |
1348 | rpcrdma_deregister_internal(ia, | 1398 | rpcrdma_destroy_rep(ia, buf->rb_recv_bufs[i]); |
1349 | buf->rb_recv_bufs[i]->rr_handle, | 1399 | if (buf->rb_send_bufs) |
1350 | &buf->rb_recv_bufs[i]->rr_iov); | 1400 | rpcrdma_destroy_req(ia, buf->rb_send_bufs[i]); |
1351 | kfree(buf->rb_recv_bufs[i]); | ||
1352 | } | ||
1353 | if (buf->rb_send_bufs && buf->rb_send_bufs[i]) { | ||
1354 | rpcrdma_deregister_internal(ia, | ||
1355 | buf->rb_send_bufs[i]->rl_handle, | ||
1356 | &buf->rb_send_bufs[i]->rl_iov); | ||
1357 | kfree(buf->rb_send_bufs[i]); | ||
1358 | } | ||
1359 | } | 1401 | } |
1360 | 1402 | ||
1361 | switch (ia->ri_memreg_strategy) { | 1403 | switch (ia->ri_memreg_strategy) { |