diff options
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/core/cache.c | 3 | ||||
-rw-r--r-- | drivers/infiniband/core/sa_query.c | 3 | ||||
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_main.c | 6 | ||||
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_provider.c | 11 | ||||
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_provider.h | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_qp.c | 54 | ||||
-rw-r--r-- | drivers/infiniband/ulp/iser/iscsi_iser.c | 22 |
7 files changed, 57 insertions, 46 deletions
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index e05ca2cdc73f..75313ade2e0d 100644 --- a/drivers/infiniband/core/cache.c +++ b/drivers/infiniband/core/cache.c | |||
@@ -301,7 +301,8 @@ static void ib_cache_event(struct ib_event_handler *handler, | |||
301 | event->event == IB_EVENT_PORT_ACTIVE || | 301 | event->event == IB_EVENT_PORT_ACTIVE || |
302 | event->event == IB_EVENT_LID_CHANGE || | 302 | event->event == IB_EVENT_LID_CHANGE || |
303 | event->event == IB_EVENT_PKEY_CHANGE || | 303 | event->event == IB_EVENT_PKEY_CHANGE || |
304 | event->event == IB_EVENT_SM_CHANGE) { | 304 | event->event == IB_EVENT_SM_CHANGE || |
305 | event->event == IB_EVENT_CLIENT_REREGISTER) { | ||
305 | work = kmalloc(sizeof *work, GFP_ATOMIC); | 306 | work = kmalloc(sizeof *work, GFP_ATOMIC); |
306 | if (work) { | 307 | if (work) { |
307 | INIT_WORK(&work->work, ib_cache_task, work); | 308 | INIT_WORK(&work->work, ib_cache_task, work); |
diff --git a/drivers/infiniband/core/sa_query.c b/drivers/infiniband/core/sa_query.c index aeda484ffd82..d6b84226bba7 100644 --- a/drivers/infiniband/core/sa_query.c +++ b/drivers/infiniband/core/sa_query.c | |||
@@ -405,7 +405,8 @@ static void ib_sa_event(struct ib_event_handler *handler, struct ib_event *event | |||
405 | event->event == IB_EVENT_PORT_ACTIVE || | 405 | event->event == IB_EVENT_PORT_ACTIVE || |
406 | event->event == IB_EVENT_LID_CHANGE || | 406 | event->event == IB_EVENT_LID_CHANGE || |
407 | event->event == IB_EVENT_PKEY_CHANGE || | 407 | event->event == IB_EVENT_PKEY_CHANGE || |
408 | event->event == IB_EVENT_SM_CHANGE) { | 408 | event->event == IB_EVENT_SM_CHANGE || |
409 | event->event == IB_EVENT_CLIENT_REREGISTER) { | ||
409 | struct ib_sa_device *sa_dev; | 410 | struct ib_sa_device *sa_dev; |
410 | sa_dev = container_of(handler, typeof(*sa_dev), event_handler); | 411 | sa_dev = container_of(handler, typeof(*sa_dev), event_handler); |
411 | 412 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c index 557cde3a4563..7b82c1907f04 100644 --- a/drivers/infiniband/hw/mthca/mthca_main.c +++ b/drivers/infiniband/hw/mthca/mthca_main.c | |||
@@ -967,12 +967,12 @@ static struct { | |||
967 | } mthca_hca_table[] = { | 967 | } mthca_hca_table[] = { |
968 | [TAVOR] = { .latest_fw = MTHCA_FW_VER(3, 4, 0), | 968 | [TAVOR] = { .latest_fw = MTHCA_FW_VER(3, 4, 0), |
969 | .flags = 0 }, | 969 | .flags = 0 }, |
970 | [ARBEL_COMPAT] = { .latest_fw = MTHCA_FW_VER(4, 7, 400), | 970 | [ARBEL_COMPAT] = { .latest_fw = MTHCA_FW_VER(4, 7, 600), |
971 | .flags = MTHCA_FLAG_PCIE }, | 971 | .flags = MTHCA_FLAG_PCIE }, |
972 | [ARBEL_NATIVE] = { .latest_fw = MTHCA_FW_VER(5, 1, 0), | 972 | [ARBEL_NATIVE] = { .latest_fw = MTHCA_FW_VER(5, 1, 400), |
973 | .flags = MTHCA_FLAG_MEMFREE | | 973 | .flags = MTHCA_FLAG_MEMFREE | |
974 | MTHCA_FLAG_PCIE }, | 974 | MTHCA_FLAG_PCIE }, |
975 | [SINAI] = { .latest_fw = MTHCA_FW_VER(1, 0, 800), | 975 | [SINAI] = { .latest_fw = MTHCA_FW_VER(1, 1, 0), |
976 | .flags = MTHCA_FLAG_MEMFREE | | 976 | .flags = MTHCA_FLAG_MEMFREE | |
977 | MTHCA_FLAG_PCIE | | 977 | MTHCA_FLAG_PCIE | |
978 | MTHCA_FLAG_SINAI_OPT } | 978 | MTHCA_FLAG_SINAI_OPT } |
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c index 230ae21db8fd..265b1d1c4a62 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c | |||
@@ -1287,11 +1287,7 @@ int mthca_register_device(struct mthca_dev *dev) | |||
1287 | (1ull << IB_USER_VERBS_CMD_MODIFY_QP) | | 1287 | (1ull << IB_USER_VERBS_CMD_MODIFY_QP) | |
1288 | (1ull << IB_USER_VERBS_CMD_DESTROY_QP) | | 1288 | (1ull << IB_USER_VERBS_CMD_DESTROY_QP) | |
1289 | (1ull << IB_USER_VERBS_CMD_ATTACH_MCAST) | | 1289 | (1ull << IB_USER_VERBS_CMD_ATTACH_MCAST) | |
1290 | (1ull << IB_USER_VERBS_CMD_DETACH_MCAST) | | 1290 | (1ull << IB_USER_VERBS_CMD_DETACH_MCAST); |
1291 | (1ull << IB_USER_VERBS_CMD_CREATE_SRQ) | | ||
1292 | (1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) | | ||
1293 | (1ull << IB_USER_VERBS_CMD_QUERY_SRQ) | | ||
1294 | (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ); | ||
1295 | dev->ib_dev.node_type = IB_NODE_CA; | 1291 | dev->ib_dev.node_type = IB_NODE_CA; |
1296 | dev->ib_dev.phys_port_cnt = dev->limits.num_ports; | 1292 | dev->ib_dev.phys_port_cnt = dev->limits.num_ports; |
1297 | dev->ib_dev.dma_device = &dev->pdev->dev; | 1293 | dev->ib_dev.dma_device = &dev->pdev->dev; |
@@ -1316,6 +1312,11 @@ int mthca_register_device(struct mthca_dev *dev) | |||
1316 | dev->ib_dev.modify_srq = mthca_modify_srq; | 1312 | dev->ib_dev.modify_srq = mthca_modify_srq; |
1317 | dev->ib_dev.query_srq = mthca_query_srq; | 1313 | dev->ib_dev.query_srq = mthca_query_srq; |
1318 | dev->ib_dev.destroy_srq = mthca_destroy_srq; | 1314 | dev->ib_dev.destroy_srq = mthca_destroy_srq; |
1315 | dev->ib_dev.uverbs_cmd_mask |= | ||
1316 | (1ull << IB_USER_VERBS_CMD_CREATE_SRQ) | | ||
1317 | (1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) | | ||
1318 | (1ull << IB_USER_VERBS_CMD_QUERY_SRQ) | | ||
1319 | (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ); | ||
1319 | 1320 | ||
1320 | if (mthca_is_memfree(dev)) | 1321 | if (mthca_is_memfree(dev)) |
1321 | dev->ib_dev.post_srq_recv = mthca_arbel_post_srq_recv; | 1322 | dev->ib_dev.post_srq_recv = mthca_arbel_post_srq_recv; |
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.h b/drivers/infiniband/hw/mthca/mthca_provider.h index 8de2887ba15c..9a5bece3fa5c 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.h +++ b/drivers/infiniband/hw/mthca/mthca_provider.h | |||
@@ -136,8 +136,8 @@ struct mthca_ah { | |||
136 | * We have one global lock that protects dev->cq/qp_table. Each | 136 | * We have one global lock that protects dev->cq/qp_table. Each |
137 | * struct mthca_cq/qp also has its own lock. An individual qp lock | 137 | * struct mthca_cq/qp also has its own lock. An individual qp lock |
138 | * may be taken inside of an individual cq lock. Both cqs attached to | 138 | * may be taken inside of an individual cq lock. Both cqs attached to |
139 | * a qp may be locked, with the send cq locked first. No other | 139 | * a qp may be locked, with the cq with the lower cqn locked first. |
140 | * nesting should be done. | 140 | * No other nesting should be done. |
141 | * | 141 | * |
142 | * Each struct mthca_cq/qp also has an ref count, protected by the | 142 | * Each struct mthca_cq/qp also has an ref count, protected by the |
143 | * corresponding table lock. The pointer from the cq/qp_table to the | 143 | * corresponding table lock. The pointer from the cq/qp_table to the |
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index cd8b6721ac9c..2e8f6f36e0a5 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
@@ -99,6 +99,10 @@ enum { | |||
99 | MTHCA_QP_BIT_RSC = 1 << 3 | 99 | MTHCA_QP_BIT_RSC = 1 << 3 |
100 | }; | 100 | }; |
101 | 101 | ||
102 | enum { | ||
103 | MTHCA_SEND_DOORBELL_FENCE = 1 << 5 | ||
104 | }; | ||
105 | |||
102 | struct mthca_qp_path { | 106 | struct mthca_qp_path { |
103 | __be32 port_pkey; | 107 | __be32 port_pkey; |
104 | u8 rnr_retry; | 108 | u8 rnr_retry; |
@@ -1259,6 +1263,32 @@ int mthca_alloc_qp(struct mthca_dev *dev, | |||
1259 | return 0; | 1263 | return 0; |
1260 | } | 1264 | } |
1261 | 1265 | ||
1266 | static void mthca_lock_cqs(struct mthca_cq *send_cq, struct mthca_cq *recv_cq) | ||
1267 | { | ||
1268 | if (send_cq == recv_cq) | ||
1269 | spin_lock_irq(&send_cq->lock); | ||
1270 | else if (send_cq->cqn < recv_cq->cqn) { | ||
1271 | spin_lock_irq(&send_cq->lock); | ||
1272 | spin_lock_nested(&recv_cq->lock, SINGLE_DEPTH_NESTING); | ||
1273 | } else { | ||
1274 | spin_lock_irq(&recv_cq->lock); | ||
1275 | spin_lock_nested(&send_cq->lock, SINGLE_DEPTH_NESTING); | ||
1276 | } | ||
1277 | } | ||
1278 | |||
1279 | static void mthca_unlock_cqs(struct mthca_cq *send_cq, struct mthca_cq *recv_cq) | ||
1280 | { | ||
1281 | if (send_cq == recv_cq) | ||
1282 | spin_unlock_irq(&send_cq->lock); | ||
1283 | else if (send_cq->cqn < recv_cq->cqn) { | ||
1284 | spin_unlock(&recv_cq->lock); | ||
1285 | spin_unlock_irq(&send_cq->lock); | ||
1286 | } else { | ||
1287 | spin_unlock(&send_cq->lock); | ||
1288 | spin_unlock_irq(&recv_cq->lock); | ||
1289 | } | ||
1290 | } | ||
1291 | |||
1262 | int mthca_alloc_sqp(struct mthca_dev *dev, | 1292 | int mthca_alloc_sqp(struct mthca_dev *dev, |
1263 | struct mthca_pd *pd, | 1293 | struct mthca_pd *pd, |
1264 | struct mthca_cq *send_cq, | 1294 | struct mthca_cq *send_cq, |
@@ -1311,17 +1341,13 @@ int mthca_alloc_sqp(struct mthca_dev *dev, | |||
1311 | * Lock CQs here, so that CQ polling code can do QP lookup | 1341 | * Lock CQs here, so that CQ polling code can do QP lookup |
1312 | * without taking a lock. | 1342 | * without taking a lock. |
1313 | */ | 1343 | */ |
1314 | spin_lock_irq(&send_cq->lock); | 1344 | mthca_lock_cqs(send_cq, recv_cq); |
1315 | if (send_cq != recv_cq) | ||
1316 | spin_lock(&recv_cq->lock); | ||
1317 | 1345 | ||
1318 | spin_lock(&dev->qp_table.lock); | 1346 | spin_lock(&dev->qp_table.lock); |
1319 | mthca_array_clear(&dev->qp_table.qp, mqpn); | 1347 | mthca_array_clear(&dev->qp_table.qp, mqpn); |
1320 | spin_unlock(&dev->qp_table.lock); | 1348 | spin_unlock(&dev->qp_table.lock); |
1321 | 1349 | ||
1322 | if (send_cq != recv_cq) | 1350 | mthca_unlock_cqs(send_cq, recv_cq); |
1323 | spin_unlock(&recv_cq->lock); | ||
1324 | spin_unlock_irq(&send_cq->lock); | ||
1325 | 1351 | ||
1326 | err_out: | 1352 | err_out: |
1327 | dma_free_coherent(&dev->pdev->dev, sqp->header_buf_size, | 1353 | dma_free_coherent(&dev->pdev->dev, sqp->header_buf_size, |
@@ -1355,9 +1381,7 @@ void mthca_free_qp(struct mthca_dev *dev, | |||
1355 | * Lock CQs here, so that CQ polling code can do QP lookup | 1381 | * Lock CQs here, so that CQ polling code can do QP lookup |
1356 | * without taking a lock. | 1382 | * without taking a lock. |
1357 | */ | 1383 | */ |
1358 | spin_lock_irq(&send_cq->lock); | 1384 | mthca_lock_cqs(send_cq, recv_cq); |
1359 | if (send_cq != recv_cq) | ||
1360 | spin_lock(&recv_cq->lock); | ||
1361 | 1385 | ||
1362 | spin_lock(&dev->qp_table.lock); | 1386 | spin_lock(&dev->qp_table.lock); |
1363 | mthca_array_clear(&dev->qp_table.qp, | 1387 | mthca_array_clear(&dev->qp_table.qp, |
@@ -1365,9 +1389,7 @@ void mthca_free_qp(struct mthca_dev *dev, | |||
1365 | --qp->refcount; | 1389 | --qp->refcount; |
1366 | spin_unlock(&dev->qp_table.lock); | 1390 | spin_unlock(&dev->qp_table.lock); |
1367 | 1391 | ||
1368 | if (send_cq != recv_cq) | 1392 | mthca_unlock_cqs(send_cq, recv_cq); |
1369 | spin_unlock(&recv_cq->lock); | ||
1370 | spin_unlock_irq(&send_cq->lock); | ||
1371 | 1393 | ||
1372 | wait_event(qp->wait, !get_qp_refcount(dev, qp)); | 1394 | wait_event(qp->wait, !get_qp_refcount(dev, qp)); |
1373 | 1395 | ||
@@ -1502,7 +1524,7 @@ int mthca_tavor_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
1502 | int i; | 1524 | int i; |
1503 | int size; | 1525 | int size; |
1504 | int size0 = 0; | 1526 | int size0 = 0; |
1505 | u32 f0 = 0; | 1527 | u32 f0; |
1506 | int ind; | 1528 | int ind; |
1507 | u8 op0 = 0; | 1529 | u8 op0 = 0; |
1508 | 1530 | ||
@@ -1686,6 +1708,8 @@ int mthca_tavor_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
1686 | if (!size0) { | 1708 | if (!size0) { |
1687 | size0 = size; | 1709 | size0 = size; |
1688 | op0 = mthca_opcode[wr->opcode]; | 1710 | op0 = mthca_opcode[wr->opcode]; |
1711 | f0 = wr->send_flags & IB_SEND_FENCE ? | ||
1712 | MTHCA_SEND_DOORBELL_FENCE : 0; | ||
1689 | } | 1713 | } |
1690 | 1714 | ||
1691 | ++ind; | 1715 | ++ind; |
@@ -1843,7 +1867,7 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
1843 | int i; | 1867 | int i; |
1844 | int size; | 1868 | int size; |
1845 | int size0 = 0; | 1869 | int size0 = 0; |
1846 | u32 f0 = 0; | 1870 | u32 f0; |
1847 | int ind; | 1871 | int ind; |
1848 | u8 op0 = 0; | 1872 | u8 op0 = 0; |
1849 | 1873 | ||
@@ -2051,6 +2075,8 @@ int mthca_arbel_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
2051 | if (!size0) { | 2075 | if (!size0) { |
2052 | size0 = size; | 2076 | size0 = size; |
2053 | op0 = mthca_opcode[wr->opcode]; | 2077 | op0 = mthca_opcode[wr->opcode]; |
2078 | f0 = wr->send_flags & IB_SEND_FENCE ? | ||
2079 | MTHCA_SEND_DOORBELL_FENCE : 0; | ||
2054 | } | 2080 | } |
2055 | 2081 | ||
2056 | ++ind; | 2082 | ++ind; |
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c index 34b0da5cfa0a..1437d7ee3b19 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.c +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c | |||
@@ -378,21 +378,6 @@ iscsi_iser_conn_start(struct iscsi_cls_conn *cls_conn) | |||
378 | return iser_conn_set_full_featured_mode(conn); | 378 | return iser_conn_set_full_featured_mode(conn); |
379 | } | 379 | } |
380 | 380 | ||
381 | static void | ||
382 | iscsi_iser_conn_terminate(struct iscsi_conn *conn) | ||
383 | { | ||
384 | struct iscsi_iser_conn *iser_conn = conn->dd_data; | ||
385 | struct iser_conn *ib_conn = iser_conn->ib_conn; | ||
386 | |||
387 | BUG_ON(!ib_conn); | ||
388 | /* starts conn teardown process, waits until all previously * | ||
389 | * posted buffers get flushed, deallocates all conn resources */ | ||
390 | iser_conn_terminate(ib_conn); | ||
391 | iser_conn->ib_conn = NULL; | ||
392 | conn->recv_lock = NULL; | ||
393 | } | ||
394 | |||
395 | |||
396 | static struct iscsi_transport iscsi_iser_transport; | 381 | static struct iscsi_transport iscsi_iser_transport; |
397 | 382 | ||
398 | static struct iscsi_cls_session * | 383 | static struct iscsi_cls_session * |
@@ -555,13 +540,13 @@ iscsi_iser_ep_poll(__u64 ep_handle, int timeout_ms) | |||
555 | static void | 540 | static void |
556 | iscsi_iser_ep_disconnect(__u64 ep_handle) | 541 | iscsi_iser_ep_disconnect(__u64 ep_handle) |
557 | { | 542 | { |
558 | struct iser_conn *ib_conn = iscsi_iser_ib_conn_lookup(ep_handle); | 543 | struct iser_conn *ib_conn; |
559 | 544 | ||
545 | ib_conn = iscsi_iser_ib_conn_lookup(ep_handle); | ||
560 | if (!ib_conn) | 546 | if (!ib_conn) |
561 | return; | 547 | return; |
562 | 548 | ||
563 | iser_err("ib conn %p state %d\n",ib_conn, ib_conn->state); | 549 | iser_err("ib conn %p state %d\n",ib_conn, ib_conn->state); |
564 | |||
565 | iser_conn_terminate(ib_conn); | 550 | iser_conn_terminate(ib_conn); |
566 | } | 551 | } |
567 | 552 | ||
@@ -614,9 +599,6 @@ static struct iscsi_transport iscsi_iser_transport = { | |||
614 | .get_session_param = iscsi_session_get_param, | 599 | .get_session_param = iscsi_session_get_param, |
615 | .start_conn = iscsi_iser_conn_start, | 600 | .start_conn = iscsi_iser_conn_start, |
616 | .stop_conn = iscsi_conn_stop, | 601 | .stop_conn = iscsi_conn_stop, |
617 | /* these are called as part of conn recovery */ | ||
618 | .suspend_conn_recv = NULL, /* FIXME is/how this relvant to iser? */ | ||
619 | .terminate_conn = iscsi_iser_conn_terminate, | ||
620 | /* IO */ | 602 | /* IO */ |
621 | .send_pdu = iscsi_conn_send_pdu, | 603 | .send_pdu = iscsi_conn_send_pdu, |
622 | .get_stats = iscsi_iser_conn_get_stats, | 604 | .get_stats = iscsi_iser_conn_get_stats, |