diff options
| -rw-r--r-- | drivers/infiniband/core/cma.c | 106 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ehca/ehca_classes.h | 1 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ehca/ehca_irq.c | 7 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ehca/ehca_main.c | 94 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ehca/ehca_qp.c | 17 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ehca/hcp_if.c | 13 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_iba6120.c | 7 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_intr.c | 7 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_kernel.h | 2 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_verbs.c | 12 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx4/main.c | 1 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mthca/mthca_cq.c | 4 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mthca/mthca_qp.c | 1 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_cm.c | 11 | ||||
| -rw-r--r-- | drivers/net/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/net/mlx4/main.c | 2 | ||||
| -rw-r--r-- | drivers/net/mlx4/mlx4.h | 1 |
17 files changed, 154 insertions, 133 deletions
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c index fde92ce45153..2eb52b7a71da 100644 --- a/drivers/infiniband/core/cma.c +++ b/drivers/infiniband/core/cma.c | |||
| @@ -346,12 +346,33 @@ static void cma_deref_id(struct rdma_id_private *id_priv) | |||
| 346 | complete(&id_priv->comp); | 346 | complete(&id_priv->comp); |
| 347 | } | 347 | } |
| 348 | 348 | ||
| 349 | static void cma_release_remove(struct rdma_id_private *id_priv) | 349 | static int cma_disable_remove(struct rdma_id_private *id_priv, |
| 350 | enum cma_state state) | ||
| 351 | { | ||
| 352 | unsigned long flags; | ||
| 353 | int ret; | ||
| 354 | |||
| 355 | spin_lock_irqsave(&id_priv->lock, flags); | ||
| 356 | if (id_priv->state == state) { | ||
| 357 | atomic_inc(&id_priv->dev_remove); | ||
| 358 | ret = 0; | ||
| 359 | } else | ||
| 360 | ret = -EINVAL; | ||
| 361 | spin_unlock_irqrestore(&id_priv->lock, flags); | ||
| 362 | return ret; | ||
| 363 | } | ||
| 364 | |||
| 365 | static void cma_enable_remove(struct rdma_id_private *id_priv) | ||
| 350 | { | 366 | { |
| 351 | if (atomic_dec_and_test(&id_priv->dev_remove)) | 367 | if (atomic_dec_and_test(&id_priv->dev_remove)) |
| 352 | wake_up(&id_priv->wait_remove); | 368 | wake_up(&id_priv->wait_remove); |
| 353 | } | 369 | } |
| 354 | 370 | ||
| 371 | static int cma_has_cm_dev(struct rdma_id_private *id_priv) | ||
| 372 | { | ||
| 373 | return (id_priv->id.device && id_priv->cm_id.ib); | ||
| 374 | } | ||
| 375 | |||
| 355 | struct rdma_cm_id *rdma_create_id(rdma_cm_event_handler event_handler, | 376 | struct rdma_cm_id *rdma_create_id(rdma_cm_event_handler event_handler, |
| 356 | void *context, enum rdma_port_space ps) | 377 | void *context, enum rdma_port_space ps) |
| 357 | { | 378 | { |
| @@ -884,9 +905,8 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) | |||
| 884 | struct rdma_cm_event event; | 905 | struct rdma_cm_event event; |
| 885 | int ret = 0; | 906 | int ret = 0; |
| 886 | 907 | ||
| 887 | atomic_inc(&id_priv->dev_remove); | 908 | if (cma_disable_remove(id_priv, CMA_CONNECT)) |
| 888 | if (!cma_comp(id_priv, CMA_CONNECT)) | 909 | return 0; |
| 889 | goto out; | ||
| 890 | 910 | ||
| 891 | memset(&event, 0, sizeof event); | 911 | memset(&event, 0, sizeof event); |
| 892 | switch (ib_event->event) { | 912 | switch (ib_event->event) { |
| @@ -942,12 +962,12 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) | |||
| 942 | /* Destroy the CM ID by returning a non-zero value. */ | 962 | /* Destroy the CM ID by returning a non-zero value. */ |
| 943 | id_priv->cm_id.ib = NULL; | 963 | id_priv->cm_id.ib = NULL; |
| 944 | cma_exch(id_priv, CMA_DESTROYING); | 964 | cma_exch(id_priv, CMA_DESTROYING); |
| 945 | cma_release_remove(id_priv); | 965 | cma_enable_remove(id_priv); |
| 946 | rdma_destroy_id(&id_priv->id); | 966 | rdma_destroy_id(&id_priv->id); |
| 947 | return ret; | 967 | return ret; |
| 948 | } | 968 | } |
| 949 | out: | 969 | out: |
| 950 | cma_release_remove(id_priv); | 970 | cma_enable_remove(id_priv); |
| 951 | return ret; | 971 | return ret; |
| 952 | } | 972 | } |
| 953 | 973 | ||
| @@ -1057,11 +1077,8 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) | |||
| 1057 | int offset, ret; | 1077 | int offset, ret; |
| 1058 | 1078 | ||
| 1059 | listen_id = cm_id->context; | 1079 | listen_id = cm_id->context; |
| 1060 | atomic_inc(&listen_id->dev_remove); | 1080 | if (cma_disable_remove(listen_id, CMA_LISTEN)) |
| 1061 | if (!cma_comp(listen_id, CMA_LISTEN)) { | 1081 | return -ECONNABORTED; |
| 1062 | ret = -ECONNABORTED; | ||
| 1063 | goto out; | ||
| 1064 | } | ||
| 1065 | 1082 | ||
| 1066 | memset(&event, 0, sizeof event); | 1083 | memset(&event, 0, sizeof event); |
| 1067 | offset = cma_user_data_offset(listen_id->id.ps); | 1084 | offset = cma_user_data_offset(listen_id->id.ps); |
| @@ -1101,11 +1118,11 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) | |||
| 1101 | 1118 | ||
| 1102 | release_conn_id: | 1119 | release_conn_id: |
| 1103 | cma_exch(conn_id, CMA_DESTROYING); | 1120 | cma_exch(conn_id, CMA_DESTROYING); |
| 1104 | cma_release_remove(conn_id); | 1121 | cma_enable_remove(conn_id); |
| 1105 | rdma_destroy_id(&conn_id->id); | 1122 | rdma_destroy_id(&conn_id->id); |
| 1106 | 1123 | ||
| 1107 | out: | 1124 | out: |
| 1108 | cma_release_remove(listen_id); | 1125 | cma_enable_remove(listen_id); |
| 1109 | return ret; | 1126 | return ret; |
| 1110 | } | 1127 | } |
| 1111 | 1128 | ||
| @@ -1171,9 +1188,10 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event) | |||
| 1171 | struct sockaddr_in *sin; | 1188 | struct sockaddr_in *sin; |
| 1172 | int ret = 0; | 1189 | int ret = 0; |
| 1173 | 1190 | ||
| 1174 | memset(&event, 0, sizeof event); | 1191 | if (cma_disable_remove(id_priv, CMA_CONNECT)) |
| 1175 | atomic_inc(&id_priv->dev_remove); | 1192 | return 0; |
| 1176 | 1193 | ||
| 1194 | memset(&event, 0, sizeof event); | ||
| 1177 | switch (iw_event->event) { | 1195 | switch (iw_event->event) { |
| 1178 | case IW_CM_EVENT_CLOSE: | 1196 | case IW_CM_EVENT_CLOSE: |
| 1179 | event.event = RDMA_CM_EVENT_DISCONNECTED; | 1197 | event.event = RDMA_CM_EVENT_DISCONNECTED; |
| @@ -1214,12 +1232,12 @@ static int cma_iw_handler(struct iw_cm_id *iw_id, struct iw_cm_event *iw_event) | |||
| 1214 | /* Destroy the CM ID by returning a non-zero value. */ | 1232 | /* Destroy the CM ID by returning a non-zero value. */ |
| 1215 | id_priv->cm_id.iw = NULL; | 1233 | id_priv->cm_id.iw = NULL; |
| 1216 | cma_exch(id_priv, CMA_DESTROYING); | 1234 | cma_exch(id_priv, CMA_DESTROYING); |
| 1217 | cma_release_remove(id_priv); | 1235 | cma_enable_remove(id_priv); |
| 1218 | rdma_destroy_id(&id_priv->id); | 1236 | rdma_destroy_id(&id_priv->id); |
| 1219 | return ret; | 1237 | return ret; |
| 1220 | } | 1238 | } |
| 1221 | 1239 | ||
| 1222 | cma_release_remove(id_priv); | 1240 | cma_enable_remove(id_priv); |
| 1223 | return ret; | 1241 | return ret; |
| 1224 | } | 1242 | } |
| 1225 | 1243 | ||
| @@ -1234,11 +1252,8 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id, | |||
| 1234 | int ret; | 1252 | int ret; |
| 1235 | 1253 | ||
| 1236 | listen_id = cm_id->context; | 1254 | listen_id = cm_id->context; |
| 1237 | atomic_inc(&listen_id->dev_remove); | 1255 | if (cma_disable_remove(listen_id, CMA_LISTEN)) |
| 1238 | if (!cma_comp(listen_id, CMA_LISTEN)) { | 1256 | return -ECONNABORTED; |
| 1239 | ret = -ECONNABORTED; | ||
| 1240 | goto out; | ||
| 1241 | } | ||
| 1242 | 1257 | ||
| 1243 | /* Create a new RDMA id for the new IW CM ID */ | 1258 | /* Create a new RDMA id for the new IW CM ID */ |
| 1244 | new_cm_id = rdma_create_id(listen_id->id.event_handler, | 1259 | new_cm_id = rdma_create_id(listen_id->id.event_handler, |
| @@ -1255,13 +1270,13 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id, | |||
| 1255 | dev = ip_dev_find(iw_event->local_addr.sin_addr.s_addr); | 1270 | dev = ip_dev_find(iw_event->local_addr.sin_addr.s_addr); |
| 1256 | if (!dev) { | 1271 | if (!dev) { |
| 1257 | ret = -EADDRNOTAVAIL; | 1272 | ret = -EADDRNOTAVAIL; |
| 1258 | cma_release_remove(conn_id); | 1273 | cma_enable_remove(conn_id); |
| 1259 | rdma_destroy_id(new_cm_id); | 1274 | rdma_destroy_id(new_cm_id); |
| 1260 | goto out; | 1275 | goto out; |
| 1261 | } | 1276 | } |
| 1262 | ret = rdma_copy_addr(&conn_id->id.route.addr.dev_addr, dev, NULL); | 1277 | ret = rdma_copy_addr(&conn_id->id.route.addr.dev_addr, dev, NULL); |
| 1263 | if (ret) { | 1278 | if (ret) { |
| 1264 | cma_release_remove(conn_id); | 1279 | cma_enable_remove(conn_id); |
| 1265 | rdma_destroy_id(new_cm_id); | 1280 | rdma_destroy_id(new_cm_id); |
| 1266 | goto out; | 1281 | goto out; |
| 1267 | } | 1282 | } |
| @@ -1270,7 +1285,7 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id, | |||
| 1270 | ret = cma_acquire_dev(conn_id); | 1285 | ret = cma_acquire_dev(conn_id); |
| 1271 | mutex_unlock(&lock); | 1286 | mutex_unlock(&lock); |
| 1272 | if (ret) { | 1287 | if (ret) { |
| 1273 | cma_release_remove(conn_id); | 1288 | cma_enable_remove(conn_id); |
| 1274 | rdma_destroy_id(new_cm_id); | 1289 | rdma_destroy_id(new_cm_id); |
| 1275 | goto out; | 1290 | goto out; |
| 1276 | } | 1291 | } |
| @@ -1293,14 +1308,14 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id, | |||
| 1293 | /* User wants to destroy the CM ID */ | 1308 | /* User wants to destroy the CM ID */ |
| 1294 | conn_id->cm_id.iw = NULL; | 1309 | conn_id->cm_id.iw = NULL; |
| 1295 | cma_exch(conn_id, CMA_DESTROYING); | 1310 | cma_exch(conn_id, CMA_DESTROYING); |
| 1296 | cma_release_remove(conn_id); | 1311 | cma_enable_remove(conn_id); |
| 1297 | rdma_destroy_id(&conn_id->id); | 1312 | rdma_destroy_id(&conn_id->id); |
| 1298 | } | 1313 | } |
| 1299 | 1314 | ||
| 1300 | out: | 1315 | out: |
| 1301 | if (dev) | 1316 | if (dev) |
| 1302 | dev_put(dev); | 1317 | dev_put(dev); |
| 1303 | cma_release_remove(listen_id); | 1318 | cma_enable_remove(listen_id); |
| 1304 | return ret; | 1319 | return ret; |
| 1305 | } | 1320 | } |
| 1306 | 1321 | ||
| @@ -1519,7 +1534,7 @@ static void cma_work_handler(struct work_struct *_work) | |||
| 1519 | destroy = 1; | 1534 | destroy = 1; |
| 1520 | } | 1535 | } |
| 1521 | out: | 1536 | out: |
| 1522 | cma_release_remove(id_priv); | 1537 | cma_enable_remove(id_priv); |
| 1523 | cma_deref_id(id_priv); | 1538 | cma_deref_id(id_priv); |
| 1524 | if (destroy) | 1539 | if (destroy) |
| 1525 | rdma_destroy_id(&id_priv->id); | 1540 | rdma_destroy_id(&id_priv->id); |
| @@ -1711,13 +1726,13 @@ static void addr_handler(int status, struct sockaddr *src_addr, | |||
| 1711 | 1726 | ||
| 1712 | if (id_priv->id.event_handler(&id_priv->id, &event)) { | 1727 | if (id_priv->id.event_handler(&id_priv->id, &event)) { |
| 1713 | cma_exch(id_priv, CMA_DESTROYING); | 1728 | cma_exch(id_priv, CMA_DESTROYING); |
| 1714 | cma_release_remove(id_priv); | 1729 | cma_enable_remove(id_priv); |
| 1715 | cma_deref_id(id_priv); | 1730 | cma_deref_id(id_priv); |
| 1716 | rdma_destroy_id(&id_priv->id); | 1731 | rdma_destroy_id(&id_priv->id); |
| 1717 | return; | 1732 | return; |
| 1718 | } | 1733 | } |
| 1719 | out: | 1734 | out: |
| 1720 | cma_release_remove(id_priv); | 1735 | cma_enable_remove(id_priv); |
| 1721 | cma_deref_id(id_priv); | 1736 | cma_deref_id(id_priv); |
| 1722 | } | 1737 | } |
| 1723 | 1738 | ||
| @@ -2042,11 +2057,10 @@ static int cma_sidr_rep_handler(struct ib_cm_id *cm_id, | |||
| 2042 | struct ib_cm_sidr_rep_event_param *rep = &ib_event->param.sidr_rep_rcvd; | 2057 | struct ib_cm_sidr_rep_event_param *rep = &ib_event->param.sidr_rep_rcvd; |
| 2043 | int ret = 0; | 2058 | int ret = 0; |
| 2044 | 2059 | ||
| 2045 | memset(&event, 0, sizeof event); | 2060 | if (cma_disable_remove(id_priv, CMA_CONNECT)) |
| 2046 | atomic_inc(&id_priv->dev_remove); | 2061 | return 0; |
| 2047 | if (!cma_comp(id_priv, CMA_CONNECT)) | ||
| 2048 | goto out; | ||
| 2049 | 2062 | ||
| 2063 | memset(&event, 0, sizeof event); | ||
| 2050 | switch (ib_event->event) { | 2064 | switch (ib_event->event) { |
| 2051 | case IB_CM_SIDR_REQ_ERROR: | 2065 | case IB_CM_SIDR_REQ_ERROR: |
| 2052 | event.event = RDMA_CM_EVENT_UNREACHABLE; | 2066 | event.event = RDMA_CM_EVENT_UNREACHABLE; |
| @@ -2084,12 +2098,12 @@ static int cma_sidr_rep_handler(struct ib_cm_id *cm_id, | |||
| 2084 | /* Destroy the CM ID by returning a non-zero value. */ | 2098 | /* Destroy the CM ID by returning a non-zero value. */ |
| 2085 | id_priv->cm_id.ib = NULL; | 2099 | id_priv->cm_id.ib = NULL; |
| 2086 | cma_exch(id_priv, CMA_DESTROYING); | 2100 | cma_exch(id_priv, CMA_DESTROYING); |
| 2087 | cma_release_remove(id_priv); | 2101 | cma_enable_remove(id_priv); |
| 2088 | rdma_destroy_id(&id_priv->id); | 2102 | rdma_destroy_id(&id_priv->id); |
| 2089 | return ret; | 2103 | return ret; |
| 2090 | } | 2104 | } |
| 2091 | out: | 2105 | out: |
| 2092 | cma_release_remove(id_priv); | 2106 | cma_enable_remove(id_priv); |
| 2093 | return ret; | 2107 | return ret; |
| 2094 | } | 2108 | } |
| 2095 | 2109 | ||
| @@ -2413,7 +2427,7 @@ int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event) | |||
| 2413 | int ret; | 2427 | int ret; |
| 2414 | 2428 | ||
| 2415 | id_priv = container_of(id, struct rdma_id_private, id); | 2429 | id_priv = container_of(id, struct rdma_id_private, id); |
| 2416 | if (!cma_comp(id_priv, CMA_CONNECT)) | 2430 | if (!cma_has_cm_dev(id_priv)) |
| 2417 | return -EINVAL; | 2431 | return -EINVAL; |
| 2418 | 2432 | ||
| 2419 | switch (id->device->node_type) { | 2433 | switch (id->device->node_type) { |
| @@ -2435,7 +2449,7 @@ int rdma_reject(struct rdma_cm_id *id, const void *private_data, | |||
| 2435 | int ret; | 2449 | int ret; |
| 2436 | 2450 | ||
| 2437 | id_priv = container_of(id, struct rdma_id_private, id); | 2451 | id_priv = container_of(id, struct rdma_id_private, id); |
| 2438 | if (!cma_comp(id_priv, CMA_CONNECT)) | 2452 | if (!cma_has_cm_dev(id_priv)) |
| 2439 | return -EINVAL; | 2453 | return -EINVAL; |
| 2440 | 2454 | ||
| 2441 | switch (rdma_node_get_transport(id->device->node_type)) { | 2455 | switch (rdma_node_get_transport(id->device->node_type)) { |
| @@ -2466,8 +2480,7 @@ int rdma_disconnect(struct rdma_cm_id *id) | |||
| 2466 | int ret; | 2480 | int ret; |
| 2467 | 2481 | ||
| 2468 | id_priv = container_of(id, struct rdma_id_private, id); | 2482 | id_priv = container_of(id, struct rdma_id_private, id); |
| 2469 | if (!cma_comp(id_priv, CMA_CONNECT) && | 2483 | if (!cma_has_cm_dev(id_priv)) |
| 2470 | !cma_comp(id_priv, CMA_DISCONNECT)) | ||
| 2471 | return -EINVAL; | 2484 | return -EINVAL; |
| 2472 | 2485 | ||
| 2473 | switch (rdma_node_get_transport(id->device->node_type)) { | 2486 | switch (rdma_node_get_transport(id->device->node_type)) { |
| @@ -2499,10 +2512,9 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast) | |||
| 2499 | int ret; | 2512 | int ret; |
| 2500 | 2513 | ||
| 2501 | id_priv = mc->id_priv; | 2514 | id_priv = mc->id_priv; |
| 2502 | atomic_inc(&id_priv->dev_remove); | 2515 | if (cma_disable_remove(id_priv, CMA_ADDR_BOUND) && |
| 2503 | if (!cma_comp(id_priv, CMA_ADDR_BOUND) && | 2516 | cma_disable_remove(id_priv, CMA_ADDR_RESOLVED)) |
| 2504 | !cma_comp(id_priv, CMA_ADDR_RESOLVED)) | 2517 | return 0; |
| 2505 | goto out; | ||
| 2506 | 2518 | ||
| 2507 | if (!status && id_priv->id.qp) | 2519 | if (!status && id_priv->id.qp) |
| 2508 | status = ib_attach_mcast(id_priv->id.qp, &multicast->rec.mgid, | 2520 | status = ib_attach_mcast(id_priv->id.qp, &multicast->rec.mgid, |
| @@ -2524,12 +2536,12 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast) | |||
| 2524 | ret = id_priv->id.event_handler(&id_priv->id, &event); | 2536 | ret = id_priv->id.event_handler(&id_priv->id, &event); |
| 2525 | if (ret) { | 2537 | if (ret) { |
| 2526 | cma_exch(id_priv, CMA_DESTROYING); | 2538 | cma_exch(id_priv, CMA_DESTROYING); |
| 2527 | cma_release_remove(id_priv); | 2539 | cma_enable_remove(id_priv); |
| 2528 | rdma_destroy_id(&id_priv->id); | 2540 | rdma_destroy_id(&id_priv->id); |
| 2529 | return 0; | 2541 | return 0; |
| 2530 | } | 2542 | } |
| 2531 | out: | 2543 | |
| 2532 | cma_release_remove(id_priv); | 2544 | cma_enable_remove(id_priv); |
| 2533 | return 0; | 2545 | return 0; |
| 2534 | } | 2546 | } |
| 2535 | 2547 | ||
diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h index f64d42b08674..1d286d3cc2d5 100644 --- a/drivers/infiniband/hw/ehca/ehca_classes.h +++ b/drivers/infiniband/hw/ehca/ehca_classes.h | |||
| @@ -277,6 +277,7 @@ void ehca_cleanup_mrmw_cache(void); | |||
| 277 | 277 | ||
| 278 | extern spinlock_t ehca_qp_idr_lock; | 278 | extern spinlock_t ehca_qp_idr_lock; |
| 279 | extern spinlock_t ehca_cq_idr_lock; | 279 | extern spinlock_t ehca_cq_idr_lock; |
| 280 | extern spinlock_t hcall_lock; | ||
| 280 | extern struct idr ehca_qp_idr; | 281 | extern struct idr ehca_qp_idr; |
| 281 | extern struct idr ehca_cq_idr; | 282 | extern struct idr ehca_cq_idr; |
| 282 | 283 | ||
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c index 82dda2faf4d0..100329ba3343 100644 --- a/drivers/infiniband/hw/ehca/ehca_irq.c +++ b/drivers/infiniband/hw/ehca/ehca_irq.c | |||
| @@ -517,12 +517,11 @@ void ehca_process_eq(struct ehca_shca *shca, int is_irq) | |||
| 517 | else { | 517 | else { |
| 518 | struct ehca_cq *cq = eq->eqe_cache[i].cq; | 518 | struct ehca_cq *cq = eq->eqe_cache[i].cq; |
| 519 | comp_event_callback(cq); | 519 | comp_event_callback(cq); |
| 520 | spin_lock_irqsave(&ehca_cq_idr_lock, flags); | 520 | spin_lock(&ehca_cq_idr_lock); |
| 521 | cq->nr_events--; | 521 | cq->nr_events--; |
| 522 | if (!cq->nr_events) | 522 | if (!cq->nr_events) |
| 523 | wake_up(&cq->wait_completion); | 523 | wake_up(&cq->wait_completion); |
| 524 | spin_unlock_irqrestore(&ehca_cq_idr_lock, | 524 | spin_unlock(&ehca_cq_idr_lock); |
| 525 | flags); | ||
| 526 | } | 525 | } |
| 527 | } else { | 526 | } else { |
| 528 | ehca_dbg(&shca->ib_device, "Got non completion event"); | 527 | ehca_dbg(&shca->ib_device, "Got non completion event"); |
| @@ -711,6 +710,7 @@ static void destroy_comp_task(struct ehca_comp_pool *pool, | |||
| 711 | kthread_stop(task); | 710 | kthread_stop(task); |
| 712 | } | 711 | } |
| 713 | 712 | ||
| 713 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 714 | static void take_over_work(struct ehca_comp_pool *pool, | 714 | static void take_over_work(struct ehca_comp_pool *pool, |
| 715 | int cpu) | 715 | int cpu) |
| 716 | { | 716 | { |
| @@ -735,7 +735,6 @@ static void take_over_work(struct ehca_comp_pool *pool, | |||
| 735 | 735 | ||
| 736 | } | 736 | } |
| 737 | 737 | ||
| 738 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 739 | static int comp_pool_callback(struct notifier_block *nfb, | 738 | static int comp_pool_callback(struct notifier_block *nfb, |
| 740 | unsigned long action, | 739 | unsigned long action, |
| 741 | void *hcpu) | 740 | void *hcpu) |
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c index fe90e7454560..c3f99f33b49c 100644 --- a/drivers/infiniband/hw/ehca/ehca_main.c +++ b/drivers/infiniband/hw/ehca/ehca_main.c | |||
| @@ -52,7 +52,7 @@ | |||
| 52 | MODULE_LICENSE("Dual BSD/GPL"); | 52 | MODULE_LICENSE("Dual BSD/GPL"); |
| 53 | MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>"); | 53 | MODULE_AUTHOR("Christoph Raisch <raisch@de.ibm.com>"); |
| 54 | MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver"); | 54 | MODULE_DESCRIPTION("IBM eServer HCA InfiniBand Device Driver"); |
| 55 | MODULE_VERSION("SVNEHCA_0022"); | 55 | MODULE_VERSION("SVNEHCA_0023"); |
| 56 | 56 | ||
| 57 | int ehca_open_aqp1 = 0; | 57 | int ehca_open_aqp1 = 0; |
| 58 | int ehca_debug_level = 0; | 58 | int ehca_debug_level = 0; |
| @@ -62,7 +62,7 @@ int ehca_use_hp_mr = 0; | |||
| 62 | int ehca_port_act_time = 30; | 62 | int ehca_port_act_time = 30; |
| 63 | int ehca_poll_all_eqs = 1; | 63 | int ehca_poll_all_eqs = 1; |
| 64 | int ehca_static_rate = -1; | 64 | int ehca_static_rate = -1; |
| 65 | int ehca_scaling_code = 1; | 65 | int ehca_scaling_code = 0; |
| 66 | 66 | ||
| 67 | module_param_named(open_aqp1, ehca_open_aqp1, int, 0); | 67 | module_param_named(open_aqp1, ehca_open_aqp1, int, 0); |
| 68 | module_param_named(debug_level, ehca_debug_level, int, 0); | 68 | module_param_named(debug_level, ehca_debug_level, int, 0); |
| @@ -98,6 +98,7 @@ MODULE_PARM_DESC(scaling_code, | |||
| 98 | 98 | ||
| 99 | spinlock_t ehca_qp_idr_lock; | 99 | spinlock_t ehca_qp_idr_lock; |
| 100 | spinlock_t ehca_cq_idr_lock; | 100 | spinlock_t ehca_cq_idr_lock; |
| 101 | spinlock_t hcall_lock; | ||
| 101 | DEFINE_IDR(ehca_qp_idr); | 102 | DEFINE_IDR(ehca_qp_idr); |
| 102 | DEFINE_IDR(ehca_cq_idr); | 103 | DEFINE_IDR(ehca_cq_idr); |
| 103 | 104 | ||
| @@ -453,15 +454,14 @@ static ssize_t ehca_store_debug_level(struct device_driver *ddp, | |||
| 453 | DRIVER_ATTR(debug_level, S_IRUSR | S_IWUSR, | 454 | DRIVER_ATTR(debug_level, S_IRUSR | S_IWUSR, |
| 454 | ehca_show_debug_level, ehca_store_debug_level); | 455 | ehca_show_debug_level, ehca_store_debug_level); |
| 455 | 456 | ||
| 456 | void ehca_create_driver_sysfs(struct ibmebus_driver *drv) | 457 | static struct attribute *ehca_drv_attrs[] = { |
| 457 | { | 458 | &driver_attr_debug_level.attr, |
| 458 | driver_create_file(&drv->driver, &driver_attr_debug_level); | 459 | NULL |
| 459 | } | 460 | }; |
| 460 | 461 | ||
| 461 | void ehca_remove_driver_sysfs(struct ibmebus_driver *drv) | 462 | static struct attribute_group ehca_drv_attr_grp = { |
| 462 | { | 463 | .attrs = ehca_drv_attrs |
| 463 | driver_remove_file(&drv->driver, &driver_attr_debug_level); | 464 | }; |
| 464 | } | ||
| 465 | 465 | ||
| 466 | #define EHCA_RESOURCE_ATTR(name) \ | 466 | #define EHCA_RESOURCE_ATTR(name) \ |
| 467 | static ssize_t ehca_show_##name(struct device *dev, \ | 467 | static ssize_t ehca_show_##name(struct device *dev, \ |
| @@ -523,44 +523,28 @@ static ssize_t ehca_show_adapter_handle(struct device *dev, | |||
| 523 | } | 523 | } |
| 524 | static DEVICE_ATTR(adapter_handle, S_IRUGO, ehca_show_adapter_handle, NULL); | 524 | static DEVICE_ATTR(adapter_handle, S_IRUGO, ehca_show_adapter_handle, NULL); |
| 525 | 525 | ||
| 526 | static struct attribute *ehca_dev_attrs[] = { | ||
| 527 | &dev_attr_adapter_handle.attr, | ||
| 528 | &dev_attr_num_ports.attr, | ||
| 529 | &dev_attr_hw_ver.attr, | ||
| 530 | &dev_attr_max_eq.attr, | ||
| 531 | &dev_attr_cur_eq.attr, | ||
| 532 | &dev_attr_max_cq.attr, | ||
| 533 | &dev_attr_cur_cq.attr, | ||
| 534 | &dev_attr_max_qp.attr, | ||
| 535 | &dev_attr_cur_qp.attr, | ||
| 536 | &dev_attr_max_mr.attr, | ||
| 537 | &dev_attr_cur_mr.attr, | ||
| 538 | &dev_attr_max_mw.attr, | ||
| 539 | &dev_attr_cur_mw.attr, | ||
| 540 | &dev_attr_max_pd.attr, | ||
| 541 | &dev_attr_max_ah.attr, | ||
| 542 | NULL | ||
| 543 | }; | ||
| 526 | 544 | ||
| 527 | void ehca_create_device_sysfs(struct ibmebus_dev *dev) | 545 | static struct attribute_group ehca_dev_attr_grp = { |
| 528 | { | 546 | .attrs = ehca_dev_attrs |
| 529 | device_create_file(&dev->ofdev.dev, &dev_attr_adapter_handle); | 547 | }; |
| 530 | device_create_file(&dev->ofdev.dev, &dev_attr_num_ports); | ||
| 531 | device_create_file(&dev->ofdev.dev, &dev_attr_hw_ver); | ||
| 532 | device_create_file(&dev->ofdev.dev, &dev_attr_max_eq); | ||
| 533 | device_create_file(&dev->ofdev.dev, &dev_attr_cur_eq); | ||
| 534 | device_create_file(&dev->ofdev.dev, &dev_attr_max_cq); | ||
| 535 | device_create_file(&dev->ofdev.dev, &dev_attr_cur_cq); | ||
| 536 | device_create_file(&dev->ofdev.dev, &dev_attr_max_qp); | ||
| 537 | device_create_file(&dev->ofdev.dev, &dev_attr_cur_qp); | ||
| 538 | device_create_file(&dev->ofdev.dev, &dev_attr_max_mr); | ||
| 539 | device_create_file(&dev->ofdev.dev, &dev_attr_cur_mr); | ||
| 540 | device_create_file(&dev->ofdev.dev, &dev_attr_max_mw); | ||
| 541 | device_create_file(&dev->ofdev.dev, &dev_attr_cur_mw); | ||
| 542 | device_create_file(&dev->ofdev.dev, &dev_attr_max_pd); | ||
| 543 | device_create_file(&dev->ofdev.dev, &dev_attr_max_ah); | ||
| 544 | } | ||
| 545 | |||
| 546 | void ehca_remove_device_sysfs(struct ibmebus_dev *dev) | ||
| 547 | { | ||
| 548 | device_remove_file(&dev->ofdev.dev, &dev_attr_adapter_handle); | ||
| 549 | device_remove_file(&dev->ofdev.dev, &dev_attr_num_ports); | ||
| 550 | device_remove_file(&dev->ofdev.dev, &dev_attr_hw_ver); | ||
| 551 | device_remove_file(&dev->ofdev.dev, &dev_attr_max_eq); | ||
| 552 | device_remove_file(&dev->ofdev.dev, &dev_attr_cur_eq); | ||
| 553 | device_remove_file(&dev->ofdev.dev, &dev_attr_max_cq); | ||
| 554 | device_remove_file(&dev->ofdev.dev, &dev_attr_cur_cq); | ||
| 555 | device_remove_file(&dev->ofdev.dev, &dev_attr_max_qp); | ||
| 556 | device_remove_file(&dev->ofdev.dev, &dev_attr_cur_qp); | ||
| 557 | device_remove_file(&dev->ofdev.dev, &dev_attr_max_mr); | ||
| 558 | device_remove_file(&dev->ofdev.dev, &dev_attr_cur_mr); | ||
| 559 | device_remove_file(&dev->ofdev.dev, &dev_attr_max_mw); | ||
| 560 | device_remove_file(&dev->ofdev.dev, &dev_attr_cur_mw); | ||
| 561 | device_remove_file(&dev->ofdev.dev, &dev_attr_max_pd); | ||
| 562 | device_remove_file(&dev->ofdev.dev, &dev_attr_max_ah); | ||
| 563 | } | ||
| 564 | 548 | ||
| 565 | static int __devinit ehca_probe(struct ibmebus_dev *dev, | 549 | static int __devinit ehca_probe(struct ibmebus_dev *dev, |
| 566 | const struct of_device_id *id) | 550 | const struct of_device_id *id) |
| @@ -668,7 +652,10 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev, | |||
| 668 | } | 652 | } |
| 669 | } | 653 | } |
| 670 | 654 | ||
| 671 | ehca_create_device_sysfs(dev); | 655 | ret = sysfs_create_group(&dev->ofdev.dev.kobj, &ehca_dev_attr_grp); |
| 656 | if (ret) /* only complain; we can live without attributes */ | ||
| 657 | ehca_err(&shca->ib_device, | ||
| 658 | "Cannot create device attributes ret=%d", ret); | ||
| 672 | 659 | ||
| 673 | spin_lock(&shca_list_lock); | 660 | spin_lock(&shca_list_lock); |
| 674 | list_add(&shca->shca_list, &shca_list); | 661 | list_add(&shca->shca_list, &shca_list); |
| @@ -720,7 +707,7 @@ static int __devexit ehca_remove(struct ibmebus_dev *dev) | |||
| 720 | struct ehca_shca *shca = dev->ofdev.dev.driver_data; | 707 | struct ehca_shca *shca = dev->ofdev.dev.driver_data; |
| 721 | int ret; | 708 | int ret; |
| 722 | 709 | ||
| 723 | ehca_remove_device_sysfs(dev); | 710 | sysfs_remove_group(&dev->ofdev.dev.kobj, &ehca_dev_attr_grp); |
| 724 | 711 | ||
| 725 | if (ehca_open_aqp1 == 1) { | 712 | if (ehca_open_aqp1 == 1) { |
| 726 | int i; | 713 | int i; |
| @@ -812,11 +799,12 @@ int __init ehca_module_init(void) | |||
| 812 | int ret; | 799 | int ret; |
| 813 | 800 | ||
| 814 | printk(KERN_INFO "eHCA Infiniband Device Driver " | 801 | printk(KERN_INFO "eHCA Infiniband Device Driver " |
| 815 | "(Rel.: SVNEHCA_0022)\n"); | 802 | "(Rel.: SVNEHCA_0023)\n"); |
| 816 | idr_init(&ehca_qp_idr); | 803 | idr_init(&ehca_qp_idr); |
| 817 | idr_init(&ehca_cq_idr); | 804 | idr_init(&ehca_cq_idr); |
| 818 | spin_lock_init(&ehca_qp_idr_lock); | 805 | spin_lock_init(&ehca_qp_idr_lock); |
| 819 | spin_lock_init(&ehca_cq_idr_lock); | 806 | spin_lock_init(&ehca_cq_idr_lock); |
| 807 | spin_lock_init(&hcall_lock); | ||
| 820 | 808 | ||
| 821 | INIT_LIST_HEAD(&shca_list); | 809 | INIT_LIST_HEAD(&shca_list); |
| 822 | spin_lock_init(&shca_list_lock); | 810 | spin_lock_init(&shca_list_lock); |
| @@ -838,7 +826,9 @@ int __init ehca_module_init(void) | |||
| 838 | goto module_init2; | 826 | goto module_init2; |
| 839 | } | 827 | } |
| 840 | 828 | ||
| 841 | ehca_create_driver_sysfs(&ehca_driver); | 829 | ret = sysfs_create_group(&ehca_driver.driver.kobj, &ehca_drv_attr_grp); |
| 830 | if (ret) /* only complain; we can live without attributes */ | ||
| 831 | ehca_gen_err("Cannot create driver attributes ret=%d", ret); | ||
| 842 | 832 | ||
| 843 | if (ehca_poll_all_eqs != 1) { | 833 | if (ehca_poll_all_eqs != 1) { |
| 844 | ehca_gen_err("WARNING!!!"); | 834 | ehca_gen_err("WARNING!!!"); |
| @@ -865,7 +855,7 @@ void __exit ehca_module_exit(void) | |||
| 865 | if (ehca_poll_all_eqs == 1) | 855 | if (ehca_poll_all_eqs == 1) |
| 866 | del_timer_sync(&poll_eqs_timer); | 856 | del_timer_sync(&poll_eqs_timer); |
| 867 | 857 | ||
| 868 | ehca_remove_driver_sysfs(&ehca_driver); | 858 | sysfs_remove_group(&ehca_driver.driver.kobj, &ehca_drv_attr_grp); |
| 869 | ibmebus_unregister_driver(&ehca_driver); | 859 | ibmebus_unregister_driver(&ehca_driver); |
| 870 | 860 | ||
| 871 | ehca_destroy_slab_caches(); | 861 | ehca_destroy_slab_caches(); |
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c index df0516f24379..b5bc787c77b6 100644 --- a/drivers/infiniband/hw/ehca/ehca_qp.c +++ b/drivers/infiniband/hw/ehca/ehca_qp.c | |||
| @@ -523,6 +523,8 @@ struct ib_qp *ehca_create_qp(struct ib_pd *pd, | |||
| 523 | goto create_qp_exit1; | 523 | goto create_qp_exit1; |
| 524 | } | 524 | } |
| 525 | 525 | ||
| 526 | my_qp->ib_qp.qp_num = my_qp->real_qp_num; | ||
| 527 | |||
| 526 | switch (init_attr->qp_type) { | 528 | switch (init_attr->qp_type) { |
| 527 | case IB_QPT_RC: | 529 | case IB_QPT_RC: |
| 528 | if (isdaqp == 0) { | 530 | if (isdaqp == 0) { |
| @@ -568,7 +570,7 @@ struct ib_qp *ehca_create_qp(struct ib_pd *pd, | |||
| 568 | parms.act_nr_recv_wqes = init_attr->cap.max_recv_wr; | 570 | parms.act_nr_recv_wqes = init_attr->cap.max_recv_wr; |
| 569 | parms.act_nr_send_sges = init_attr->cap.max_send_sge; | 571 | parms.act_nr_send_sges = init_attr->cap.max_send_sge; |
| 570 | parms.act_nr_recv_sges = init_attr->cap.max_recv_sge; | 572 | parms.act_nr_recv_sges = init_attr->cap.max_recv_sge; |
| 571 | my_qp->real_qp_num = | 573 | my_qp->ib_qp.qp_num = |
| 572 | (init_attr->qp_type == IB_QPT_SMI) ? 0 : 1; | 574 | (init_attr->qp_type == IB_QPT_SMI) ? 0 : 1; |
| 573 | } | 575 | } |
| 574 | 576 | ||
| @@ -595,7 +597,6 @@ struct ib_qp *ehca_create_qp(struct ib_pd *pd, | |||
| 595 | my_qp->ib_qp.recv_cq = init_attr->recv_cq; | 597 | my_qp->ib_qp.recv_cq = init_attr->recv_cq; |
| 596 | my_qp->ib_qp.send_cq = init_attr->send_cq; | 598 | my_qp->ib_qp.send_cq = init_attr->send_cq; |
| 597 | 599 | ||
| 598 | my_qp->ib_qp.qp_num = my_qp->real_qp_num; | ||
| 599 | my_qp->ib_qp.qp_type = init_attr->qp_type; | 600 | my_qp->ib_qp.qp_type = init_attr->qp_type; |
| 600 | 601 | ||
| 601 | my_qp->qp_type = init_attr->qp_type; | 602 | my_qp->qp_type = init_attr->qp_type; |
| @@ -968,17 +969,21 @@ static int internal_modify_qp(struct ib_qp *ibqp, | |||
| 968 | ((ehca_mult - 1) / ah_mult) : 0; | 969 | ((ehca_mult - 1) / ah_mult) : 0; |
| 969 | else | 970 | else |
| 970 | mqpcb->max_static_rate = 0; | 971 | mqpcb->max_static_rate = 0; |
| 971 | |||
| 972 | update_mask |= EHCA_BMASK_SET(MQPCB_MASK_MAX_STATIC_RATE, 1); | 972 | update_mask |= EHCA_BMASK_SET(MQPCB_MASK_MAX_STATIC_RATE, 1); |
| 973 | 973 | ||
| 974 | /* | 974 | /* |
| 975 | * Always supply the GRH flag, even if it's zero, to give the | ||
| 976 | * hypervisor a clear "yes" or "no" instead of a "perhaps" | ||
| 977 | */ | ||
| 978 | update_mask |= EHCA_BMASK_SET(MQPCB_MASK_SEND_GRH_FLAG, 1); | ||
| 979 | |||
| 980 | /* | ||
| 975 | * only if GRH is TRUE we might consider SOURCE_GID_IDX | 981 | * only if GRH is TRUE we might consider SOURCE_GID_IDX |
| 976 | * and DEST_GID otherwise phype will return H_ATTR_PARM!!! | 982 | * and DEST_GID otherwise phype will return H_ATTR_PARM!!! |
| 977 | */ | 983 | */ |
| 978 | if (attr->ah_attr.ah_flags == IB_AH_GRH) { | 984 | if (attr->ah_attr.ah_flags == IB_AH_GRH) { |
| 979 | mqpcb->send_grh_flag = 1 << 31; | 985 | mqpcb->send_grh_flag = 1; |
| 980 | update_mask |= | 986 | |
| 981 | EHCA_BMASK_SET(MQPCB_MASK_SEND_GRH_FLAG, 1); | ||
| 982 | mqpcb->source_gid_idx = attr->ah_attr.grh.sgid_index; | 987 | mqpcb->source_gid_idx = attr->ah_attr.grh.sgid_index; |
| 983 | update_mask |= | 988 | update_mask |= |
| 984 | EHCA_BMASK_SET(MQPCB_MASK_SOURCE_GID_IDX, 1); | 989 | EHCA_BMASK_SET(MQPCB_MASK_SOURCE_GID_IDX, 1); |
diff --git a/drivers/infiniband/hw/ehca/hcp_if.c b/drivers/infiniband/hw/ehca/hcp_if.c index b564fcd3b282..7f0beec74f70 100644 --- a/drivers/infiniband/hw/ehca/hcp_if.c +++ b/drivers/infiniband/hw/ehca/hcp_if.c | |||
| @@ -154,7 +154,8 @@ static long ehca_plpar_hcall9(unsigned long opcode, | |||
| 154 | unsigned long arg9) | 154 | unsigned long arg9) |
| 155 | { | 155 | { |
| 156 | long ret; | 156 | long ret; |
| 157 | int i, sleep_msecs; | 157 | int i, sleep_msecs, lock_is_set = 0; |
| 158 | unsigned long flags; | ||
| 158 | 159 | ||
| 159 | ehca_gen_dbg("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx " | 160 | ehca_gen_dbg("opcode=%lx arg1=%lx arg2=%lx arg3=%lx arg4=%lx " |
| 160 | "arg5=%lx arg6=%lx arg7=%lx arg8=%lx arg9=%lx", | 161 | "arg5=%lx arg6=%lx arg7=%lx arg8=%lx arg9=%lx", |
| @@ -162,10 +163,18 @@ static long ehca_plpar_hcall9(unsigned long opcode, | |||
| 162 | arg8, arg9); | 163 | arg8, arg9); |
| 163 | 164 | ||
| 164 | for (i = 0; i < 5; i++) { | 165 | for (i = 0; i < 5; i++) { |
| 166 | if ((opcode == H_ALLOC_RESOURCE) && (arg2 == 5)) { | ||
| 167 | spin_lock_irqsave(&hcall_lock, flags); | ||
| 168 | lock_is_set = 1; | ||
| 169 | } | ||
| 170 | |||
| 165 | ret = plpar_hcall9(opcode, outs, | 171 | ret = plpar_hcall9(opcode, outs, |
| 166 | arg1, arg2, arg3, arg4, arg5, | 172 | arg1, arg2, arg3, arg4, arg5, |
| 167 | arg6, arg7, arg8, arg9); | 173 | arg6, arg7, arg8, arg9); |
| 168 | 174 | ||
| 175 | if (lock_is_set) | ||
| 176 | spin_unlock_irqrestore(&hcall_lock, flags); | ||
| 177 | |||
| 169 | if (H_IS_LONG_BUSY(ret)) { | 178 | if (H_IS_LONG_BUSY(ret)) { |
| 170 | sleep_msecs = get_longbusy_msecs(ret); | 179 | sleep_msecs = get_longbusy_msecs(ret); |
| 171 | msleep_interruptible(sleep_msecs); | 180 | msleep_interruptible(sleep_msecs); |
| @@ -193,11 +202,11 @@ static long ehca_plpar_hcall9(unsigned long opcode, | |||
| 193 | opcode, ret, outs[0], outs[1], outs[2], outs[3], | 202 | opcode, ret, outs[0], outs[1], outs[2], outs[3], |
| 194 | outs[4], outs[5], outs[6], outs[7], outs[8]); | 203 | outs[4], outs[5], outs[6], outs[7], outs[8]); |
| 195 | return ret; | 204 | return ret; |
| 196 | |||
| 197 | } | 205 | } |
| 198 | 206 | ||
| 199 | return H_BUSY; | 207 | return H_BUSY; |
| 200 | } | 208 | } |
| 209 | |||
| 201 | u64 hipz_h_alloc_resource_eq(const struct ipz_adapter_handle adapter_handle, | 210 | u64 hipz_h_alloc_resource_eq(const struct ipz_adapter_handle adapter_handle, |
| 202 | struct ehca_pfeq *pfeq, | 211 | struct ehca_pfeq *pfeq, |
| 203 | const u32 neq_control, | 212 | const u32 neq_control, |
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6120.c b/drivers/infiniband/hw/ipath/ipath_iba6120.c index 1b9c30857754..4e2e3dfeb2c8 100644 --- a/drivers/infiniband/hw/ipath/ipath_iba6120.c +++ b/drivers/infiniband/hw/ipath/ipath_iba6120.c | |||
| @@ -747,7 +747,6 @@ static void ipath_pe_quiet_serdes(struct ipath_devdata *dd) | |||
| 747 | 747 | ||
| 748 | static int ipath_pe_intconfig(struct ipath_devdata *dd) | 748 | static int ipath_pe_intconfig(struct ipath_devdata *dd) |
| 749 | { | 749 | { |
| 750 | u64 val; | ||
| 751 | u32 chiprev; | 750 | u32 chiprev; |
| 752 | 751 | ||
| 753 | /* | 752 | /* |
| @@ -760,9 +759,9 @@ static int ipath_pe_intconfig(struct ipath_devdata *dd) | |||
| 760 | if ((chiprev & INFINIPATH_R_CHIPREVMINOR_MASK) > 1) { | 759 | if ((chiprev & INFINIPATH_R_CHIPREVMINOR_MASK) > 1) { |
| 761 | /* Rev2+ reports extra errors via internal GPIO pins */ | 760 | /* Rev2+ reports extra errors via internal GPIO pins */ |
| 762 | dd->ipath_flags |= IPATH_GPIO_ERRINTRS; | 761 | dd->ipath_flags |= IPATH_GPIO_ERRINTRS; |
| 763 | val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_gpio_mask); | 762 | dd->ipath_gpio_mask |= IPATH_GPIO_ERRINTR_MASK; |
| 764 | val |= IPATH_GPIO_ERRINTR_MASK; | 763 | ipath_write_kreg(dd, dd->ipath_kregs->kr_gpio_mask, |
| 765 | ipath_write_kreg( dd, dd->ipath_kregs->kr_gpio_mask, val); | 764 | dd->ipath_gpio_mask); |
| 766 | } | 765 | } |
| 767 | return 0; | 766 | return 0; |
| 768 | } | 767 | } |
diff --git a/drivers/infiniband/hw/ipath/ipath_intr.c b/drivers/infiniband/hw/ipath/ipath_intr.c index 45d033169c6e..a90d3b5699c4 100644 --- a/drivers/infiniband/hw/ipath/ipath_intr.c +++ b/drivers/infiniband/hw/ipath/ipath_intr.c | |||
| @@ -1056,7 +1056,7 @@ irqreturn_t ipath_intr(int irq, void *data) | |||
| 1056 | gpiostatus &= ~(1 << IPATH_GPIO_PORT0_BIT); | 1056 | gpiostatus &= ~(1 << IPATH_GPIO_PORT0_BIT); |
| 1057 | chk0rcv = 1; | 1057 | chk0rcv = 1; |
| 1058 | } | 1058 | } |
| 1059 | if (unlikely(gpiostatus)) { | 1059 | if (gpiostatus) { |
| 1060 | /* | 1060 | /* |
| 1061 | * Some unexpected bits remain. If they could have | 1061 | * Some unexpected bits remain. If they could have |
| 1062 | * caused the interrupt, complain and clear. | 1062 | * caused the interrupt, complain and clear. |
| @@ -1065,9 +1065,8 @@ irqreturn_t ipath_intr(int irq, void *data) | |||
| 1065 | * GPIO interrupts, possibly on a "three strikes" | 1065 | * GPIO interrupts, possibly on a "three strikes" |
| 1066 | * basis. | 1066 | * basis. |
| 1067 | */ | 1067 | */ |
| 1068 | u32 mask; | 1068 | const u32 mask = (u32) dd->ipath_gpio_mask; |
| 1069 | mask = ipath_read_kreg32( | 1069 | |
| 1070 | dd, dd->ipath_kregs->kr_gpio_mask); | ||
| 1071 | if (mask & gpiostatus) { | 1070 | if (mask & gpiostatus) { |
| 1072 | ipath_dbg("Unexpected GPIO IRQ bits %x\n", | 1071 | ipath_dbg("Unexpected GPIO IRQ bits %x\n", |
| 1073 | gpiostatus & mask); | 1072 | gpiostatus & mask); |
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index e900c2593f44..12194f3dd8cc 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
| @@ -397,6 +397,8 @@ struct ipath_devdata { | |||
| 397 | unsigned long ipath_pioavailshadow[8]; | 397 | unsigned long ipath_pioavailshadow[8]; |
| 398 | /* shadow of kr_gpio_out, for rmw ops */ | 398 | /* shadow of kr_gpio_out, for rmw ops */ |
| 399 | u64 ipath_gpio_out; | 399 | u64 ipath_gpio_out; |
| 400 | /* shadow the gpio mask register */ | ||
| 401 | u64 ipath_gpio_mask; | ||
| 400 | /* kr_revision shadow */ | 402 | /* kr_revision shadow */ |
| 401 | u64 ipath_revision; | 403 | u64 ipath_revision; |
| 402 | /* | 404 | /* |
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c index 12933e77c7e9..bb70845279b8 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.c +++ b/drivers/infiniband/hw/ipath/ipath_verbs.c | |||
| @@ -1387,13 +1387,12 @@ static int enable_timer(struct ipath_devdata *dd) | |||
| 1387 | * processing. | 1387 | * processing. |
| 1388 | */ | 1388 | */ |
| 1389 | if (dd->ipath_flags & IPATH_GPIO_INTR) { | 1389 | if (dd->ipath_flags & IPATH_GPIO_INTR) { |
| 1390 | u64 val; | ||
| 1391 | ipath_write_kreg(dd, dd->ipath_kregs->kr_debugportselect, | 1390 | ipath_write_kreg(dd, dd->ipath_kregs->kr_debugportselect, |
| 1392 | 0x2074076542310ULL); | 1391 | 0x2074076542310ULL); |
| 1393 | /* Enable GPIO bit 2 interrupt */ | 1392 | /* Enable GPIO bit 2 interrupt */ |
| 1394 | val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_gpio_mask); | 1393 | dd->ipath_gpio_mask |= (u64) (1 << IPATH_GPIO_PORT0_BIT); |
| 1395 | val |= (u64) (1 << IPATH_GPIO_PORT0_BIT); | 1394 | ipath_write_kreg(dd, dd->ipath_kregs->kr_gpio_mask, |
| 1396 | ipath_write_kreg( dd, dd->ipath_kregs->kr_gpio_mask, val); | 1395 | dd->ipath_gpio_mask); |
| 1397 | } | 1396 | } |
| 1398 | 1397 | ||
| 1399 | init_timer(&dd->verbs_timer); | 1398 | init_timer(&dd->verbs_timer); |
| @@ -1412,8 +1411,9 @@ static int disable_timer(struct ipath_devdata *dd) | |||
| 1412 | u64 val; | 1411 | u64 val; |
| 1413 | /* Disable GPIO bit 2 interrupt */ | 1412 | /* Disable GPIO bit 2 interrupt */ |
| 1414 | val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_gpio_mask); | 1413 | val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_gpio_mask); |
| 1415 | val &= ~((u64) (1 << IPATH_GPIO_PORT0_BIT)); | 1414 | dd->ipath_gpio_mask &= ~((u64) (1 << IPATH_GPIO_PORT0_BIT)); |
| 1416 | ipath_write_kreg( dd, dd->ipath_kregs->kr_gpio_mask, val); | 1415 | ipath_write_kreg(dd, dd->ipath_kregs->kr_gpio_mask, |
| 1416 | dd->ipath_gpio_mask); | ||
| 1417 | /* | 1417 | /* |
| 1418 | * We might want to undo changes to debugportselect, | 1418 | * We might want to undo changes to debugportselect, |
| 1419 | * but how? | 1419 | * but how? |
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 688ecb4c39f3..402f3a20ec0a 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
| @@ -489,6 +489,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) | |||
| 489 | ibdev->uar_map = ioremap(ibdev->priv_uar.pfn << PAGE_SHIFT, PAGE_SIZE); | 489 | ibdev->uar_map = ioremap(ibdev->priv_uar.pfn << PAGE_SHIFT, PAGE_SIZE); |
| 490 | if (!ibdev->uar_map) | 490 | if (!ibdev->uar_map) |
| 491 | goto err_uar; | 491 | goto err_uar; |
| 492 | MLX4_INIT_DOORBELL_LOCK(&ibdev->uar_lock); | ||
| 492 | 493 | ||
| 493 | INIT_LIST_HEAD(&ibdev->pgdir_list); | 494 | INIT_LIST_HEAD(&ibdev->pgdir_list); |
| 494 | mutex_init(&ibdev->pgdir_mutex); | 495 | mutex_init(&ibdev->pgdir_mutex); |
diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c index cf0868f6e965..ca224d018af2 100644 --- a/drivers/infiniband/hw/mthca/mthca_cq.c +++ b/drivers/infiniband/hw/mthca/mthca_cq.c | |||
| @@ -284,7 +284,7 @@ void mthca_cq_clean(struct mthca_dev *dev, struct mthca_cq *cq, u32 qpn, | |||
| 284 | { | 284 | { |
| 285 | struct mthca_cqe *cqe; | 285 | struct mthca_cqe *cqe; |
| 286 | u32 prod_index; | 286 | u32 prod_index; |
| 287 | int nfreed = 0; | 287 | int i, nfreed = 0; |
| 288 | 288 | ||
| 289 | spin_lock_irq(&cq->lock); | 289 | spin_lock_irq(&cq->lock); |
| 290 | 290 | ||
| @@ -321,6 +321,8 @@ void mthca_cq_clean(struct mthca_dev *dev, struct mthca_cq *cq, u32 qpn, | |||
| 321 | } | 321 | } |
| 322 | 322 | ||
| 323 | if (nfreed) { | 323 | if (nfreed) { |
| 324 | for (i = 0; i < nfreed; ++i) | ||
| 325 | set_cqe_hw(get_cqe(cq, (cq->cons_index + i) & cq->ibcq.cqe)); | ||
| 324 | wmb(); | 326 | wmb(); |
| 325 | cq->cons_index += nfreed; | 327 | cq->cons_index += nfreed; |
| 326 | update_cons_index(dev, cq, nfreed); | 328 | update_cons_index(dev, cq, nfreed); |
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index fee60c852d14..72fabb822f1c 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
| @@ -1862,6 +1862,7 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr, | |||
| 1862 | dev->kar + MTHCA_RECEIVE_DOORBELL, | 1862 | dev->kar + MTHCA_RECEIVE_DOORBELL, |
| 1863 | MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock)); | 1863 | MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock)); |
| 1864 | 1864 | ||
| 1865 | qp->rq.next_ind = ind; | ||
| 1865 | qp->rq.head += MTHCA_TAVOR_MAX_WQES_PER_RECV_DB; | 1866 | qp->rq.head += MTHCA_TAVOR_MAX_WQES_PER_RECV_DB; |
| 1866 | size0 = 0; | 1867 | size0 = 0; |
| 1867 | } | 1868 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c index 785bc8505f2a..eec833b81e9b 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c | |||
| @@ -257,10 +257,11 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even | |||
| 257 | cm_id->context = p; | 257 | cm_id->context = p; |
| 258 | p->jiffies = jiffies; | 258 | p->jiffies = jiffies; |
| 259 | spin_lock_irq(&priv->lock); | 259 | spin_lock_irq(&priv->lock); |
| 260 | if (list_empty(&priv->cm.passive_ids)) | ||
| 261 | queue_delayed_work(ipoib_workqueue, | ||
| 262 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); | ||
| 260 | list_add(&p->list, &priv->cm.passive_ids); | 263 | list_add(&p->list, &priv->cm.passive_ids); |
| 261 | spin_unlock_irq(&priv->lock); | 264 | spin_unlock_irq(&priv->lock); |
| 262 | queue_delayed_work(ipoib_workqueue, | ||
| 263 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); | ||
| 264 | return 0; | 265 | return 0; |
| 265 | 266 | ||
| 266 | err_rep: | 267 | err_rep: |
| @@ -378,8 +379,6 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc) | |||
| 378 | if (!list_empty(&p->list)) | 379 | if (!list_empty(&p->list)) |
| 379 | list_move(&p->list, &priv->cm.passive_ids); | 380 | list_move(&p->list, &priv->cm.passive_ids); |
| 380 | spin_unlock_irqrestore(&priv->lock, flags); | 381 | spin_unlock_irqrestore(&priv->lock, flags); |
| 381 | queue_delayed_work(ipoib_workqueue, | ||
| 382 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); | ||
| 383 | } | 382 | } |
| 384 | } | 383 | } |
| 385 | 384 | ||
| @@ -1100,6 +1099,10 @@ static void ipoib_cm_stale_task(struct work_struct *work) | |||
| 1100 | kfree(p); | 1099 | kfree(p); |
| 1101 | spin_lock_irq(&priv->lock); | 1100 | spin_lock_irq(&priv->lock); |
| 1102 | } | 1101 | } |
| 1102 | |||
| 1103 | if (!list_empty(&priv->cm.passive_ids)) | ||
| 1104 | queue_delayed_work(ipoib_workqueue, | ||
| 1105 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); | ||
| 1103 | spin_unlock_irq(&priv->lock); | 1106 | spin_unlock_irq(&priv->lock); |
| 1104 | } | 1107 | } |
| 1105 | 1108 | ||
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index fb99cd445504..c5baa197bc08 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -2508,6 +2508,7 @@ config MLX4_CORE | |||
| 2508 | 2508 | ||
| 2509 | config MLX4_DEBUG | 2509 | config MLX4_DEBUG |
| 2510 | bool "Verbose debugging output" if (MLX4_CORE && EMBEDDED) | 2510 | bool "Verbose debugging output" if (MLX4_CORE && EMBEDDED) |
| 2511 | depends on MLX4_CORE | ||
| 2511 | default y | 2512 | default y |
| 2512 | ---help--- | 2513 | ---help--- |
| 2513 | This option causes debugging code to be compiled into the | 2514 | This option causes debugging code to be compiled into the |
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index 4debb024eaf9..20b8c0d3ced4 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c | |||
| @@ -542,8 +542,6 @@ static int __devinit mlx4_setup_hca(struct mlx4_dev *dev) | |||
| 542 | struct mlx4_priv *priv = mlx4_priv(dev); | 542 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 543 | int err; | 543 | int err; |
| 544 | 544 | ||
| 545 | MLX4_INIT_DOORBELL_LOCK(&priv->doorbell_lock); | ||
| 546 | |||
| 547 | err = mlx4_init_uar_table(dev); | 545 | err = mlx4_init_uar_table(dev); |
| 548 | if (err) { | 546 | if (err) { |
| 549 | mlx4_err(dev, "Failed to initialize " | 547 | mlx4_err(dev, "Failed to initialize " |
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index 9befbae3d196..3d3b6d24d8d3 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h | |||
| @@ -275,7 +275,6 @@ struct mlx4_priv { | |||
| 275 | 275 | ||
| 276 | struct mlx4_uar driver_uar; | 276 | struct mlx4_uar driver_uar; |
| 277 | void __iomem *kar; | 277 | void __iomem *kar; |
| 278 | MLX4_DECLARE_DOORBELL_LOCK(doorbell_lock) | ||
| 279 | 278 | ||
| 280 | u32 rev_id; | 279 | u32 rev_id; |
| 281 | char board_id[MLX4_BOARD_ID_LEN]; | 280 | char board_id[MLX4_BOARD_ID_LEN]; |
