Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branches 'core', 'cxgb3', 'cxgb4', 'iser', 'iwpm', 'misc', 'mlx4', 'mlx5', 'noio', 'ocrdma', 'qib', 'srp' and 'usnic' into for-next

+3782 -663
+2 -17
drivers/infiniband/Makefile
··· 1 1 obj-$(CONFIG_INFINIBAND) += core/ 2 - obj-$(CONFIG_INFINIBAND_MTHCA) += hw/mthca/ 3 - obj-$(CONFIG_INFINIBAND_IPATH) += hw/ipath/ 4 - obj-$(CONFIG_INFINIBAND_QIB) += hw/qib/ 5 - obj-$(CONFIG_INFINIBAND_EHCA) += hw/ehca/ 6 - obj-$(CONFIG_INFINIBAND_AMSO1100) += hw/amso1100/ 7 - obj-$(CONFIG_INFINIBAND_CXGB3) += hw/cxgb3/ 8 - obj-$(CONFIG_INFINIBAND_CXGB4) += hw/cxgb4/ 9 - obj-$(CONFIG_MLX4_INFINIBAND) += hw/mlx4/ 10 - obj-$(CONFIG_MLX5_INFINIBAND) += hw/mlx5/ 11 - obj-$(CONFIG_INFINIBAND_NES) += hw/nes/ 12 - obj-$(CONFIG_INFINIBAND_OCRDMA) += hw/ocrdma/ 13 - obj-$(CONFIG_INFINIBAND_USNIC) += hw/usnic/ 14 - obj-$(CONFIG_INFINIBAND_IPOIB) += ulp/ipoib/ 15 - obj-$(CONFIG_INFINIBAND_SRP) += ulp/srp/ 16 - obj-$(CONFIG_INFINIBAND_SRPT) += ulp/srpt/ 17 - obj-$(CONFIG_INFINIBAND_ISER) += ulp/iser/ 18 - obj-$(CONFIG_INFINIBAND_ISERT) += ulp/isert/ 2 + obj-$(CONFIG_INFINIBAND) += hw/ 3 + obj-$(CONFIG_INFINIBAND) += ulp/
+1 -1
drivers/infiniband/core/Makefile
··· 18 18 19 19 ib_cm-y := cm.o 20 20 21 - iw_cm-y := iwcm.o 21 + iw_cm-y := iwcm.o iwpm_util.o iwpm_msg.o 22 22 23 23 rdma_cm-y := cma.o 24 24
+2 -1
drivers/infiniband/core/cma.c
··· 3607 3607 3608 3608 id_stats = ibnl_put_msg(skb, &nlh, cb->nlh->nlmsg_seq, 3609 3609 sizeof *id_stats, RDMA_NL_RDMA_CM, 3610 - RDMA_NL_RDMA_CM_ID_STATS); 3610 + RDMA_NL_RDMA_CM_ID_STATS, 3611 + NLM_F_MULTI); 3611 3612 if (!id_stats) 3612 3613 goto out; 3613 3614
+685
drivers/infiniband/core/iwpm_msg.c
··· 1 + /* 2 + * Copyright (c) 2014 Intel Corporation. All rights reserved. 3 + * Copyright (c) 2014 Chelsio, Inc. All rights reserved. 4 + * 5 + * This software is available to you under a choice of one of two 6 + * licenses. You may choose to be licensed under the terms of the GNU 7 + * General Public License (GPL) Version 2, available from the file 8 + * COPYING in the main directory of this source tree, or the 9 + * OpenIB.org BSD license below: 10 + * 11 + * Redistribution and use in source and binary forms, with or 12 + * without modification, are permitted provided that the following 13 + * conditions are met: 14 + * 15 + * - Redistributions of source code must retain the above 16 + * copyright notice, this list of conditions and the following 17 + * disclaimer. 18 + * 19 + * - Redistributions in binary form must reproduce the above 20 + * copyright notice, this list of conditions and the following 21 + * disclaimer in the documentation and/or other materials 22 + * provided with the distribution. 23 + * 24 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 + * SOFTWARE. 32 + */ 33 + 34 + #include "iwpm_util.h" 35 + 36 + static const char iwpm_ulib_name[] = "iWarpPortMapperUser"; 37 + static int iwpm_ulib_version = 3; 38 + static int iwpm_user_pid = IWPM_PID_UNDEFINED; 39 + static atomic_t echo_nlmsg_seq; 40 + 41 + int iwpm_valid_pid(void) 42 + { 43 + return iwpm_user_pid > 0; 44 + } 45 + EXPORT_SYMBOL(iwpm_valid_pid); 46 + 47 + /* 48 + * iwpm_register_pid - Send a netlink query to user space 49 + * for the iwarp port mapper pid 50 + * 51 + * nlmsg attributes: 52 + * [IWPM_NLA_REG_PID_SEQ] 53 + * [IWPM_NLA_REG_IF_NAME] 54 + * [IWPM_NLA_REG_IBDEV_NAME] 55 + * [IWPM_NLA_REG_ULIB_NAME] 56 + */ 57 + int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client) 58 + { 59 + struct sk_buff *skb = NULL; 60 + struct iwpm_nlmsg_request *nlmsg_request = NULL; 61 + struct nlmsghdr *nlh; 62 + u32 msg_seq; 63 + const char *err_str = ""; 64 + int ret = -EINVAL; 65 + 66 + if (!iwpm_valid_client(nl_client)) { 67 + err_str = "Invalid port mapper client"; 68 + goto pid_query_error; 69 + } 70 + if (iwpm_registered_client(nl_client)) 71 + return 0; 72 + skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REG_PID, &nlh, nl_client); 73 + if (!skb) { 74 + err_str = "Unable to create a nlmsg"; 75 + goto pid_query_error; 76 + } 77 + nlh->nlmsg_seq = iwpm_get_nlmsg_seq(); 78 + nlmsg_request = iwpm_get_nlmsg_request(nlh->nlmsg_seq, nl_client, GFP_KERNEL); 79 + if (!nlmsg_request) { 80 + err_str = "Unable to allocate netlink request"; 81 + goto pid_query_error; 82 + } 83 + msg_seq = atomic_read(&echo_nlmsg_seq); 84 + 85 + /* fill in the pid request message */ 86 + err_str = "Unable to put attribute of the nlmsg"; 87 + ret = ibnl_put_attr(skb, nlh, sizeof(u32), &msg_seq, IWPM_NLA_REG_PID_SEQ); 88 + if (ret) 89 + goto pid_query_error; 90 + ret = ibnl_put_attr(skb, nlh, IWPM_IFNAME_SIZE, 91 + pm_msg->if_name, IWPM_NLA_REG_IF_NAME); 92 + if (ret) 93 + goto pid_query_error; 94 + ret = ibnl_put_attr(skb, nlh, IWPM_DEVNAME_SIZE, 95 + pm_msg->dev_name, IWPM_NLA_REG_IBDEV_NAME); 96 + if (ret) 97 + goto pid_query_error; 98 + ret = ibnl_put_attr(skb, nlh, IWPM_ULIBNAME_SIZE, 99 + (char *)iwpm_ulib_name, IWPM_NLA_REG_ULIB_NAME); 100 + if (ret) 101 + goto pid_query_error; 102 + 103 + pr_debug("%s: Multicasting a nlmsg (dev = %s ifname = %s iwpm = %s)\n", 104 + __func__, pm_msg->dev_name, pm_msg->if_name, iwpm_ulib_name); 105 + 106 + ret = ibnl_multicast(skb, nlh, RDMA_NL_GROUP_IWPM, GFP_KERNEL); 107 + if (ret) { 108 + skb = NULL; /* skb is freed in the netlink send-op handling */ 109 + iwpm_set_registered(nl_client, 1); 110 + iwpm_user_pid = IWPM_PID_UNAVAILABLE; 111 + err_str = "Unable to send a nlmsg"; 112 + goto pid_query_error; 113 + } 114 + nlmsg_request->req_buffer = pm_msg; 115 + ret = iwpm_wait_complete_req(nlmsg_request); 116 + return ret; 117 + pid_query_error: 118 + pr_info("%s: %s (client = %d)\n", __func__, err_str, nl_client); 119 + if (skb) 120 + dev_kfree_skb(skb); 121 + if (nlmsg_request) 122 + iwpm_free_nlmsg_request(&nlmsg_request->kref); 123 + return ret; 124 + } 125 + EXPORT_SYMBOL(iwpm_register_pid); 126 + 127 + /* 128 + * iwpm_add_mapping - Send a netlink add mapping message 129 + * to the port mapper 130 + * nlmsg attributes: 131 + * [IWPM_NLA_MANAGE_MAPPING_SEQ] 132 + * [IWPM_NLA_MANAGE_ADDR] 133 + */ 134 + int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) 135 + { 136 + struct sk_buff *skb = NULL; 137 + struct iwpm_nlmsg_request *nlmsg_request = NULL; 138 + struct nlmsghdr *nlh; 139 + u32 msg_seq; 140 + const char *err_str = ""; 141 + int ret = -EINVAL; 142 + 143 + if (!iwpm_valid_client(nl_client)) { 144 + err_str = "Invalid port mapper client"; 145 + goto add_mapping_error; 146 + } 147 + if (!iwpm_registered_client(nl_client)) { 148 + err_str = "Unregistered port mapper client"; 149 + goto add_mapping_error; 150 + } 151 + if (!iwpm_valid_pid()) 152 + return 0; 153 + skb = iwpm_create_nlmsg(RDMA_NL_IWPM_ADD_MAPPING, &nlh, nl_client); 154 + if (!skb) { 155 + err_str = "Unable to create a nlmsg"; 156 + goto add_mapping_error; 157 + } 158 + nlh->nlmsg_seq = iwpm_get_nlmsg_seq(); 159 + nlmsg_request = iwpm_get_nlmsg_request(nlh->nlmsg_seq, nl_client, GFP_KERNEL); 160 + if (!nlmsg_request) { 161 + err_str = "Unable to allocate netlink request"; 162 + goto add_mapping_error; 163 + } 164 + msg_seq = atomic_read(&echo_nlmsg_seq); 165 + /* fill in the add mapping message */ 166 + err_str = "Unable to put attribute of the nlmsg"; 167 + ret = ibnl_put_attr(skb, nlh, sizeof(u32), &msg_seq, 168 + IWPM_NLA_MANAGE_MAPPING_SEQ); 169 + if (ret) 170 + goto add_mapping_error; 171 + ret = ibnl_put_attr(skb, nlh, sizeof(struct sockaddr_storage), 172 + &pm_msg->loc_addr, IWPM_NLA_MANAGE_ADDR); 173 + if (ret) 174 + goto add_mapping_error; 175 + nlmsg_request->req_buffer = pm_msg; 176 + 177 + ret = ibnl_unicast(skb, nlh, iwpm_user_pid); 178 + if (ret) { 179 + skb = NULL; /* skb is freed in the netlink send-op handling */ 180 + iwpm_user_pid = IWPM_PID_UNDEFINED; 181 + err_str = "Unable to send a nlmsg"; 182 + goto add_mapping_error; 183 + } 184 + ret = iwpm_wait_complete_req(nlmsg_request); 185 + return ret; 186 + add_mapping_error: 187 + pr_info("%s: %s (client = %d)\n", __func__, err_str, nl_client); 188 + if (skb) 189 + dev_kfree_skb(skb); 190 + if (nlmsg_request) 191 + iwpm_free_nlmsg_request(&nlmsg_request->kref); 192 + return ret; 193 + } 194 + EXPORT_SYMBOL(iwpm_add_mapping); 195 + 196 + /* 197 + * iwpm_add_and_query_mapping - Send a netlink add and query 198 + * mapping message to the port mapper 199 + * nlmsg attributes: 200 + * [IWPM_NLA_QUERY_MAPPING_SEQ] 201 + * [IWPM_NLA_QUERY_LOCAL_ADDR] 202 + * [IWPM_NLA_QUERY_REMOTE_ADDR] 203 + */ 204 + int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client) 205 + { 206 + struct sk_buff *skb = NULL; 207 + struct iwpm_nlmsg_request *nlmsg_request = NULL; 208 + struct nlmsghdr *nlh; 209 + u32 msg_seq; 210 + const char *err_str = ""; 211 + int ret = -EINVAL; 212 + 213 + if (!iwpm_valid_client(nl_client)) { 214 + err_str = "Invalid port mapper client"; 215 + goto query_mapping_error; 216 + } 217 + if (!iwpm_registered_client(nl_client)) { 218 + err_str = "Unregistered port mapper client"; 219 + goto query_mapping_error; 220 + } 221 + if (!iwpm_valid_pid()) 222 + return 0; 223 + ret = -ENOMEM; 224 + skb = iwpm_create_nlmsg(RDMA_NL_IWPM_QUERY_MAPPING, &nlh, nl_client); 225 + if (!skb) { 226 + err_str = "Unable to create a nlmsg"; 227 + goto query_mapping_error; 228 + } 229 + nlh->nlmsg_seq = iwpm_get_nlmsg_seq(); 230 + nlmsg_request = iwpm_get_nlmsg_request(nlh->nlmsg_seq, 231 + nl_client, GFP_KERNEL); 232 + if (!nlmsg_request) { 233 + err_str = "Unable to allocate netlink request"; 234 + goto query_mapping_error; 235 + } 236 + msg_seq = atomic_read(&echo_nlmsg_seq); 237 + 238 + /* fill in the query message */ 239 + err_str = "Unable to put attribute of the nlmsg"; 240 + ret = ibnl_put_attr(skb, nlh, sizeof(u32), &msg_seq, 241 + IWPM_NLA_QUERY_MAPPING_SEQ); 242 + if (ret) 243 + goto query_mapping_error; 244 + ret = ibnl_put_attr(skb, nlh, sizeof(struct sockaddr_storage), 245 + &pm_msg->loc_addr, IWPM_NLA_QUERY_LOCAL_ADDR); 246 + if (ret) 247 + goto query_mapping_error; 248 + ret = ibnl_put_attr(skb, nlh, sizeof(struct sockaddr_storage), 249 + &pm_msg->rem_addr, IWPM_NLA_QUERY_REMOTE_ADDR); 250 + if (ret) 251 + goto query_mapping_error; 252 + nlmsg_request->req_buffer = pm_msg; 253 + 254 + ret = ibnl_unicast(skb, nlh, iwpm_user_pid); 255 + if (ret) { 256 + skb = NULL; /* skb is freed in the netlink send-op handling */ 257 + err_str = "Unable to send a nlmsg"; 258 + goto query_mapping_error; 259 + } 260 + ret = iwpm_wait_complete_req(nlmsg_request); 261 + return ret; 262 + query_mapping_error: 263 + pr_info("%s: %s (client = %d)\n", __func__, err_str, nl_client); 264 + if (skb) 265 + dev_kfree_skb(skb); 266 + if (nlmsg_request) 267 + iwpm_free_nlmsg_request(&nlmsg_request->kref); 268 + return ret; 269 + } 270 + EXPORT_SYMBOL(iwpm_add_and_query_mapping); 271 + 272 + /* 273 + * iwpm_remove_mapping - Send a netlink remove mapping message 274 + * to the port mapper 275 + * nlmsg attributes: 276 + * [IWPM_NLA_MANAGE_MAPPING_SEQ] 277 + * [IWPM_NLA_MANAGE_ADDR] 278 + */ 279 + int iwpm_remove_mapping(struct sockaddr_storage *local_addr, u8 nl_client) 280 + { 281 + struct sk_buff *skb = NULL; 282 + struct nlmsghdr *nlh; 283 + u32 msg_seq; 284 + const char *err_str = ""; 285 + int ret = -EINVAL; 286 + 287 + if (!iwpm_valid_client(nl_client)) { 288 + err_str = "Invalid port mapper client"; 289 + goto remove_mapping_error; 290 + } 291 + if (!iwpm_registered_client(nl_client)) { 292 + err_str = "Unregistered port mapper client"; 293 + goto remove_mapping_error; 294 + } 295 + if (!iwpm_valid_pid()) 296 + return 0; 297 + skb = iwpm_create_nlmsg(RDMA_NL_IWPM_REMOVE_MAPPING, &nlh, nl_client); 298 + if (!skb) { 299 + ret = -ENOMEM; 300 + err_str = "Unable to create a nlmsg"; 301 + goto remove_mapping_error; 302 + } 303 + msg_seq = atomic_read(&echo_nlmsg_seq); 304 + nlh->nlmsg_seq = iwpm_get_nlmsg_seq(); 305 + err_str = "Unable to put attribute of the nlmsg"; 306 + ret = ibnl_put_attr(skb, nlh, sizeof(u32), &msg_seq, 307 + IWPM_NLA_MANAGE_MAPPING_SEQ); 308 + if (ret) 309 + goto remove_mapping_error; 310 + ret = ibnl_put_attr(skb, nlh, sizeof(struct sockaddr_storage), 311 + local_addr, IWPM_NLA_MANAGE_ADDR); 312 + if (ret) 313 + goto remove_mapping_error; 314 + 315 + ret = ibnl_unicast(skb, nlh, iwpm_user_pid); 316 + if (ret) { 317 + skb = NULL; /* skb is freed in the netlink send-op handling */ 318 + iwpm_user_pid = IWPM_PID_UNDEFINED; 319 + err_str = "Unable to send a nlmsg"; 320 + goto remove_mapping_error; 321 + } 322 + iwpm_print_sockaddr(local_addr, 323 + "remove_mapping: Local sockaddr:"); 324 + return 0; 325 + remove_mapping_error: 326 + pr_info("%s: %s (client = %d)\n", __func__, err_str, nl_client); 327 + if (skb) 328 + dev_kfree_skb_any(skb); 329 + return ret; 330 + } 331 + EXPORT_SYMBOL(iwpm_remove_mapping); 332 + 333 + /* netlink attribute policy for the received response to register pid request */ 334 + static const struct nla_policy resp_reg_policy[IWPM_NLA_RREG_PID_MAX] = { 335 + [IWPM_NLA_RREG_PID_SEQ] = { .type = NLA_U32 }, 336 + [IWPM_NLA_RREG_IBDEV_NAME] = { .type = NLA_STRING, 337 + .len = IWPM_DEVNAME_SIZE - 1 }, 338 + [IWPM_NLA_RREG_ULIB_NAME] = { .type = NLA_STRING, 339 + .len = IWPM_ULIBNAME_SIZE - 1 }, 340 + [IWPM_NLA_RREG_ULIB_VER] = { .type = NLA_U16 }, 341 + [IWPM_NLA_RREG_PID_ERR] = { .type = NLA_U16 } 342 + }; 343 + 344 + /* 345 + * iwpm_register_pid_cb - Process a port mapper response to 346 + * iwpm_register_pid() 347 + */ 348 + int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb) 349 + { 350 + struct iwpm_nlmsg_request *nlmsg_request = NULL; 351 + struct nlattr *nltb[IWPM_NLA_RREG_PID_MAX]; 352 + struct iwpm_dev_data *pm_msg; 353 + char *dev_name, *iwpm_name; 354 + u32 msg_seq; 355 + u8 nl_client; 356 + u16 iwpm_version; 357 + const char *msg_type = "Register Pid response"; 358 + 359 + if (iwpm_parse_nlmsg(cb, IWPM_NLA_RREG_PID_MAX, 360 + resp_reg_policy, nltb, msg_type)) 361 + return -EINVAL; 362 + 363 + msg_seq = nla_get_u32(nltb[IWPM_NLA_RREG_PID_SEQ]); 364 + nlmsg_request = iwpm_find_nlmsg_request(msg_seq); 365 + if (!nlmsg_request) { 366 + pr_info("%s: Could not find a matching request (seq = %u)\n", 367 + __func__, msg_seq); 368 + return -EINVAL; 369 + } 370 + pm_msg = nlmsg_request->req_buffer; 371 + nl_client = nlmsg_request->nl_client; 372 + dev_name = (char *)nla_data(nltb[IWPM_NLA_RREG_IBDEV_NAME]); 373 + iwpm_name = (char *)nla_data(nltb[IWPM_NLA_RREG_ULIB_NAME]); 374 + iwpm_version = nla_get_u16(nltb[IWPM_NLA_RREG_ULIB_VER]); 375 + 376 + /* check device name, ulib name and version */ 377 + if (strcmp(pm_msg->dev_name, dev_name) || 378 + strcmp(iwpm_ulib_name, iwpm_name) || 379 + iwpm_version != iwpm_ulib_version) { 380 + 381 + pr_info("%s: Incorrect info (dev = %s name = %s version = %d)\n", 382 + __func__, dev_name, iwpm_name, iwpm_version); 383 + nlmsg_request->err_code = IWPM_USER_LIB_INFO_ERR; 384 + goto register_pid_response_exit; 385 + } 386 + iwpm_user_pid = cb->nlh->nlmsg_pid; 387 + atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq); 388 + pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n", 389 + __func__, iwpm_user_pid); 390 + if (iwpm_valid_client(nl_client)) 391 + iwpm_set_registered(nl_client, 1); 392 + register_pid_response_exit: 393 + nlmsg_request->request_done = 1; 394 + /* always for found nlmsg_request */ 395 + kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); 396 + barrier(); 397 + wake_up(&nlmsg_request->waitq); 398 + return 0; 399 + } 400 + EXPORT_SYMBOL(iwpm_register_pid_cb); 401 + 402 + /* netlink attribute policy for the received response to add mapping request */ 403 + static const struct nla_policy resp_add_policy[IWPM_NLA_RMANAGE_MAPPING_MAX] = { 404 + [IWPM_NLA_MANAGE_MAPPING_SEQ] = { .type = NLA_U32 }, 405 + [IWPM_NLA_MANAGE_ADDR] = { .len = sizeof(struct sockaddr_storage) }, 406 + [IWPM_NLA_MANAGE_MAPPED_LOC_ADDR] = { .len = sizeof(struct sockaddr_storage) }, 407 + [IWPM_NLA_RMANAGE_MAPPING_ERR] = { .type = NLA_U16 } 408 + }; 409 + 410 + /* 411 + * iwpm_add_mapping_cb - Process a port mapper response to 412 + * iwpm_add_mapping() 413 + */ 414 + int iwpm_add_mapping_cb(struct sk_buff *skb, struct netlink_callback *cb) 415 + { 416 + struct iwpm_sa_data *pm_msg; 417 + struct iwpm_nlmsg_request *nlmsg_request = NULL; 418 + struct nlattr *nltb[IWPM_NLA_RMANAGE_MAPPING_MAX]; 419 + struct sockaddr_storage *local_sockaddr; 420 + struct sockaddr_storage *mapped_sockaddr; 421 + const char *msg_type; 422 + u32 msg_seq; 423 + 424 + msg_type = "Add Mapping response"; 425 + if (iwpm_parse_nlmsg(cb, IWPM_NLA_RMANAGE_MAPPING_MAX, 426 + resp_add_policy, nltb, msg_type)) 427 + return -EINVAL; 428 + 429 + atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq); 430 + 431 + msg_seq = nla_get_u32(nltb[IWPM_NLA_MANAGE_MAPPING_SEQ]); 432 + nlmsg_request = iwpm_find_nlmsg_request(msg_seq); 433 + if (!nlmsg_request) { 434 + pr_info("%s: Could not find a matching request (seq = %u)\n", 435 + __func__, msg_seq); 436 + return -EINVAL; 437 + } 438 + pm_msg = nlmsg_request->req_buffer; 439 + local_sockaddr = (struct sockaddr_storage *) 440 + nla_data(nltb[IWPM_NLA_MANAGE_ADDR]); 441 + mapped_sockaddr = (struct sockaddr_storage *) 442 + nla_data(nltb[IWPM_NLA_MANAGE_MAPPED_LOC_ADDR]); 443 + 444 + if (iwpm_compare_sockaddr(local_sockaddr, &pm_msg->loc_addr)) { 445 + nlmsg_request->err_code = IWPM_USER_LIB_INFO_ERR; 446 + goto add_mapping_response_exit; 447 + } 448 + if (mapped_sockaddr->ss_family != local_sockaddr->ss_family) { 449 + pr_info("%s: Sockaddr family doesn't match the requested one\n", 450 + __func__); 451 + nlmsg_request->err_code = IWPM_USER_LIB_INFO_ERR; 452 + goto add_mapping_response_exit; 453 + } 454 + memcpy(&pm_msg->mapped_loc_addr, mapped_sockaddr, 455 + sizeof(*mapped_sockaddr)); 456 + iwpm_print_sockaddr(&pm_msg->loc_addr, 457 + "add_mapping: Local sockaddr:"); 458 + iwpm_print_sockaddr(&pm_msg->mapped_loc_addr, 459 + "add_mapping: Mapped local sockaddr:"); 460 + 461 + add_mapping_response_exit: 462 + nlmsg_request->request_done = 1; 463 + /* always for found request */ 464 + kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); 465 + barrier(); 466 + wake_up(&nlmsg_request->waitq); 467 + return 0; 468 + } 469 + EXPORT_SYMBOL(iwpm_add_mapping_cb); 470 + 471 + /* netlink attribute policy for the response to add and query mapping request */ 472 + static const struct nla_policy resp_query_policy[IWPM_NLA_RQUERY_MAPPING_MAX] = { 473 + [IWPM_NLA_QUERY_MAPPING_SEQ] = { .type = NLA_U32 }, 474 + [IWPM_NLA_QUERY_LOCAL_ADDR] = { .len = sizeof(struct sockaddr_storage) }, 475 + [IWPM_NLA_QUERY_REMOTE_ADDR] = { .len = sizeof(struct sockaddr_storage) }, 476 + [IWPM_NLA_RQUERY_MAPPED_LOC_ADDR] = { .len = sizeof(struct sockaddr_storage) }, 477 + [IWPM_NLA_RQUERY_MAPPED_REM_ADDR] = { .len = sizeof(struct sockaddr_storage) }, 478 + [IWPM_NLA_RQUERY_MAPPING_ERR] = { .type = NLA_U16 } 479 + }; 480 + 481 + /* 482 + * iwpm_add_and_query_mapping_cb - Process a port mapper response to 483 + * iwpm_add_and_query_mapping() 484 + */ 485 + int iwpm_add_and_query_mapping_cb(struct sk_buff *skb, 486 + struct netlink_callback *cb) 487 + { 488 + struct iwpm_sa_data *pm_msg; 489 + struct iwpm_nlmsg_request *nlmsg_request = NULL; 490 + struct nlattr *nltb[IWPM_NLA_RQUERY_MAPPING_MAX]; 491 + struct sockaddr_storage *local_sockaddr, *remote_sockaddr; 492 + struct sockaddr_storage *mapped_loc_sockaddr, *mapped_rem_sockaddr; 493 + const char *msg_type; 494 + u32 msg_seq; 495 + u16 err_code; 496 + 497 + msg_type = "Query Mapping response"; 498 + if (iwpm_parse_nlmsg(cb, IWPM_NLA_RQUERY_MAPPING_MAX, 499 + resp_query_policy, nltb, msg_type)) 500 + return -EINVAL; 501 + atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq); 502 + 503 + msg_seq = nla_get_u32(nltb[IWPM_NLA_QUERY_MAPPING_SEQ]); 504 + nlmsg_request = iwpm_find_nlmsg_request(msg_seq); 505 + if (!nlmsg_request) { 506 + pr_info("%s: Could not find a matching request (seq = %u)\n", 507 + __func__, msg_seq); 508 + return -EINVAL; 509 + } 510 + pm_msg = nlmsg_request->req_buffer; 511 + local_sockaddr = (struct sockaddr_storage *) 512 + nla_data(nltb[IWPM_NLA_QUERY_LOCAL_ADDR]); 513 + remote_sockaddr = (struct sockaddr_storage *) 514 + nla_data(nltb[IWPM_NLA_QUERY_REMOTE_ADDR]); 515 + mapped_loc_sockaddr = (struct sockaddr_storage *) 516 + nla_data(nltb[IWPM_NLA_RQUERY_MAPPED_LOC_ADDR]); 517 + mapped_rem_sockaddr = (struct sockaddr_storage *) 518 + nla_data(nltb[IWPM_NLA_RQUERY_MAPPED_REM_ADDR]); 519 + 520 + err_code = nla_get_u16(nltb[IWPM_NLA_RQUERY_MAPPING_ERR]); 521 + if (err_code == IWPM_REMOTE_QUERY_REJECT) { 522 + pr_info("%s: Received a Reject (pid = %u, echo seq = %u)\n", 523 + __func__, cb->nlh->nlmsg_pid, msg_seq); 524 + nlmsg_request->err_code = IWPM_REMOTE_QUERY_REJECT; 525 + } 526 + if (iwpm_compare_sockaddr(local_sockaddr, &pm_msg->loc_addr) || 527 + iwpm_compare_sockaddr(remote_sockaddr, &pm_msg->rem_addr)) { 528 + pr_info("%s: Incorrect local sockaddr\n", __func__); 529 + nlmsg_request->err_code = IWPM_USER_LIB_INFO_ERR; 530 + goto query_mapping_response_exit; 531 + } 532 + if (mapped_loc_sockaddr->ss_family != local_sockaddr->ss_family || 533 + mapped_rem_sockaddr->ss_family != remote_sockaddr->ss_family) { 534 + pr_info("%s: Sockaddr family doesn't match the requested one\n", 535 + __func__); 536 + nlmsg_request->err_code = IWPM_USER_LIB_INFO_ERR; 537 + goto query_mapping_response_exit; 538 + } 539 + memcpy(&pm_msg->mapped_loc_addr, mapped_loc_sockaddr, 540 + sizeof(*mapped_loc_sockaddr)); 541 + memcpy(&pm_msg->mapped_rem_addr, mapped_rem_sockaddr, 542 + sizeof(*mapped_rem_sockaddr)); 543 + 544 + iwpm_print_sockaddr(&pm_msg->loc_addr, 545 + "query_mapping: Local sockaddr:"); 546 + iwpm_print_sockaddr(&pm_msg->mapped_loc_addr, 547 + "query_mapping: Mapped local sockaddr:"); 548 + iwpm_print_sockaddr(&pm_msg->rem_addr, 549 + "query_mapping: Remote sockaddr:"); 550 + iwpm_print_sockaddr(&pm_msg->mapped_rem_addr, 551 + "query_mapping: Mapped remote sockaddr:"); 552 + query_mapping_response_exit: 553 + nlmsg_request->request_done = 1; 554 + /* always for found request */ 555 + kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); 556 + barrier(); 557 + wake_up(&nlmsg_request->waitq); 558 + return 0; 559 + } 560 + EXPORT_SYMBOL(iwpm_add_and_query_mapping_cb); 561 + 562 + /* netlink attribute policy for the received request for mapping info */ 563 + static const struct nla_policy resp_mapinfo_policy[IWPM_NLA_MAPINFO_REQ_MAX] = { 564 + [IWPM_NLA_MAPINFO_ULIB_NAME] = { .type = NLA_STRING, 565 + .len = IWPM_ULIBNAME_SIZE - 1 }, 566 + [IWPM_NLA_MAPINFO_ULIB_VER] = { .type = NLA_U16 } 567 + }; 568 + 569 + /* 570 + * iwpm_mapping_info_cb - Process a port mapper request for mapping info 571 + */ 572 + int iwpm_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb) 573 + { 574 + struct nlattr *nltb[IWPM_NLA_MAPINFO_REQ_MAX]; 575 + const char *msg_type = "Mapping Info response"; 576 + int iwpm_pid; 577 + u8 nl_client; 578 + char *iwpm_name; 579 + u16 iwpm_version; 580 + int ret = -EINVAL; 581 + 582 + if (iwpm_parse_nlmsg(cb, IWPM_NLA_MAPINFO_REQ_MAX, 583 + resp_mapinfo_policy, nltb, msg_type)) { 584 + pr_info("%s: Unable to parse nlmsg\n", __func__); 585 + return ret; 586 + } 587 + iwpm_name = (char *)nla_data(nltb[IWPM_NLA_MAPINFO_ULIB_NAME]); 588 + iwpm_version = nla_get_u16(nltb[IWPM_NLA_MAPINFO_ULIB_VER]); 589 + if (strcmp(iwpm_ulib_name, iwpm_name) || 590 + iwpm_version != iwpm_ulib_version) { 591 + pr_info("%s: Invalid port mapper name = %s version = %d\n", 592 + __func__, iwpm_name, iwpm_version); 593 + return ret; 594 + } 595 + nl_client = RDMA_NL_GET_CLIENT(cb->nlh->nlmsg_type); 596 + if (!iwpm_valid_client(nl_client)) { 597 + pr_info("%s: Invalid port mapper client = %d\n", 598 + __func__, nl_client); 599 + return ret; 600 + } 601 + iwpm_set_registered(nl_client, 0); 602 + atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq); 603 + if (!iwpm_mapinfo_available()) 604 + return 0; 605 + iwpm_pid = cb->nlh->nlmsg_pid; 606 + pr_debug("%s: iWarp Port Mapper (pid = %d) is available!\n", 607 + __func__, iwpm_pid); 608 + ret = iwpm_send_mapinfo(nl_client, iwpm_pid); 609 + return ret; 610 + } 611 + EXPORT_SYMBOL(iwpm_mapping_info_cb); 612 + 613 + /* netlink attribute policy for the received mapping info ack */ 614 + static const struct nla_policy ack_mapinfo_policy[IWPM_NLA_MAPINFO_NUM_MAX] = { 615 + [IWPM_NLA_MAPINFO_SEQ] = { .type = NLA_U32 }, 616 + [IWPM_NLA_MAPINFO_SEND_NUM] = { .type = NLA_U32 }, 617 + [IWPM_NLA_MAPINFO_ACK_NUM] = { .type = NLA_U32 } 618 + }; 619 + 620 + /* 621 + * iwpm_ack_mapping_info_cb - Process a port mapper ack for 622 + * the provided mapping info records 623 + */ 624 + int iwpm_ack_mapping_info_cb(struct sk_buff *skb, struct netlink_callback *cb) 625 + { 626 + struct nlattr *nltb[IWPM_NLA_MAPINFO_NUM_MAX]; 627 + u32 mapinfo_send, mapinfo_ack; 628 + const char *msg_type = "Mapping Info Ack"; 629 + 630 + if (iwpm_parse_nlmsg(cb, IWPM_NLA_MAPINFO_NUM_MAX, 631 + ack_mapinfo_policy, nltb, msg_type)) 632 + return -EINVAL; 633 + mapinfo_send = nla_get_u32(nltb[IWPM_NLA_MAPINFO_SEND_NUM]); 634 + mapinfo_ack = nla_get_u32(nltb[IWPM_NLA_MAPINFO_ACK_NUM]); 635 + if (mapinfo_ack != mapinfo_send) 636 + pr_info("%s: Invalid mapinfo number (sent = %u ack-ed = %u)\n", 637 + __func__, mapinfo_send, mapinfo_ack); 638 + atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq); 639 + return 0; 640 + } 641 + EXPORT_SYMBOL(iwpm_ack_mapping_info_cb); 642 + 643 + /* netlink attribute policy for the received port mapper error message */ 644 + static const struct nla_policy map_error_policy[IWPM_NLA_ERR_MAX] = { 645 + [IWPM_NLA_ERR_SEQ] = { .type = NLA_U32 }, 646 + [IWPM_NLA_ERR_CODE] = { .type = NLA_U16 }, 647 + }; 648 + 649 + /* 650 + * iwpm_mapping_error_cb - Process a port mapper error message 651 + */ 652 + int iwpm_mapping_error_cb(struct sk_buff *skb, struct netlink_callback *cb) 653 + { 654 + struct iwpm_nlmsg_request *nlmsg_request = NULL; 655 + int nl_client = RDMA_NL_GET_CLIENT(cb->nlh->nlmsg_type); 656 + struct nlattr *nltb[IWPM_NLA_ERR_MAX]; 657 + u32 msg_seq; 658 + u16 err_code; 659 + const char *msg_type = "Mapping Error Msg"; 660 + 661 + if (iwpm_parse_nlmsg(cb, IWPM_NLA_ERR_MAX, 662 + map_error_policy, nltb, msg_type)) 663 + return -EINVAL; 664 + 665 + msg_seq = nla_get_u32(nltb[IWPM_NLA_ERR_SEQ]); 666 + err_code = nla_get_u16(nltb[IWPM_NLA_ERR_CODE]); 667 + pr_info("%s: Received msg seq = %u err code = %u client = %d\n", 668 + __func__, msg_seq, err_code, nl_client); 669 + /* look for nlmsg_request */ 670 + nlmsg_request = iwpm_find_nlmsg_request(msg_seq); 671 + if (!nlmsg_request) { 672 + /* not all errors have associated requests */ 673 + pr_debug("Could not find matching req (seq = %u)\n", msg_seq); 674 + return 0; 675 + } 676 + atomic_set(&echo_nlmsg_seq, cb->nlh->nlmsg_seq); 677 + nlmsg_request->err_code = err_code; 678 + nlmsg_request->request_done = 1; 679 + /* always for found request */ 680 + kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); 681 + barrier(); 682 + wake_up(&nlmsg_request->waitq); 683 + return 0; 684 + } 685 + EXPORT_SYMBOL(iwpm_mapping_error_cb);
+607
drivers/infiniband/core/iwpm_util.c
··· 1 + /* 2 + * Copyright (c) 2014 Chelsio, Inc. All rights reserved. 3 + * Copyright (c) 2014 Intel Corporation. All rights reserved. 4 + * 5 + * This software is available to you under a choice of one of two 6 + * licenses. You may choose to be licensed under the terms of the GNU 7 + * General Public License (GPL) Version 2, available from the file 8 + * COPYING in the main directory of this source tree, or the 9 + * OpenIB.org BSD license below: 10 + * 11 + * Redistribution and use in source and binary forms, with or 12 + * without modification, are permitted provided that the following 13 + * conditions are met: 14 + * 15 + * - Redistributions of source code must retain the above 16 + * copyright notice, this list of conditions and the following 17 + * disclaimer. 18 + * 19 + * - Redistributions in binary form must reproduce the above 20 + * copyright notice, this list of conditions and the following 21 + * disclaimer in the documentation and/or other materials 22 + * provided with the distribution. 23 + * 24 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 + * SOFTWARE. 32 + */ 33 + 34 + #include "iwpm_util.h" 35 + 36 + #define IWPM_HASH_BUCKET_SIZE 512 37 + #define IWPM_HASH_BUCKET_MASK (IWPM_HASH_BUCKET_SIZE - 1) 38 + 39 + static LIST_HEAD(iwpm_nlmsg_req_list); 40 + static DEFINE_SPINLOCK(iwpm_nlmsg_req_lock); 41 + 42 + static struct hlist_head *iwpm_hash_bucket; 43 + static DEFINE_SPINLOCK(iwpm_mapinfo_lock); 44 + 45 + static DEFINE_MUTEX(iwpm_admin_lock); 46 + static struct iwpm_admin_data iwpm_admin; 47 + 48 + int iwpm_init(u8 nl_client) 49 + { 50 + if (iwpm_valid_client(nl_client)) 51 + return -EINVAL; 52 + mutex_lock(&iwpm_admin_lock); 53 + if (atomic_read(&iwpm_admin.refcount) == 0) { 54 + iwpm_hash_bucket = kzalloc(IWPM_HASH_BUCKET_SIZE * 55 + sizeof(struct hlist_head), GFP_KERNEL); 56 + if (!iwpm_hash_bucket) { 57 + mutex_unlock(&iwpm_admin_lock); 58 + pr_err("%s Unable to create mapinfo hash table\n", __func__); 59 + return -ENOMEM; 60 + } 61 + } 62 + atomic_inc(&iwpm_admin.refcount); 63 + mutex_unlock(&iwpm_admin_lock); 64 + iwpm_set_valid(nl_client, 1); 65 + return 0; 66 + } 67 + EXPORT_SYMBOL(iwpm_init); 68 + 69 + static void free_hash_bucket(void); 70 + 71 + int iwpm_exit(u8 nl_client) 72 + { 73 + 74 + if (!iwpm_valid_client(nl_client)) 75 + return -EINVAL; 76 + mutex_lock(&iwpm_admin_lock); 77 + if (atomic_read(&iwpm_admin.refcount) == 0) { 78 + mutex_unlock(&iwpm_admin_lock); 79 + pr_err("%s Incorrect usage - negative refcount\n", __func__); 80 + return -EINVAL; 81 + } 82 + if (atomic_dec_and_test(&iwpm_admin.refcount)) { 83 + free_hash_bucket(); 84 + pr_debug("%s: Mapinfo hash table is destroyed\n", __func__); 85 + } 86 + mutex_unlock(&iwpm_admin_lock); 87 + iwpm_set_valid(nl_client, 0); 88 + return 0; 89 + } 90 + EXPORT_SYMBOL(iwpm_exit); 91 + 92 + static struct hlist_head *get_hash_bucket_head(struct sockaddr_storage *, 93 + struct sockaddr_storage *); 94 + 95 + int iwpm_create_mapinfo(struct sockaddr_storage *local_sockaddr, 96 + struct sockaddr_storage *mapped_sockaddr, 97 + u8 nl_client) 98 + { 99 + struct hlist_head *hash_bucket_head; 100 + struct iwpm_mapping_info *map_info; 101 + unsigned long flags; 102 + 103 + if (!iwpm_valid_client(nl_client)) 104 + return -EINVAL; 105 + map_info = kzalloc(sizeof(struct iwpm_mapping_info), GFP_KERNEL); 106 + if (!map_info) { 107 + pr_err("%s: Unable to allocate a mapping info\n", __func__); 108 + return -ENOMEM; 109 + } 110 + memcpy(&map_info->local_sockaddr, local_sockaddr, 111 + sizeof(struct sockaddr_storage)); 112 + memcpy(&map_info->mapped_sockaddr, mapped_sockaddr, 113 + sizeof(struct sockaddr_storage)); 114 + map_info->nl_client = nl_client; 115 + 116 + spin_lock_irqsave(&iwpm_mapinfo_lock, flags); 117 + if (iwpm_hash_bucket) { 118 + hash_bucket_head = get_hash_bucket_head( 119 + &map_info->local_sockaddr, 120 + &map_info->mapped_sockaddr); 121 + hlist_add_head(&map_info->hlist_node, hash_bucket_head); 122 + } 123 + spin_unlock_irqrestore(&iwpm_mapinfo_lock, flags); 124 + return 0; 125 + } 126 + EXPORT_SYMBOL(iwpm_create_mapinfo); 127 + 128 + int iwpm_remove_mapinfo(struct sockaddr_storage *local_sockaddr, 129 + struct sockaddr_storage *mapped_local_addr) 130 + { 131 + struct hlist_node *tmp_hlist_node; 132 + struct hlist_head *hash_bucket_head; 133 + struct iwpm_mapping_info *map_info = NULL; 134 + unsigned long flags; 135 + int ret = -EINVAL; 136 + 137 + spin_lock_irqsave(&iwpm_mapinfo_lock, flags); 138 + if (iwpm_hash_bucket) { 139 + hash_bucket_head = get_hash_bucket_head( 140 + local_sockaddr, 141 + mapped_local_addr); 142 + hlist_for_each_entry_safe(map_info, tmp_hlist_node, 143 + hash_bucket_head, hlist_node) { 144 + 145 + if (!iwpm_compare_sockaddr(&map_info->mapped_sockaddr, 146 + mapped_local_addr)) { 147 + 148 + hlist_del_init(&map_info->hlist_node); 149 + kfree(map_info); 150 + ret = 0; 151 + break; 152 + } 153 + } 154 + } 155 + spin_unlock_irqrestore(&iwpm_mapinfo_lock, flags); 156 + return ret; 157 + } 158 + EXPORT_SYMBOL(iwpm_remove_mapinfo); 159 + 160 + static void free_hash_bucket(void) 161 + { 162 + struct hlist_node *tmp_hlist_node; 163 + struct iwpm_mapping_info *map_info; 164 + unsigned long flags; 165 + int i; 166 + 167 + /* remove all the mapinfo data from the list */ 168 + spin_lock_irqsave(&iwpm_mapinfo_lock, flags); 169 + for (i = 0; i < IWPM_HASH_BUCKET_SIZE; i++) { 170 + hlist_for_each_entry_safe(map_info, tmp_hlist_node, 171 + &iwpm_hash_bucket[i], hlist_node) { 172 + 173 + hlist_del_init(&map_info->hlist_node); 174 + kfree(map_info); 175 + } 176 + } 177 + /* free the hash list */ 178 + kfree(iwpm_hash_bucket); 179 + iwpm_hash_bucket = NULL; 180 + spin_unlock_irqrestore(&iwpm_mapinfo_lock, flags); 181 + } 182 + 183 + struct iwpm_nlmsg_request *iwpm_get_nlmsg_request(__u32 nlmsg_seq, 184 + u8 nl_client, gfp_t gfp) 185 + { 186 + struct iwpm_nlmsg_request *nlmsg_request = NULL; 187 + unsigned long flags; 188 + 189 + nlmsg_request = kzalloc(sizeof(struct iwpm_nlmsg_request), gfp); 190 + if (!nlmsg_request) { 191 + pr_err("%s Unable to allocate a nlmsg_request\n", __func__); 192 + return NULL; 193 + } 194 + spin_lock_irqsave(&iwpm_nlmsg_req_lock, flags); 195 + list_add_tail(&nlmsg_request->inprocess_list, &iwpm_nlmsg_req_list); 196 + spin_unlock_irqrestore(&iwpm_nlmsg_req_lock, flags); 197 + 198 + kref_init(&nlmsg_request->kref); 199 + kref_get(&nlmsg_request->kref); 200 + nlmsg_request->nlmsg_seq = nlmsg_seq; 201 + nlmsg_request->nl_client = nl_client; 202 + nlmsg_request->request_done = 0; 203 + nlmsg_request->err_code = 0; 204 + return nlmsg_request; 205 + } 206 + 207 + void iwpm_free_nlmsg_request(struct kref *kref) 208 + { 209 + struct iwpm_nlmsg_request *nlmsg_request; 210 + unsigned long flags; 211 + 212 + nlmsg_request = container_of(kref, struct iwpm_nlmsg_request, kref); 213 + 214 + spin_lock_irqsave(&iwpm_nlmsg_req_lock, flags); 215 + list_del_init(&nlmsg_request->inprocess_list); 216 + spin_unlock_irqrestore(&iwpm_nlmsg_req_lock, flags); 217 + 218 + if (!nlmsg_request->request_done) 219 + pr_debug("%s Freeing incomplete nlmsg request (seq = %u).\n", 220 + __func__, nlmsg_request->nlmsg_seq); 221 + kfree(nlmsg_request); 222 + } 223 + 224 + struct iwpm_nlmsg_request *iwpm_find_nlmsg_request(__u32 echo_seq) 225 + { 226 + struct iwpm_nlmsg_request *nlmsg_request; 227 + struct iwpm_nlmsg_request *found_request = NULL; 228 + unsigned long flags; 229 + 230 + spin_lock_irqsave(&iwpm_nlmsg_req_lock, flags); 231 + list_for_each_entry(nlmsg_request, &iwpm_nlmsg_req_list, 232 + inprocess_list) { 233 + if (nlmsg_request->nlmsg_seq == echo_seq) { 234 + found_request = nlmsg_request; 235 + kref_get(&nlmsg_request->kref); 236 + break; 237 + } 238 + } 239 + spin_unlock_irqrestore(&iwpm_nlmsg_req_lock, flags); 240 + return found_request; 241 + } 242 + 243 + int iwpm_wait_complete_req(struct iwpm_nlmsg_request *nlmsg_request) 244 + { 245 + int ret; 246 + init_waitqueue_head(&nlmsg_request->waitq); 247 + 248 + ret = wait_event_timeout(nlmsg_request->waitq, 249 + (nlmsg_request->request_done != 0), IWPM_NL_TIMEOUT); 250 + if (!ret) { 251 + ret = -EINVAL; 252 + pr_info("%s: Timeout %d sec for netlink request (seq = %u)\n", 253 + __func__, (IWPM_NL_TIMEOUT/HZ), nlmsg_request->nlmsg_seq); 254 + } else { 255 + ret = nlmsg_request->err_code; 256 + } 257 + kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request); 258 + return ret; 259 + } 260 + 261 + int iwpm_get_nlmsg_seq(void) 262 + { 263 + return atomic_inc_return(&iwpm_admin.nlmsg_seq); 264 + } 265 + 266 + int iwpm_valid_client(u8 nl_client) 267 + { 268 + if (nl_client >= RDMA_NL_NUM_CLIENTS) 269 + return 0; 270 + return iwpm_admin.client_list[nl_client]; 271 + } 272 + 273 + void iwpm_set_valid(u8 nl_client, int valid) 274 + { 275 + if (nl_client >= RDMA_NL_NUM_CLIENTS) 276 + return; 277 + iwpm_admin.client_list[nl_client] = valid; 278 + } 279 + 280 + /* valid client */ 281 + int iwpm_registered_client(u8 nl_client) 282 + { 283 + return iwpm_admin.reg_list[nl_client]; 284 + } 285 + 286 + /* valid client */ 287 + void iwpm_set_registered(u8 nl_client, int reg) 288 + { 289 + iwpm_admin.reg_list[nl_client] = reg; 290 + } 291 + 292 + int iwpm_compare_sockaddr(struct sockaddr_storage *a_sockaddr, 293 + struct sockaddr_storage *b_sockaddr) 294 + { 295 + if (a_sockaddr->ss_family != b_sockaddr->ss_family) 296 + return 1; 297 + if (a_sockaddr->ss_family == AF_INET) { 298 + struct sockaddr_in *a4_sockaddr = 299 + (struct sockaddr_in *)a_sockaddr; 300 + struct sockaddr_in *b4_sockaddr = 301 + (struct sockaddr_in *)b_sockaddr; 302 + if (!memcmp(&a4_sockaddr->sin_addr, 303 + &b4_sockaddr->sin_addr, sizeof(struct in_addr)) 304 + && a4_sockaddr->sin_port == b4_sockaddr->sin_port) 305 + return 0; 306 + 307 + } else if (a_sockaddr->ss_family == AF_INET6) { 308 + struct sockaddr_in6 *a6_sockaddr = 309 + (struct sockaddr_in6 *)a_sockaddr; 310 + struct sockaddr_in6 *b6_sockaddr = 311 + (struct sockaddr_in6 *)b_sockaddr; 312 + if (!memcmp(&a6_sockaddr->sin6_addr, 313 + &b6_sockaddr->sin6_addr, sizeof(struct in6_addr)) 314 + && a6_sockaddr->sin6_port == b6_sockaddr->sin6_port) 315 + return 0; 316 + 317 + } else { 318 + pr_err("%s: Invalid sockaddr family\n", __func__); 319 + } 320 + return 1; 321 + } 322 + 323 + struct sk_buff *iwpm_create_nlmsg(u32 nl_op, struct nlmsghdr **nlh, 324 + int nl_client) 325 + { 326 + struct sk_buff *skb = NULL; 327 + 328 + skb = dev_alloc_skb(NLMSG_GOODSIZE); 329 + if (!skb) { 330 + pr_err("%s Unable to allocate skb\n", __func__); 331 + goto create_nlmsg_exit; 332 + } 333 + if (!(ibnl_put_msg(skb, nlh, 0, 0, nl_client, nl_op, 334 + NLM_F_REQUEST))) { 335 + pr_warn("%s: Unable to put the nlmsg header\n", __func__); 336 + dev_kfree_skb(skb); 337 + skb = NULL; 338 + } 339 + create_nlmsg_exit: 340 + return skb; 341 + } 342 + 343 + int iwpm_parse_nlmsg(struct netlink_callback *cb, int policy_max, 344 + const struct nla_policy *nlmsg_policy, 345 + struct nlattr *nltb[], const char *msg_type) 346 + { 347 + int nlh_len = 0; 348 + int ret; 349 + const char *err_str = ""; 350 + 351 + ret = nlmsg_validate(cb->nlh, nlh_len, policy_max-1, nlmsg_policy); 352 + if (ret) { 353 + err_str = "Invalid attribute"; 354 + goto parse_nlmsg_error; 355 + } 356 + ret = nlmsg_parse(cb->nlh, nlh_len, nltb, policy_max-1, nlmsg_policy); 357 + if (ret) { 358 + err_str = "Unable to parse the nlmsg"; 359 + goto parse_nlmsg_error; 360 + } 361 + ret = iwpm_validate_nlmsg_attr(nltb, policy_max); 362 + if (ret) { 363 + err_str = "Invalid NULL attribute"; 364 + goto parse_nlmsg_error; 365 + } 366 + return 0; 367 + parse_nlmsg_error: 368 + pr_warn("%s: %s (msg type %s ret = %d)\n", 369 + __func__, err_str, msg_type, ret); 370 + return ret; 371 + } 372 + 373 + void iwpm_print_sockaddr(struct sockaddr_storage *sockaddr, char *msg) 374 + { 375 + struct sockaddr_in6 *sockaddr_v6; 376 + struct sockaddr_in *sockaddr_v4; 377 + 378 + switch (sockaddr->ss_family) { 379 + case AF_INET: 380 + sockaddr_v4 = (struct sockaddr_in *)sockaddr; 381 + pr_debug("%s IPV4 %pI4: %u(0x%04X)\n", 382 + msg, &sockaddr_v4->sin_addr, 383 + ntohs(sockaddr_v4->sin_port), 384 + ntohs(sockaddr_v4->sin_port)); 385 + break; 386 + case AF_INET6: 387 + sockaddr_v6 = (struct sockaddr_in6 *)sockaddr; 388 + pr_debug("%s IPV6 %pI6: %u(0x%04X)\n", 389 + msg, &sockaddr_v6->sin6_addr, 390 + ntohs(sockaddr_v6->sin6_port), 391 + ntohs(sockaddr_v6->sin6_port)); 392 + break; 393 + default: 394 + break; 395 + } 396 + } 397 + 398 + static u32 iwpm_ipv6_jhash(struct sockaddr_in6 *ipv6_sockaddr) 399 + { 400 + u32 ipv6_hash = jhash(&ipv6_sockaddr->sin6_addr, sizeof(struct in6_addr), 0); 401 + u32 hash = jhash_2words(ipv6_hash, (__force u32) ipv6_sockaddr->sin6_port, 0); 402 + return hash; 403 + } 404 + 405 + static u32 iwpm_ipv4_jhash(struct sockaddr_in *ipv4_sockaddr) 406 + { 407 + u32 ipv4_hash = jhash(&ipv4_sockaddr->sin_addr, sizeof(struct in_addr), 0); 408 + u32 hash = jhash_2words(ipv4_hash, (__force u32) ipv4_sockaddr->sin_port, 0); 409 + return hash; 410 + } 411 + 412 + static struct hlist_head *get_hash_bucket_head(struct sockaddr_storage 413 + *local_sockaddr, 414 + struct sockaddr_storage 415 + *mapped_sockaddr) 416 + { 417 + u32 local_hash, mapped_hash, hash; 418 + 419 + if (local_sockaddr->ss_family == AF_INET) { 420 + local_hash = iwpm_ipv4_jhash((struct sockaddr_in *) local_sockaddr); 421 + mapped_hash = iwpm_ipv4_jhash((struct sockaddr_in *) mapped_sockaddr); 422 + 423 + } else if (local_sockaddr->ss_family == AF_INET6) { 424 + local_hash = iwpm_ipv6_jhash((struct sockaddr_in6 *) local_sockaddr); 425 + mapped_hash = iwpm_ipv6_jhash((struct sockaddr_in6 *) mapped_sockaddr); 426 + } else { 427 + pr_err("%s: Invalid sockaddr family\n", __func__); 428 + return NULL; 429 + } 430 + 431 + if (local_hash == mapped_hash) /* if port mapper isn't available */ 432 + hash = local_hash; 433 + else 434 + hash = jhash_2words(local_hash, mapped_hash, 0); 435 + 436 + return &iwpm_hash_bucket[hash & IWPM_HASH_BUCKET_MASK]; 437 + } 438 + 439 + static int send_mapinfo_num(u32 mapping_num, u8 nl_client, int iwpm_pid) 440 + { 441 + struct sk_buff *skb = NULL; 442 + struct nlmsghdr *nlh; 443 + u32 msg_seq; 444 + const char *err_str = ""; 445 + int ret = -EINVAL; 446 + 447 + skb = iwpm_create_nlmsg(RDMA_NL_IWPM_MAPINFO_NUM, &nlh, nl_client); 448 + if (!skb) { 449 + err_str = "Unable to create a nlmsg"; 450 + goto mapinfo_num_error; 451 + } 452 + nlh->nlmsg_seq = iwpm_get_nlmsg_seq(); 453 + msg_seq = 0; 454 + err_str = "Unable to put attribute of mapinfo number nlmsg"; 455 + ret = ibnl_put_attr(skb, nlh, sizeof(u32), &msg_seq, IWPM_NLA_MAPINFO_SEQ); 456 + if (ret) 457 + goto mapinfo_num_error; 458 + ret = ibnl_put_attr(skb, nlh, sizeof(u32), 459 + &mapping_num, IWPM_NLA_MAPINFO_SEND_NUM); 460 + if (ret) 461 + goto mapinfo_num_error; 462 + ret = ibnl_unicast(skb, nlh, iwpm_pid); 463 + if (ret) { 464 + skb = NULL; 465 + err_str = "Unable to send a nlmsg"; 466 + goto mapinfo_num_error; 467 + } 468 + pr_debug("%s: Sent mapping number = %d\n", __func__, mapping_num); 469 + return 0; 470 + mapinfo_num_error: 471 + pr_info("%s: %s\n", __func__, err_str); 472 + if (skb) 473 + dev_kfree_skb(skb); 474 + return ret; 475 + } 476 + 477 + static int send_nlmsg_done(struct sk_buff *skb, u8 nl_client, int iwpm_pid) 478 + { 479 + struct nlmsghdr *nlh = NULL; 480 + int ret = 0; 481 + 482 + if (!skb) 483 + return ret; 484 + if (!(ibnl_put_msg(skb, &nlh, 0, 0, nl_client, 485 + RDMA_NL_IWPM_MAPINFO, NLM_F_MULTI))) { 486 + pr_warn("%s Unable to put NLMSG_DONE\n", __func__); 487 + return -ENOMEM; 488 + } 489 + nlh->nlmsg_type = NLMSG_DONE; 490 + ret = ibnl_unicast(skb, (struct nlmsghdr *)skb->data, iwpm_pid); 491 + if (ret) 492 + pr_warn("%s Unable to send a nlmsg\n", __func__); 493 + return ret; 494 + } 495 + 496 + int iwpm_send_mapinfo(u8 nl_client, int iwpm_pid) 497 + { 498 + struct iwpm_mapping_info *map_info; 499 + struct sk_buff *skb = NULL; 500 + struct nlmsghdr *nlh; 501 + int skb_num = 0, mapping_num = 0; 502 + int i = 0, nlmsg_bytes = 0; 503 + unsigned long flags; 504 + const char *err_str = ""; 505 + int ret; 506 + 507 + skb = dev_alloc_skb(NLMSG_GOODSIZE); 508 + if (!skb) { 509 + ret = -ENOMEM; 510 + err_str = "Unable to allocate skb"; 511 + goto send_mapping_info_exit; 512 + } 513 + skb_num++; 514 + spin_lock_irqsave(&iwpm_mapinfo_lock, flags); 515 + for (i = 0; i < IWPM_HASH_BUCKET_SIZE; i++) { 516 + hlist_for_each_entry(map_info, &iwpm_hash_bucket[i], 517 + hlist_node) { 518 + if (map_info->nl_client != nl_client) 519 + continue; 520 + nlh = NULL; 521 + if (!(ibnl_put_msg(skb, &nlh, 0, 0, nl_client, 522 + RDMA_NL_IWPM_MAPINFO, NLM_F_MULTI))) { 523 + ret = -ENOMEM; 524 + err_str = "Unable to put the nlmsg header"; 525 + goto send_mapping_info_unlock; 526 + } 527 + err_str = "Unable to put attribute of the nlmsg"; 528 + ret = ibnl_put_attr(skb, nlh, 529 + sizeof(struct sockaddr_storage), 530 + &map_info->local_sockaddr, 531 + IWPM_NLA_MAPINFO_LOCAL_ADDR); 532 + if (ret) 533 + goto send_mapping_info_unlock; 534 + 535 + ret = ibnl_put_attr(skb, nlh, 536 + sizeof(struct sockaddr_storage), 537 + &map_info->mapped_sockaddr, 538 + IWPM_NLA_MAPINFO_MAPPED_ADDR); 539 + if (ret) 540 + goto send_mapping_info_unlock; 541 + 542 + iwpm_print_sockaddr(&map_info->local_sockaddr, 543 + "send_mapping_info: Local sockaddr:"); 544 + iwpm_print_sockaddr(&map_info->mapped_sockaddr, 545 + "send_mapping_info: Mapped local sockaddr:"); 546 + mapping_num++; 547 + nlmsg_bytes += nlh->nlmsg_len; 548 + 549 + /* check if all mappings can fit in one skb */ 550 + if (NLMSG_GOODSIZE - nlmsg_bytes < nlh->nlmsg_len * 2) { 551 + /* and leave room for NLMSG_DONE */ 552 + nlmsg_bytes = 0; 553 + skb_num++; 554 + spin_unlock_irqrestore(&iwpm_mapinfo_lock, 555 + flags); 556 + /* send the skb */ 557 + ret = send_nlmsg_done(skb, nl_client, iwpm_pid); 558 + skb = NULL; 559 + if (ret) { 560 + err_str = "Unable to send map info"; 561 + goto send_mapping_info_exit; 562 + } 563 + if (skb_num == IWPM_MAPINFO_SKB_COUNT) { 564 + ret = -ENOMEM; 565 + err_str = "Insufficient skbs for map info"; 566 + goto send_mapping_info_exit; 567 + } 568 + skb = dev_alloc_skb(NLMSG_GOODSIZE); 569 + if (!skb) { 570 + ret = -ENOMEM; 571 + err_str = "Unable to allocate skb"; 572 + goto send_mapping_info_exit; 573 + } 574 + spin_lock_irqsave(&iwpm_mapinfo_lock, flags); 575 + } 576 + } 577 + } 578 + send_mapping_info_unlock: 579 + spin_unlock_irqrestore(&iwpm_mapinfo_lock, flags); 580 + send_mapping_info_exit: 581 + if (ret) { 582 + pr_warn("%s: %s (ret = %d)\n", __func__, err_str, ret); 583 + if (skb) 584 + dev_kfree_skb(skb); 585 + return ret; 586 + } 587 + send_nlmsg_done(skb, nl_client, iwpm_pid); 588 + return send_mapinfo_num(mapping_num, nl_client, iwpm_pid); 589 + } 590 + 591 + int iwpm_mapinfo_available(void) 592 + { 593 + unsigned long flags; 594 + int full_bucket = 0, i = 0; 595 + 596 + spin_lock_irqsave(&iwpm_mapinfo_lock, flags); 597 + if (iwpm_hash_bucket) { 598 + for (i = 0; i < IWPM_HASH_BUCKET_SIZE; i++) { 599 + if (!hlist_empty(&iwpm_hash_bucket[i])) { 600 + full_bucket = 1; 601 + break; 602 + } 603 + } 604 + } 605 + spin_unlock_irqrestore(&iwpm_mapinfo_lock, flags); 606 + return full_bucket; 607 + }
+238
drivers/infiniband/core/iwpm_util.h
··· 1 + /* 2 + * Copyright (c) 2014 Intel Corporation. All rights reserved. 3 + * Copyright (c) 2014 Chelsio, Inc. All rights reserved. 4 + * 5 + * This software is available to you under a choice of one of two 6 + * licenses. You may choose to be licensed under the terms of the GNU 7 + * General Public License (GPL) Version 2, available from the file 8 + * COPYING in the main directory of this source tree, or the 9 + * OpenIB.org BSD license below: 10 + * 11 + * Redistribution and use in source and binary forms, with or 12 + * without modification, are permitted provided that the following 13 + * conditions are met: 14 + * 15 + * - Redistributions of source code must retain the above 16 + * copyright notice, this list of conditions and the following 17 + * disclaimer. 18 + * 19 + * - Redistributions in binary form must reproduce the above 20 + * copyright notice, this list of conditions and the following 21 + * disclaimer in the documentation and/or other materials 22 + * provided with the distribution. 23 + * 24 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 + * SOFTWARE. 32 + */ 33 + #ifndef _IWPM_UTIL_H 34 + #define _IWPM_UTIL_H 35 + 36 + #include <linux/module.h> 37 + #include <linux/io.h> 38 + #include <linux/in.h> 39 + #include <linux/in6.h> 40 + #include <linux/spinlock.h> 41 + #include <linux/kernel.h> 42 + #include <linux/netdevice.h> 43 + #include <linux/delay.h> 44 + #include <linux/workqueue.h> 45 + #include <linux/mutex.h> 46 + #include <linux/jhash.h> 47 + #include <linux/kref.h> 48 + #include <net/netlink.h> 49 + #include <linux/errno.h> 50 + #include <rdma/iw_portmap.h> 51 + #include <rdma/rdma_netlink.h> 52 + 53 + 54 + #define IWPM_NL_RETRANS 3 55 + #define IWPM_NL_TIMEOUT (10*HZ) 56 + #define IWPM_MAPINFO_SKB_COUNT 20 57 + 58 + #define IWPM_PID_UNDEFINED -1 59 + #define IWPM_PID_UNAVAILABLE -2 60 + 61 + struct iwpm_nlmsg_request { 62 + struct list_head inprocess_list; 63 + __u32 nlmsg_seq; 64 + void *req_buffer; 65 + u8 nl_client; 66 + u8 request_done; 67 + u16 err_code; 68 + wait_queue_head_t waitq; 69 + struct kref kref; 70 + }; 71 + 72 + struct iwpm_mapping_info { 73 + struct hlist_node hlist_node; 74 + struct sockaddr_storage local_sockaddr; 75 + struct sockaddr_storage mapped_sockaddr; 76 + u8 nl_client; 77 + }; 78 + 79 + struct iwpm_admin_data { 80 + atomic_t refcount; 81 + atomic_t nlmsg_seq; 82 + int client_list[RDMA_NL_NUM_CLIENTS]; 83 + int reg_list[RDMA_NL_NUM_CLIENTS]; 84 + }; 85 + 86 + /** 87 + * iwpm_get_nlmsg_request - Allocate and initialize netlink message request 88 + * @nlmsg_seq: Sequence number of the netlink message 89 + * @nl_client: The index of the netlink client 90 + * @gfp: Indicates how the memory for the request should be allocated 91 + * 92 + * Returns the newly allocated netlink request object if successful, 93 + * otherwise returns NULL 94 + */ 95 + struct iwpm_nlmsg_request *iwpm_get_nlmsg_request(__u32 nlmsg_seq, 96 + u8 nl_client, gfp_t gfp); 97 + 98 + /** 99 + * iwpm_free_nlmsg_request - Deallocate netlink message request 100 + * @kref: Holds reference of netlink message request 101 + */ 102 + void iwpm_free_nlmsg_request(struct kref *kref); 103 + 104 + /** 105 + * iwpm_find_nlmsg_request - Find netlink message request in the request list 106 + * @echo_seq: Sequence number of the netlink request to find 107 + * 108 + * Returns the found netlink message request, 109 + * if not found, returns NULL 110 + */ 111 + struct iwpm_nlmsg_request *iwpm_find_nlmsg_request(__u32 echo_seq); 112 + 113 + /** 114 + * iwpm_wait_complete_req - Block while servicing the netlink request 115 + * @nlmsg_request: Netlink message request to service 116 + * 117 + * Wakes up, after the request is completed or expired 118 + * Returns 0 if the request is complete without error 119 + */ 120 + int iwpm_wait_complete_req(struct iwpm_nlmsg_request *nlmsg_request); 121 + 122 + /** 123 + * iwpm_get_nlmsg_seq - Get the sequence number for a netlink 124 + * message to send to the port mapper 125 + * 126 + * Returns the sequence number for the netlink message. 127 + */ 128 + int iwpm_get_nlmsg_seq(void); 129 + 130 + /** 131 + * iwpm_valid_client - Check if the port mapper client is valid 132 + * @nl_client: The index of the netlink client 133 + * 134 + * Valid clients need to call iwpm_init() before using 135 + * the port mapper 136 + */ 137 + int iwpm_valid_client(u8 nl_client); 138 + 139 + /** 140 + * iwpm_set_valid - Set the port mapper client to valid or not 141 + * @nl_client: The index of the netlink client 142 + * @valid: 1 if valid or 0 if invalid 143 + */ 144 + void iwpm_set_valid(u8 nl_client, int valid); 145 + 146 + /** 147 + * iwpm_registered_client - Check if the port mapper client is registered 148 + * @nl_client: The index of the netlink client 149 + * 150 + * Call iwpm_register_pid() to register a client 151 + */ 152 + int iwpm_registered_client(u8 nl_client); 153 + 154 + /** 155 + * iwpm_set_registered - Set the port mapper client to registered or not 156 + * @nl_client: The index of the netlink client 157 + * @reg: 1 if registered or 0 if not 158 + */ 159 + void iwpm_set_registered(u8 nl_client, int reg); 160 + 161 + /** 162 + * iwpm_send_mapinfo - Send local and mapped IPv4/IPv6 address info of 163 + * a client to the user space port mapper 164 + * @nl_client: The index of the netlink client 165 + * @iwpm_pid: The pid of the user space port mapper 166 + * 167 + * If successful, returns the number of sent mapping info records 168 + */ 169 + int iwpm_send_mapinfo(u8 nl_client, int iwpm_pid); 170 + 171 + /** 172 + * iwpm_mapinfo_available - Check if any mapping info records is available 173 + * in the hash table 174 + * 175 + * Returns 1 if mapping information is available, otherwise returns 0 176 + */ 177 + int iwpm_mapinfo_available(void); 178 + 179 + /** 180 + * iwpm_compare_sockaddr - Compare two sockaddr storage structs 181 + * 182 + * Returns 0 if they are holding the same ip/tcp address info, 183 + * otherwise returns 1 184 + */ 185 + int iwpm_compare_sockaddr(struct sockaddr_storage *a_sockaddr, 186 + struct sockaddr_storage *b_sockaddr); 187 + 188 + /** 189 + * iwpm_validate_nlmsg_attr - Check for NULL netlink attributes 190 + * @nltb: Holds address of each netlink message attributes 191 + * @nla_count: Number of netlink message attributes 192 + * 193 + * Returns error if any of the nla_count attributes is NULL 194 + */ 195 + static inline int iwpm_validate_nlmsg_attr(struct nlattr *nltb[], 196 + int nla_count) 197 + { 198 + int i; 199 + for (i = 1; i < nla_count; i++) { 200 + if (!nltb[i]) 201 + return -EINVAL; 202 + } 203 + return 0; 204 + } 205 + 206 + /** 207 + * iwpm_create_nlmsg - Allocate skb and form a netlink message 208 + * @nl_op: Netlink message opcode 209 + * @nlh: Holds address of the netlink message header in skb 210 + * @nl_client: The index of the netlink client 211 + * 212 + * Returns the newly allcated skb, or NULL if the tailroom of the skb 213 + * is insufficient to store the message header and payload 214 + */ 215 + struct sk_buff *iwpm_create_nlmsg(u32 nl_op, struct nlmsghdr **nlh, 216 + int nl_client); 217 + 218 + /** 219 + * iwpm_parse_nlmsg - Validate and parse the received netlink message 220 + * @cb: Netlink callback structure 221 + * @policy_max: Maximum attribute type to be expected 222 + * @nlmsg_policy: Validation policy 223 + * @nltb: Array to store policy_max parsed elements 224 + * @msg_type: Type of netlink message 225 + * 226 + * Returns 0 on success or a negative error code 227 + */ 228 + int iwpm_parse_nlmsg(struct netlink_callback *cb, int policy_max, 229 + const struct nla_policy *nlmsg_policy, 230 + struct nlattr *nltb[], const char *msg_type); 231 + 232 + /** 233 + * iwpm_print_sockaddr - Print IPv4/IPv6 address and TCP port 234 + * @sockaddr: Socket address to print 235 + * @msg: Message to print 236 + */ 237 + void iwpm_print_sockaddr(struct sockaddr_storage *sockaddr, char *msg); 238 + #endif
+16 -2
drivers/infiniband/core/netlink.c
··· 103 103 EXPORT_SYMBOL(ibnl_remove_client); 104 104 105 105 void *ibnl_put_msg(struct sk_buff *skb, struct nlmsghdr **nlh, int seq, 106 - int len, int client, int op) 106 + int len, int client, int op, int flags) 107 107 { 108 108 unsigned char *prev_tail; 109 109 110 110 prev_tail = skb_tail_pointer(skb); 111 111 *nlh = nlmsg_put(skb, 0, seq, RDMA_NL_GET_TYPE(client, op), 112 - len, NLM_F_MULTI); 112 + len, flags); 113 113 if (!*nlh) 114 114 goto out_nlmsg_trim; 115 115 (*nlh)->nlmsg_len = skb_tail_pointer(skb) - prev_tail; ··· 171 171 netlink_rcv_skb(skb, &ibnl_rcv_msg); 172 172 mutex_unlock(&ibnl_mutex); 173 173 } 174 + 175 + int ibnl_unicast(struct sk_buff *skb, struct nlmsghdr *nlh, 176 + __u32 pid) 177 + { 178 + return nlmsg_unicast(nls, skb, pid); 179 + } 180 + EXPORT_SYMBOL(ibnl_unicast); 181 + 182 + int ibnl_multicast(struct sk_buff *skb, struct nlmsghdr *nlh, 183 + unsigned int group, gfp_t flags) 184 + { 185 + return nlmsg_multicast(nls, skb, 0, group, flags); 186 + } 187 + EXPORT_SYMBOL(ibnl_multicast); 174 188 175 189 int __init ibnl_init(void) 176 190 {
+1 -1
drivers/infiniband/core/sa_query.c
··· 618 618 619 619 static int send_mad(struct ib_sa_query *query, int timeout_ms, gfp_t gfp_mask) 620 620 { 621 - bool preload = gfp_mask & __GFP_WAIT; 621 + bool preload = !!(gfp_mask & __GFP_WAIT); 622 622 unsigned long flags; 623 623 int ret, id; 624 624
+4 -4
drivers/infiniband/core/verbs.c
··· 48 48 49 49 #include "core_priv.h" 50 50 51 - int ib_rate_to_mult(enum ib_rate rate) 51 + __attribute_const__ int ib_rate_to_mult(enum ib_rate rate) 52 52 { 53 53 switch (rate) { 54 54 case IB_RATE_2_5_GBPS: return 1; ··· 65 65 } 66 66 EXPORT_SYMBOL(ib_rate_to_mult); 67 67 68 - enum ib_rate mult_to_ib_rate(int mult) 68 + __attribute_const__ enum ib_rate mult_to_ib_rate(int mult) 69 69 { 70 70 switch (mult) { 71 71 case 1: return IB_RATE_2_5_GBPS; ··· 82 82 } 83 83 EXPORT_SYMBOL(mult_to_ib_rate); 84 84 85 - int ib_rate_to_mbps(enum ib_rate rate) 85 + __attribute_const__ int ib_rate_to_mbps(enum ib_rate rate) 86 86 { 87 87 switch (rate) { 88 88 case IB_RATE_2_5_GBPS: return 2500; ··· 107 107 } 108 108 EXPORT_SYMBOL(ib_rate_to_mbps); 109 109 110 - enum rdma_transport_type 110 + __attribute_const__ enum rdma_transport_type 111 111 rdma_node_get_transport(enum rdma_node_type node_type) 112 112 { 113 113 switch (node_type) {
+12
drivers/infiniband/hw/Makefile
··· 1 + obj-$(CONFIG_INFINIBAND_MTHCA) += mthca/ 2 + obj-$(CONFIG_INFINIBAND_IPATH) += ipath/ 3 + obj-$(CONFIG_INFINIBAND_QIB) += qib/ 4 + obj-$(CONFIG_INFINIBAND_EHCA) += ehca/ 5 + obj-$(CONFIG_INFINIBAND_AMSO1100) += amso1100/ 6 + obj-$(CONFIG_INFINIBAND_CXGB3) += cxgb3/ 7 + obj-$(CONFIG_INFINIBAND_CXGB4) += cxgb4/ 8 + obj-$(CONFIG_MLX4_INFINIBAND) += mlx4/ 9 + obj-$(CONFIG_MLX5_INFINIBAND) += mlx5/ 10 + obj-$(CONFIG_INFINIBAND_NES) += nes/ 11 + obj-$(CONFIG_INFINIBAND_OCRDMA) += ocrdma/ 12 + obj-$(CONFIG_INFINIBAND_USNIC) += usnic/
+2 -4
drivers/infiniband/hw/cxgb3/cxio_hal.c
··· 735 735 ((perm & TPT_MW_BIND) ? F_TPT_MW_BIND_ENABLE : 0) | 736 736 V_TPT_ADDR_TYPE((zbva ? TPT_ZBTO : TPT_VATO)) | 737 737 V_TPT_PAGE_SIZE(page_size)); 738 - tpt.rsvd_pbl_addr = reset_tpt_entry ? 0 : 739 - cpu_to_be32(V_TPT_PBL_ADDR(PBL_OFF(rdev_p, pbl_addr)>>3)); 738 + tpt.rsvd_pbl_addr = cpu_to_be32(V_TPT_PBL_ADDR(PBL_OFF(rdev_p, pbl_addr)>>3)); 740 739 tpt.len = cpu_to_be32(len); 741 740 tpt.va_hi = cpu_to_be32((u32) (to >> 32)); 742 741 tpt.va_low_or_fbo = cpu_to_be32((u32) (to & 0xFFFFFFFFULL)); 743 742 tpt.rsvd_bind_cnt_or_pstag = 0; 744 - tpt.rsvd_pbl_size = reset_tpt_entry ? 0 : 745 - cpu_to_be32(V_TPT_PBL_SIZE(pbl_size >> 2)); 743 + tpt.rsvd_pbl_size = cpu_to_be32(V_TPT_PBL_SIZE(pbl_size >> 2)); 746 744 } 747 745 err = cxio_hal_ctrl_qp_write_mem(rdev_p, 748 746 stag_idx +
+1
drivers/infiniband/hw/cxgb3/iwch_cm.c
··· 418 418 skb->priority = CPL_PRIORITY_DATA; 419 419 set_arp_failure_handler(skb, abort_arp_failure); 420 420 req = (struct cpl_abort_req *) skb_put(skb, sizeof(*req)); 421 + memset(req, 0, sizeof(*req)); 421 422 req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_REQ)); 422 423 req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid)); 423 424 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ABORT_REQ, ep->hwtid));
+157 -40
drivers/infiniband/hw/cxgb4/cm.c
··· 1 1 /* 2 - * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved. 2 + * Copyright (c) 2009-2014 Chelsio, Inc. All rights reserved. 3 3 * 4 4 * This software is available to you under a choice of one of two 5 5 * licenses. You may choose to be licensed under the terms of the GNU ··· 46 46 #include <net/tcp.h> 47 47 #include <net/ip6_route.h> 48 48 #include <net/addrconf.h> 49 + 50 + #include <rdma/ib_addr.h> 49 51 50 52 #include "iw_cxgb4.h" 51 53 ··· 296 294 dst_release(ep->dst); 297 295 cxgb4_l2t_release(ep->l2t); 298 296 } 297 + if (test_bit(RELEASE_MAPINFO, &ep->com.flags)) { 298 + print_addr(&ep->com, __func__, "remove_mapinfo/mapping"); 299 + iwpm_remove_mapinfo(&ep->com.local_addr, 300 + &ep->com.mapped_local_addr); 301 + iwpm_remove_mapping(&ep->com.local_addr, RDMA_NL_C4IW); 302 + } 299 303 kfree(ep); 300 304 } 301 305 ··· 349 341 350 342 static struct net_device *get_real_dev(struct net_device *egress_dev) 351 343 { 352 - struct net_device *phys_dev = egress_dev; 353 - if (egress_dev->priv_flags & IFF_802_1Q_VLAN) 354 - phys_dev = vlan_dev_real_dev(egress_dev); 355 - return phys_dev; 344 + return rdma_vlan_dev_real_dev(egress_dev) ? : egress_dev; 356 345 } 357 346 358 347 static int our_interface(struct c4iw_dev *dev, struct net_device *egress_dev) ··· 533 528 return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t); 534 529 } 535 530 531 + /* 532 + * c4iw_form_pm_msg - Form a port mapper message with mapping info 533 + */ 534 + static void c4iw_form_pm_msg(struct c4iw_ep *ep, 535 + struct iwpm_sa_data *pm_msg) 536 + { 537 + memcpy(&pm_msg->loc_addr, &ep->com.local_addr, 538 + sizeof(ep->com.local_addr)); 539 + memcpy(&pm_msg->rem_addr, &ep->com.remote_addr, 540 + sizeof(ep->com.remote_addr)); 541 + } 542 + 543 + /* 544 + * c4iw_form_reg_msg - Form a port mapper message with dev info 545 + */ 546 + static void c4iw_form_reg_msg(struct c4iw_dev *dev, 547 + struct iwpm_dev_data *pm_msg) 548 + { 549 + memcpy(pm_msg->dev_name, dev->ibdev.name, IWPM_DEVNAME_SIZE); 550 + memcpy(pm_msg->if_name, dev->rdev.lldi.ports[0]->name, 551 + IWPM_IFNAME_SIZE); 552 + } 553 + 554 + static void c4iw_record_pm_msg(struct c4iw_ep *ep, 555 + struct iwpm_sa_data *pm_msg) 556 + { 557 + memcpy(&ep->com.mapped_local_addr, &pm_msg->mapped_loc_addr, 558 + sizeof(ep->com.mapped_local_addr)); 559 + memcpy(&ep->com.mapped_remote_addr, &pm_msg->mapped_rem_addr, 560 + sizeof(ep->com.mapped_remote_addr)); 561 + } 562 + 536 563 static int send_connect(struct c4iw_ep *ep) 537 564 { 538 565 struct cpl_act_open_req *req; ··· 583 546 int sizev6 = is_t4(ep->com.dev->rdev.lldi.adapter_type) ? 584 547 sizeof(struct cpl_act_open_req6) : 585 548 sizeof(struct cpl_t5_act_open_req6); 586 - struct sockaddr_in *la = (struct sockaddr_in *)&ep->com.local_addr; 587 - struct sockaddr_in *ra = (struct sockaddr_in *)&ep->com.remote_addr; 588 - struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)&ep->com.local_addr; 589 - struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)&ep->com.remote_addr; 549 + struct sockaddr_in *la = (struct sockaddr_in *) 550 + &ep->com.mapped_local_addr; 551 + struct sockaddr_in *ra = (struct sockaddr_in *) 552 + &ep->com.mapped_remote_addr; 553 + struct sockaddr_in6 *la6 = (struct sockaddr_in6 *) 554 + &ep->com.mapped_local_addr; 555 + struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *) 556 + &ep->com.mapped_remote_addr; 590 557 591 558 wrlen = (ep->com.remote_addr.ss_family == AF_INET) ? 592 559 roundup(sizev4, 16) : ··· 1668 1627 req->le.filter = cpu_to_be32(cxgb4_select_ntuple( 1669 1628 ep->com.dev->rdev.lldi.ports[0], 1670 1629 ep->l2t)); 1671 - sin = (struct sockaddr_in *)&ep->com.local_addr; 1630 + sin = (struct sockaddr_in *)&ep->com.mapped_local_addr; 1672 1631 req->le.lport = sin->sin_port; 1673 1632 req->le.u.ipv4.lip = sin->sin_addr.s_addr; 1674 - sin = (struct sockaddr_in *)&ep->com.remote_addr; 1633 + sin = (struct sockaddr_in *)&ep->com.mapped_remote_addr; 1675 1634 req->le.pport = sin->sin_port; 1676 1635 req->le.u.ipv4.pip = sin->sin_addr.s_addr; 1677 1636 req->tcb.t_state_to_astid = ··· 1787 1746 if (!ep->l2t) 1788 1747 goto out; 1789 1748 ep->mtu = dst_mtu(dst); 1790 - ep->tx_chan = cxgb4_port_chan(n->dev); 1791 - ep->smac_idx = (cxgb4_port_viid(n->dev) & 0x7F) << 1; 1749 + ep->tx_chan = cxgb4_port_chan(pdev); 1750 + ep->smac_idx = (cxgb4_port_viid(pdev) & 0x7F) << 1; 1792 1751 step = cdev->rdev.lldi.ntxq / 1793 1752 cdev->rdev.lldi.nchan; 1794 - ep->txq_idx = cxgb4_port_idx(n->dev) * step; 1795 - ep->ctrlq_idx = cxgb4_port_idx(n->dev); 1753 + ep->txq_idx = cxgb4_port_idx(pdev) * step; 1754 + ep->ctrlq_idx = cxgb4_port_idx(pdev); 1796 1755 step = cdev->rdev.lldi.nrxq / 1797 1756 cdev->rdev.lldi.nchan; 1798 1757 ep->rss_qid = cdev->rdev.lldi.rxq_ids[ 1799 - cxgb4_port_idx(n->dev) * step]; 1758 + cxgb4_port_idx(pdev) * step]; 1800 1759 1801 1760 if (clear_mpa_v1) { 1802 1761 ep->retry_with_mpa_v1 = 0; ··· 1911 1870 struct sockaddr_in6 *ra6; 1912 1871 1913 1872 ep = lookup_atid(t, atid); 1914 - la = (struct sockaddr_in *)&ep->com.local_addr; 1915 - ra = (struct sockaddr_in *)&ep->com.remote_addr; 1916 - la6 = (struct sockaddr_in6 *)&ep->com.local_addr; 1917 - ra6 = (struct sockaddr_in6 *)&ep->com.remote_addr; 1873 + la = (struct sockaddr_in *)&ep->com.mapped_local_addr; 1874 + ra = (struct sockaddr_in *)&ep->com.mapped_remote_addr; 1875 + la6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr; 1876 + ra6 = (struct sockaddr_in6 *)&ep->com.mapped_remote_addr; 1918 1877 1919 1878 PDBG("%s ep %p atid %u status %u errno %d\n", __func__, ep, atid, 1920 1879 status, status2errno(status)); ··· 2771 2730 struct c4iw_dev *dev = to_c4iw_dev(cm_id->device); 2772 2731 struct c4iw_ep *ep; 2773 2732 int err = 0; 2774 - struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr; 2775 - struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr; 2776 - struct sockaddr_in6 *laddr6 = (struct sockaddr_in6 *)&cm_id->local_addr; 2777 - struct sockaddr_in6 *raddr6 = (struct sockaddr_in6 *) 2778 - &cm_id->remote_addr; 2733 + struct sockaddr_in *laddr; 2734 + struct sockaddr_in *raddr; 2735 + struct sockaddr_in6 *laddr6; 2736 + struct sockaddr_in6 *raddr6; 2737 + struct iwpm_dev_data pm_reg_msg; 2738 + struct iwpm_sa_data pm_msg; 2779 2739 __u8 *ra; 2780 2740 int iptype; 2741 + int iwpm_err = 0; 2781 2742 2782 2743 if ((conn_param->ord > c4iw_max_read_depth) || 2783 2744 (conn_param->ird > c4iw_max_read_depth)) { ··· 2810 2767 if (!ep->com.qp) { 2811 2768 PDBG("%s qpn 0x%x not found!\n", __func__, conn_param->qpn); 2812 2769 err = -EINVAL; 2813 - goto fail2; 2770 + goto fail1; 2814 2771 } 2815 2772 ref_qp(ep); 2816 2773 PDBG("%s qpn 0x%x qp %p cm_id %p\n", __func__, conn_param->qpn, ··· 2823 2780 if (ep->atid == -1) { 2824 2781 printk(KERN_ERR MOD "%s - cannot alloc atid.\n", __func__); 2825 2782 err = -ENOMEM; 2826 - goto fail2; 2783 + goto fail1; 2827 2784 } 2828 2785 insert_handle(dev, &dev->atid_idr, ep, ep->atid); 2786 + 2787 + memcpy(&ep->com.local_addr, &cm_id->local_addr, 2788 + sizeof(ep->com.local_addr)); 2789 + memcpy(&ep->com.remote_addr, &cm_id->remote_addr, 2790 + sizeof(ep->com.remote_addr)); 2791 + 2792 + /* No port mapper available, go with the specified peer information */ 2793 + memcpy(&ep->com.mapped_local_addr, &cm_id->local_addr, 2794 + sizeof(ep->com.mapped_local_addr)); 2795 + memcpy(&ep->com.mapped_remote_addr, &cm_id->remote_addr, 2796 + sizeof(ep->com.mapped_remote_addr)); 2797 + 2798 + c4iw_form_reg_msg(dev, &pm_reg_msg); 2799 + iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_C4IW); 2800 + if (iwpm_err) { 2801 + PDBG("%s: Port Mapper reg pid fail (err = %d).\n", 2802 + __func__, iwpm_err); 2803 + } 2804 + if (iwpm_valid_pid() && !iwpm_err) { 2805 + c4iw_form_pm_msg(ep, &pm_msg); 2806 + iwpm_err = iwpm_add_and_query_mapping(&pm_msg, RDMA_NL_C4IW); 2807 + if (iwpm_err) 2808 + PDBG("%s: Port Mapper query fail (err = %d).\n", 2809 + __func__, iwpm_err); 2810 + else 2811 + c4iw_record_pm_msg(ep, &pm_msg); 2812 + } 2813 + if (iwpm_create_mapinfo(&ep->com.local_addr, 2814 + &ep->com.mapped_local_addr, RDMA_NL_C4IW)) { 2815 + iwpm_remove_mapping(&ep->com.local_addr, RDMA_NL_C4IW); 2816 + err = -ENOMEM; 2817 + goto fail1; 2818 + } 2819 + print_addr(&ep->com, __func__, "add_query/create_mapinfo"); 2820 + set_bit(RELEASE_MAPINFO, &ep->com.flags); 2821 + 2822 + laddr = (struct sockaddr_in *)&ep->com.mapped_local_addr; 2823 + raddr = (struct sockaddr_in *)&ep->com.mapped_remote_addr; 2824 + laddr6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr; 2825 + raddr6 = (struct sockaddr_in6 *) &ep->com.mapped_remote_addr; 2829 2826 2830 2827 if (cm_id->remote_addr.ss_family == AF_INET) { 2831 2828 iptype = 4; ··· 2877 2794 if ((__force int)raddr->sin_addr.s_addr == INADDR_ANY) { 2878 2795 err = pick_local_ipaddrs(dev, cm_id); 2879 2796 if (err) 2880 - goto fail2; 2797 + goto fail1; 2881 2798 } 2882 2799 2883 2800 /* find a route */ ··· 2897 2814 if (ipv6_addr_type(&raddr6->sin6_addr) == IPV6_ADDR_ANY) { 2898 2815 err = pick_local_ip6addrs(dev, cm_id); 2899 2816 if (err) 2900 - goto fail2; 2817 + goto fail1; 2901 2818 } 2902 2819 2903 2820 /* find a route */ ··· 2913 2830 if (!ep->dst) { 2914 2831 printk(KERN_ERR MOD "%s - cannot find route.\n", __func__); 2915 2832 err = -EHOSTUNREACH; 2916 - goto fail3; 2833 + goto fail2; 2917 2834 } 2918 2835 2919 2836 err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, true); 2920 2837 if (err) { 2921 2838 printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__); 2922 - goto fail4; 2839 + goto fail3; 2923 2840 } 2924 2841 2925 2842 PDBG("%s txq_idx %u tx_chan %u smac_idx %u rss_qid %u l2t_idx %u\n", ··· 2928 2845 2929 2846 state_set(&ep->com, CONNECTING); 2930 2847 ep->tos = 0; 2931 - memcpy(&ep->com.local_addr, &cm_id->local_addr, 2932 - sizeof(ep->com.local_addr)); 2933 - memcpy(&ep->com.remote_addr, &cm_id->remote_addr, 2934 - sizeof(ep->com.remote_addr)); 2935 2848 2936 2849 /* send connect request to rnic */ 2937 2850 err = send_connect(ep); ··· 2935 2856 goto out; 2936 2857 2937 2858 cxgb4_l2t_release(ep->l2t); 2938 - fail4: 2939 - dst_release(ep->dst); 2940 2859 fail3: 2860 + dst_release(ep->dst); 2861 + fail2: 2941 2862 remove_handle(ep->com.dev, &ep->com.dev->atid_idr, ep->atid); 2942 2863 cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid); 2943 - fail2: 2864 + fail1: 2944 2865 cm_id->rem_ref(cm_id); 2945 2866 c4iw_put_ep(&ep->com); 2946 2867 out: ··· 2950 2871 static int create_server6(struct c4iw_dev *dev, struct c4iw_listen_ep *ep) 2951 2872 { 2952 2873 int err; 2953 - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ep->com.local_addr; 2874 + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) 2875 + &ep->com.mapped_local_addr; 2954 2876 2955 2877 c4iw_init_wr_wait(&ep->com.wr_wait); 2956 2878 err = cxgb4_create_server6(ep->com.dev->rdev.lldi.ports[0], ··· 2972 2892 static int create_server4(struct c4iw_dev *dev, struct c4iw_listen_ep *ep) 2973 2893 { 2974 2894 int err; 2975 - struct sockaddr_in *sin = (struct sockaddr_in *)&ep->com.local_addr; 2895 + struct sockaddr_in *sin = (struct sockaddr_in *) 2896 + &ep->com.mapped_local_addr; 2976 2897 2977 2898 if (dev->rdev.lldi.enable_fw_ofld_conn) { 2978 2899 do { ··· 3008 2927 int err = 0; 3009 2928 struct c4iw_dev *dev = to_c4iw_dev(cm_id->device); 3010 2929 struct c4iw_listen_ep *ep; 2930 + struct iwpm_dev_data pm_reg_msg; 2931 + struct iwpm_sa_data pm_msg; 2932 + int iwpm_err = 0; 3011 2933 3012 2934 might_sleep(); 3013 2935 ··· 3045 2961 goto fail2; 3046 2962 } 3047 2963 insert_handle(dev, &dev->stid_idr, ep, ep->stid); 2964 + 2965 + /* No port mapper available, go with the specified info */ 2966 + memcpy(&ep->com.mapped_local_addr, &cm_id->local_addr, 2967 + sizeof(ep->com.mapped_local_addr)); 2968 + 2969 + c4iw_form_reg_msg(dev, &pm_reg_msg); 2970 + iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_C4IW); 2971 + if (iwpm_err) { 2972 + PDBG("%s: Port Mapper reg pid fail (err = %d).\n", 2973 + __func__, iwpm_err); 2974 + } 2975 + if (iwpm_valid_pid() && !iwpm_err) { 2976 + memcpy(&pm_msg.loc_addr, &ep->com.local_addr, 2977 + sizeof(ep->com.local_addr)); 2978 + iwpm_err = iwpm_add_mapping(&pm_msg, RDMA_NL_C4IW); 2979 + if (iwpm_err) 2980 + PDBG("%s: Port Mapper query fail (err = %d).\n", 2981 + __func__, iwpm_err); 2982 + else 2983 + memcpy(&ep->com.mapped_local_addr, 2984 + &pm_msg.mapped_loc_addr, 2985 + sizeof(ep->com.mapped_local_addr)); 2986 + } 2987 + if (iwpm_create_mapinfo(&ep->com.local_addr, 2988 + &ep->com.mapped_local_addr, RDMA_NL_C4IW)) { 2989 + err = -ENOMEM; 2990 + goto fail3; 2991 + } 2992 + print_addr(&ep->com, __func__, "add_mapping/create_mapinfo"); 2993 + 2994 + set_bit(RELEASE_MAPINFO, &ep->com.flags); 3048 2995 state_set(&ep->com, LISTEN); 3049 2996 if (ep->com.local_addr.ss_family == AF_INET) 3050 2997 err = create_server4(dev, ep); ··· 3085 2970 cm_id->provider_data = ep; 3086 2971 goto out; 3087 2972 } 2973 + 2974 + fail3: 3088 2975 cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid, 3089 2976 ep->com.local_addr.ss_family); 3090 2977 fail2:
+2 -2
drivers/infiniband/hw/cxgb4/cq.c
··· 940 940 if (!mm2) 941 941 goto err4; 942 942 943 - memset(&uresp, 0, sizeof(uresp)); 944 943 uresp.qid_mask = rhp->rdev.cqmask; 945 944 uresp.cqid = chp->cq.cqid; 946 945 uresp.size = chp->cq.size; ··· 950 951 uresp.gts_key = ucontext->key; 951 952 ucontext->key += PAGE_SIZE; 952 953 spin_unlock(&ucontext->mmap_lock); 953 - ret = ib_copy_to_udata(udata, &uresp, sizeof uresp); 954 + ret = ib_copy_to_udata(udata, &uresp, 955 + sizeof(uresp) - sizeof(uresp.reserved)); 954 956 if (ret) 955 957 goto err5; 956 958
+71 -12
drivers/infiniband/hw/cxgb4/device.c
··· 77 77 int pos; 78 78 }; 79 79 80 + /* registered cxgb4 netlink callbacks */ 81 + static struct ibnl_client_cbs c4iw_nl_cb_table[] = { 82 + [RDMA_NL_IWPM_REG_PID] = {.dump = iwpm_register_pid_cb}, 83 + [RDMA_NL_IWPM_ADD_MAPPING] = {.dump = iwpm_add_mapping_cb}, 84 + [RDMA_NL_IWPM_QUERY_MAPPING] = {.dump = iwpm_add_and_query_mapping_cb}, 85 + [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb}, 86 + [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb}, 87 + [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb} 88 + }; 89 + 80 90 static int count_idrs(int id, void *p, void *data) 81 91 { 82 92 int *countp = data; ··· 123 113 &qp->ep->com.local_addr; 124 114 struct sockaddr_in *rsin = (struct sockaddr_in *) 125 115 &qp->ep->com.remote_addr; 116 + struct sockaddr_in *mapped_lsin = (struct sockaddr_in *) 117 + &qp->ep->com.mapped_local_addr; 118 + struct sockaddr_in *mapped_rsin = (struct sockaddr_in *) 119 + &qp->ep->com.mapped_remote_addr; 126 120 127 121 cc = snprintf(qpd->buf + qpd->pos, space, 128 122 "rc qp sq id %u rq id %u state %u " 129 123 "onchip %u ep tid %u state %u " 130 - "%pI4:%u->%pI4:%u\n", 124 + "%pI4:%u/%u->%pI4:%u/%u\n", 131 125 qp->wq.sq.qid, qp->wq.rq.qid, 132 126 (int)qp->attr.state, 133 127 qp->wq.sq.flags & T4_SQ_ONCHIP, 134 128 qp->ep->hwtid, (int)qp->ep->com.state, 135 129 &lsin->sin_addr, ntohs(lsin->sin_port), 136 - &rsin->sin_addr, ntohs(rsin->sin_port)); 130 + ntohs(mapped_lsin->sin_port), 131 + &rsin->sin_addr, ntohs(rsin->sin_port), 132 + ntohs(mapped_rsin->sin_port)); 137 133 } else { 138 134 struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *) 139 135 &qp->ep->com.local_addr; 140 136 struct sockaddr_in6 *rsin6 = (struct sockaddr_in6 *) 141 137 &qp->ep->com.remote_addr; 138 + struct sockaddr_in6 *mapped_lsin6 = 139 + (struct sockaddr_in6 *) 140 + &qp->ep->com.mapped_local_addr; 141 + struct sockaddr_in6 *mapped_rsin6 = 142 + (struct sockaddr_in6 *) 143 + &qp->ep->com.mapped_remote_addr; 142 144 143 145 cc = snprintf(qpd->buf + qpd->pos, space, 144 146 "rc qp sq id %u rq id %u state %u " 145 147 "onchip %u ep tid %u state %u " 146 - "%pI6:%u->%pI6:%u\n", 148 + "%pI6:%u/%u->%pI6:%u/%u\n", 147 149 qp->wq.sq.qid, qp->wq.rq.qid, 148 150 (int)qp->attr.state, 149 151 qp->wq.sq.flags & T4_SQ_ONCHIP, 150 152 qp->ep->hwtid, (int)qp->ep->com.state, 151 153 &lsin6->sin6_addr, 152 154 ntohs(lsin6->sin6_port), 155 + ntohs(mapped_lsin6->sin6_port), 153 156 &rsin6->sin6_addr, 154 - ntohs(rsin6->sin6_port)); 157 + ntohs(rsin6->sin6_port), 158 + ntohs(mapped_rsin6->sin6_port)); 155 159 } 156 160 } else 157 161 cc = snprintf(qpd->buf + qpd->pos, space, ··· 410 386 &ep->com.local_addr; 411 387 struct sockaddr_in *rsin = (struct sockaddr_in *) 412 388 &ep->com.remote_addr; 389 + struct sockaddr_in *mapped_lsin = (struct sockaddr_in *) 390 + &ep->com.mapped_local_addr; 391 + struct sockaddr_in *mapped_rsin = (struct sockaddr_in *) 392 + &ep->com.mapped_remote_addr; 413 393 414 394 cc = snprintf(epd->buf + epd->pos, space, 415 395 "ep %p cm_id %p qp %p state %d flags 0x%lx " 416 396 "history 0x%lx hwtid %d atid %d " 417 - "%pI4:%d <-> %pI4:%d\n", 397 + "%pI4:%d/%d <-> %pI4:%d/%d\n", 418 398 ep, ep->com.cm_id, ep->com.qp, 419 399 (int)ep->com.state, ep->com.flags, 420 400 ep->com.history, ep->hwtid, ep->atid, 421 401 &lsin->sin_addr, ntohs(lsin->sin_port), 422 - &rsin->sin_addr, ntohs(rsin->sin_port)); 402 + ntohs(mapped_lsin->sin_port), 403 + &rsin->sin_addr, ntohs(rsin->sin_port), 404 + ntohs(mapped_rsin->sin_port)); 423 405 } else { 424 406 struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *) 425 407 &ep->com.local_addr; 426 408 struct sockaddr_in6 *rsin6 = (struct sockaddr_in6 *) 427 409 &ep->com.remote_addr; 410 + struct sockaddr_in6 *mapped_lsin6 = (struct sockaddr_in6 *) 411 + &ep->com.mapped_local_addr; 412 + struct sockaddr_in6 *mapped_rsin6 = (struct sockaddr_in6 *) 413 + &ep->com.mapped_remote_addr; 428 414 429 415 cc = snprintf(epd->buf + epd->pos, space, 430 416 "ep %p cm_id %p qp %p state %d flags 0x%lx " 431 417 "history 0x%lx hwtid %d atid %d " 432 - "%pI6:%d <-> %pI6:%d\n", 418 + "%pI6:%d/%d <-> %pI6:%d/%d\n", 433 419 ep, ep->com.cm_id, ep->com.qp, 434 420 (int)ep->com.state, ep->com.flags, 435 421 ep->com.history, ep->hwtid, ep->atid, 436 422 &lsin6->sin6_addr, ntohs(lsin6->sin6_port), 437 - &rsin6->sin6_addr, ntohs(rsin6->sin6_port)); 423 + ntohs(mapped_lsin6->sin6_port), 424 + &rsin6->sin6_addr, ntohs(rsin6->sin6_port), 425 + ntohs(mapped_rsin6->sin6_port)); 438 426 } 439 427 if (cc < space) 440 428 epd->pos += cc; ··· 467 431 if (ep->com.local_addr.ss_family == AF_INET) { 468 432 struct sockaddr_in *lsin = (struct sockaddr_in *) 469 433 &ep->com.local_addr; 434 + struct sockaddr_in *mapped_lsin = (struct sockaddr_in *) 435 + &ep->com.mapped_local_addr; 470 436 471 437 cc = snprintf(epd->buf + epd->pos, space, 472 438 "ep %p cm_id %p state %d flags 0x%lx stid %d " 473 - "backlog %d %pI4:%d\n", 439 + "backlog %d %pI4:%d/%d\n", 474 440 ep, ep->com.cm_id, (int)ep->com.state, 475 441 ep->com.flags, ep->stid, ep->backlog, 476 - &lsin->sin_addr, ntohs(lsin->sin_port)); 442 + &lsin->sin_addr, ntohs(lsin->sin_port), 443 + ntohs(mapped_lsin->sin_port)); 477 444 } else { 478 445 struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *) 479 446 &ep->com.local_addr; 447 + struct sockaddr_in6 *mapped_lsin6 = (struct sockaddr_in6 *) 448 + &ep->com.mapped_local_addr; 480 449 481 450 cc = snprintf(epd->buf + epd->pos, space, 482 451 "ep %p cm_id %p state %d flags 0x%lx stid %d " 483 - "backlog %d %pI6:%d\n", 452 + "backlog %d %pI6:%d/%d\n", 484 453 ep, ep->com.cm_id, (int)ep->com.state, 485 454 ep->com.flags, ep->stid, ep->backlog, 486 - &lsin6->sin6_addr, ntohs(lsin6->sin6_port)); 455 + &lsin6->sin6_addr, ntohs(lsin6->sin6_port), 456 + ntohs(mapped_lsin6->sin6_port)); 487 457 } 488 458 if (cc < space) 489 459 epd->pos += cc; ··· 729 687 if (ctx->dev->rdev.oc_mw_kva) 730 688 iounmap(ctx->dev->rdev.oc_mw_kva); 731 689 ib_dealloc_device(&ctx->dev->ibdev); 690 + iwpm_exit(RDMA_NL_C4IW); 732 691 ctx->dev = NULL; 733 692 } 734 693 ··· 779 736 pci_resource_len(devp->rdev.lldi.pdev, 2)); 780 737 if (!devp->rdev.bar2_kva) { 781 738 pr_err(MOD "Unable to ioremap BAR2\n"); 739 + ib_dealloc_device(&devp->ibdev); 782 740 return ERR_PTR(-EINVAL); 783 741 } 784 742 } else if (ocqp_supported(infop)) { ··· 791 747 devp->rdev.lldi.vr->ocq.size); 792 748 if (!devp->rdev.oc_mw_kva) { 793 749 pr_err(MOD "Unable to ioremap onchip mem\n"); 750 + ib_dealloc_device(&devp->ibdev); 794 751 return ERR_PTR(-EINVAL); 795 752 } 796 753 } ··· 825 780 c4iw_debugfs_root); 826 781 setup_debugfs(devp); 827 782 } 783 + 784 + ret = iwpm_init(RDMA_NL_C4IW); 785 + if (ret) { 786 + pr_err("port mapper initialization failed with %d\n", ret); 787 + ib_dealloc_device(&devp->ibdev); 788 + return ERR_PTR(ret); 789 + } 790 + 828 791 return devp; 829 792 } 830 793 ··· 1327 1274 printk(KERN_WARNING MOD 1328 1275 "could not create debugfs entry, continuing\n"); 1329 1276 1277 + if (ibnl_add_client(RDMA_NL_C4IW, RDMA_NL_IWPM_NUM_OPS, 1278 + c4iw_nl_cb_table)) 1279 + pr_err("%s[%u]: Failed to add netlink callback\n" 1280 + , __func__, __LINE__); 1281 + 1330 1282 cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info); 1331 1283 1332 1284 return 0; ··· 1349 1291 } 1350 1292 mutex_unlock(&dev_mutex); 1351 1293 cxgb4_unregister_uld(CXGB4_ULD_RDMA); 1294 + ibnl_remove_client(RDMA_NL_C4IW); 1352 1295 c4iw_cm_term(); 1353 1296 debugfs_remove_recursive(c4iw_debugfs_root); 1354 1297 }
+44
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
··· 52 52 53 53 #include <rdma/ib_verbs.h> 54 54 #include <rdma/iw_cm.h> 55 + #include <rdma/rdma_netlink.h> 56 + #include <rdma/iw_portmap.h> 55 57 56 58 #include "cxgb4.h" 57 59 #include "cxgb4_uld.h" ··· 730 728 CLOSE_SENT = 3, 731 729 TIMEOUT = 4, 732 730 QP_REFERENCED = 5, 731 + RELEASE_MAPINFO = 6, 733 732 }; 734 733 735 734 enum c4iw_ep_history { ··· 767 764 struct mutex mutex; 768 765 struct sockaddr_storage local_addr; 769 766 struct sockaddr_storage remote_addr; 767 + struct sockaddr_storage mapped_local_addr; 768 + struct sockaddr_storage mapped_remote_addr; 770 769 struct c4iw_wr_wait wr_wait; 771 770 unsigned long flags; 772 771 unsigned long history; ··· 811 806 u8 tried_with_mpa_v1; 812 807 unsigned int retry_count; 813 808 }; 809 + 810 + static inline void print_addr(struct c4iw_ep_common *epc, const char *func, 811 + const char *msg) 812 + { 813 + 814 + #define SINA(a) (&(((struct sockaddr_in *)(a))->sin_addr.s_addr)) 815 + #define SINP(a) ntohs(((struct sockaddr_in *)(a))->sin_port) 816 + #define SIN6A(a) (&(((struct sockaddr_in6 *)(a))->sin6_addr)) 817 + #define SIN6P(a) ntohs(((struct sockaddr_in6 *)(a))->sin6_port) 818 + 819 + if (c4iw_debug) { 820 + switch (epc->local_addr.ss_family) { 821 + case AF_INET: 822 + PDBG("%s %s %pI4:%u/%u <-> %pI4:%u/%u\n", 823 + func, msg, SINA(&epc->local_addr), 824 + SINP(&epc->local_addr), 825 + SINP(&epc->mapped_local_addr), 826 + SINA(&epc->remote_addr), 827 + SINP(&epc->remote_addr), 828 + SINP(&epc->mapped_remote_addr)); 829 + break; 830 + case AF_INET6: 831 + PDBG("%s %s %pI6:%u/%u <-> %pI6:%u/%u\n", 832 + func, msg, SIN6A(&epc->local_addr), 833 + SIN6P(&epc->local_addr), 834 + SIN6P(&epc->mapped_local_addr), 835 + SIN6A(&epc->remote_addr), 836 + SIN6P(&epc->remote_addr), 837 + SIN6P(&epc->mapped_remote_addr)); 838 + break; 839 + default: 840 + break; 841 + } 842 + } 843 + #undef SINA 844 + #undef SINP 845 + #undef SIN6A 846 + #undef SIN6P 847 + } 814 848 815 849 static inline struct c4iw_ep *to_ep(struct iw_cm_id *cm_id) 816 850 {
+3 -2
drivers/infiniband/hw/cxgb4/provider.c
··· 122 122 INIT_LIST_HEAD(&context->mmaps); 123 123 spin_lock_init(&context->mmap_lock); 124 124 125 - if (udata->outlen < sizeof(uresp)) { 125 + if (udata->outlen < sizeof(uresp) - sizeof(uresp.reserved)) { 126 126 if (!warned++) 127 127 pr_err(MOD "Warning - downlevel libcxgb4 (non-fatal), device status page disabled."); 128 128 rhp->rdev.flags |= T4_STATUS_PAGE_DISABLED; ··· 140 140 context->key += PAGE_SIZE; 141 141 spin_unlock(&context->mmap_lock); 142 142 143 - ret = ib_copy_to_udata(udata, &uresp, sizeof(uresp)); 143 + ret = ib_copy_to_udata(udata, &uresp, 144 + sizeof(uresp) - sizeof(uresp.reserved)); 144 145 if (ret) 145 146 goto err_mm; 146 147
+2
drivers/infiniband/hw/cxgb4/user.h
··· 48 48 __u32 cqid; 49 49 __u32 size; 50 50 __u32 qid_mask; 51 + __u32 reserved; /* explicit padding (optional for i386) */ 51 52 }; 52 53 53 54 ··· 75 74 struct c4iw_alloc_ucontext_resp { 76 75 __u64 status_page_key; 77 76 __u32 status_page_size; 77 + __u32 reserved; /* explicit padding (optional for i386) */ 78 78 }; 79 79 #endif
+4
drivers/infiniband/hw/ipath/ipath_diag.c
··· 346 346 ret = -EFAULT; 347 347 goto bail; 348 348 } 349 + dp.len = odp.len; 350 + dp.unit = odp.unit; 351 + dp.data = odp.data; 352 + dp.pbc_wd = 0; 349 353 } else { 350 354 ret = -EINVAL; 351 355 goto bail;
+2 -2
drivers/infiniband/hw/ipath/ipath_intr.c
··· 70 70 if (sbuf[0] || sbuf[1] || (piobcnt > 128 && (sbuf[2] || sbuf[3]))) { 71 71 int i; 72 72 if (ipath_debug & (__IPATH_PKTDBG|__IPATH_DBG) && 73 - dd->ipath_lastcancel > jiffies) { 73 + time_after(dd->ipath_lastcancel, jiffies)) { 74 74 __IPATH_DBG_WHICH(__IPATH_PKTDBG|__IPATH_DBG, 75 75 "SendbufErrs %lx %lx", sbuf[0], 76 76 sbuf[1]); ··· 755 755 756 756 /* likely due to cancel; so suppress message unless verbose */ 757 757 if ((errs & (INFINIPATH_E_SPKTLEN | INFINIPATH_E_SPIOARMLAUNCH)) && 758 - dd->ipath_lastcancel > jiffies) { 758 + time_after(dd->ipath_lastcancel, jiffies)) { 759 759 /* armlaunch takes precedence; it often causes both. */ 760 760 ipath_cdbg(VERBOSE, 761 761 "Suppressed %s error (%llx) after sendbuf cancel\n",
+2 -2
drivers/infiniband/hw/ipath/ipath_sdma.c
··· 247 247 248 248 /* ipath_sdma_abort() is done, waiting for interrupt */ 249 249 if (status == IPATH_SDMA_ABORT_DISARMED) { 250 - if (jiffies < dd->ipath_sdma_abort_intr_timeout) 250 + if (time_before(jiffies, dd->ipath_sdma_abort_intr_timeout)) 251 251 goto resched_noprint; 252 252 /* give up, intr got lost somewhere */ 253 253 ipath_dbg("give up waiting for SDMADISABLED intr\n"); ··· 341 341 * JAG - this is bad to just have default be a loop without 342 342 * state change 343 343 */ 344 - if (jiffies > dd->ipath_sdma_abort_jiffies) { 344 + if (time_after(jiffies, dd->ipath_sdma_abort_jiffies)) { 345 345 ipath_dbg("looping with status 0x%08lx\n", 346 346 dd->ipath_sdma_status); 347 347 dd->ipath_sdma_abort_jiffies = jiffies + 5 * HZ;
+1 -1
drivers/infiniband/hw/mlx4/ah.c
··· 73 73 { 74 74 struct mlx4_ib_dev *ibdev = to_mdev(pd->device); 75 75 struct mlx4_dev *dev = ibdev->dev; 76 - int is_mcast; 76 + int is_mcast = 0; 77 77 struct in6_addr in6; 78 78 u16 vlan_tag; 79 79
+3 -3
drivers/infiniband/hw/mlx4/cq.c
··· 102 102 int err; 103 103 104 104 err = mlx4_buf_alloc(dev->dev, nent * dev->dev->caps.cqe_size, 105 - PAGE_SIZE * 2, &buf->buf); 105 + PAGE_SIZE * 2, &buf->buf, GFP_KERNEL); 106 106 107 107 if (err) 108 108 goto out; ··· 113 113 if (err) 114 114 goto err_buf; 115 115 116 - err = mlx4_buf_write_mtt(dev->dev, &buf->mtt, &buf->buf); 116 + err = mlx4_buf_write_mtt(dev->dev, &buf->mtt, &buf->buf, GFP_KERNEL); 117 117 if (err) 118 118 goto err_mtt; 119 119 ··· 209 209 210 210 uar = &to_mucontext(context)->uar; 211 211 } else { 212 - err = mlx4_db_alloc(dev->dev, &cq->db, 1); 212 + err = mlx4_db_alloc(dev->dev, &cq->db, 1, GFP_KERNEL); 213 213 if (err) 214 214 goto err_cq; 215 215
+24 -16
drivers/infiniband/hw/mlx4/mad.c
··· 478 478 if (!tun_ctx || tun_ctx->state != DEMUX_PV_STATE_ACTIVE) 479 479 return -EAGAIN; 480 480 481 - /* QP0 forwarding only for Dom0 */ 482 - if (!dest_qpt && (mlx4_master_func_num(dev->dev) != slave)) 483 - return -EINVAL; 484 - 485 481 if (!dest_qpt) 486 482 tun_qp = &tun_ctx->qp[0]; 487 483 else ··· 663 667 } 664 668 /* Class-specific handling */ 665 669 switch (mad->mad_hdr.mgmt_class) { 670 + case IB_MGMT_CLASS_SUBN_LID_ROUTED: 671 + case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE: 672 + /* 255 indicates the dom0 */ 673 + if (slave != 255 && slave != mlx4_master_func_num(dev->dev)) { 674 + if (!mlx4_vf_smi_enabled(dev->dev, slave, port)) 675 + return -EPERM; 676 + /* for a VF. drop unsolicited MADs */ 677 + if (!(mad->mad_hdr.method & IB_MGMT_METHOD_RESP)) { 678 + mlx4_ib_warn(ibdev, "demux QP0. rejecting unsolicited mad for slave %d class 0x%x, method 0x%x\n", 679 + slave, mad->mad_hdr.mgmt_class, 680 + mad->mad_hdr.method); 681 + return -EINVAL; 682 + } 683 + } 684 + break; 666 685 case IB_MGMT_CLASS_SUBN_ADM: 667 686 if (mlx4_ib_demux_sa_handler(ibdev, port, slave, 668 687 (struct ib_sa_mad *) mad)) ··· 1176 1165 if (!sqp_ctx || sqp_ctx->state != DEMUX_PV_STATE_ACTIVE) 1177 1166 return -EAGAIN; 1178 1167 1179 - /* QP0 forwarding only for Dom0 */ 1180 - if (dest_qpt == IB_QPT_SMI && (mlx4_master_func_num(dev->dev) != slave)) 1181 - return -EINVAL; 1182 - 1183 1168 if (dest_qpt == IB_QPT_SMI) { 1184 1169 src_qpnum = 0; 1185 1170 sqp = &sqp_ctx->qp[0]; ··· 1292 1285 "belongs to another slave\n", wc->src_qp); 1293 1286 return; 1294 1287 } 1295 - if (slave != mlx4_master_func_num(dev->dev) && !(wc->src_qp & 0x2)) { 1296 - mlx4_ib_warn(ctx->ib_dev, "can't multiplex bad sqp:%d: " 1297 - "non-master trying to send QP0 packets\n", wc->src_qp); 1298 - return; 1299 - } 1300 1288 1301 1289 /* Map transaction ID */ 1302 1290 ib_dma_sync_single_for_cpu(ctx->ib_dev, tun_qp->ring[wr_ix].map, ··· 1319 1317 1320 1318 /* Class-specific handling */ 1321 1319 switch (tunnel->mad.mad_hdr.mgmt_class) { 1320 + case IB_MGMT_CLASS_SUBN_LID_ROUTED: 1321 + case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE: 1322 + if (slave != mlx4_master_func_num(dev->dev) && 1323 + !mlx4_vf_smi_enabled(dev->dev, slave, ctx->port)) 1324 + return; 1325 + break; 1322 1326 case IB_MGMT_CLASS_SUBN_ADM: 1323 1327 if (mlx4_ib_multiplex_sa_handler(ctx->ib_dev, ctx->port, slave, 1324 1328 (struct ib_sa_mad *) &tunnel->mad)) ··· 1757 1749 return -EEXIST; 1758 1750 1759 1751 ctx->state = DEMUX_PV_STATE_STARTING; 1760 - /* have QP0 only on port owner, and only if link layer is IB */ 1761 - if (ctx->slave == mlx4_master_func_num(to_mdev(ctx->ib_dev)->dev) && 1762 - rdma_port_get_link_layer(ibdev, ctx->port) == IB_LINK_LAYER_INFINIBAND) 1752 + /* have QP0 only if link layer is IB */ 1753 + if (rdma_port_get_link_layer(ibdev, ctx->port) == 1754 + IB_LINK_LAYER_INFINIBAND) 1763 1755 ctx->has_smi = 1; 1764 1756 1765 1757 if (ctx->has_smi) {
+17 -9
drivers/infiniband/hw/mlx4/main.c
··· 544 544 return 0; 545 545 } 546 546 547 - static int mlx4_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_viols, 548 - u32 cap_mask) 547 + static int mlx4_ib_SET_PORT(struct mlx4_ib_dev *dev, u8 port, int reset_qkey_viols, 548 + u32 cap_mask) 549 549 { 550 550 struct mlx4_cmd_mailbox *mailbox; 551 551 int err; 552 - u8 is_eth = dev->dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH; 553 552 554 553 mailbox = mlx4_alloc_cmd_mailbox(dev->dev); 555 554 if (IS_ERR(mailbox)) ··· 562 563 ((__be32 *) mailbox->buf)[1] = cpu_to_be32(cap_mask); 563 564 } 564 565 565 - err = mlx4_cmd(dev->dev, mailbox->dma, port, is_eth, MLX4_CMD_SET_PORT, 566 - MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE); 566 + err = mlx4_cmd(dev->dev, mailbox->dma, port, 0, MLX4_CMD_SET_PORT, 567 + MLX4_CMD_TIME_CLASS_B, MLX4_CMD_WRAPPED); 567 568 568 569 mlx4_free_cmd_mailbox(dev->dev, mailbox); 569 570 return err; ··· 572 573 static int mlx4_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, 573 574 struct ib_port_modify *props) 574 575 { 576 + struct mlx4_ib_dev *mdev = to_mdev(ibdev); 577 + u8 is_eth = mdev->dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH; 575 578 struct ib_port_attr attr; 576 579 u32 cap_mask; 577 580 int err; 578 581 579 - mutex_lock(&to_mdev(ibdev)->cap_mask_mutex); 582 + /* return OK if this is RoCE. CM calls ib_modify_port() regardless 583 + * of whether port link layer is ETH or IB. For ETH ports, qkey 584 + * violations and port capabilities are not meaningful. 585 + */ 586 + if (is_eth) 587 + return 0; 588 + 589 + mutex_lock(&mdev->cap_mask_mutex); 580 590 581 591 err = mlx4_ib_query_port(ibdev, port, &attr); 582 592 if (err) ··· 594 586 cap_mask = (attr.port_cap_flags | props->set_port_cap_mask) & 595 587 ~props->clr_port_cap_mask; 596 588 597 - err = mlx4_SET_PORT(to_mdev(ibdev), port, 598 - !!(mask & IB_PORT_RESET_QKEY_CNTR), 599 - cap_mask); 589 + err = mlx4_ib_SET_PORT(mdev, port, 590 + !!(mask & IB_PORT_RESET_QKEY_CNTR), 591 + cap_mask); 600 592 601 593 out: 602 594 mutex_unlock(&to_mdev(ibdev)->cap_mask_mutex);
+1
drivers/infiniband/hw/mlx4/mlx4_ib.h
··· 156 156 MLX4_IB_QP_LSO = IB_QP_CREATE_IPOIB_UD_LSO, 157 157 MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK = IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK, 158 158 MLX4_IB_QP_NETIF = IB_QP_CREATE_NETIF_QP, 159 + MLX4_IB_QP_CREATE_USE_GFP_NOIO = IB_QP_CREATE_USE_GFP_NOIO, 159 160 MLX4_IB_SRIOV_TUNNEL_QP = 1 << 30, 160 161 MLX4_IB_SRIOV_SQP = 1 << 31, 161 162 };
+67 -35
drivers/infiniband/hw/mlx4/qp.c
··· 608 608 return !attr->srq; 609 609 } 610 610 611 + static int qp0_enabled_vf(struct mlx4_dev *dev, int qpn) 612 + { 613 + int i; 614 + for (i = 0; i < dev->caps.num_ports; i++) { 615 + if (qpn == dev->caps.qp0_proxy[i]) 616 + return !!dev->caps.qp0_qkey[i]; 617 + } 618 + return 0; 619 + } 620 + 611 621 static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, 612 622 struct ib_qp_init_attr *init_attr, 613 - struct ib_udata *udata, int sqpn, struct mlx4_ib_qp **caller_qp) 623 + struct ib_udata *udata, int sqpn, struct mlx4_ib_qp **caller_qp, 624 + gfp_t gfp) 614 625 { 615 626 int qpn; 616 627 int err; ··· 636 625 !(init_attr->create_flags & MLX4_IB_SRIOV_SQP))) { 637 626 if (init_attr->qp_type == IB_QPT_GSI) 638 627 qp_type = MLX4_IB_QPT_PROXY_GSI; 639 - else if (mlx4_is_master(dev->dev)) 640 - qp_type = MLX4_IB_QPT_PROXY_SMI_OWNER; 641 - else 642 - qp_type = MLX4_IB_QPT_PROXY_SMI; 628 + else { 629 + if (mlx4_is_master(dev->dev) || 630 + qp0_enabled_vf(dev->dev, sqpn)) 631 + qp_type = MLX4_IB_QPT_PROXY_SMI_OWNER; 632 + else 633 + qp_type = MLX4_IB_QPT_PROXY_SMI; 634 + } 643 635 } 644 636 qpn = sqpn; 645 637 /* add extra sg entry for tunneling */ ··· 657 643 return -EINVAL; 658 644 if (tnl_init->proxy_qp_type == IB_QPT_GSI) 659 645 qp_type = MLX4_IB_QPT_TUN_GSI; 660 - else if (tnl_init->slave == mlx4_master_func_num(dev->dev)) 646 + else if (tnl_init->slave == mlx4_master_func_num(dev->dev) || 647 + mlx4_vf_smi_enabled(dev->dev, tnl_init->slave, 648 + tnl_init->port)) 661 649 qp_type = MLX4_IB_QPT_TUN_SMI_OWNER; 662 650 else 663 651 qp_type = MLX4_IB_QPT_TUN_SMI; ··· 674 658 if (qp_type == MLX4_IB_QPT_SMI || qp_type == MLX4_IB_QPT_GSI || 675 659 (qp_type & (MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_SMI_OWNER | 676 660 MLX4_IB_QPT_PROXY_GSI | MLX4_IB_QPT_TUN_SMI_OWNER))) { 677 - sqp = kzalloc(sizeof (struct mlx4_ib_sqp), GFP_KERNEL); 661 + sqp = kzalloc(sizeof (struct mlx4_ib_sqp), gfp); 678 662 if (!sqp) 679 663 return -ENOMEM; 680 664 qp = &sqp->qp; 681 665 qp->pri.vid = 0xFFFF; 682 666 qp->alt.vid = 0xFFFF; 683 667 } else { 684 - qp = kzalloc(sizeof (struct mlx4_ib_qp), GFP_KERNEL); 668 + qp = kzalloc(sizeof (struct mlx4_ib_qp), gfp); 685 669 if (!qp) 686 670 return -ENOMEM; 687 671 qp->pri.vid = 0xFFFF; ··· 764 748 goto err; 765 749 766 750 if (qp_has_rq(init_attr)) { 767 - err = mlx4_db_alloc(dev->dev, &qp->db, 0); 751 + err = mlx4_db_alloc(dev->dev, &qp->db, 0, gfp); 768 752 if (err) 769 753 goto err; 770 754 771 755 *qp->db.db = 0; 772 756 } 773 757 774 - if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf)) { 758 + if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf, gfp)) { 775 759 err = -ENOMEM; 776 760 goto err_db; 777 761 } ··· 781 765 if (err) 782 766 goto err_buf; 783 767 784 - err = mlx4_buf_write_mtt(dev->dev, &qp->mtt, &qp->buf); 768 + err = mlx4_buf_write_mtt(dev->dev, &qp->mtt, &qp->buf, gfp); 785 769 if (err) 786 770 goto err_mtt; 787 771 788 - qp->sq.wrid = kmalloc(qp->sq.wqe_cnt * sizeof (u64), GFP_KERNEL); 789 - qp->rq.wrid = kmalloc(qp->rq.wqe_cnt * sizeof (u64), GFP_KERNEL); 790 - 772 + qp->sq.wrid = kmalloc(qp->sq.wqe_cnt * sizeof (u64), gfp); 773 + qp->rq.wrid = kmalloc(qp->rq.wqe_cnt * sizeof (u64), gfp); 791 774 if (!qp->sq.wrid || !qp->rq.wrid) { 792 775 err = -ENOMEM; 793 776 goto err_wrid; ··· 816 801 goto err_proxy; 817 802 } 818 803 819 - err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp); 804 + err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp, gfp); 820 805 if (err) 821 806 goto err_qpn; 822 807 ··· 1055 1040 struct mlx4_ib_qp *qp = NULL; 1056 1041 int err; 1057 1042 u16 xrcdn = 0; 1043 + gfp_t gfp; 1058 1044 1045 + gfp = (init_attr->create_flags & MLX4_IB_QP_CREATE_USE_GFP_NOIO) ? 1046 + GFP_NOIO : GFP_KERNEL; 1059 1047 /* 1060 1048 * We only support LSO, vendor flag1, and multicast loopback blocking, 1061 1049 * and only for kernel UD QPs. ··· 1067 1049 MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK | 1068 1050 MLX4_IB_SRIOV_TUNNEL_QP | 1069 1051 MLX4_IB_SRIOV_SQP | 1070 - MLX4_IB_QP_NETIF)) 1052 + MLX4_IB_QP_NETIF | 1053 + MLX4_IB_QP_CREATE_USE_GFP_NOIO)) 1071 1054 return ERR_PTR(-EINVAL); 1072 1055 1073 1056 if (init_attr->create_flags & IB_QP_CREATE_NETIF_QP) { ··· 1078 1059 1079 1060 if (init_attr->create_flags && 1080 1061 (udata || 1081 - ((init_attr->create_flags & ~MLX4_IB_SRIOV_SQP) && 1062 + ((init_attr->create_flags & ~(MLX4_IB_SRIOV_SQP | MLX4_IB_QP_CREATE_USE_GFP_NOIO)) && 1082 1063 init_attr->qp_type != IB_QPT_UD) || 1083 1064 ((init_attr->create_flags & MLX4_IB_SRIOV_SQP) && 1084 1065 init_attr->qp_type > IB_QPT_GSI))) ··· 1098 1079 case IB_QPT_RC: 1099 1080 case IB_QPT_UC: 1100 1081 case IB_QPT_RAW_PACKET: 1101 - qp = kzalloc(sizeof *qp, GFP_KERNEL); 1082 + qp = kzalloc(sizeof *qp, gfp); 1102 1083 if (!qp) 1103 1084 return ERR_PTR(-ENOMEM); 1104 1085 qp->pri.vid = 0xFFFF; ··· 1107 1088 case IB_QPT_UD: 1108 1089 { 1109 1090 err = create_qp_common(to_mdev(pd->device), pd, init_attr, 1110 - udata, 0, &qp); 1091 + udata, 0, &qp, gfp); 1111 1092 if (err) 1112 1093 return ERR_PTR(err); 1113 1094 ··· 1125 1106 1126 1107 err = create_qp_common(to_mdev(pd->device), pd, init_attr, udata, 1127 1108 get_sqp_num(to_mdev(pd->device), init_attr), 1128 - &qp); 1109 + &qp, gfp); 1129 1110 if (err) 1130 1111 return ERR_PTR(err); 1131 1112 ··· 1949 1930 return err; 1950 1931 } 1951 1932 1933 + static int vf_get_qp0_qkey(struct mlx4_dev *dev, int qpn, u32 *qkey) 1934 + { 1935 + int i; 1936 + for (i = 0; i < dev->caps.num_ports; i++) { 1937 + if (qpn == dev->caps.qp0_proxy[i] || 1938 + qpn == dev->caps.qp0_tunnel[i]) { 1939 + *qkey = dev->caps.qp0_qkey[i]; 1940 + return 0; 1941 + } 1942 + } 1943 + return -EINVAL; 1944 + } 1945 + 1952 1946 static int build_sriov_qp0_header(struct mlx4_ib_sqp *sqp, 1953 1947 struct ib_send_wr *wr, 1954 1948 void *wqe, unsigned *mlx_seg_len) ··· 2019 1987 cpu_to_be32(mdev->dev->caps.qp0_tunnel[sqp->qp.port - 1]); 2020 1988 2021 1989 sqp->ud_header.bth.psn = cpu_to_be32((sqp->send_psn++) & ((1 << 24) - 1)); 2022 - if (mlx4_get_parav_qkey(mdev->dev, sqp->qp.mqp.qpn, &qkey)) 2023 - return -EINVAL; 1990 + if (mlx4_is_master(mdev->dev)) { 1991 + if (mlx4_get_parav_qkey(mdev->dev, sqp->qp.mqp.qpn, &qkey)) 1992 + return -EINVAL; 1993 + } else { 1994 + if (vf_get_qp0_qkey(mdev->dev, sqp->qp.mqp.qpn, &qkey)) 1995 + return -EINVAL; 1996 + } 2024 1997 sqp->ud_header.deth.qkey = cpu_to_be32(qkey); 2025 1998 sqp->ud_header.deth.source_qpn = cpu_to_be32(sqp->qp.mqp.qpn); 2026 1999 ··· 2407 2370 2408 2371 static void set_tunnel_datagram_seg(struct mlx4_ib_dev *dev, 2409 2372 struct mlx4_wqe_datagram_seg *dseg, 2410 - struct ib_send_wr *wr, enum ib_qp_type qpt) 2373 + struct ib_send_wr *wr, 2374 + enum mlx4_ib_qp_type qpt) 2411 2375 { 2412 2376 union mlx4_ext_av *av = &to_mah(wr->wr.ud.ah)->av; 2413 2377 struct mlx4_av sqp_av = {0}; ··· 2421 2383 cpu_to_be32(0xf0000000); 2422 2384 2423 2385 memcpy(dseg->av, &sqp_av, sizeof (struct mlx4_av)); 2424 - /* This function used only for sending on QP1 proxies */ 2425 - dseg->dqpn = cpu_to_be32(dev->dev->caps.qp1_tunnel[port - 1]); 2386 + if (qpt == MLX4_IB_QPT_PROXY_GSI) 2387 + dseg->dqpn = cpu_to_be32(dev->dev->caps.qp1_tunnel[port - 1]); 2388 + else 2389 + dseg->dqpn = cpu_to_be32(dev->dev->caps.qp0_tunnel[port - 1]); 2426 2390 /* Use QKEY from the QP context, which is set by master */ 2427 2391 dseg->qkey = cpu_to_be32(IB_QP_SET_QKEY); 2428 2392 } ··· 2719 2679 break; 2720 2680 2721 2681 case MLX4_IB_QPT_PROXY_SMI_OWNER: 2722 - if (unlikely(!mlx4_is_master(to_mdev(ibqp->device)->dev))) { 2723 - err = -ENOSYS; 2724 - *bad_wr = wr; 2725 - goto out; 2726 - } 2727 2682 err = build_sriov_qp0_header(to_msqp(qp), wr, ctrl, &seglen); 2728 2683 if (unlikely(err)) { 2729 2684 *bad_wr = wr; ··· 2735 2700 size += seglen / 16; 2736 2701 break; 2737 2702 case MLX4_IB_QPT_PROXY_SMI: 2738 - /* don't allow QP0 sends on guests */ 2739 - err = -ENOSYS; 2740 - *bad_wr = wr; 2741 - goto out; 2742 2703 case MLX4_IB_QPT_PROXY_GSI: 2743 2704 /* If we are tunneling special qps, this is a UD qp. 2744 2705 * In this case we first add a UD segment targeting 2745 2706 * the tunnel qp, and then add a header with address 2746 2707 * information */ 2747 - set_tunnel_datagram_seg(to_mdev(ibqp->device), wqe, wr, ibqp->qp_type); 2708 + set_tunnel_datagram_seg(to_mdev(ibqp->device), wqe, wr, 2709 + qp->mlx4_ib_qp_type); 2748 2710 wqe += sizeof (struct mlx4_wqe_datagram_seg); 2749 2711 size += sizeof (struct mlx4_wqe_datagram_seg) / 16; 2750 2712 build_tunnel_header(wr, wqe, &seglen);
+4 -3
drivers/infiniband/hw/mlx4/srq.c
··· 134 134 if (err) 135 135 goto err_mtt; 136 136 } else { 137 - err = mlx4_db_alloc(dev->dev, &srq->db, 0); 137 + err = mlx4_db_alloc(dev->dev, &srq->db, 0, GFP_KERNEL); 138 138 if (err) 139 139 goto err_srq; 140 140 141 141 *srq->db.db = 0; 142 142 143 - if (mlx4_buf_alloc(dev->dev, buf_size, PAGE_SIZE * 2, &srq->buf)) { 143 + if (mlx4_buf_alloc(dev->dev, buf_size, PAGE_SIZE * 2, &srq->buf, 144 + GFP_KERNEL)) { 144 145 err = -ENOMEM; 145 146 goto err_db; 146 147 } ··· 166 165 if (err) 167 166 goto err_buf; 168 167 169 - err = mlx4_buf_write_mtt(dev->dev, &srq->mtt, &srq->buf); 168 + err = mlx4_buf_write_mtt(dev->dev, &srq->mtt, &srq->buf, GFP_KERNEL); 170 169 if (err) 171 170 goto err_mtt; 172 171
+104 -1
drivers/infiniband/hw/mlx4/sysfs.c
··· 389 389 struct mlx4_ib_dev *dev; 390 390 struct attribute_group pkey_group; 391 391 struct attribute_group gid_group; 392 - u8 port_num; 392 + struct device_attribute enable_smi_admin; 393 + struct device_attribute smi_enabled; 393 394 int slave; 395 + u8 port_num; 394 396 }; 395 397 396 398 ··· 560 558 return NULL; 561 559 } 562 560 561 + static ssize_t sysfs_show_smi_enabled(struct device *dev, 562 + struct device_attribute *attr, char *buf) 563 + { 564 + struct mlx4_port *p = 565 + container_of(attr, struct mlx4_port, smi_enabled); 566 + ssize_t len = 0; 567 + 568 + if (mlx4_vf_smi_enabled(p->dev->dev, p->slave, p->port_num)) 569 + len = sprintf(buf, "%d\n", 1); 570 + else 571 + len = sprintf(buf, "%d\n", 0); 572 + 573 + return len; 574 + } 575 + 576 + static ssize_t sysfs_show_enable_smi_admin(struct device *dev, 577 + struct device_attribute *attr, 578 + char *buf) 579 + { 580 + struct mlx4_port *p = 581 + container_of(attr, struct mlx4_port, enable_smi_admin); 582 + ssize_t len = 0; 583 + 584 + if (mlx4_vf_get_enable_smi_admin(p->dev->dev, p->slave, p->port_num)) 585 + len = sprintf(buf, "%d\n", 1); 586 + else 587 + len = sprintf(buf, "%d\n", 0); 588 + 589 + return len; 590 + } 591 + 592 + static ssize_t sysfs_store_enable_smi_admin(struct device *dev, 593 + struct device_attribute *attr, 594 + const char *buf, size_t count) 595 + { 596 + struct mlx4_port *p = 597 + container_of(attr, struct mlx4_port, enable_smi_admin); 598 + int enable; 599 + 600 + if (sscanf(buf, "%i", &enable) != 1 || 601 + enable < 0 || enable > 1) 602 + return -EINVAL; 603 + 604 + if (mlx4_vf_set_enable_smi_admin(p->dev->dev, p->slave, p->port_num, enable)) 605 + return -EINVAL; 606 + return count; 607 + } 608 + 609 + static int add_vf_smi_entries(struct mlx4_port *p) 610 + { 611 + int is_eth = rdma_port_get_link_layer(&p->dev->ib_dev, p->port_num) == 612 + IB_LINK_LAYER_ETHERNET; 613 + int ret; 614 + 615 + /* do not display entries if eth transport, or if master */ 616 + if (is_eth || p->slave == mlx4_master_func_num(p->dev->dev)) 617 + return 0; 618 + 619 + sysfs_attr_init(&p->smi_enabled.attr); 620 + p->smi_enabled.show = sysfs_show_smi_enabled; 621 + p->smi_enabled.store = NULL; 622 + p->smi_enabled.attr.name = "smi_enabled"; 623 + p->smi_enabled.attr.mode = 0444; 624 + ret = sysfs_create_file(&p->kobj, &p->smi_enabled.attr); 625 + if (ret) { 626 + pr_err("failed to create smi_enabled\n"); 627 + return ret; 628 + } 629 + 630 + sysfs_attr_init(&p->enable_smi_admin.attr); 631 + p->enable_smi_admin.show = sysfs_show_enable_smi_admin; 632 + p->enable_smi_admin.store = sysfs_store_enable_smi_admin; 633 + p->enable_smi_admin.attr.name = "enable_smi_admin"; 634 + p->enable_smi_admin.attr.mode = 0644; 635 + ret = sysfs_create_file(&p->kobj, &p->enable_smi_admin.attr); 636 + if (ret) { 637 + pr_err("failed to create enable_smi_admin\n"); 638 + sysfs_remove_file(&p->kobj, &p->smi_enabled.attr); 639 + return ret; 640 + } 641 + return 0; 642 + } 643 + 644 + static void remove_vf_smi_entries(struct mlx4_port *p) 645 + { 646 + int is_eth = rdma_port_get_link_layer(&p->dev->ib_dev, p->port_num) == 647 + IB_LINK_LAYER_ETHERNET; 648 + 649 + if (is_eth || p->slave == mlx4_master_func_num(p->dev->dev)) 650 + return; 651 + 652 + sysfs_remove_file(&p->kobj, &p->smi_enabled.attr); 653 + sysfs_remove_file(&p->kobj, &p->enable_smi_admin.attr); 654 + } 655 + 563 656 static int add_port(struct mlx4_ib_dev *dev, int port_num, int slave) 564 657 { 565 658 struct mlx4_port *p; ··· 696 599 } 697 600 698 601 ret = sysfs_create_group(&p->kobj, &p->gid_group); 602 + if (ret) 603 + goto err_free_gid; 604 + 605 + ret = add_vf_smi_entries(p); 699 606 if (ret) 700 607 goto err_free_gid; 701 608 ··· 770 669 mport = container_of(p, struct mlx4_port, kobj); 771 670 sysfs_remove_group(p, &mport->pkey_group); 772 671 sysfs_remove_group(p, &mport->gid_group); 672 + remove_vf_smi_entries(mport); 773 673 kobject_put(p); 774 674 } 775 675 kobject_put(dev->dev_ports_parent[slave]); ··· 815 713 port = container_of(p, struct mlx4_port, kobj); 816 714 sysfs_remove_group(p, &port->pkey_group); 817 715 sysfs_remove_group(p, &port->gid_group); 716 + remove_vf_smi_entries(port); 818 717 kobject_put(p); 819 718 kobject_put(device->dev_ports_parent[slave]); 820 719 }
+12 -1
drivers/infiniband/hw/mlx5/cq.c
··· 32 32 33 33 #include <linux/kref.h> 34 34 #include <rdma/ib_umem.h> 35 + #include <rdma/ib_user_verbs.h> 35 36 #include "mlx5_ib.h" 36 37 #include "user.h" 37 38 ··· 603 602 int *cqe_size, int *index, int *inlen) 604 603 { 605 604 struct mlx5_ib_create_cq ucmd; 605 + size_t ucmdlen; 606 606 int page_shift; 607 607 int npages; 608 608 int ncont; 609 609 int err; 610 610 611 - if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) 611 + ucmdlen = 612 + (udata->inlen - sizeof(struct ib_uverbs_cmd_hdr) < 613 + sizeof(ucmd)) ? (sizeof(ucmd) - 614 + sizeof(ucmd.reserved)) : sizeof(ucmd); 615 + 616 + if (ib_copy_from_udata(&ucmd, udata, ucmdlen)) 612 617 return -EFAULT; 618 + 619 + if (ucmdlen == sizeof(ucmd) && 620 + ucmd.reserved != 0) 621 + return -EINVAL; 613 622 614 623 if (ucmd.cqe_size != 64 && ucmd.cqe_size != 128) 615 624 return -EINVAL;
+11 -2
drivers/infiniband/hw/mlx5/mlx5_ib.h
··· 264 264 __be64 *pas; 265 265 dma_addr_t dma; 266 266 int npages; 267 - struct completion done; 268 - enum ib_wc_status status; 269 267 struct mlx5_ib_dev *dev; 270 268 struct mlx5_create_mkey_mbox_out out; 271 269 struct mlx5_core_sig_ctx *sig; ··· 274 276 __be64 *mapped_page_list; 275 277 dma_addr_t map; 276 278 }; 279 + 280 + struct mlx5_ib_umr_context { 281 + enum ib_wc_status status; 282 + struct completion done; 283 + }; 284 + 285 + static inline void mlx5_ib_init_umr_context(struct mlx5_ib_umr_context *context) 286 + { 287 + context->status = -1; 288 + init_completion(&context->done); 289 + } 277 290 278 291 struct umr_common { 279 292 struct ib_pd *pd;
+45 -31
drivers/infiniband/hw/mlx5/mr.c
··· 73 73 struct mlx5_cache_ent *ent = &cache->ent[c]; 74 74 u8 key; 75 75 unsigned long flags; 76 + struct mlx5_mr_table *table = &dev->mdev.priv.mr_table; 77 + int err; 76 78 77 79 spin_lock_irqsave(&ent->lock, flags); 78 80 ent->pending--; ··· 109 107 ent->cur++; 110 108 ent->size++; 111 109 spin_unlock_irqrestore(&ent->lock, flags); 110 + 111 + write_lock_irqsave(&table->lock, flags); 112 + err = radix_tree_insert(&table->tree, mlx5_base_mkey(mr->mmr.key), 113 + &mr->mmr); 114 + if (err) 115 + pr_err("Error inserting to mr tree. 0x%x\n", -err); 116 + write_unlock_irqrestore(&table->lock, flags); 112 117 } 113 118 114 119 static int add_keys(struct mlx5_ib_dev *dev, int c, int num) ··· 708 699 709 700 void mlx5_umr_cq_handler(struct ib_cq *cq, void *cq_context) 710 701 { 711 - struct mlx5_ib_mr *mr; 702 + struct mlx5_ib_umr_context *context; 712 703 struct ib_wc wc; 713 704 int err; 714 705 ··· 721 712 if (err == 0) 722 713 break; 723 714 724 - mr = (struct mlx5_ib_mr *)(unsigned long)wc.wr_id; 725 - mr->status = wc.status; 726 - complete(&mr->done); 715 + context = (struct mlx5_ib_umr_context *) (unsigned long) wc.wr_id; 716 + context->status = wc.status; 717 + complete(&context->done); 727 718 } 728 719 ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); 729 720 } ··· 735 726 struct mlx5_ib_dev *dev = to_mdev(pd->device); 736 727 struct device *ddev = dev->ib_dev.dma_device; 737 728 struct umr_common *umrc = &dev->umrc; 729 + struct mlx5_ib_umr_context umr_context; 738 730 struct ib_send_wr wr, *bad; 739 731 struct mlx5_ib_mr *mr; 740 732 struct ib_sge sg; 741 733 int size = sizeof(u64) * npages; 742 - int err; 734 + int err = 0; 743 735 int i; 744 736 745 737 for (i = 0; i < 1; i++) { ··· 761 751 mr->pas = kmalloc(size + MLX5_UMR_ALIGN - 1, GFP_KERNEL); 762 752 if (!mr->pas) { 763 753 err = -ENOMEM; 764 - goto error; 754 + goto free_mr; 765 755 } 766 756 767 757 mlx5_ib_populate_pas(dev, umem, page_shift, ··· 770 760 mr->dma = dma_map_single(ddev, mr_align(mr->pas, MLX5_UMR_ALIGN), size, 771 761 DMA_TO_DEVICE); 772 762 if (dma_mapping_error(ddev, mr->dma)) { 773 - kfree(mr->pas); 774 763 err = -ENOMEM; 775 - goto error; 764 + goto free_pas; 776 765 } 777 766 778 767 memset(&wr, 0, sizeof(wr)); 779 - wr.wr_id = (u64)(unsigned long)mr; 768 + wr.wr_id = (u64)(unsigned long)&umr_context; 780 769 prep_umr_reg_wqe(pd, &wr, &sg, mr->dma, npages, mr->mmr.key, page_shift, virt_addr, len, access_flags); 781 770 782 - /* We serialize polls so one process does not kidnap another's 783 - * completion. This is not a problem since wr is completed in 784 - * around 1 usec 785 - */ 771 + mlx5_ib_init_umr_context(&umr_context); 786 772 down(&umrc->sem); 787 - init_completion(&mr->done); 788 773 err = ib_post_send(umrc->qp, &wr, &bad); 789 774 if (err) { 790 775 mlx5_ib_warn(dev, "post send failed, err %d\n", err); 791 - up(&umrc->sem); 792 - goto error; 776 + goto unmap_dma; 777 + } else { 778 + wait_for_completion(&umr_context.done); 779 + if (umr_context.status != IB_WC_SUCCESS) { 780 + mlx5_ib_warn(dev, "reg umr failed\n"); 781 + err = -EFAULT; 782 + } 793 783 } 794 - wait_for_completion(&mr->done); 795 - up(&umrc->sem); 796 784 785 + mr->mmr.iova = virt_addr; 786 + mr->mmr.size = len; 787 + mr->mmr.pd = to_mpd(pd)->pdn; 788 + 789 + unmap_dma: 790 + up(&umrc->sem); 797 791 dma_unmap_single(ddev, mr->dma, size, DMA_TO_DEVICE); 792 + 793 + free_pas: 798 794 kfree(mr->pas); 799 795 800 - if (mr->status != IB_WC_SUCCESS) { 801 - mlx5_ib_warn(dev, "reg umr failed\n"); 802 - err = -EFAULT; 803 - goto error; 796 + free_mr: 797 + if (err) { 798 + free_cached_mr(dev, mr); 799 + return ERR_PTR(err); 804 800 } 805 801 806 802 return mr; 807 - 808 - error: 809 - free_cached_mr(dev, mr); 810 - return ERR_PTR(err); 811 803 } 812 804 813 805 static struct mlx5_ib_mr *reg_create(struct ib_pd *pd, u64 virt_addr, ··· 938 926 static int unreg_umr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) 939 927 { 940 928 struct umr_common *umrc = &dev->umrc; 929 + struct mlx5_ib_umr_context umr_context; 941 930 struct ib_send_wr wr, *bad; 942 931 int err; 943 932 944 933 memset(&wr, 0, sizeof(wr)); 945 - wr.wr_id = (u64)(unsigned long)mr; 934 + wr.wr_id = (u64)(unsigned long)&umr_context; 946 935 prep_umr_unreg_wqe(dev, &wr, mr->mmr.key); 947 936 937 + mlx5_ib_init_umr_context(&umr_context); 948 938 down(&umrc->sem); 949 - init_completion(&mr->done); 950 939 err = ib_post_send(umrc->qp, &wr, &bad); 951 940 if (err) { 952 941 up(&umrc->sem); 953 942 mlx5_ib_dbg(dev, "err %d\n", err); 954 943 goto error; 944 + } else { 945 + wait_for_completion(&umr_context.done); 946 + up(&umrc->sem); 955 947 } 956 - wait_for_completion(&mr->done); 957 - up(&umrc->sem); 958 - if (mr->status != IB_WC_SUCCESS) { 948 + if (umr_context.status != IB_WC_SUCCESS) { 959 949 mlx5_ib_warn(dev, "unreg umr failed\n"); 960 950 err = -EFAULT; 961 951 goto error;
+23 -19
drivers/infiniband/hw/mlx5/qp.c
··· 574 574 uar_index = uuarn_to_uar_index(&context->uuari, uuarn); 575 575 mlx5_ib_dbg(dev, "uuarn 0x%x, uar_index 0x%x\n", uuarn, uar_index); 576 576 577 + qp->rq.offset = 0; 578 + qp->sq.wqe_shift = ilog2(MLX5_SEND_WQE_BB); 579 + qp->sq.offset = qp->rq.wqe_cnt << qp->rq.wqe_shift; 580 + 577 581 err = set_user_buf_size(dev, qp, &ucmd); 578 582 if (err) 579 583 goto err_uuar; ··· 2082 2078 struct ib_sig_domain *wire = &sig_attrs->wire; 2083 2079 int ret, selector; 2084 2080 2081 + memset(bsf, 0, sizeof(*bsf)); 2085 2082 switch (sig_attrs->mem.sig_type) { 2086 2083 case IB_SIG_TYPE_T10_DIF: 2087 2084 if (sig_attrs->wire.sig_type != IB_SIG_TYPE_T10_DIF) ··· 2095 2090 /* Same block structure */ 2096 2091 basic->bsf_size_sbs = 1 << 4; 2097 2092 if (mem->sig.dif.bg_type == wire->sig.dif.bg_type) 2098 - basic->wire.copy_byte_mask = 0xff; 2099 - else 2100 - basic->wire.copy_byte_mask = 0x3f; 2093 + basic->wire.copy_byte_mask |= 0xc0; 2094 + if (mem->sig.dif.app_tag == wire->sig.dif.app_tag) 2095 + basic->wire.copy_byte_mask |= 0x30; 2096 + if (mem->sig.dif.ref_tag == wire->sig.dif.ref_tag) 2097 + basic->wire.copy_byte_mask |= 0x0f; 2101 2098 } else 2102 2099 basic->wire.bs_selector = bs_selector(wire->sig.dif.pi_interval); 2103 2100 ··· 2138 2131 int ret; 2139 2132 int wqe_size; 2140 2133 2141 - if (!wr->wr.sig_handover.prot) { 2134 + if (!wr->wr.sig_handover.prot || 2135 + (data_key == wr->wr.sig_handover.prot->lkey && 2136 + data_va == wr->wr.sig_handover.prot->addr && 2137 + data_len == wr->wr.sig_handover.prot->length)) { 2142 2138 /** 2143 2139 * Source domain doesn't contain signature information 2140 + * or data and protection are interleaved in memory. 2144 2141 * So need construct: 2145 2142 * ------------------ 2146 2143 * | data_klm | ··· 2198 2187 data_sentry->bcount = cpu_to_be16(block_size); 2199 2188 data_sentry->key = cpu_to_be32(data_key); 2200 2189 data_sentry->va = cpu_to_be64(data_va); 2190 + data_sentry->stride = cpu_to_be16(block_size); 2191 + 2201 2192 prot_sentry->bcount = cpu_to_be16(prot_size); 2202 2193 prot_sentry->key = cpu_to_be32(prot_key); 2194 + prot_sentry->va = cpu_to_be64(prot_va); 2195 + prot_sentry->stride = cpu_to_be16(prot_size); 2203 2196 2204 - if (prot_key == data_key && prot_va == data_va) { 2205 - /** 2206 - * The data and protection are interleaved 2207 - * in a single memory region 2208 - **/ 2209 - prot_sentry->va = cpu_to_be64(data_va + block_size); 2210 - prot_sentry->stride = cpu_to_be16(block_size + prot_size); 2211 - data_sentry->stride = prot_sentry->stride; 2212 - } else { 2213 - /* The data and protection are two different buffers */ 2214 - prot_sentry->va = cpu_to_be64(prot_va); 2215 - data_sentry->stride = cpu_to_be16(block_size); 2216 - prot_sentry->stride = cpu_to_be16(prot_size); 2217 - } 2218 2197 wqe_size = ALIGN(sizeof(*sblock_ctrl) + sizeof(*data_sentry) + 2219 2198 sizeof(*prot_sentry), 64); 2220 2199 } ··· 2276 2275 2277 2276 /* length of the protected region, data + protection */ 2278 2277 region_len = wr->sg_list->length; 2279 - if (wr->wr.sig_handover.prot) 2278 + if (wr->wr.sig_handover.prot && 2279 + (wr->wr.sig_handover.prot->lkey != wr->sg_list->lkey || 2280 + wr->wr.sig_handover.prot->addr != wr->sg_list->addr || 2281 + wr->wr.sig_handover.prot->length != wr->sg_list->length)) 2280 2282 region_len += wr->wr.sig_handover.prot->length; 2281 2283 2282 2284 /**
+13 -1
drivers/infiniband/hw/mlx5/srq.c
··· 35 35 #include <linux/mlx5/srq.h> 36 36 #include <linux/slab.h> 37 37 #include <rdma/ib_umem.h> 38 + #include <rdma/ib_user_verbs.h> 38 39 39 40 #include "mlx5_ib.h" 40 41 #include "user.h" ··· 79 78 { 80 79 struct mlx5_ib_dev *dev = to_mdev(pd->device); 81 80 struct mlx5_ib_create_srq ucmd; 81 + size_t ucmdlen; 82 82 int err; 83 83 int npages; 84 84 int page_shift; 85 85 int ncont; 86 86 u32 offset; 87 87 88 - if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) { 88 + ucmdlen = 89 + (udata->inlen - sizeof(struct ib_uverbs_cmd_hdr) < 90 + sizeof(ucmd)) ? (sizeof(ucmd) - 91 + sizeof(ucmd.reserved)) : sizeof(ucmd); 92 + 93 + if (ib_copy_from_udata(&ucmd, udata, ucmdlen)) { 89 94 mlx5_ib_dbg(dev, "failed copy udata\n"); 90 95 return -EFAULT; 91 96 } 97 + 98 + if (ucmdlen == sizeof(ucmd) && 99 + ucmd.reserved != 0) 100 + return -EINVAL; 101 + 92 102 srq->wq_sig = !!(ucmd.flags & MLX5_SRQ_FLAG_SIGNATURE); 93 103 94 104 srq->umem = ib_umem_get(pd->uobject->context, ucmd.buf_addr, buf_size,
+2
drivers/infiniband/hw/mlx5/user.h
··· 91 91 __u64 buf_addr; 92 92 __u64 db_addr; 93 93 __u32 cqe_size; 94 + __u32 reserved; /* explicit padding (optional on i386) */ 94 95 }; 95 96 96 97 struct mlx5_ib_create_cq_resp { ··· 110 109 __u64 buf_addr; 111 110 __u64 db_addr; 112 111 __u32 flags; 112 + __u32 reserved; /* explicit padding (optional on i386) */ 113 113 }; 114 114 115 115 struct mlx5_ib_create_srq_resp {
+24 -1
drivers/infiniband/hw/nes/nes.c
··· 68 68 int max_mtu = 9000; 69 69 int interrupt_mod_interval = 0; 70 70 71 - 72 71 /* Interoperability */ 73 72 int mpa_version = 1; 74 73 module_param(mpa_version, int, 0644); ··· 110 111 }; 111 112 112 113 MODULE_DEVICE_TABLE(pci, nes_pci_table); 114 + 115 + /* registered nes netlink callbacks */ 116 + static struct ibnl_client_cbs nes_nl_cb_table[] = { 117 + [RDMA_NL_IWPM_REG_PID] = {.dump = iwpm_register_pid_cb}, 118 + [RDMA_NL_IWPM_ADD_MAPPING] = {.dump = iwpm_add_mapping_cb}, 119 + [RDMA_NL_IWPM_QUERY_MAPPING] = {.dump = iwpm_add_and_query_mapping_cb}, 120 + [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb}, 121 + [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb}, 122 + [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb} 123 + }; 113 124 114 125 static int nes_inetaddr_event(struct notifier_block *, unsigned long, void *); 115 126 static int nes_net_event(struct notifier_block *, unsigned long, void *); ··· 681 672 } 682 673 nes_notifiers_registered++; 683 674 675 + if (ibnl_add_client(RDMA_NL_NES, RDMA_NL_IWPM_NUM_OPS, nes_nl_cb_table)) 676 + printk(KERN_ERR PFX "%s[%u]: Failed to add netlink callback\n", 677 + __func__, __LINE__); 678 + 679 + ret = iwpm_init(RDMA_NL_NES); 680 + if (ret) { 681 + printk(KERN_ERR PFX "%s: port mapper initialization failed\n", 682 + pci_name(pcidev)); 683 + goto bail7; 684 + } 685 + 684 686 INIT_DELAYED_WORK(&nesdev->work, nes_recheck_link_status); 685 687 686 688 /* Initialize network devices */ ··· 730 710 731 711 nes_debug(NES_DBG_INIT, "netdev_count=%d, nesadapter->netdev_count=%d\n", 732 712 nesdev->netdev_count, nesdev->nesadapter->netdev_count); 713 + ibnl_remove_client(RDMA_NL_NES); 733 714 734 715 nes_notifiers_registered--; 735 716 if (nes_notifiers_registered == 0) { ··· 794 773 nesdev->nesadapter->netdev_count--; 795 774 } 796 775 } 776 + ibnl_remove_client(RDMA_NL_NES); 777 + iwpm_exit(RDMA_NL_NES); 797 778 798 779 nes_notifiers_registered--; 799 780 if (nes_notifiers_registered == 0) {
+3
drivers/infiniband/hw/nes/nes.h
··· 51 51 #include <rdma/ib_pack.h> 52 52 #include <rdma/rdma_cm.h> 53 53 #include <rdma/iw_cm.h> 54 + #include <rdma/rdma_netlink.h> 55 + #include <rdma/iw_portmap.h> 54 56 55 57 #define NES_SEND_FIRST_WRITE 56 58 ··· 132 130 #define NES_DBG_IW_TX 0x00040000 133 131 #define NES_DBG_SHUTDOWN 0x00080000 134 132 #define NES_DBG_PAU 0x00100000 133 + #define NES_DBG_NLMSG 0x00200000 135 134 #define NES_DBG_RSVD1 0x10000000 136 135 #define NES_DBG_RSVD2 0x20000000 137 136 #define NES_DBG_RSVD3 0x40000000
+260 -60
drivers/infiniband/hw/nes/nes_cm.c
··· 1 1 /* 2 - * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. 2 + * Copyright (c) 2006 - 2014 Intel Corporation. All rights reserved. 3 3 * 4 4 * This software is available to you under a choice of one of two 5 5 * licenses. You may choose to be licensed under the terms of the GNU ··· 59 59 #include <net/route.h> 60 60 #include <net/ip_fib.h> 61 61 #include <net/tcp.h> 62 + #include <linux/fcntl.h> 62 63 63 64 #include "nes.h" 64 65 ··· 167 166 { 168 167 return rem_ref_cm_node(cm_node->cm_core, cm_node); 169 168 } 170 - 171 169 /** 172 170 * create_event 173 171 */ ··· 482 482 iph->ttl = 0x40; 483 483 iph->protocol = 0x06; /* IPPROTO_TCP */ 484 484 485 - iph->saddr = htonl(cm_node->loc_addr); 486 - iph->daddr = htonl(cm_node->rem_addr); 485 + iph->saddr = htonl(cm_node->mapped_loc_addr); 486 + iph->daddr = htonl(cm_node->mapped_rem_addr); 487 487 488 - tcph->source = htons(cm_node->loc_port); 489 - tcph->dest = htons(cm_node->rem_port); 488 + tcph->source = htons(cm_node->mapped_loc_port); 489 + tcph->dest = htons(cm_node->mapped_rem_port); 490 490 tcph->seq = htonl(cm_node->tcp_cntxt.loc_seq_num); 491 491 492 492 if (flags & SET_ACK) { ··· 523 523 524 524 skb_shinfo(skb)->nr_frags = 0; 525 525 cm_packets_created++; 526 + } 527 + 528 + /* 529 + * nes_create_sockaddr - Record ip addr and tcp port in a sockaddr struct 530 + */ 531 + static void nes_create_sockaddr(__be32 ip_addr, __be16 port, 532 + struct sockaddr_storage *addr) 533 + { 534 + struct sockaddr_in *nes_sockaddr = (struct sockaddr_in *)addr; 535 + nes_sockaddr->sin_family = AF_INET; 536 + memcpy(&nes_sockaddr->sin_addr.s_addr, &ip_addr, sizeof(__be32)); 537 + nes_sockaddr->sin_port = port; 538 + } 539 + 540 + /* 541 + * nes_create_mapinfo - Create a mapinfo object in the port mapper data base 542 + */ 543 + static int nes_create_mapinfo(struct nes_cm_info *cm_info) 544 + { 545 + struct sockaddr_storage local_sockaddr; 546 + struct sockaddr_storage mapped_sockaddr; 547 + 548 + nes_create_sockaddr(htonl(cm_info->loc_addr), htons(cm_info->loc_port), 549 + &local_sockaddr); 550 + nes_create_sockaddr(htonl(cm_info->mapped_loc_addr), 551 + htons(cm_info->mapped_loc_port), &mapped_sockaddr); 552 + 553 + return iwpm_create_mapinfo(&local_sockaddr, 554 + &mapped_sockaddr, RDMA_NL_NES); 555 + } 556 + 557 + /* 558 + * nes_remove_mapinfo - Remove a mapinfo object from the port mapper data base 559 + * and send a remove mapping op message to 560 + * the userspace port mapper 561 + */ 562 + static int nes_remove_mapinfo(u32 loc_addr, u16 loc_port, 563 + u32 mapped_loc_addr, u16 mapped_loc_port) 564 + { 565 + struct sockaddr_storage local_sockaddr; 566 + struct sockaddr_storage mapped_sockaddr; 567 + 568 + nes_create_sockaddr(htonl(loc_addr), htons(loc_port), &local_sockaddr); 569 + nes_create_sockaddr(htonl(mapped_loc_addr), htons(mapped_loc_port), 570 + &mapped_sockaddr); 571 + 572 + iwpm_remove_mapinfo(&local_sockaddr, &mapped_sockaddr); 573 + return iwpm_remove_mapping(&local_sockaddr, RDMA_NL_NES); 574 + } 575 + 576 + /* 577 + * nes_form_pm_msg - Form a port mapper message with mapping info 578 + */ 579 + static void nes_form_pm_msg(struct nes_cm_info *cm_info, 580 + struct iwpm_sa_data *pm_msg) 581 + { 582 + nes_create_sockaddr(htonl(cm_info->loc_addr), htons(cm_info->loc_port), 583 + &pm_msg->loc_addr); 584 + nes_create_sockaddr(htonl(cm_info->rem_addr), htons(cm_info->rem_port), 585 + &pm_msg->rem_addr); 586 + } 587 + 588 + /* 589 + * nes_form_reg_msg - Form a port mapper message with dev info 590 + */ 591 + static void nes_form_reg_msg(struct nes_vnic *nesvnic, 592 + struct iwpm_dev_data *pm_msg) 593 + { 594 + memcpy(pm_msg->dev_name, nesvnic->nesibdev->ibdev.name, 595 + IWPM_DEVNAME_SIZE); 596 + memcpy(pm_msg->if_name, nesvnic->netdev->name, IWPM_IFNAME_SIZE); 597 + } 598 + 599 + /* 600 + * nes_record_pm_msg - Save the received mapping info 601 + */ 602 + static void nes_record_pm_msg(struct nes_cm_info *cm_info, 603 + struct iwpm_sa_data *pm_msg) 604 + { 605 + struct sockaddr_in *mapped_loc_addr = 606 + (struct sockaddr_in *)&pm_msg->mapped_loc_addr; 607 + struct sockaddr_in *mapped_rem_addr = 608 + (struct sockaddr_in *)&pm_msg->mapped_rem_addr; 609 + 610 + if (mapped_loc_addr->sin_family == AF_INET) { 611 + cm_info->mapped_loc_addr = 612 + ntohl(mapped_loc_addr->sin_addr.s_addr); 613 + cm_info->mapped_loc_port = ntohs(mapped_loc_addr->sin_port); 614 + } 615 + if (mapped_rem_addr->sin_family == AF_INET) { 616 + cm_info->mapped_rem_addr = 617 + ntohl(mapped_rem_addr->sin_addr.s_addr); 618 + cm_info->mapped_rem_port = ntohs(mapped_rem_addr->sin_port); 619 + } 526 620 } 527 621 528 622 /** ··· 1241 1147 loc_addr, loc_port, 1242 1148 cm_node->rem_addr, cm_node->rem_port, 1243 1149 rem_addr, rem_port); 1244 - if ((cm_node->loc_addr == loc_addr) && (cm_node->loc_port == loc_port) && 1245 - (cm_node->rem_addr == rem_addr) && (cm_node->rem_port == rem_port)) { 1150 + if ((cm_node->mapped_loc_addr == loc_addr) && 1151 + (cm_node->mapped_loc_port == loc_port) && 1152 + (cm_node->mapped_rem_addr == rem_addr) && 1153 + (cm_node->mapped_rem_port == rem_port)) { 1154 + 1246 1155 add_ref_cm_node(cm_node); 1247 1156 spin_unlock_irqrestore(&cm_core->ht_lock, flags); 1248 1157 return cm_node; ··· 1262 1165 * find_listener - find a cm node listening on this addr-port pair 1263 1166 */ 1264 1167 static struct nes_cm_listener *find_listener(struct nes_cm_core *cm_core, 1265 - nes_addr_t dst_addr, u16 dst_port, enum nes_cm_listener_state listener_state) 1168 + nes_addr_t dst_addr, u16 dst_port, 1169 + enum nes_cm_listener_state listener_state, int local) 1266 1170 { 1267 1171 unsigned long flags; 1268 1172 struct nes_cm_listener *listen_node; 1173 + nes_addr_t listen_addr; 1174 + u16 listen_port; 1269 1175 1270 1176 /* walk list and find cm_node associated with this session ID */ 1271 1177 spin_lock_irqsave(&cm_core->listen_list_lock, flags); 1272 1178 list_for_each_entry(listen_node, &cm_core->listen_list.list, list) { 1179 + if (local) { 1180 + listen_addr = listen_node->loc_addr; 1181 + listen_port = listen_node->loc_port; 1182 + } else { 1183 + listen_addr = listen_node->mapped_loc_addr; 1184 + listen_port = listen_node->mapped_loc_port; 1185 + } 1273 1186 /* compare node pair, return node handle if a match */ 1274 - if (((listen_node->loc_addr == dst_addr) || 1275 - listen_node->loc_addr == 0x00000000) && 1276 - (listen_node->loc_port == dst_port) && 1187 + if (((listen_addr == dst_addr) || 1188 + listen_addr == 0x00000000) && 1189 + (listen_port == dst_port) && 1277 1190 (listener_state & listen_node->listener_state)) { 1278 1191 atomic_inc(&listen_node->ref_count); 1279 1192 spin_unlock_irqrestore(&cm_core->listen_list_lock, flags); ··· 1295 1188 /* no listener */ 1296 1189 return NULL; 1297 1190 } 1298 - 1299 1191 1300 1192 /** 1301 1193 * add_hte_node - add a cm node to the hash table ··· 1416 1310 1417 1311 spin_unlock_irqrestore(&cm_core->listen_list_lock, flags); 1418 1312 1419 - if (listener->nesvnic) 1420 - nes_manage_apbvt(listener->nesvnic, listener->loc_port, 1421 - PCI_FUNC(listener->nesvnic->nesdev->pcidev->devfn), NES_MANAGE_APBVT_DEL); 1313 + if (listener->nesvnic) { 1314 + nes_manage_apbvt(listener->nesvnic, 1315 + listener->mapped_loc_port, 1316 + PCI_FUNC(listener->nesvnic->nesdev->pcidev->devfn), 1317 + NES_MANAGE_APBVT_DEL); 1318 + 1319 + nes_remove_mapinfo(listener->loc_addr, 1320 + listener->loc_port, 1321 + listener->mapped_loc_addr, 1322 + listener->mapped_loc_port); 1323 + nes_debug(NES_DBG_NLMSG, 1324 + "Delete APBVT mapped_loc_port = %04X\n", 1325 + listener->mapped_loc_port); 1326 + } 1422 1327 1423 1328 nes_debug(NES_DBG_CM, "destroying listener (%p)\n", listener); 1424 1329 ··· 1571 1454 cm_node->loc_port = cm_info->loc_port; 1572 1455 cm_node->rem_port = cm_info->rem_port; 1573 1456 1457 + cm_node->mapped_loc_addr = cm_info->mapped_loc_addr; 1458 + cm_node->mapped_rem_addr = cm_info->mapped_rem_addr; 1459 + cm_node->mapped_loc_port = cm_info->mapped_loc_port; 1460 + cm_node->mapped_rem_port = cm_info->mapped_rem_port; 1461 + 1574 1462 cm_node->mpa_frame_rev = mpa_version; 1575 1463 cm_node->send_rdma0_op = SEND_RDMA_READ_ZERO; 1576 1464 cm_node->mpav2_ird_ord = 0; ··· 1622 1500 cm_node->loopbackpartner = NULL; 1623 1501 1624 1502 /* get the mac addr for the remote node */ 1625 - oldarpindex = nes_arp_table(nesdev, cm_node->rem_addr, NULL, NES_ARP_RESOLVE); 1626 - arpindex = nes_addr_resolve_neigh(nesvnic, cm_info->rem_addr, oldarpindex); 1503 + oldarpindex = nes_arp_table(nesdev, cm_node->mapped_rem_addr, 1504 + NULL, NES_ARP_RESOLVE); 1505 + arpindex = nes_addr_resolve_neigh(nesvnic, 1506 + cm_node->mapped_rem_addr, oldarpindex); 1627 1507 if (arpindex < 0) { 1628 1508 kfree(cm_node); 1629 1509 return NULL; ··· 1687 1563 mini_cm_dec_refcnt_listen(cm_core, cm_node->listener, 0); 1688 1564 } else { 1689 1565 if (cm_node->apbvt_set && cm_node->nesvnic) { 1690 - nes_manage_apbvt(cm_node->nesvnic, cm_node->loc_port, 1691 - PCI_FUNC( 1692 - cm_node->nesvnic->nesdev->pcidev->devfn), 1566 + nes_manage_apbvt(cm_node->nesvnic, cm_node->mapped_loc_port, 1567 + PCI_FUNC(cm_node->nesvnic->nesdev->pcidev->devfn), 1693 1568 NES_MANAGE_APBVT_DEL); 1694 1569 } 1570 + nes_debug(NES_DBG_NLMSG, "Delete APBVT mapped_loc_port = %04X\n", 1571 + cm_node->mapped_loc_port); 1572 + nes_remove_mapinfo(cm_node->loc_addr, cm_node->loc_port, 1573 + cm_node->mapped_loc_addr, cm_node->mapped_loc_port); 1695 1574 } 1696 1575 1697 1576 atomic_dec(&cm_core->node_cnt); ··· 2362 2235 * mini_cm_listen - create a listen node with params 2363 2236 */ 2364 2237 static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *cm_core, 2365 - struct nes_vnic *nesvnic, struct nes_cm_info *cm_info) 2238 + struct nes_vnic *nesvnic, struct nes_cm_info *cm_info) 2366 2239 { 2367 2240 struct nes_cm_listener *listener; 2241 + struct iwpm_dev_data pm_reg_msg; 2242 + struct iwpm_sa_data pm_msg; 2368 2243 unsigned long flags; 2244 + int iwpm_err = 0; 2369 2245 2370 2246 nes_debug(NES_DBG_CM, "Search for 0x%08x : 0x%04x\n", 2371 2247 cm_info->loc_addr, cm_info->loc_port); 2372 2248 2373 2249 /* cannot have multiple matching listeners */ 2374 - listener = find_listener(cm_core, htonl(cm_info->loc_addr), 2375 - htons(cm_info->loc_port), NES_CM_LISTENER_EITHER_STATE); 2250 + listener = find_listener(cm_core, cm_info->loc_addr, cm_info->loc_port, 2251 + NES_CM_LISTENER_EITHER_STATE, 1); 2252 + 2376 2253 if (listener && listener->listener_state == NES_CM_LISTENER_ACTIVE_STATE) { 2377 2254 /* find automatically incs ref count ??? */ 2378 2255 atomic_dec(&listener->ref_count); ··· 2385 2254 } 2386 2255 2387 2256 if (!listener) { 2257 + nes_form_reg_msg(nesvnic, &pm_reg_msg); 2258 + iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_NES); 2259 + if (iwpm_err) { 2260 + nes_debug(NES_DBG_NLMSG, 2261 + "Port Mapper reg pid fail (err = %d).\n", iwpm_err); 2262 + } 2263 + if (iwpm_valid_pid() && !iwpm_err) { 2264 + nes_form_pm_msg(cm_info, &pm_msg); 2265 + iwpm_err = iwpm_add_mapping(&pm_msg, RDMA_NL_NES); 2266 + if (iwpm_err) 2267 + nes_debug(NES_DBG_NLMSG, 2268 + "Port Mapper query fail (err = %d).\n", iwpm_err); 2269 + else 2270 + nes_record_pm_msg(cm_info, &pm_msg); 2271 + } 2272 + 2388 2273 /* create a CM listen node (1/2 node to compare incoming traffic to) */ 2389 2274 listener = kzalloc(sizeof(*listener), GFP_ATOMIC); 2390 2275 if (!listener) { ··· 2408 2261 return NULL; 2409 2262 } 2410 2263 2411 - listener->loc_addr = htonl(cm_info->loc_addr); 2412 - listener->loc_port = htons(cm_info->loc_port); 2264 + listener->loc_addr = cm_info->loc_addr; 2265 + listener->loc_port = cm_info->loc_port; 2266 + listener->mapped_loc_addr = cm_info->mapped_loc_addr; 2267 + listener->mapped_loc_port = cm_info->mapped_loc_port; 2413 2268 listener->reused_node = 0; 2414 2269 2415 2270 atomic_set(&listener->ref_count, 1); ··· 2473 2324 2474 2325 if (cm_info->loc_addr == cm_info->rem_addr) { 2475 2326 loopbackremotelistener = find_listener(cm_core, 2476 - ntohl(nesvnic->local_ipaddr), cm_node->rem_port, 2477 - NES_CM_LISTENER_ACTIVE_STATE); 2327 + cm_node->mapped_loc_addr, cm_node->mapped_rem_port, 2328 + NES_CM_LISTENER_ACTIVE_STATE, 0); 2478 2329 if (loopbackremotelistener == NULL) { 2479 2330 create_event(cm_node, NES_CM_EVENT_ABORTED); 2480 2331 } else { 2481 2332 loopback_cm_info = *cm_info; 2482 2333 loopback_cm_info.loc_port = cm_info->rem_port; 2483 2334 loopback_cm_info.rem_port = cm_info->loc_port; 2335 + loopback_cm_info.mapped_loc_port = 2336 + cm_info->mapped_rem_port; 2337 + loopback_cm_info.mapped_rem_port = 2338 + cm_info->mapped_loc_port; 2484 2339 loopback_cm_info.cm_id = loopbackremotelistener->cm_id; 2485 2340 loopbackremotenode = make_cm_node(cm_core, nesvnic, 2486 2341 &loopback_cm_info, loopbackremotelistener); ··· 2713 2560 nfo.rem_addr = ntohl(iph->saddr); 2714 2561 nfo.rem_port = ntohs(tcph->source); 2715 2562 2563 + /* If port mapper is available these should be mapped address info */ 2564 + nfo.mapped_loc_addr = ntohl(iph->daddr); 2565 + nfo.mapped_loc_port = ntohs(tcph->dest); 2566 + nfo.mapped_rem_addr = ntohl(iph->saddr); 2567 + nfo.mapped_rem_port = ntohs(tcph->source); 2568 + 2716 2569 tmp_daddr = cpu_to_be32(iph->daddr); 2717 2570 tmp_saddr = cpu_to_be32(iph->saddr); 2718 2571 ··· 2727 2568 2728 2569 do { 2729 2570 cm_node = find_node(cm_core, 2730 - nfo.rem_port, nfo.rem_addr, 2731 - nfo.loc_port, nfo.loc_addr); 2571 + nfo.mapped_rem_port, nfo.mapped_rem_addr, 2572 + nfo.mapped_loc_port, nfo.mapped_loc_addr); 2732 2573 2733 2574 if (!cm_node) { 2734 2575 /* Only type of packet accepted are for */ ··· 2737 2578 skb_handled = 0; 2738 2579 break; 2739 2580 } 2740 - listener = find_listener(cm_core, nfo.loc_addr, 2741 - nfo.loc_port, 2742 - NES_CM_LISTENER_ACTIVE_STATE); 2581 + listener = find_listener(cm_core, nfo.mapped_loc_addr, 2582 + nfo.mapped_loc_port, 2583 + NES_CM_LISTENER_ACTIVE_STATE, 0); 2743 2584 if (!listener) { 2744 2585 nfo.cm_id = NULL; 2745 2586 nfo.conn_type = 0; ··· 3343 3184 3344 3185 nes_cm_init_tsa_conn(nesqp, cm_node); 3345 3186 3346 - nesqp->nesqp_context->tcpPorts[0] = cpu_to_le16(ntohs(laddr->sin_port)); 3347 - nesqp->nesqp_context->tcpPorts[1] = cpu_to_le16(ntohs(raddr->sin_port)); 3187 + nesqp->nesqp_context->tcpPorts[0] = 3188 + cpu_to_le16(cm_node->mapped_loc_port); 3189 + nesqp->nesqp_context->tcpPorts[1] = 3190 + cpu_to_le16(cm_node->mapped_rem_port); 3348 3191 3349 - nesqp->nesqp_context->ip0 = cpu_to_le32(ntohl(raddr->sin_addr.s_addr)); 3192 + nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->mapped_rem_addr); 3350 3193 3351 3194 nesqp->nesqp_context->misc2 |= cpu_to_le32( 3352 3195 (u32)PCI_FUNC(nesdev->pcidev->devfn) << ··· 3372 3211 memset(&nes_quad, 0, sizeof(nes_quad)); 3373 3212 nes_quad.DstIpAdrIndex = 3374 3213 cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24); 3375 - nes_quad.SrcIpadr = raddr->sin_addr.s_addr; 3376 - nes_quad.TcpPorts[0] = raddr->sin_port; 3377 - nes_quad.TcpPorts[1] = laddr->sin_port; 3214 + nes_quad.SrcIpadr = htonl(cm_node->mapped_rem_addr); 3215 + nes_quad.TcpPorts[0] = htons(cm_node->mapped_rem_port); 3216 + nes_quad.TcpPorts[1] = htons(cm_node->mapped_loc_port); 3378 3217 3379 3218 /* Produce hash key */ 3380 3219 crc_value = get_crc_value(&nes_quad); ··· 3476 3315 int apbvt_set = 0; 3477 3316 struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr; 3478 3317 struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr; 3318 + struct iwpm_dev_data pm_reg_msg; 3319 + struct iwpm_sa_data pm_msg; 3320 + int iwpm_err = 0; 3479 3321 3480 3322 if (cm_id->remote_addr.ss_family != AF_INET) 3481 3323 return -ENOSYS; ··· 3516 3352 nes_debug(NES_DBG_CM, "mpa private data len =%u\n", 3517 3353 conn_param->private_data_len); 3518 3354 3355 + /* set up the connection params for the node */ 3356 + cm_info.loc_addr = ntohl(laddr->sin_addr.s_addr); 3357 + cm_info.loc_port = ntohs(laddr->sin_port); 3358 + cm_info.rem_addr = ntohl(raddr->sin_addr.s_addr); 3359 + cm_info.rem_port = ntohs(raddr->sin_port); 3360 + cm_info.cm_id = cm_id; 3361 + cm_info.conn_type = NES_CM_IWARP_CONN_TYPE; 3362 + 3363 + /* No port mapper available, go with the specified peer information */ 3364 + cm_info.mapped_loc_addr = cm_info.loc_addr; 3365 + cm_info.mapped_loc_port = cm_info.loc_port; 3366 + cm_info.mapped_rem_addr = cm_info.rem_addr; 3367 + cm_info.mapped_rem_port = cm_info.rem_port; 3368 + 3369 + nes_form_reg_msg(nesvnic, &pm_reg_msg); 3370 + iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_NES); 3371 + if (iwpm_err) { 3372 + nes_debug(NES_DBG_NLMSG, 3373 + "Port Mapper reg pid fail (err = %d).\n", iwpm_err); 3374 + } 3375 + if (iwpm_valid_pid() && !iwpm_err) { 3376 + nes_form_pm_msg(&cm_info, &pm_msg); 3377 + iwpm_err = iwpm_add_and_query_mapping(&pm_msg, RDMA_NL_NES); 3378 + if (iwpm_err) 3379 + nes_debug(NES_DBG_NLMSG, 3380 + "Port Mapper query fail (err = %d).\n", iwpm_err); 3381 + else 3382 + nes_record_pm_msg(&cm_info, &pm_msg); 3383 + } 3384 + 3519 3385 if (laddr->sin_addr.s_addr != raddr->sin_addr.s_addr) { 3520 - nes_manage_apbvt(nesvnic, ntohs(laddr->sin_port), 3521 - PCI_FUNC(nesdev->pcidev->devfn), 3522 - NES_MANAGE_APBVT_ADD); 3386 + nes_manage_apbvt(nesvnic, cm_info.mapped_loc_port, 3387 + PCI_FUNC(nesdev->pcidev->devfn), NES_MANAGE_APBVT_ADD); 3523 3388 apbvt_set = 1; 3524 3389 } 3525 3390 3526 - /* set up the connection params for the node */ 3527 - cm_info.loc_addr = htonl(laddr->sin_addr.s_addr); 3528 - cm_info.loc_port = htons(laddr->sin_port); 3529 - cm_info.rem_addr = htonl(raddr->sin_addr.s_addr); 3530 - cm_info.rem_port = htons(raddr->sin_port); 3531 - cm_info.cm_id = cm_id; 3532 - cm_info.conn_type = NES_CM_IWARP_CONN_TYPE; 3391 + if (nes_create_mapinfo(&cm_info)) 3392 + return -ENOMEM; 3533 3393 3534 3394 cm_id->add_ref(cm_id); 3535 3395 ··· 3563 3375 &cm_info); 3564 3376 if (!cm_node) { 3565 3377 if (apbvt_set) 3566 - nes_manage_apbvt(nesvnic, ntohs(laddr->sin_port), 3378 + nes_manage_apbvt(nesvnic, cm_info.mapped_loc_port, 3567 3379 PCI_FUNC(nesdev->pcidev->devfn), 3568 3380 NES_MANAGE_APBVT_DEL); 3569 3381 3382 + nes_debug(NES_DBG_NLMSG, "Delete mapped_loc_port = %04X\n", 3383 + cm_info.mapped_loc_port); 3384 + nes_remove_mapinfo(cm_info.loc_addr, cm_info.loc_port, 3385 + cm_info.mapped_loc_addr, cm_info.mapped_loc_port); 3570 3386 cm_id->rem_ref(cm_id); 3571 3387 return -ENOMEM; 3572 3388 } ··· 3616 3424 nesvnic->local_ipaddr, laddr->sin_addr.s_addr); 3617 3425 3618 3426 /* setup listen params in our api call struct */ 3619 - cm_info.loc_addr = nesvnic->local_ipaddr; 3620 - cm_info.loc_port = laddr->sin_port; 3427 + cm_info.loc_addr = ntohl(nesvnic->local_ipaddr); 3428 + cm_info.loc_port = ntohs(laddr->sin_port); 3621 3429 cm_info.backlog = backlog; 3622 3430 cm_info.cm_id = cm_id; 3623 3431 3624 3432 cm_info.conn_type = NES_CM_IWARP_CONN_TYPE; 3625 3433 3434 + /* No port mapper available, go with the specified info */ 3435 + cm_info.mapped_loc_addr = cm_info.loc_addr; 3436 + cm_info.mapped_loc_port = cm_info.loc_port; 3626 3437 3627 3438 cm_node = g_cm_core->api->listen(g_cm_core, nesvnic, &cm_info); 3628 3439 if (!cm_node) { ··· 3637 3442 cm_id->provider_data = cm_node; 3638 3443 3639 3444 if (!cm_node->reused_node) { 3640 - err = nes_manage_apbvt(nesvnic, ntohs(laddr->sin_port), 3445 + if (nes_create_mapinfo(&cm_info)) 3446 + return -ENOMEM; 3447 + 3448 + err = nes_manage_apbvt(nesvnic, cm_node->mapped_loc_port, 3641 3449 PCI_FUNC(nesvnic->nesdev->pcidev->devfn), 3642 3450 NES_MANAGE_APBVT_ADD); 3643 3451 if (err) { ··· 3765 3567 nes_cm_init_tsa_conn(nesqp, cm_node); 3766 3568 3767 3569 /* set the QP tsa context */ 3768 - nesqp->nesqp_context->tcpPorts[0] = cpu_to_le16(ntohs(laddr->sin_port)); 3769 - nesqp->nesqp_context->tcpPorts[1] = cpu_to_le16(ntohs(raddr->sin_port)); 3770 - nesqp->nesqp_context->ip0 = cpu_to_le32(ntohl(raddr->sin_addr.s_addr)); 3570 + nesqp->nesqp_context->tcpPorts[0] = 3571 + cpu_to_le16(cm_node->mapped_loc_port); 3572 + nesqp->nesqp_context->tcpPorts[1] = 3573 + cpu_to_le16(cm_node->mapped_rem_port); 3574 + nesqp->nesqp_context->ip0 = cpu_to_le32(cm_node->mapped_rem_addr); 3771 3575 3772 3576 nesqp->nesqp_context->misc2 |= cpu_to_le32( 3773 3577 (u32)PCI_FUNC(nesdev->pcidev->devfn) << ··· 3799 3599 3800 3600 nes_quad.DstIpAdrIndex = 3801 3601 cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) << 24); 3802 - nes_quad.SrcIpadr = raddr->sin_addr.s_addr; 3803 - nes_quad.TcpPorts[0] = raddr->sin_port; 3804 - nes_quad.TcpPorts[1] = laddr->sin_port; 3602 + nes_quad.SrcIpadr = htonl(cm_node->mapped_rem_addr); 3603 + nes_quad.TcpPorts[0] = htons(cm_node->mapped_rem_port); 3604 + nes_quad.TcpPorts[1] = htons(cm_node->mapped_loc_port); 3805 3605 3806 3606 /* Produce hash key */ 3807 3607 crc_value = get_crc_value(&nes_quad); ··· 3829 3629 cm_event.ird = cm_node->ird_size; 3830 3630 cm_event.ord = cm_node->ord_size; 3831 3631 3832 - cm_event_laddr->sin_addr.s_addr = event->cm_info.rem_addr; 3632 + cm_event_laddr->sin_addr.s_addr = htonl(event->cm_info.rem_addr); 3833 3633 ret = cm_id->event_handler(cm_id, &cm_event); 3834 3634 nes_debug(NES_DBG_CM, "OFA CM event_handler returned, ret=%d\n", ret); 3835 3635
+9 -3
drivers/infiniband/hw/nes/nes_cm.h
··· 1 1 /* 2 - * Copyright (c) 2006 - 2011 Intel Corporation. All rights reserved. 2 + * Copyright (c) 2006 - 2014 Intel Corporation. All rights reserved. 3 3 * 4 4 * This software is available to you under a choice of one of two 5 5 * licenses. You may choose to be licensed under the terms of the GNU ··· 293 293 struct list_head list; 294 294 struct nes_cm_core *cm_core; 295 295 u8 loc_mac[ETH_ALEN]; 296 - nes_addr_t loc_addr; 297 - u16 loc_port; 296 + nes_addr_t loc_addr, mapped_loc_addr; 297 + u16 loc_port, mapped_loc_port; 298 298 struct iw_cm_id *cm_id; 299 299 enum nes_cm_conn_type conn_type; 300 300 atomic_t ref_count; ··· 308 308 /* per connection node and node state information */ 309 309 struct nes_cm_node { 310 310 nes_addr_t loc_addr, rem_addr; 311 + nes_addr_t mapped_loc_addr, mapped_rem_addr; 311 312 u16 loc_port, rem_port; 313 + u16 mapped_loc_port, mapped_rem_port; 312 314 313 315 u8 loc_mac[ETH_ALEN]; 314 316 u8 rem_mac[ETH_ALEN]; ··· 366 364 u16 rem_port; 367 365 nes_addr_t loc_addr; 368 366 nes_addr_t rem_addr; 367 + u16 mapped_loc_port; 368 + u16 mapped_rem_port; 369 + nes_addr_t mapped_loc_addr; 370 + nes_addr_t mapped_rem_addr; 369 371 370 372 enum nes_cm_conn_type conn_type; 371 373 int backlog;
+1 -8
drivers/infiniband/hw/ocrdma/ocrdma_stats.c
··· 510 510 return status; 511 511 } 512 512 513 - static int ocrdma_debugfs_open(struct inode *inode, struct file *file) 514 - { 515 - if (inode->i_private) 516 - file->private_data = inode->i_private; 517 - return 0; 518 - } 519 - 520 513 static const struct file_operations ocrdma_dbg_ops = { 521 514 .owner = THIS_MODULE, 522 - .open = ocrdma_debugfs_open, 515 + .open = simple_open, 523 516 .read = ocrdma_dbgfs_ops_read, 524 517 }; 525 518
+4 -4
drivers/infiniband/hw/qib/qib_init.c
··· 1272 1272 * Do all the generic driver unit- and chip-independent memory 1273 1273 * allocation and initialization. 1274 1274 */ 1275 - static int __init qlogic_ib_init(void) 1275 + static int __init qib_ib_init(void) 1276 1276 { 1277 1277 int ret; 1278 1278 ··· 1316 1316 return ret; 1317 1317 } 1318 1318 1319 - module_init(qlogic_ib_init); 1319 + module_init(qib_ib_init); 1320 1320 1321 1321 /* 1322 1322 * Do the non-unit driver cleanup, memory free, etc. at unload. 1323 1323 */ 1324 - static void __exit qlogic_ib_cleanup(void) 1324 + static void __exit qib_ib_cleanup(void) 1325 1325 { 1326 1326 int ret; 1327 1327 ··· 1346 1346 qib_dev_cleanup(); 1347 1347 } 1348 1348 1349 - module_exit(qlogic_ib_cleanup); 1349 + module_exit(qib_ib_cleanup); 1350 1350 1351 1351 /* this can only be called after a successful initialization */ 1352 1352 static void cleanup_device_data(struct qib_devdata *dd)
+1 -1
drivers/infiniband/hw/qib/qib_mad.c
··· 1028 1028 1029 1029 event.event = IB_EVENT_PKEY_CHANGE; 1030 1030 event.device = &dd->verbs_dev.ibdev; 1031 - event.element.port_num = 1; 1031 + event.element.port_num = port; 1032 1032 ib_dispatch_event(&event); 1033 1033 } 1034 1034 return 0;
+2 -1
drivers/infiniband/hw/qib/qib_qp.c
··· 985 985 struct ib_qp *ret; 986 986 987 987 if (init_attr->cap.max_send_sge > ib_qib_max_sges || 988 - init_attr->cap.max_send_wr > ib_qib_max_qp_wrs) { 988 + init_attr->cap.max_send_wr > ib_qib_max_qp_wrs || 989 + init_attr->create_flags) { 989 990 ret = ERR_PTR(-EINVAL); 990 991 goto bail; 991 992 }
+3
drivers/infiniband/hw/usnic/usnic_ib_verbs.c
··· 466 466 ucontext = to_uucontext(pd->uobject->context); 467 467 us_ibdev = to_usdev(pd->device); 468 468 469 + if (init_attr->create_flags) 470 + return ERR_PTR(-EINVAL); 471 + 469 472 err = ib_copy_from_udata(&cmd, udata, sizeof(cmd)); 470 473 if (err) { 471 474 usnic_err("%s: cannot copy udata for create_qp\n",
+18
drivers/infiniband/hw/usnic/usnic_uiom_interval_tree.c
··· 1 + /* 2 + * Copyright (c) 2014, Cisco Systems, Inc. All rights reserved. 3 + * 4 + * This program is free software; you may redistribute it and/or modify 5 + * it under the terms of the GNU General Public License as published by 6 + * the Free Software Foundation; version 2 of the License. 7 + * 8 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 9 + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 10 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 11 + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 12 + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 13 + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 14 + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 15 + * SOFTWARE. 16 + * 17 + */ 18 + 1 19 #include <linux/init.h> 2 20 #include <linux/list.h> 3 21 #include <linux/slab.h>
+5
drivers/infiniband/ulp/Makefile
··· 1 + obj-$(CONFIG_INFINIBAND_IPOIB) += ipoib/ 2 + obj-$(CONFIG_INFINIBAND_SRP) += srp/ 3 + obj-$(CONFIG_INFINIBAND_SRPT) += srpt/ 4 + obj-$(CONFIG_INFINIBAND_ISER) += iser/ 5 + obj-$(CONFIG_INFINIBAND_ISERT) += isert/
+15 -3
drivers/infiniband/ulp/ipoib/ipoib_cm.c
··· 1030 1030 .cap.max_send_sge = 1, 1031 1031 .sq_sig_type = IB_SIGNAL_ALL_WR, 1032 1032 .qp_type = IB_QPT_RC, 1033 - .qp_context = tx 1033 + .qp_context = tx, 1034 + .create_flags = IB_QP_CREATE_USE_GFP_NOIO 1034 1035 }; 1035 1036 1036 - return ib_create_qp(priv->pd, &attr); 1037 + struct ib_qp *tx_qp; 1038 + 1039 + tx_qp = ib_create_qp(priv->pd, &attr); 1040 + if (PTR_ERR(tx_qp) == -EINVAL) { 1041 + ipoib_warn(priv, "can't use GFP_NOIO for QPs on device %s, using GFP_KERNEL\n", 1042 + priv->ca->name); 1043 + attr.create_flags &= ~IB_QP_CREATE_USE_GFP_NOIO; 1044 + tx_qp = ib_create_qp(priv->pd, &attr); 1045 + } 1046 + return tx_qp; 1037 1047 } 1038 1048 1039 1049 static int ipoib_cm_send_req(struct net_device *dev, ··· 1114 1104 struct ipoib_dev_priv *priv = netdev_priv(p->dev); 1115 1105 int ret; 1116 1106 1117 - p->tx_ring = vzalloc(ipoib_sendq_size * sizeof *p->tx_ring); 1107 + p->tx_ring = __vmalloc(ipoib_sendq_size * sizeof *p->tx_ring, 1108 + GFP_NOIO, PAGE_KERNEL); 1118 1109 if (!p->tx_ring) { 1119 1110 ipoib_warn(priv, "failed to allocate tx ring\n"); 1120 1111 ret = -ENOMEM; 1121 1112 goto err_tx; 1122 1113 } 1114 + memset(p->tx_ring, 0, ipoib_sendq_size * sizeof *p->tx_ring); 1123 1115 1124 1116 p->qp = ipoib_cm_create_tx_qp(p->dev, p); 1125 1117 if (IS_ERR(p->qp)) {
+61 -44
drivers/infiniband/ulp/iser/iscsi_iser.c
··· 99 99 module_param_named(pi_guard, iser_pi_guard, int, 0644); 100 100 MODULE_PARM_DESC(pi_guard, "T10-PI guard_type, 0:CRC|1:IP_CSUM (default:CRC)"); 101 101 102 + static struct workqueue_struct *release_wq; 102 103 struct iser_global ig; 103 104 104 105 void ··· 338 337 return cls_conn; 339 338 } 340 339 341 - static void 342 - iscsi_iser_conn_destroy(struct iscsi_cls_conn *cls_conn) 343 - { 344 - struct iscsi_conn *conn = cls_conn->dd_data; 345 - struct iser_conn *ib_conn = conn->dd_data; 346 - 347 - iscsi_conn_teardown(cls_conn); 348 - /* 349 - * Userspace will normally call the stop callback and 350 - * already have freed the ib_conn, but if it goofed up then 351 - * we free it here. 352 - */ 353 - if (ib_conn) { 354 - ib_conn->iscsi_conn = NULL; 355 - iser_conn_put(ib_conn, 1); /* deref iscsi/ib conn unbinding */ 356 - } 357 - } 358 - 359 340 static int 360 341 iscsi_iser_conn_bind(struct iscsi_cls_session *cls_session, 361 342 struct iscsi_cls_conn *cls_conn, uint64_t transport_eph, ··· 375 392 conn->dd_data = ib_conn; 376 393 ib_conn->iscsi_conn = conn; 377 394 378 - iser_conn_get(ib_conn); /* ref iscsi/ib conn binding */ 379 395 return 0; 396 + } 397 + 398 + static int 399 + iscsi_iser_conn_start(struct iscsi_cls_conn *cls_conn) 400 + { 401 + struct iscsi_conn *iscsi_conn; 402 + struct iser_conn *ib_conn; 403 + 404 + iscsi_conn = cls_conn->dd_data; 405 + ib_conn = iscsi_conn->dd_data; 406 + reinit_completion(&ib_conn->stop_completion); 407 + 408 + return iscsi_conn_start(cls_conn); 380 409 } 381 410 382 411 static void ··· 397 402 struct iscsi_conn *conn = cls_conn->dd_data; 398 403 struct iser_conn *ib_conn = conn->dd_data; 399 404 405 + iser_dbg("stopping iscsi_conn: %p, ib_conn: %p\n", conn, ib_conn); 406 + iscsi_conn_stop(cls_conn, flag); 407 + 400 408 /* 401 409 * Userspace may have goofed up and not bound the connection or 402 410 * might have only partially setup the connection. 403 411 */ 404 412 if (ib_conn) { 405 - iscsi_conn_stop(cls_conn, flag); 406 - /* 407 - * There is no unbind event so the stop callback 408 - * must release the ref from the bind. 409 - */ 410 - iser_conn_put(ib_conn, 1); /* deref iscsi/ib conn unbinding */ 413 + conn->dd_data = NULL; 414 + complete(&ib_conn->stop_completion); 411 415 } 412 - conn->dd_data = NULL; 413 416 } 414 417 415 418 static void iscsi_iser_session_destroy(struct iscsi_cls_session *cls_session) ··· 508 515 case ISCSI_PARAM_HDRDGST_EN: 509 516 sscanf(buf, "%d", &value); 510 517 if (value) { 511 - iser_err("DataDigest wasn't negotiated to None"); 518 + iser_err("DataDigest wasn't negotiated to None\n"); 512 519 return -EPROTO; 513 520 } 514 521 break; 515 522 case ISCSI_PARAM_DATADGST_EN: 516 523 sscanf(buf, "%d", &value); 517 524 if (value) { 518 - iser_err("DataDigest wasn't negotiated to None"); 525 + iser_err("DataDigest wasn't negotiated to None\n"); 519 526 return -EPROTO; 520 527 } 521 528 break; 522 529 case ISCSI_PARAM_IFMARKER_EN: 523 530 sscanf(buf, "%d", &value); 524 531 if (value) { 525 - iser_err("IFMarker wasn't negotiated to No"); 532 + iser_err("IFMarker wasn't negotiated to No\n"); 526 533 return -EPROTO; 527 534 } 528 535 break; 529 536 case ISCSI_PARAM_OFMARKER_EN: 530 537 sscanf(buf, "%d", &value); 531 538 if (value) { 532 - iser_err("OFMarker wasn't negotiated to No"); 539 + iser_err("OFMarker wasn't negotiated to No\n"); 533 540 return -EPROTO; 534 541 } 535 542 break; ··· 645 652 struct iser_conn *ib_conn; 646 653 647 654 ib_conn = ep->dd_data; 648 - if (ib_conn->iscsi_conn) 649 - /* 650 - * Must suspend xmit path if the ep is bound to the 651 - * iscsi_conn, so we know we are not accessing the ib_conn 652 - * when we free it. 653 - * 654 - * This may not be bound if the ep poll failed. 655 - */ 656 - iscsi_suspend_tx(ib_conn->iscsi_conn); 657 - 658 - 659 - iser_info("ib conn %p state %d\n", ib_conn, ib_conn->state); 655 + iser_info("ep %p ib conn %p state %d\n", ep, ib_conn, ib_conn->state); 660 656 iser_conn_terminate(ib_conn); 657 + 658 + /* 659 + * if iser_conn and iscsi_conn are bound, we must wait iscsi_conn_stop 660 + * call and ISER_CONN_DOWN state before freeing the iser resources. 661 + * otherwise we are safe to free resources immediately. 662 + */ 663 + if (ib_conn->iscsi_conn) { 664 + INIT_WORK(&ib_conn->release_work, iser_release_work); 665 + queue_work(release_wq, &ib_conn->release_work); 666 + } else { 667 + iser_conn_release(ib_conn); 668 + } 661 669 } 662 670 663 671 static umode_t iser_attr_is_visible(int param_type, int param) ··· 742 748 /* connection management */ 743 749 .create_conn = iscsi_iser_conn_create, 744 750 .bind_conn = iscsi_iser_conn_bind, 745 - .destroy_conn = iscsi_iser_conn_destroy, 751 + .destroy_conn = iscsi_conn_teardown, 746 752 .attr_is_visible = iser_attr_is_visible, 747 753 .set_param = iscsi_iser_set_param, 748 754 .get_conn_param = iscsi_conn_get_param, 749 755 .get_ep_param = iscsi_iser_get_ep_param, 750 756 .get_session_param = iscsi_session_get_param, 751 - .start_conn = iscsi_conn_start, 757 + .start_conn = iscsi_iser_conn_start, 752 758 .stop_conn = iscsi_iser_conn_stop, 753 759 /* iscsi host params */ 754 760 .get_host_param = iscsi_host_get_param, ··· 795 801 mutex_init(&ig.connlist_mutex); 796 802 INIT_LIST_HEAD(&ig.connlist); 797 803 804 + release_wq = alloc_workqueue("release workqueue", 0, 0); 805 + if (!release_wq) { 806 + iser_err("failed to allocate release workqueue\n"); 807 + return -ENOMEM; 808 + } 809 + 798 810 iscsi_iser_scsi_transport = iscsi_register_transport( 799 811 &iscsi_iser_transport); 800 812 if (!iscsi_iser_scsi_transport) { ··· 819 819 820 820 static void __exit iser_exit(void) 821 821 { 822 + struct iser_conn *ib_conn, *n; 823 + int connlist_empty; 824 + 822 825 iser_dbg("Removing iSER datamover...\n"); 826 + destroy_workqueue(release_wq); 827 + 828 + mutex_lock(&ig.connlist_mutex); 829 + connlist_empty = list_empty(&ig.connlist); 830 + mutex_unlock(&ig.connlist_mutex); 831 + 832 + if (!connlist_empty) { 833 + iser_err("Error cleanup stage completed but we still have iser " 834 + "connections, destroying them anyway.\n"); 835 + list_for_each_entry_safe(ib_conn, n, &ig.connlist, conn_list) { 836 + iser_conn_release(ib_conn); 837 + } 838 + } 839 + 823 840 iscsi_unregister_transport(&iscsi_iser_transport); 824 841 kmem_cache_destroy(ig.desc_cache); 825 842 }
+6 -4
drivers/infiniband/ulp/iser/iscsi_iser.h
··· 69 69 70 70 #define DRV_NAME "iser" 71 71 #define PFX DRV_NAME ": " 72 - #define DRV_VER "1.3" 72 + #define DRV_VER "1.4" 73 73 74 74 #define iser_dbg(fmt, arg...) \ 75 75 do { \ ··· 333 333 int post_recv_buf_count; /* posted rx count */ 334 334 atomic_t post_send_buf_count; /* posted tx count */ 335 335 char name[ISER_OBJECT_NAME_SIZE]; 336 + struct work_struct release_work; 337 + struct completion stop_completion; 336 338 struct list_head conn_list; /* entry in ig conn list */ 337 339 338 340 char *login_buf; ··· 419 417 420 418 void iser_conn_init(struct iser_conn *ib_conn); 421 419 422 - void iser_conn_get(struct iser_conn *ib_conn); 423 - 424 - int iser_conn_put(struct iser_conn *ib_conn, int destroy_cma_id_allowed); 420 + void iser_conn_release(struct iser_conn *ib_conn); 425 421 426 422 void iser_conn_terminate(struct iser_conn *ib_conn); 423 + 424 + void iser_release_work(struct work_struct *work); 427 425 428 426 void iser_rcv_completion(struct iser_rx_desc *desc, 429 427 unsigned long dto_xfer_len,
+39 -50
drivers/infiniband/ulp/iser/iser_verbs.c
··· 581 581 return ret; 582 582 } 583 583 584 + void iser_release_work(struct work_struct *work) 585 + { 586 + struct iser_conn *ib_conn; 587 + 588 + ib_conn = container_of(work, struct iser_conn, release_work); 589 + 590 + /* wait for .conn_stop callback */ 591 + wait_for_completion(&ib_conn->stop_completion); 592 + 593 + /* wait for the qp`s post send and post receive buffers to empty */ 594 + wait_event_interruptible(ib_conn->wait, 595 + ib_conn->state == ISER_CONN_DOWN); 596 + 597 + iser_conn_release(ib_conn); 598 + } 599 + 584 600 /** 585 601 * Frees all conn objects and deallocs conn descriptor 586 602 */ 587 - static void iser_conn_release(struct iser_conn *ib_conn, int can_destroy_id) 603 + void iser_conn_release(struct iser_conn *ib_conn) 588 604 { 589 605 struct iser_device *device = ib_conn->device; 590 606 591 - BUG_ON(ib_conn->state != ISER_CONN_DOWN); 607 + BUG_ON(ib_conn->state == ISER_CONN_UP); 592 608 593 609 mutex_lock(&ig.connlist_mutex); 594 610 list_del(&ib_conn->conn_list); ··· 616 600 if (device != NULL) 617 601 iser_device_try_release(device); 618 602 /* if cma handler context, the caller actually destroy the id */ 619 - if (ib_conn->cma_id != NULL && can_destroy_id) { 603 + if (ib_conn->cma_id != NULL) { 620 604 rdma_destroy_id(ib_conn->cma_id); 621 605 ib_conn->cma_id = NULL; 622 606 } 623 607 iscsi_destroy_endpoint(ib_conn->ep); 624 - } 625 - 626 - void iser_conn_get(struct iser_conn *ib_conn) 627 - { 628 - atomic_inc(&ib_conn->refcount); 629 - } 630 - 631 - int iser_conn_put(struct iser_conn *ib_conn, int can_destroy_id) 632 - { 633 - if (atomic_dec_and_test(&ib_conn->refcount)) { 634 - iser_conn_release(ib_conn, can_destroy_id); 635 - return 1; 636 - } 637 - return 0; 638 608 } 639 609 640 610 /** ··· 640 638 if (err) 641 639 iser_err("Failed to disconnect, conn: 0x%p err %d\n", 642 640 ib_conn,err); 643 - 644 - wait_event_interruptible(ib_conn->wait, 645 - ib_conn->state == ISER_CONN_DOWN); 646 - 647 - iser_conn_put(ib_conn, 1); /* deref ib conn deallocate */ 648 641 } 649 642 650 - static int iser_connect_error(struct rdma_cm_id *cma_id) 643 + static void iser_connect_error(struct rdma_cm_id *cma_id) 651 644 { 652 645 struct iser_conn *ib_conn; 646 + 653 647 ib_conn = (struct iser_conn *)cma_id->context; 654 648 655 649 ib_conn->state = ISER_CONN_DOWN; 656 650 wake_up_interruptible(&ib_conn->wait); 657 - return iser_conn_put(ib_conn, 0); /* deref ib conn's cma id */ 658 651 } 659 652 660 - static int iser_addr_handler(struct rdma_cm_id *cma_id) 653 + static void iser_addr_handler(struct rdma_cm_id *cma_id) 661 654 { 662 655 struct iser_device *device; 663 656 struct iser_conn *ib_conn; ··· 661 664 device = iser_device_find_by_ib_device(cma_id); 662 665 if (!device) { 663 666 iser_err("device lookup/creation failed\n"); 664 - return iser_connect_error(cma_id); 667 + iser_connect_error(cma_id); 668 + return; 665 669 } 666 670 667 671 ib_conn = (struct iser_conn *)cma_id->context; ··· 684 686 ret = rdma_resolve_route(cma_id, 1000); 685 687 if (ret) { 686 688 iser_err("resolve route failed: %d\n", ret); 687 - return iser_connect_error(cma_id); 689 + iser_connect_error(cma_id); 690 + return; 688 691 } 689 - 690 - return 0; 691 692 } 692 693 693 - static int iser_route_handler(struct rdma_cm_id *cma_id) 694 + static void iser_route_handler(struct rdma_cm_id *cma_id) 694 695 { 695 696 struct rdma_conn_param conn_param; 696 697 int ret; ··· 717 720 goto failure; 718 721 } 719 722 720 - return 0; 723 + return; 721 724 failure: 722 - return iser_connect_error(cma_id); 725 + iser_connect_error(cma_id); 723 726 } 724 727 725 728 static void iser_connected_handler(struct rdma_cm_id *cma_id) ··· 732 735 iser_info("remote qpn:%x my qpn:%x\n", attr.dest_qp_num, cma_id->qp->qp_num); 733 736 734 737 ib_conn = (struct iser_conn *)cma_id->context; 735 - ib_conn->state = ISER_CONN_UP; 736 - wake_up_interruptible(&ib_conn->wait); 738 + if (iser_conn_state_comp_exch(ib_conn, ISER_CONN_PENDING, ISER_CONN_UP)) 739 + wake_up_interruptible(&ib_conn->wait); 737 740 } 738 741 739 - static int iser_disconnected_handler(struct rdma_cm_id *cma_id) 742 + static void iser_disconnected_handler(struct rdma_cm_id *cma_id) 740 743 { 741 744 struct iser_conn *ib_conn; 742 - int ret; 743 745 744 746 ib_conn = (struct iser_conn *)cma_id->context; 745 747 ··· 758 762 ib_conn->state = ISER_CONN_DOWN; 759 763 wake_up_interruptible(&ib_conn->wait); 760 764 } 761 - 762 - ret = iser_conn_put(ib_conn, 0); /* deref ib conn's cma id */ 763 - return ret; 764 765 } 765 766 766 767 static int iser_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) 767 768 { 768 - int ret = 0; 769 - 770 769 iser_info("event %d status %d conn %p id %p\n", 771 770 event->event, event->status, cma_id->context, cma_id); 772 771 773 772 switch (event->event) { 774 773 case RDMA_CM_EVENT_ADDR_RESOLVED: 775 - ret = iser_addr_handler(cma_id); 774 + iser_addr_handler(cma_id); 776 775 break; 777 776 case RDMA_CM_EVENT_ROUTE_RESOLVED: 778 - ret = iser_route_handler(cma_id); 777 + iser_route_handler(cma_id); 779 778 break; 780 779 case RDMA_CM_EVENT_ESTABLISHED: 781 780 iser_connected_handler(cma_id); ··· 780 789 case RDMA_CM_EVENT_CONNECT_ERROR: 781 790 case RDMA_CM_EVENT_UNREACHABLE: 782 791 case RDMA_CM_EVENT_REJECTED: 783 - ret = iser_connect_error(cma_id); 792 + iser_connect_error(cma_id); 784 793 break; 785 794 case RDMA_CM_EVENT_DISCONNECTED: 786 795 case RDMA_CM_EVENT_DEVICE_REMOVAL: 787 796 case RDMA_CM_EVENT_ADDR_CHANGE: 788 - ret = iser_disconnected_handler(cma_id); 797 + iser_disconnected_handler(cma_id); 789 798 break; 790 799 default: 791 800 iser_err("Unexpected RDMA CM event (%d)\n", event->event); 792 801 break; 793 802 } 794 - return ret; 803 + return 0; 795 804 } 796 805 797 806 void iser_conn_init(struct iser_conn *ib_conn) ··· 800 809 init_waitqueue_head(&ib_conn->wait); 801 810 ib_conn->post_recv_buf_count = 0; 802 811 atomic_set(&ib_conn->post_send_buf_count, 0); 803 - atomic_set(&ib_conn->refcount, 1); /* ref ib conn allocation */ 812 + init_completion(&ib_conn->stop_completion); 804 813 INIT_LIST_HEAD(&ib_conn->conn_list); 805 814 spin_lock_init(&ib_conn->lock); 806 815 } ··· 828 837 829 838 ib_conn->state = ISER_CONN_PENDING; 830 839 831 - iser_conn_get(ib_conn); /* ref ib conn's cma id */ 832 840 ib_conn->cma_id = rdma_create_id(iser_cma_handler, 833 841 (void *)ib_conn, 834 842 RDMA_PS_TCP, IB_QPT_RC); ··· 864 874 ib_conn->cma_id = NULL; 865 875 addr_failure: 866 876 ib_conn->state = ISER_CONN_DOWN; 867 - iser_conn_put(ib_conn, 1); /* deref ib conn's cma id */ 868 877 connect_failure: 869 - iser_conn_put(ib_conn, 1); /* deref ib conn deallocate */ 878 + iser_conn_release(ib_conn); 870 879 return err; 871 880 } 872 881
+512 -160
drivers/infiniband/ulp/srp/ib_srp.c
··· 30 30 * SOFTWARE. 31 31 */ 32 32 33 - #define pr_fmt(fmt) PFX fmt 33 + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 34 34 35 35 #include <linux/module.h> 36 36 #include <linux/init.h> ··· 66 66 static unsigned int cmd_sg_entries; 67 67 static unsigned int indirect_sg_entries; 68 68 static bool allow_ext_sg; 69 + static bool prefer_fr; 70 + static bool register_always; 69 71 static int topspin_workarounds = 1; 70 72 71 73 module_param(srp_sg_tablesize, uint, 0444); ··· 88 86 module_param(topspin_workarounds, int, 0444); 89 87 MODULE_PARM_DESC(topspin_workarounds, 90 88 "Enable workarounds for Topspin/Cisco SRP target bugs if != 0"); 89 + 90 + module_param(prefer_fr, bool, 0444); 91 + MODULE_PARM_DESC(prefer_fr, 92 + "Whether to use fast registration if both FMR and fast registration are supported"); 93 + 94 + module_param(register_always, bool, 0444); 95 + MODULE_PARM_DESC(register_always, 96 + "Use memory registration even for contiguous memory regions"); 91 97 92 98 static struct kernel_param_ops srp_tmo_ops; 93 99 ··· 298 288 return 0; 299 289 } 300 290 291 + static struct ib_fmr_pool *srp_alloc_fmr_pool(struct srp_target_port *target) 292 + { 293 + struct srp_device *dev = target->srp_host->srp_dev; 294 + struct ib_fmr_pool_param fmr_param; 295 + 296 + memset(&fmr_param, 0, sizeof(fmr_param)); 297 + fmr_param.pool_size = target->scsi_host->can_queue; 298 + fmr_param.dirty_watermark = fmr_param.pool_size / 4; 299 + fmr_param.cache = 1; 300 + fmr_param.max_pages_per_fmr = dev->max_pages_per_mr; 301 + fmr_param.page_shift = ilog2(dev->mr_page_size); 302 + fmr_param.access = (IB_ACCESS_LOCAL_WRITE | 303 + IB_ACCESS_REMOTE_WRITE | 304 + IB_ACCESS_REMOTE_READ); 305 + 306 + return ib_create_fmr_pool(dev->pd, &fmr_param); 307 + } 308 + 309 + /** 310 + * srp_destroy_fr_pool() - free the resources owned by a pool 311 + * @pool: Fast registration pool to be destroyed. 312 + */ 313 + static void srp_destroy_fr_pool(struct srp_fr_pool *pool) 314 + { 315 + int i; 316 + struct srp_fr_desc *d; 317 + 318 + if (!pool) 319 + return; 320 + 321 + for (i = 0, d = &pool->desc[0]; i < pool->size; i++, d++) { 322 + if (d->frpl) 323 + ib_free_fast_reg_page_list(d->frpl); 324 + if (d->mr) 325 + ib_dereg_mr(d->mr); 326 + } 327 + kfree(pool); 328 + } 329 + 330 + /** 331 + * srp_create_fr_pool() - allocate and initialize a pool for fast registration 332 + * @device: IB device to allocate fast registration descriptors for. 333 + * @pd: Protection domain associated with the FR descriptors. 334 + * @pool_size: Number of descriptors to allocate. 335 + * @max_page_list_len: Maximum fast registration work request page list length. 336 + */ 337 + static struct srp_fr_pool *srp_create_fr_pool(struct ib_device *device, 338 + struct ib_pd *pd, int pool_size, 339 + int max_page_list_len) 340 + { 341 + struct srp_fr_pool *pool; 342 + struct srp_fr_desc *d; 343 + struct ib_mr *mr; 344 + struct ib_fast_reg_page_list *frpl; 345 + int i, ret = -EINVAL; 346 + 347 + if (pool_size <= 0) 348 + goto err; 349 + ret = -ENOMEM; 350 + pool = kzalloc(sizeof(struct srp_fr_pool) + 351 + pool_size * sizeof(struct srp_fr_desc), GFP_KERNEL); 352 + if (!pool) 353 + goto err; 354 + pool->size = pool_size; 355 + pool->max_page_list_len = max_page_list_len; 356 + spin_lock_init(&pool->lock); 357 + INIT_LIST_HEAD(&pool->free_list); 358 + 359 + for (i = 0, d = &pool->desc[0]; i < pool->size; i++, d++) { 360 + mr = ib_alloc_fast_reg_mr(pd, max_page_list_len); 361 + if (IS_ERR(mr)) { 362 + ret = PTR_ERR(mr); 363 + goto destroy_pool; 364 + } 365 + d->mr = mr; 366 + frpl = ib_alloc_fast_reg_page_list(device, max_page_list_len); 367 + if (IS_ERR(frpl)) { 368 + ret = PTR_ERR(frpl); 369 + goto destroy_pool; 370 + } 371 + d->frpl = frpl; 372 + list_add_tail(&d->entry, &pool->free_list); 373 + } 374 + 375 + out: 376 + return pool; 377 + 378 + destroy_pool: 379 + srp_destroy_fr_pool(pool); 380 + 381 + err: 382 + pool = ERR_PTR(ret); 383 + goto out; 384 + } 385 + 386 + /** 387 + * srp_fr_pool_get() - obtain a descriptor suitable for fast registration 388 + * @pool: Pool to obtain descriptor from. 389 + */ 390 + static struct srp_fr_desc *srp_fr_pool_get(struct srp_fr_pool *pool) 391 + { 392 + struct srp_fr_desc *d = NULL; 393 + unsigned long flags; 394 + 395 + spin_lock_irqsave(&pool->lock, flags); 396 + if (!list_empty(&pool->free_list)) { 397 + d = list_first_entry(&pool->free_list, typeof(*d), entry); 398 + list_del(&d->entry); 399 + } 400 + spin_unlock_irqrestore(&pool->lock, flags); 401 + 402 + return d; 403 + } 404 + 405 + /** 406 + * srp_fr_pool_put() - put an FR descriptor back in the free list 407 + * @pool: Pool the descriptor was allocated from. 408 + * @desc: Pointer to an array of fast registration descriptor pointers. 409 + * @n: Number of descriptors to put back. 410 + * 411 + * Note: The caller must already have queued an invalidation request for 412 + * desc->mr->rkey before calling this function. 413 + */ 414 + static void srp_fr_pool_put(struct srp_fr_pool *pool, struct srp_fr_desc **desc, 415 + int n) 416 + { 417 + unsigned long flags; 418 + int i; 419 + 420 + spin_lock_irqsave(&pool->lock, flags); 421 + for (i = 0; i < n; i++) 422 + list_add(&desc[i]->entry, &pool->free_list); 423 + spin_unlock_irqrestore(&pool->lock, flags); 424 + } 425 + 426 + static struct srp_fr_pool *srp_alloc_fr_pool(struct srp_target_port *target) 427 + { 428 + struct srp_device *dev = target->srp_host->srp_dev; 429 + 430 + return srp_create_fr_pool(dev->dev, dev->pd, 431 + target->scsi_host->can_queue, 432 + dev->max_pages_per_mr); 433 + } 434 + 301 435 static int srp_create_target_ib(struct srp_target_port *target) 302 436 { 437 + struct srp_device *dev = target->srp_host->srp_dev; 303 438 struct ib_qp_init_attr *init_attr; 304 439 struct ib_cq *recv_cq, *send_cq; 305 440 struct ib_qp *qp; 441 + struct ib_fmr_pool *fmr_pool = NULL; 442 + struct srp_fr_pool *fr_pool = NULL; 443 + const int m = 1 + dev->use_fast_reg; 306 444 int ret; 307 445 308 446 init_attr = kzalloc(sizeof *init_attr, GFP_KERNEL); 309 447 if (!init_attr) 310 448 return -ENOMEM; 311 449 312 - recv_cq = ib_create_cq(target->srp_host->srp_dev->dev, 313 - srp_recv_completion, NULL, target, 450 + recv_cq = ib_create_cq(dev->dev, srp_recv_completion, NULL, target, 314 451 target->queue_size, target->comp_vector); 315 452 if (IS_ERR(recv_cq)) { 316 453 ret = PTR_ERR(recv_cq); 317 454 goto err; 318 455 } 319 456 320 - send_cq = ib_create_cq(target->srp_host->srp_dev->dev, 321 - srp_send_completion, NULL, target, 322 - target->queue_size, target->comp_vector); 457 + send_cq = ib_create_cq(dev->dev, srp_send_completion, NULL, target, 458 + m * target->queue_size, target->comp_vector); 323 459 if (IS_ERR(send_cq)) { 324 460 ret = PTR_ERR(send_cq); 325 461 goto err_recv_cq; ··· 474 318 ib_req_notify_cq(recv_cq, IB_CQ_NEXT_COMP); 475 319 476 320 init_attr->event_handler = srp_qp_event; 477 - init_attr->cap.max_send_wr = target->queue_size; 321 + init_attr->cap.max_send_wr = m * target->queue_size; 478 322 init_attr->cap.max_recv_wr = target->queue_size; 479 323 init_attr->cap.max_recv_sge = 1; 480 324 init_attr->cap.max_send_sge = 1; 481 - init_attr->sq_sig_type = IB_SIGNAL_ALL_WR; 325 + init_attr->sq_sig_type = IB_SIGNAL_REQ_WR; 482 326 init_attr->qp_type = IB_QPT_RC; 483 327 init_attr->send_cq = send_cq; 484 328 init_attr->recv_cq = recv_cq; 485 329 486 - qp = ib_create_qp(target->srp_host->srp_dev->pd, init_attr); 330 + qp = ib_create_qp(dev->pd, init_attr); 487 331 if (IS_ERR(qp)) { 488 332 ret = PTR_ERR(qp); 489 333 goto err_send_cq; ··· 492 336 ret = srp_init_qp(target, qp); 493 337 if (ret) 494 338 goto err_qp; 339 + 340 + if (dev->use_fast_reg && dev->has_fr) { 341 + fr_pool = srp_alloc_fr_pool(target); 342 + if (IS_ERR(fr_pool)) { 343 + ret = PTR_ERR(fr_pool); 344 + shost_printk(KERN_WARNING, target->scsi_host, PFX 345 + "FR pool allocation failed (%d)\n", ret); 346 + goto err_qp; 347 + } 348 + if (target->fr_pool) 349 + srp_destroy_fr_pool(target->fr_pool); 350 + target->fr_pool = fr_pool; 351 + } else if (!dev->use_fast_reg && dev->has_fmr) { 352 + fmr_pool = srp_alloc_fmr_pool(target); 353 + if (IS_ERR(fmr_pool)) { 354 + ret = PTR_ERR(fmr_pool); 355 + shost_printk(KERN_WARNING, target->scsi_host, PFX 356 + "FMR pool allocation failed (%d)\n", ret); 357 + goto err_qp; 358 + } 359 + if (target->fmr_pool) 360 + ib_destroy_fmr_pool(target->fmr_pool); 361 + target->fmr_pool = fmr_pool; 362 + } 495 363 496 364 if (target->qp) 497 365 ib_destroy_qp(target->qp); ··· 551 371 */ 552 372 static void srp_free_target_ib(struct srp_target_port *target) 553 373 { 374 + struct srp_device *dev = target->srp_host->srp_dev; 554 375 int i; 555 376 377 + if (dev->use_fast_reg) { 378 + if (target->fr_pool) 379 + srp_destroy_fr_pool(target->fr_pool); 380 + } else { 381 + if (target->fmr_pool) 382 + ib_destroy_fmr_pool(target->fmr_pool); 383 + } 556 384 ib_destroy_qp(target->qp); 557 385 ib_destroy_cq(target->send_cq); 558 386 ib_destroy_cq(target->recv_cq); ··· 765 577 766 578 static void srp_free_req_data(struct srp_target_port *target) 767 579 { 768 - struct ib_device *ibdev = target->srp_host->srp_dev->dev; 580 + struct srp_device *dev = target->srp_host->srp_dev; 581 + struct ib_device *ibdev = dev->dev; 769 582 struct srp_request *req; 770 583 int i; 771 584 ··· 775 586 776 587 for (i = 0; i < target->req_ring_size; ++i) { 777 588 req = &target->req_ring[i]; 778 - kfree(req->fmr_list); 589 + if (dev->use_fast_reg) 590 + kfree(req->fr_list); 591 + else 592 + kfree(req->fmr_list); 779 593 kfree(req->map_page); 780 594 if (req->indirect_dma_addr) { 781 595 ib_dma_unmap_single(ibdev, req->indirect_dma_addr, ··· 797 605 struct srp_device *srp_dev = target->srp_host->srp_dev; 798 606 struct ib_device *ibdev = srp_dev->dev; 799 607 struct srp_request *req; 608 + void *mr_list; 800 609 dma_addr_t dma_addr; 801 610 int i, ret = -ENOMEM; 802 611 ··· 810 617 811 618 for (i = 0; i < target->req_ring_size; ++i) { 812 619 req = &target->req_ring[i]; 813 - req->fmr_list = kmalloc(target->cmd_sg_cnt * sizeof(void *), 814 - GFP_KERNEL); 815 - req->map_page = kmalloc(SRP_FMR_SIZE * sizeof(void *), 816 - GFP_KERNEL); 620 + mr_list = kmalloc(target->cmd_sg_cnt * sizeof(void *), 621 + GFP_KERNEL); 622 + if (!mr_list) 623 + goto out; 624 + if (srp_dev->use_fast_reg) 625 + req->fr_list = mr_list; 626 + else 627 + req->fmr_list = mr_list; 628 + req->map_page = kmalloc(srp_dev->max_pages_per_mr * 629 + sizeof(void *), GFP_KERNEL); 630 + if (!req->map_page) 631 + goto out; 817 632 req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL); 818 - if (!req->fmr_list || !req->map_page || !req->indirect_desc) 633 + if (!req->indirect_desc) 819 634 goto out; 820 635 821 636 dma_addr = ib_dma_map_single(ibdev, req->indirect_desc, ··· 960 759 } 961 760 } 962 761 762 + static int srp_inv_rkey(struct srp_target_port *target, u32 rkey) 763 + { 764 + struct ib_send_wr *bad_wr; 765 + struct ib_send_wr wr = { 766 + .opcode = IB_WR_LOCAL_INV, 767 + .wr_id = LOCAL_INV_WR_ID_MASK, 768 + .next = NULL, 769 + .num_sge = 0, 770 + .send_flags = 0, 771 + .ex.invalidate_rkey = rkey, 772 + }; 773 + 774 + return ib_post_send(target->qp, &wr, &bad_wr); 775 + } 776 + 963 777 static void srp_unmap_data(struct scsi_cmnd *scmnd, 964 778 struct srp_target_port *target, 965 779 struct srp_request *req) 966 780 { 967 - struct ib_device *ibdev = target->srp_host->srp_dev->dev; 968 - struct ib_pool_fmr **pfmr; 781 + struct srp_device *dev = target->srp_host->srp_dev; 782 + struct ib_device *ibdev = dev->dev; 783 + int i, res; 969 784 970 785 if (!scsi_sglist(scmnd) || 971 786 (scmnd->sc_data_direction != DMA_TO_DEVICE && 972 787 scmnd->sc_data_direction != DMA_FROM_DEVICE)) 973 788 return; 974 789 975 - pfmr = req->fmr_list; 976 - while (req->nfmr--) 977 - ib_fmr_pool_unmap(*pfmr++); 790 + if (dev->use_fast_reg) { 791 + struct srp_fr_desc **pfr; 792 + 793 + for (i = req->nmdesc, pfr = req->fr_list; i > 0; i--, pfr++) { 794 + res = srp_inv_rkey(target, (*pfr)->mr->rkey); 795 + if (res < 0) { 796 + shost_printk(KERN_ERR, target->scsi_host, PFX 797 + "Queueing INV WR for rkey %#x failed (%d)\n", 798 + (*pfr)->mr->rkey, res); 799 + queue_work(system_long_wq, 800 + &target->tl_err_work); 801 + } 802 + } 803 + if (req->nmdesc) 804 + srp_fr_pool_put(target->fr_pool, req->fr_list, 805 + req->nmdesc); 806 + } else { 807 + struct ib_pool_fmr **pfmr; 808 + 809 + for (i = req->nmdesc, pfmr = req->fmr_list; i > 0; i--, pfmr++) 810 + ib_fmr_pool_unmap(*pfmr); 811 + } 978 812 979 813 ib_dma_unmap_sg(ibdev, scsi_sglist(scmnd), scsi_sg_count(scmnd), 980 814 scmnd->sc_data_direction); ··· 1049 813 1050 814 /** 1051 815 * srp_free_req() - Unmap data and add request to the free request list. 816 + * @target: SRP target port. 817 + * @req: Request to be freed. 818 + * @scmnd: SCSI command associated with @req. 819 + * @req_lim_delta: Amount to be added to @target->req_lim. 1052 820 */ 1053 821 static void srp_free_req(struct srp_target_port *target, 1054 822 struct srp_request *req, struct scsi_cmnd *scmnd, ··· 1122 882 * callbacks will have finished before a new QP is allocated. 1123 883 */ 1124 884 ret = srp_new_cm_id(target); 1125 - /* 1126 - * Whether or not creating a new CM ID succeeded, create a new 1127 - * QP. This guarantees that all completion callback function 1128 - * invocations have finished before request resetting starts. 1129 - */ 1130 - if (ret == 0) 1131 - ret = srp_create_target_ib(target); 1132 - else 1133 - srp_create_target_ib(target); 1134 885 1135 886 for (i = 0; i < target->req_ring_size; ++i) { 1136 887 struct srp_request *req = &target->req_ring[i]; 1137 888 srp_finish_req(target, req, NULL, DID_RESET << 16); 1138 889 } 890 + 891 + /* 892 + * Whether or not creating a new CM ID succeeded, create a new 893 + * QP. This guarantees that all callback functions for the old QP have 894 + * finished before any send requests are posted on the new QP. 895 + */ 896 + ret += srp_create_target_ib(target); 1139 897 1140 898 INIT_LIST_HEAD(&target->free_tx); 1141 899 for (i = 0; i < target->queue_size; ++i) ··· 1166 928 static int srp_map_finish_fmr(struct srp_map_state *state, 1167 929 struct srp_target_port *target) 1168 930 { 1169 - struct srp_device *dev = target->srp_host->srp_dev; 1170 931 struct ib_pool_fmr *fmr; 1171 932 u64 io_addr = 0; 1172 933 1173 - if (!state->npages) 1174 - return 0; 1175 - 1176 - if (state->npages == 1) { 1177 - srp_map_desc(state, state->base_dma_addr, state->fmr_len, 1178 - target->rkey); 1179 - state->npages = state->fmr_len = 0; 1180 - return 0; 1181 - } 1182 - 1183 - fmr = ib_fmr_pool_map_phys(dev->fmr_pool, state->pages, 934 + fmr = ib_fmr_pool_map_phys(target->fmr_pool, state->pages, 1184 935 state->npages, io_addr); 1185 936 if (IS_ERR(fmr)) 1186 937 return PTR_ERR(fmr); 1187 938 1188 939 *state->next_fmr++ = fmr; 1189 - state->nfmr++; 940 + state->nmdesc++; 1190 941 1191 - srp_map_desc(state, 0, state->fmr_len, fmr->fmr->rkey); 1192 - state->npages = state->fmr_len = 0; 942 + srp_map_desc(state, 0, state->dma_len, fmr->fmr->rkey); 943 + 1193 944 return 0; 945 + } 946 + 947 + static int srp_map_finish_fr(struct srp_map_state *state, 948 + struct srp_target_port *target) 949 + { 950 + struct srp_device *dev = target->srp_host->srp_dev; 951 + struct ib_send_wr *bad_wr; 952 + struct ib_send_wr wr; 953 + struct srp_fr_desc *desc; 954 + u32 rkey; 955 + 956 + desc = srp_fr_pool_get(target->fr_pool); 957 + if (!desc) 958 + return -ENOMEM; 959 + 960 + rkey = ib_inc_rkey(desc->mr->rkey); 961 + ib_update_fast_reg_key(desc->mr, rkey); 962 + 963 + memcpy(desc->frpl->page_list, state->pages, 964 + sizeof(state->pages[0]) * state->npages); 965 + 966 + memset(&wr, 0, sizeof(wr)); 967 + wr.opcode = IB_WR_FAST_REG_MR; 968 + wr.wr_id = FAST_REG_WR_ID_MASK; 969 + wr.wr.fast_reg.iova_start = state->base_dma_addr; 970 + wr.wr.fast_reg.page_list = desc->frpl; 971 + wr.wr.fast_reg.page_list_len = state->npages; 972 + wr.wr.fast_reg.page_shift = ilog2(dev->mr_page_size); 973 + wr.wr.fast_reg.length = state->dma_len; 974 + wr.wr.fast_reg.access_flags = (IB_ACCESS_LOCAL_WRITE | 975 + IB_ACCESS_REMOTE_READ | 976 + IB_ACCESS_REMOTE_WRITE); 977 + wr.wr.fast_reg.rkey = desc->mr->lkey; 978 + 979 + *state->next_fr++ = desc; 980 + state->nmdesc++; 981 + 982 + srp_map_desc(state, state->base_dma_addr, state->dma_len, 983 + desc->mr->rkey); 984 + 985 + return ib_post_send(target->qp, &wr, &bad_wr); 986 + } 987 + 988 + static int srp_finish_mapping(struct srp_map_state *state, 989 + struct srp_target_port *target) 990 + { 991 + int ret = 0; 992 + 993 + if (state->npages == 0) 994 + return 0; 995 + 996 + if (state->npages == 1 && !register_always) 997 + srp_map_desc(state, state->base_dma_addr, state->dma_len, 998 + target->rkey); 999 + else 1000 + ret = target->srp_host->srp_dev->use_fast_reg ? 1001 + srp_map_finish_fr(state, target) : 1002 + srp_map_finish_fmr(state, target); 1003 + 1004 + if (ret == 0) { 1005 + state->npages = 0; 1006 + state->dma_len = 0; 1007 + } 1008 + 1009 + return ret; 1194 1010 } 1195 1011 1196 1012 static void srp_map_update_start(struct srp_map_state *state, ··· 1259 967 static int srp_map_sg_entry(struct srp_map_state *state, 1260 968 struct srp_target_port *target, 1261 969 struct scatterlist *sg, int sg_index, 1262 - int use_fmr) 970 + bool use_mr) 1263 971 { 1264 972 struct srp_device *dev = target->srp_host->srp_dev; 1265 973 struct ib_device *ibdev = dev->dev; ··· 1271 979 if (!dma_len) 1272 980 return 0; 1273 981 1274 - if (use_fmr == SRP_MAP_NO_FMR) { 1275 - /* Once we're in direct map mode for a request, we don't 1276 - * go back to FMR mode, so no need to update anything 982 + if (!use_mr) { 983 + /* 984 + * Once we're in direct map mode for a request, we don't 985 + * go back to FMR or FR mode, so no need to update anything 1277 986 * other than the descriptor. 1278 987 */ 1279 988 srp_map_desc(state, dma_addr, dma_len, target->rkey); 1280 989 return 0; 1281 990 } 1282 991 1283 - /* If we start at an offset into the FMR page, don't merge into 1284 - * the current FMR. Finish it out, and use the kernel's MR for this 1285 - * sg entry. This is to avoid potential bugs on some SRP targets 1286 - * that were never quite defined, but went away when the initiator 1287 - * avoided using FMR on such page fragments. 992 + /* 993 + * Since not all RDMA HW drivers support non-zero page offsets for 994 + * FMR, if we start at an offset into a page, don't merge into the 995 + * current FMR mapping. Finish it out, and use the kernel's MR for 996 + * this sg entry. 1288 997 */ 1289 - if (dma_addr & ~dev->fmr_page_mask || dma_len > dev->fmr_max_size) { 1290 - ret = srp_map_finish_fmr(state, target); 998 + if ((!dev->use_fast_reg && dma_addr & ~dev->mr_page_mask) || 999 + dma_len > dev->mr_max_size) { 1000 + ret = srp_finish_mapping(state, target); 1291 1001 if (ret) 1292 1002 return ret; 1293 1003 ··· 1298 1004 return 0; 1299 1005 } 1300 1006 1301 - /* If this is the first sg to go into the FMR, save our position. 1302 - * We need to know the first unmapped entry, its index, and the 1303 - * first unmapped address within that entry to be able to restart 1304 - * mapping after an error. 1007 + /* 1008 + * If this is the first sg that will be mapped via FMR or via FR, save 1009 + * our position. We need to know the first unmapped entry, its index, 1010 + * and the first unmapped address within that entry to be able to 1011 + * restart mapping after an error. 1305 1012 */ 1306 1013 if (!state->unmapped_sg) 1307 1014 srp_map_update_start(state, sg, sg_index, dma_addr); 1308 1015 1309 1016 while (dma_len) { 1310 - if (state->npages == SRP_FMR_SIZE) { 1311 - ret = srp_map_finish_fmr(state, target); 1017 + unsigned offset = dma_addr & ~dev->mr_page_mask; 1018 + if (state->npages == dev->max_pages_per_mr || offset != 0) { 1019 + ret = srp_finish_mapping(state, target); 1312 1020 if (ret) 1313 1021 return ret; 1314 1022 1315 1023 srp_map_update_start(state, sg, sg_index, dma_addr); 1316 1024 } 1317 1025 1318 - len = min_t(unsigned int, dma_len, dev->fmr_page_size); 1026 + len = min_t(unsigned int, dma_len, dev->mr_page_size - offset); 1319 1027 1320 1028 if (!state->npages) 1321 1029 state->base_dma_addr = dma_addr; 1322 - state->pages[state->npages++] = dma_addr; 1323 - state->fmr_len += len; 1030 + state->pages[state->npages++] = dma_addr & dev->mr_page_mask; 1031 + state->dma_len += len; 1324 1032 dma_addr += len; 1325 1033 dma_len -= len; 1326 1034 } 1327 1035 1328 - /* If the last entry of the FMR wasn't a full page, then we need to 1036 + /* 1037 + * If the last entry of the MR wasn't a full page, then we need to 1329 1038 * close it out and start a new one -- we can only merge at page 1330 1039 * boundries. 1331 1040 */ 1332 1041 ret = 0; 1333 - if (len != dev->fmr_page_size) { 1334 - ret = srp_map_finish_fmr(state, target); 1042 + if (len != dev->mr_page_size) { 1043 + ret = srp_finish_mapping(state, target); 1335 1044 if (!ret) 1336 1045 srp_map_update_start(state, NULL, 0, 0); 1337 1046 } 1338 1047 return ret; 1339 1048 } 1340 1049 1050 + static int srp_map_sg(struct srp_map_state *state, 1051 + struct srp_target_port *target, struct srp_request *req, 1052 + struct scatterlist *scat, int count) 1053 + { 1054 + struct srp_device *dev = target->srp_host->srp_dev; 1055 + struct ib_device *ibdev = dev->dev; 1056 + struct scatterlist *sg; 1057 + int i; 1058 + bool use_mr; 1059 + 1060 + state->desc = req->indirect_desc; 1061 + state->pages = req->map_page; 1062 + if (dev->use_fast_reg) { 1063 + state->next_fr = req->fr_list; 1064 + use_mr = !!target->fr_pool; 1065 + } else { 1066 + state->next_fmr = req->fmr_list; 1067 + use_mr = !!target->fmr_pool; 1068 + } 1069 + 1070 + for_each_sg(scat, sg, count, i) { 1071 + if (srp_map_sg_entry(state, target, sg, i, use_mr)) { 1072 + /* 1073 + * Memory registration failed, so backtrack to the 1074 + * first unmapped entry and continue on without using 1075 + * memory registration. 1076 + */ 1077 + dma_addr_t dma_addr; 1078 + unsigned int dma_len; 1079 + 1080 + backtrack: 1081 + sg = state->unmapped_sg; 1082 + i = state->unmapped_index; 1083 + 1084 + dma_addr = ib_sg_dma_address(ibdev, sg); 1085 + dma_len = ib_sg_dma_len(ibdev, sg); 1086 + dma_len -= (state->unmapped_addr - dma_addr); 1087 + dma_addr = state->unmapped_addr; 1088 + use_mr = false; 1089 + srp_map_desc(state, dma_addr, dma_len, target->rkey); 1090 + } 1091 + } 1092 + 1093 + if (use_mr && srp_finish_mapping(state, target)) 1094 + goto backtrack; 1095 + 1096 + req->nmdesc = state->nmdesc; 1097 + 1098 + return 0; 1099 + } 1100 + 1341 1101 static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_target_port *target, 1342 1102 struct srp_request *req) 1343 1103 { 1344 - struct scatterlist *scat, *sg; 1104 + struct scatterlist *scat; 1345 1105 struct srp_cmd *cmd = req->cmd->buf; 1346 - int i, len, nents, count, use_fmr; 1106 + int len, nents, count; 1347 1107 struct srp_device *dev; 1348 1108 struct ib_device *ibdev; 1349 1109 struct srp_map_state state; ··· 1429 1081 fmt = SRP_DATA_DESC_DIRECT; 1430 1082 len = sizeof (struct srp_cmd) + sizeof (struct srp_direct_buf); 1431 1083 1432 - if (count == 1) { 1084 + if (count == 1 && !register_always) { 1433 1085 /* 1434 1086 * The midlayer only generated a single gather/scatter 1435 1087 * entry, or DMA mapping coalesced everything to a ··· 1442 1094 buf->key = cpu_to_be32(target->rkey); 1443 1095 buf->len = cpu_to_be32(ib_sg_dma_len(ibdev, scat)); 1444 1096 1445 - req->nfmr = 0; 1097 + req->nmdesc = 0; 1446 1098 goto map_complete; 1447 1099 } 1448 1100 1449 - /* We have more than one scatter/gather entry, so build our indirect 1450 - * descriptor table, trying to merge as many entries with FMR as we 1451 - * can. 1101 + /* 1102 + * We have more than one scatter/gather entry, so build our indirect 1103 + * descriptor table, trying to merge as many entries as we can. 1452 1104 */ 1453 1105 indirect_hdr = (void *) cmd->add_data; 1454 1106 ··· 1456 1108 target->indirect_size, DMA_TO_DEVICE); 1457 1109 1458 1110 memset(&state, 0, sizeof(state)); 1459 - state.desc = req->indirect_desc; 1460 - state.pages = req->map_page; 1461 - state.next_fmr = req->fmr_list; 1462 - 1463 - use_fmr = dev->fmr_pool ? SRP_MAP_ALLOW_FMR : SRP_MAP_NO_FMR; 1464 - 1465 - for_each_sg(scat, sg, count, i) { 1466 - if (srp_map_sg_entry(&state, target, sg, i, use_fmr)) { 1467 - /* FMR mapping failed, so backtrack to the first 1468 - * unmapped entry and continue on without using FMR. 1469 - */ 1470 - dma_addr_t dma_addr; 1471 - unsigned int dma_len; 1472 - 1473 - backtrack: 1474 - sg = state.unmapped_sg; 1475 - i = state.unmapped_index; 1476 - 1477 - dma_addr = ib_sg_dma_address(ibdev, sg); 1478 - dma_len = ib_sg_dma_len(ibdev, sg); 1479 - dma_len -= (state.unmapped_addr - dma_addr); 1480 - dma_addr = state.unmapped_addr; 1481 - use_fmr = SRP_MAP_NO_FMR; 1482 - srp_map_desc(&state, dma_addr, dma_len, target->rkey); 1483 - } 1484 - } 1485 - 1486 - if (use_fmr == SRP_MAP_ALLOW_FMR && srp_map_finish_fmr(&state, target)) 1487 - goto backtrack; 1111 + srp_map_sg(&state, target, req, scat, count); 1488 1112 1489 1113 /* We've mapped the request, now pull as much of the indirect 1490 1114 * descriptor table as we can into the command buffer. If this ··· 1464 1144 * guaranteed to fit into the command, as the SCSI layer won't 1465 1145 * give us more S/G entries than we allow. 1466 1146 */ 1467 - req->nfmr = state.nfmr; 1468 1147 if (state.ndesc == 1) { 1469 - /* FMR mapping was able to collapse this to one entry, 1148 + /* 1149 + * Memory registration collapsed the sg-list into one entry, 1470 1150 * so use a direct descriptor. 1471 1151 */ 1472 1152 struct srp_direct_buf *buf = (void *) cmd->add_data; ··· 1775 1455 1776 1456 /** 1777 1457 * srp_tl_err_work() - handle a transport layer error 1458 + * @work: Work structure embedded in an SRP target port. 1778 1459 * 1779 1460 * Note: This function may get invoked before the rport has been created, 1780 1461 * hence the target->rport test. ··· 1789 1468 srp_start_tl_fail_timers(target->rport); 1790 1469 } 1791 1470 1792 - static void srp_handle_qp_err(enum ib_wc_status wc_status, bool send_err, 1793 - struct srp_target_port *target) 1471 + static void srp_handle_qp_err(u64 wr_id, enum ib_wc_status wc_status, 1472 + bool send_err, struct srp_target_port *target) 1794 1473 { 1795 1474 if (target->connected && !target->qp_in_error) { 1796 - shost_printk(KERN_ERR, target->scsi_host, 1797 - PFX "failed %s status %d\n", 1798 - send_err ? "send" : "receive", 1799 - wc_status); 1475 + if (wr_id & LOCAL_INV_WR_ID_MASK) { 1476 + shost_printk(KERN_ERR, target->scsi_host, PFX 1477 + "LOCAL_INV failed with status %d\n", 1478 + wc_status); 1479 + } else if (wr_id & FAST_REG_WR_ID_MASK) { 1480 + shost_printk(KERN_ERR, target->scsi_host, PFX 1481 + "FAST_REG_MR failed status %d\n", 1482 + wc_status); 1483 + } else { 1484 + shost_printk(KERN_ERR, target->scsi_host, 1485 + PFX "failed %s status %d for iu %p\n", 1486 + send_err ? "send" : "receive", 1487 + wc_status, (void *)(uintptr_t)wr_id); 1488 + } 1800 1489 queue_work(system_long_wq, &target->tl_err_work); 1801 1490 } 1802 1491 target->qp_in_error = true; ··· 1822 1491 if (likely(wc.status == IB_WC_SUCCESS)) { 1823 1492 srp_handle_recv(target, &wc); 1824 1493 } else { 1825 - srp_handle_qp_err(wc.status, false, target); 1494 + srp_handle_qp_err(wc.wr_id, wc.status, false, target); 1826 1495 } 1827 1496 } 1828 1497 } ··· 1838 1507 iu = (struct srp_iu *) (uintptr_t) wc.wr_id; 1839 1508 list_add(&iu->list, &target->free_tx); 1840 1509 } else { 1841 - srp_handle_qp_err(wc.status, true, target); 1510 + srp_handle_qp_err(wc.wr_id, wc.status, true, target); 1842 1511 } 1843 1512 } 1844 1513 } ··· 1852 1521 struct srp_cmd *cmd; 1853 1522 struct ib_device *dev; 1854 1523 unsigned long flags; 1855 - int len, result; 1524 + int len, ret; 1856 1525 const bool in_scsi_eh = !in_interrupt() && current == shost->ehandler; 1857 1526 1858 1527 /* ··· 1864 1533 if (in_scsi_eh) 1865 1534 mutex_lock(&rport->mutex); 1866 1535 1867 - result = srp_chkready(target->rport); 1868 - if (unlikely(result)) { 1869 - scmnd->result = result; 1870 - scmnd->scsi_done(scmnd); 1871 - goto unlock_rport; 1872 - } 1536 + scmnd->result = srp_chkready(target->rport); 1537 + if (unlikely(scmnd->result)) 1538 + goto err; 1873 1539 1874 1540 spin_lock_irqsave(&target->lock, flags); 1875 1541 iu = __srp_get_tx_iu(target, SRP_IU_CMD); ··· 1881 1553 ib_dma_sync_single_for_cpu(dev, iu->dma, target->max_iu_len, 1882 1554 DMA_TO_DEVICE); 1883 1555 1884 - scmnd->result = 0; 1885 1556 scmnd->host_scribble = (void *) req; 1886 1557 1887 1558 cmd = iu->buf; ··· 1897 1570 len = srp_map_data(scmnd, target, req); 1898 1571 if (len < 0) { 1899 1572 shost_printk(KERN_ERR, target->scsi_host, 1900 - PFX "Failed to map data\n"); 1573 + PFX "Failed to map data (%d)\n", len); 1574 + /* 1575 + * If we ran out of memory descriptors (-ENOMEM) because an 1576 + * application is queuing many requests with more than 1577 + * max_pages_per_mr sg-list elements, tell the SCSI mid-layer 1578 + * to reduce queue depth temporarily. 1579 + */ 1580 + scmnd->result = len == -ENOMEM ? 1581 + DID_OK << 16 | QUEUE_FULL << 1 : DID_ERROR << 16; 1901 1582 goto err_iu; 1902 1583 } 1903 1584 ··· 1917 1582 goto err_unmap; 1918 1583 } 1919 1584 1585 + ret = 0; 1586 + 1920 1587 unlock_rport: 1921 1588 if (in_scsi_eh) 1922 1589 mutex_unlock(&rport->mutex); 1923 1590 1924 - return 0; 1591 + return ret; 1925 1592 1926 1593 err_unmap: 1927 1594 srp_unmap_data(scmnd, target, req); ··· 1931 1594 err_iu: 1932 1595 srp_put_tx_iu(target, iu, SRP_IU_CMD); 1933 1596 1597 + /* 1598 + * Avoid that the loops that iterate over the request ring can 1599 + * encounter a dangling SCSI command pointer. 1600 + */ 1601 + req->scmnd = NULL; 1602 + 1934 1603 spin_lock_irqsave(&target->lock, flags); 1935 1604 list_add(&req->list, &target->free_reqs); 1936 1605 1937 1606 err_unlock: 1938 1607 spin_unlock_irqrestore(&target->lock, flags); 1939 1608 1940 - if (in_scsi_eh) 1941 - mutex_unlock(&rport->mutex); 1609 + err: 1610 + if (scmnd->result) { 1611 + scmnd->scsi_done(scmnd); 1612 + ret = 0; 1613 + } else { 1614 + ret = SCSI_MLQUEUE_HOST_BUSY; 1615 + } 1942 1616 1943 - return SCSI_MLQUEUE_HOST_BUSY; 1617 + goto unlock_rport; 1944 1618 } 1945 1619 1946 1620 /* ··· 2658 2310 2659 2311 /** 2660 2312 * srp_conn_unique() - check whether the connection to a target is unique 2313 + * @host: SRP host. 2314 + * @target: SRP target port. 2661 2315 */ 2662 2316 static bool srp_conn_unique(struct srp_host *host, 2663 2317 struct srp_target_port *target) ··· 2955 2605 container_of(dev, struct srp_host, dev); 2956 2606 struct Scsi_Host *target_host; 2957 2607 struct srp_target_port *target; 2958 - struct ib_device *ibdev = host->srp_dev->dev; 2608 + struct srp_device *srp_dev = host->srp_dev; 2609 + struct ib_device *ibdev = srp_dev->dev; 2959 2610 int ret; 2960 2611 2961 2612 target_host = scsi_host_alloc(&srp_template, ··· 3001 2650 goto err; 3002 2651 } 3003 2652 3004 - if (!host->srp_dev->fmr_pool && !target->allow_ext_sg && 3005 - target->cmd_sg_cnt < target->sg_tablesize) { 3006 - pr_warn("No FMR pool and no external indirect descriptors, limiting sg_tablesize to cmd_sg_cnt\n"); 2653 + if (!srp_dev->has_fmr && !srp_dev->has_fr && !target->allow_ext_sg && 2654 + target->cmd_sg_cnt < target->sg_tablesize) { 2655 + pr_warn("No MR pool and no external indirect descriptors, limiting sg_tablesize to cmd_sg_cnt\n"); 3007 2656 target->sg_tablesize = target->cmd_sg_cnt; 3008 2657 } 3009 2658 ··· 3141 2790 { 3142 2791 struct srp_device *srp_dev; 3143 2792 struct ib_device_attr *dev_attr; 3144 - struct ib_fmr_pool_param fmr_param; 3145 2793 struct srp_host *host; 3146 - int max_pages_per_fmr, fmr_page_shift, s, e, p; 2794 + int mr_page_shift, s, e, p; 2795 + u64 max_pages_per_mr; 3147 2796 3148 2797 dev_attr = kmalloc(sizeof *dev_attr, GFP_KERNEL); 3149 2798 if (!dev_attr) ··· 3158 2807 if (!srp_dev) 3159 2808 goto free_attr; 3160 2809 2810 + srp_dev->has_fmr = (device->alloc_fmr && device->dealloc_fmr && 2811 + device->map_phys_fmr && device->unmap_fmr); 2812 + srp_dev->has_fr = (dev_attr->device_cap_flags & 2813 + IB_DEVICE_MEM_MGT_EXTENSIONS); 2814 + if (!srp_dev->has_fmr && !srp_dev->has_fr) 2815 + dev_warn(&device->dev, "neither FMR nor FR is supported\n"); 2816 + 2817 + srp_dev->use_fast_reg = (srp_dev->has_fr && 2818 + (!srp_dev->has_fmr || prefer_fr)); 2819 + 3161 2820 /* 3162 2821 * Use the smallest page size supported by the HCA, down to a 3163 2822 * minimum of 4096 bytes. We're unlikely to build large sglists 3164 2823 * out of smaller entries. 3165 2824 */ 3166 - fmr_page_shift = max(12, ffs(dev_attr->page_size_cap) - 1); 3167 - srp_dev->fmr_page_size = 1 << fmr_page_shift; 3168 - srp_dev->fmr_page_mask = ~((u64) srp_dev->fmr_page_size - 1); 3169 - srp_dev->fmr_max_size = srp_dev->fmr_page_size * SRP_FMR_SIZE; 2825 + mr_page_shift = max(12, ffs(dev_attr->page_size_cap) - 1); 2826 + srp_dev->mr_page_size = 1 << mr_page_shift; 2827 + srp_dev->mr_page_mask = ~((u64) srp_dev->mr_page_size - 1); 2828 + max_pages_per_mr = dev_attr->max_mr_size; 2829 + do_div(max_pages_per_mr, srp_dev->mr_page_size); 2830 + srp_dev->max_pages_per_mr = min_t(u64, SRP_MAX_PAGES_PER_MR, 2831 + max_pages_per_mr); 2832 + if (srp_dev->use_fast_reg) { 2833 + srp_dev->max_pages_per_mr = 2834 + min_t(u32, srp_dev->max_pages_per_mr, 2835 + dev_attr->max_fast_reg_page_list_len); 2836 + } 2837 + srp_dev->mr_max_size = srp_dev->mr_page_size * 2838 + srp_dev->max_pages_per_mr; 2839 + pr_debug("%s: mr_page_shift = %d, dev_attr->max_mr_size = %#llx, dev_attr->max_fast_reg_page_list_len = %u, max_pages_per_mr = %d, mr_max_size = %#x\n", 2840 + device->name, mr_page_shift, dev_attr->max_mr_size, 2841 + dev_attr->max_fast_reg_page_list_len, 2842 + srp_dev->max_pages_per_mr, srp_dev->mr_max_size); 3170 2843 3171 2844 INIT_LIST_HEAD(&srp_dev->dev_list); 3172 2845 ··· 3205 2830 IB_ACCESS_REMOTE_WRITE); 3206 2831 if (IS_ERR(srp_dev->mr)) 3207 2832 goto err_pd; 3208 - 3209 - for (max_pages_per_fmr = SRP_FMR_SIZE; 3210 - max_pages_per_fmr >= SRP_FMR_MIN_SIZE; 3211 - max_pages_per_fmr /= 2, srp_dev->fmr_max_size /= 2) { 3212 - memset(&fmr_param, 0, sizeof fmr_param); 3213 - fmr_param.pool_size = SRP_FMR_POOL_SIZE; 3214 - fmr_param.dirty_watermark = SRP_FMR_DIRTY_SIZE; 3215 - fmr_param.cache = 1; 3216 - fmr_param.max_pages_per_fmr = max_pages_per_fmr; 3217 - fmr_param.page_shift = fmr_page_shift; 3218 - fmr_param.access = (IB_ACCESS_LOCAL_WRITE | 3219 - IB_ACCESS_REMOTE_WRITE | 3220 - IB_ACCESS_REMOTE_READ); 3221 - 3222 - srp_dev->fmr_pool = ib_create_fmr_pool(srp_dev->pd, &fmr_param); 3223 - if (!IS_ERR(srp_dev->fmr_pool)) 3224 - break; 3225 - } 3226 - 3227 - if (IS_ERR(srp_dev->fmr_pool)) 3228 - srp_dev->fmr_pool = NULL; 3229 2833 3230 2834 if (device->node_type == RDMA_NODE_IB_SWITCH) { 3231 2835 s = 0; ··· 3268 2914 kfree(host); 3269 2915 } 3270 2916 3271 - if (srp_dev->fmr_pool) 3272 - ib_destroy_fmr_pool(srp_dev->fmr_pool); 3273 2917 ib_dereg_mr(srp_dev->mr); 3274 2918 ib_dealloc_pd(srp_dev->pd); 3275 2919
+79 -15
drivers/infiniband/ulp/srp/ib_srp.h
··· 66 66 SRP_TAG_NO_REQ = ~0U, 67 67 SRP_TAG_TSK_MGMT = 1U << 31, 68 68 69 - SRP_FMR_SIZE = 512, 70 - SRP_FMR_MIN_SIZE = 128, 71 - SRP_FMR_POOL_SIZE = 1024, 72 - SRP_FMR_DIRTY_SIZE = SRP_FMR_POOL_SIZE / 4, 69 + SRP_MAX_PAGES_PER_MR = 512, 73 70 74 - SRP_MAP_ALLOW_FMR = 0, 75 - SRP_MAP_NO_FMR = 1, 71 + LOCAL_INV_WR_ID_MASK = 1, 72 + FAST_REG_WR_ID_MASK = 2, 76 73 }; 77 74 78 75 enum srp_target_state { ··· 83 86 SRP_IU_RSP, 84 87 }; 85 88 89 + /* 90 + * @mr_page_mask: HCA memory registration page mask. 91 + * @mr_page_size: HCA memory registration page size. 92 + * @mr_max_size: Maximum size in bytes of a single FMR / FR registration 93 + * request. 94 + */ 86 95 struct srp_device { 87 96 struct list_head dev_list; 88 97 struct ib_device *dev; 89 98 struct ib_pd *pd; 90 99 struct ib_mr *mr; 91 - struct ib_fmr_pool *fmr_pool; 92 - u64 fmr_page_mask; 93 - int fmr_page_size; 94 - int fmr_max_size; 100 + u64 mr_page_mask; 101 + int mr_page_size; 102 + int mr_max_size; 103 + int max_pages_per_mr; 104 + bool has_fmr; 105 + bool has_fr; 106 + bool use_fast_reg; 95 107 }; 96 108 97 109 struct srp_host { ··· 118 112 struct list_head list; 119 113 struct scsi_cmnd *scmnd; 120 114 struct srp_iu *cmd; 121 - struct ib_pool_fmr **fmr_list; 115 + union { 116 + struct ib_pool_fmr **fmr_list; 117 + struct srp_fr_desc **fr_list; 118 + }; 122 119 u64 *map_page; 123 120 struct srp_direct_buf *indirect_desc; 124 121 dma_addr_t indirect_dma_addr; 125 - short nfmr; 122 + short nmdesc; 126 123 short index; 127 124 }; 128 125 ··· 140 131 struct ib_cq *send_cq ____cacheline_aligned_in_smp; 141 132 struct ib_cq *recv_cq; 142 133 struct ib_qp *qp; 134 + union { 135 + struct ib_fmr_pool *fmr_pool; 136 + struct srp_fr_pool *fr_pool; 137 + }; 143 138 u32 lkey; 144 139 u32 rkey; 145 140 enum srp_target_state state; ··· 210 197 enum dma_data_direction direction; 211 198 }; 212 199 200 + /** 201 + * struct srp_fr_desc - fast registration work request arguments 202 + * @entry: Entry in srp_fr_pool.free_list. 203 + * @mr: Memory region. 204 + * @frpl: Fast registration page list. 205 + */ 206 + struct srp_fr_desc { 207 + struct list_head entry; 208 + struct ib_mr *mr; 209 + struct ib_fast_reg_page_list *frpl; 210 + }; 211 + 212 + /** 213 + * struct srp_fr_pool - pool of fast registration descriptors 214 + * 215 + * An entry is available for allocation if and only if it occurs in @free_list. 216 + * 217 + * @size: Number of descriptors in this pool. 218 + * @max_page_list_len: Maximum fast registration work request page list length. 219 + * @lock: Protects free_list. 220 + * @free_list: List of free descriptors. 221 + * @desc: Fast registration descriptor pool. 222 + */ 223 + struct srp_fr_pool { 224 + int size; 225 + int max_page_list_len; 226 + spinlock_t lock; 227 + struct list_head free_list; 228 + struct srp_fr_desc desc[0]; 229 + }; 230 + 231 + /** 232 + * struct srp_map_state - per-request DMA memory mapping state 233 + * @desc: Pointer to the element of the SRP buffer descriptor array 234 + * that is being filled in. 235 + * @pages: Array with DMA addresses of pages being considered for 236 + * memory registration. 237 + * @base_dma_addr: DMA address of the first page that has not yet been mapped. 238 + * @dma_len: Number of bytes that will be registered with the next 239 + * FMR or FR memory registration call. 240 + * @total_len: Total number of bytes in the sg-list being mapped. 241 + * @npages: Number of page addresses in the pages[] array. 242 + * @nmdesc: Number of FMR or FR memory descriptors used for mapping. 243 + * @ndesc: Number of SRP buffer descriptors that have been filled in. 244 + * @unmapped_sg: First element of the sg-list that is mapped via FMR or FR. 245 + * @unmapped_index: Index of the first element mapped via FMR or FR. 246 + * @unmapped_addr: DMA address of the first element mapped via FMR or FR. 247 + */ 213 248 struct srp_map_state { 214 - struct ib_pool_fmr **next_fmr; 249 + union { 250 + struct ib_pool_fmr **next_fmr; 251 + struct srp_fr_desc **next_fr; 252 + }; 215 253 struct srp_direct_buf *desc; 216 254 u64 *pages; 217 255 dma_addr_t base_dma_addr; 218 - u32 fmr_len; 256 + u32 dma_len; 219 257 u32 total_len; 220 258 unsigned int npages; 221 - unsigned int nfmr; 259 + unsigned int nmdesc; 222 260 unsigned int ndesc; 223 261 struct scatterlist *unmapped_sg; 224 262 int unmapped_index;
+14 -13
drivers/net/ethernet/mellanox/mlx4/alloc.c
··· 171 171 */ 172 172 173 173 int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, 174 - struct mlx4_buf *buf) 174 + struct mlx4_buf *buf, gfp_t gfp) 175 175 { 176 176 dma_addr_t t; 177 177 ··· 180 180 buf->npages = 1; 181 181 buf->page_shift = get_order(size) + PAGE_SHIFT; 182 182 buf->direct.buf = dma_alloc_coherent(&dev->pdev->dev, 183 - size, &t, GFP_KERNEL); 183 + size, &t, gfp); 184 184 if (!buf->direct.buf) 185 185 return -ENOMEM; 186 186 ··· 200 200 buf->npages = buf->nbufs; 201 201 buf->page_shift = PAGE_SHIFT; 202 202 buf->page_list = kcalloc(buf->nbufs, sizeof(*buf->page_list), 203 - GFP_KERNEL); 203 + gfp); 204 204 if (!buf->page_list) 205 205 return -ENOMEM; 206 206 207 207 for (i = 0; i < buf->nbufs; ++i) { 208 208 buf->page_list[i].buf = 209 209 dma_alloc_coherent(&dev->pdev->dev, PAGE_SIZE, 210 - &t, GFP_KERNEL); 210 + &t, gfp); 211 211 if (!buf->page_list[i].buf) 212 212 goto err_free; 213 213 ··· 218 218 219 219 if (BITS_PER_LONG == 64) { 220 220 struct page **pages; 221 - pages = kmalloc(sizeof *pages * buf->nbufs, GFP_KERNEL); 221 + pages = kmalloc(sizeof *pages * buf->nbufs, gfp); 222 222 if (!pages) 223 223 goto err_free; 224 224 for (i = 0; i < buf->nbufs; ++i) ··· 260 260 } 261 261 EXPORT_SYMBOL_GPL(mlx4_buf_free); 262 262 263 - static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device) 263 + static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device, 264 + gfp_t gfp) 264 265 { 265 266 struct mlx4_db_pgdir *pgdir; 266 267 267 - pgdir = kzalloc(sizeof *pgdir, GFP_KERNEL); 268 + pgdir = kzalloc(sizeof *pgdir, gfp); 268 269 if (!pgdir) 269 270 return NULL; 270 271 ··· 273 272 pgdir->bits[0] = pgdir->order0; 274 273 pgdir->bits[1] = pgdir->order1; 275 274 pgdir->db_page = dma_alloc_coherent(dma_device, PAGE_SIZE, 276 - &pgdir->db_dma, GFP_KERNEL); 275 + &pgdir->db_dma, gfp); 277 276 if (!pgdir->db_page) { 278 277 kfree(pgdir); 279 278 return NULL; ··· 313 312 return 0; 314 313 } 315 314 316 - int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order) 315 + int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order, gfp_t gfp) 317 316 { 318 317 struct mlx4_priv *priv = mlx4_priv(dev); 319 318 struct mlx4_db_pgdir *pgdir; ··· 325 324 if (!mlx4_alloc_db_from_pgdir(pgdir, db, order)) 326 325 goto out; 327 326 328 - pgdir = mlx4_alloc_db_pgdir(&(dev->pdev->dev)); 327 + pgdir = mlx4_alloc_db_pgdir(&(dev->pdev->dev), gfp); 329 328 if (!pgdir) { 330 329 ret = -ENOMEM; 331 330 goto out; ··· 377 376 { 378 377 int err; 379 378 380 - err = mlx4_db_alloc(dev, &wqres->db, 1); 379 + err = mlx4_db_alloc(dev, &wqres->db, 1, GFP_KERNEL); 381 380 if (err) 382 381 return err; 383 382 384 383 *wqres->db.db = 0; 385 384 386 - err = mlx4_buf_alloc(dev, size, max_direct, &wqres->buf); 385 + err = mlx4_buf_alloc(dev, size, max_direct, &wqres->buf, GFP_KERNEL); 387 386 if (err) 388 387 goto err_db; 389 388 ··· 392 391 if (err) 393 392 goto err_buf; 394 393 395 - err = mlx4_buf_write_mtt(dev, &wqres->mtt, &wqres->buf); 394 + err = mlx4_buf_write_mtt(dev, &wqres->mtt, &wqres->buf, GFP_KERNEL); 396 395 if (err) 397 396 goto err_mtt; 398 397
+78 -14
drivers/net/ethernet/mellanox/mlx4/cmd.c
··· 705 705 struct ib_smp *smp = inbox->buf; 706 706 u32 index; 707 707 u8 port; 708 + u8 opcode_modifier; 708 709 u16 *table; 709 710 int err; 710 711 int vidx, pidx; 712 + int network_view; 711 713 struct mlx4_priv *priv = mlx4_priv(dev); 712 714 struct ib_smp *outsmp = outbox->buf; 713 715 __be16 *outtab = (__be16 *)(outsmp->data); 714 716 __be32 slave_cap_mask; 715 717 __be64 slave_node_guid; 718 + 716 719 port = vhcr->in_modifier; 720 + 721 + /* network-view bit is for driver use only, and should not be passed to FW */ 722 + opcode_modifier = vhcr->op_modifier & ~0x8; /* clear netw view bit */ 723 + network_view = !!(vhcr->op_modifier & 0x8); 717 724 718 725 if (smp->base_version == 1 && 719 726 smp->mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED && 720 727 smp->class_version == 1) { 721 - if (smp->method == IB_MGMT_METHOD_GET) { 728 + /* host view is paravirtualized */ 729 + if (!network_view && smp->method == IB_MGMT_METHOD_GET) { 722 730 if (smp->attr_id == IB_SMP_ATTR_PKEY_TABLE) { 723 731 index = be32_to_cpu(smp->attr_mod); 724 732 if (port < 1 || port > dev->caps.num_ports) ··· 751 743 /*get the slave specific caps:*/ 752 744 /*do the command */ 753 745 err = mlx4_cmd_box(dev, inbox->dma, outbox->dma, 754 - vhcr->in_modifier, vhcr->op_modifier, 746 + vhcr->in_modifier, opcode_modifier, 755 747 vhcr->op, MLX4_CMD_TIME_CLASS_C, MLX4_CMD_NATIVE); 756 748 /* modify the response for slaves */ 757 749 if (!err && slave != mlx4_master_func_num(dev)) { ··· 768 760 smp->attr_mod = cpu_to_be32(slave / 8); 769 761 /* execute cmd */ 770 762 err = mlx4_cmd_box(dev, inbox->dma, outbox->dma, 771 - vhcr->in_modifier, vhcr->op_modifier, 763 + vhcr->in_modifier, opcode_modifier, 772 764 vhcr->op, MLX4_CMD_TIME_CLASS_C, MLX4_CMD_NATIVE); 773 765 if (!err) { 774 766 /* if needed, move slave gid to index 0 */ ··· 782 774 } 783 775 if (smp->attr_id == IB_SMP_ATTR_NODE_INFO) { 784 776 err = mlx4_cmd_box(dev, inbox->dma, outbox->dma, 785 - vhcr->in_modifier, vhcr->op_modifier, 777 + vhcr->in_modifier, opcode_modifier, 786 778 vhcr->op, MLX4_CMD_TIME_CLASS_C, MLX4_CMD_NATIVE); 787 779 if (!err) { 788 780 slave_node_guid = mlx4_get_slave_node_guid(dev, slave); ··· 792 784 } 793 785 } 794 786 } 787 + 788 + /* Non-privileged VFs are only allowed "host" view LID-routed 'Get' MADs. 789 + * These are the MADs used by ib verbs (such as ib_query_gids). 790 + */ 795 791 if (slave != mlx4_master_func_num(dev) && 796 - ((smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) || 797 - (smp->mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED && 798 - smp->method == IB_MGMT_METHOD_SET))) { 799 - mlx4_err(dev, "slave %d is trying to execute a Subnet MGMT MAD, " 800 - "class 0x%x, method 0x%x for attr 0x%x. Rejecting\n", 801 - slave, smp->method, smp->mgmt_class, 802 - be16_to_cpu(smp->attr_id)); 803 - return -EPERM; 792 + !mlx4_vf_smi_enabled(dev, slave, port)) { 793 + if (!(smp->mgmt_class == IB_MGMT_CLASS_SUBN_LID_ROUTED && 794 + smp->method == IB_MGMT_METHOD_GET) || network_view) { 795 + mlx4_err(dev, "Unprivileged slave %d is trying to execute a Subnet MGMT MAD, class 0x%x, method 0x%x, view=%s for attr 0x%x. Rejecting\n", 796 + slave, smp->method, smp->mgmt_class, 797 + network_view ? "Network" : "Host", 798 + be16_to_cpu(smp->attr_id)); 799 + return -EPERM; 800 + } 804 801 } 805 - /*default:*/ 802 + 806 803 return mlx4_cmd_box(dev, inbox->dma, outbox->dma, 807 - vhcr->in_modifier, vhcr->op_modifier, 804 + vhcr->in_modifier, opcode_modifier, 808 805 vhcr->op, MLX4_CMD_TIME_CLASS_C, MLX4_CMD_NATIVE); 809 806 } 810 807 ··· 1666 1653 for (port = min_port; port <= max_port; port++) { 1667 1654 if (!test_bit(port - 1, actv_ports.ports)) 1668 1655 continue; 1656 + priv->mfunc.master.vf_oper[slave].smi_enabled[port] = 1657 + priv->mfunc.master.vf_admin[slave].enable_smi[port]; 1669 1658 vp_oper = &priv->mfunc.master.vf_oper[slave].vport[port]; 1670 1659 vp_admin = &priv->mfunc.master.vf_admin[slave].vport[port]; 1671 1660 vp_oper->state = *vp_admin; ··· 1719 1704 for (port = min_port; port <= max_port; port++) { 1720 1705 if (!test_bit(port - 1, actv_ports.ports)) 1721 1706 continue; 1707 + priv->mfunc.master.vf_oper[slave].smi_enabled[port] = 1708 + MLX4_VF_SMI_DISABLED; 1722 1709 vp_oper = &priv->mfunc.master.vf_oper[slave].vport[port]; 1723 1710 if (NO_INDX != vp_oper->vlan_idx) { 1724 1711 __mlx4_unregister_vlan(&priv->dev, ··· 2554 2537 return 0; 2555 2538 } 2556 2539 EXPORT_SYMBOL_GPL(mlx4_set_vf_link_state); 2540 + 2541 + int mlx4_vf_smi_enabled(struct mlx4_dev *dev, int slave, int port) 2542 + { 2543 + struct mlx4_priv *priv = mlx4_priv(dev); 2544 + 2545 + if (slave < 1 || slave >= dev->num_slaves || 2546 + port < 1 || port > MLX4_MAX_PORTS) 2547 + return 0; 2548 + 2549 + return priv->mfunc.master.vf_oper[slave].smi_enabled[port] == 2550 + MLX4_VF_SMI_ENABLED; 2551 + } 2552 + EXPORT_SYMBOL_GPL(mlx4_vf_smi_enabled); 2553 + 2554 + int mlx4_vf_get_enable_smi_admin(struct mlx4_dev *dev, int slave, int port) 2555 + { 2556 + struct mlx4_priv *priv = mlx4_priv(dev); 2557 + 2558 + if (slave == mlx4_master_func_num(dev)) 2559 + return 1; 2560 + 2561 + if (slave < 1 || slave >= dev->num_slaves || 2562 + port < 1 || port > MLX4_MAX_PORTS) 2563 + return 0; 2564 + 2565 + return priv->mfunc.master.vf_admin[slave].enable_smi[port] == 2566 + MLX4_VF_SMI_ENABLED; 2567 + } 2568 + EXPORT_SYMBOL_GPL(mlx4_vf_get_enable_smi_admin); 2569 + 2570 + int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port, 2571 + int enabled) 2572 + { 2573 + struct mlx4_priv *priv = mlx4_priv(dev); 2574 + 2575 + if (slave == mlx4_master_func_num(dev)) 2576 + return 0; 2577 + 2578 + if (slave < 1 || slave >= dev->num_slaves || 2579 + port < 1 || port > MLX4_MAX_PORTS || 2580 + enabled < 0 || enabled > 1) 2581 + return -EINVAL; 2582 + 2583 + priv->mfunc.master.vf_admin[slave].enable_smi[port] = enabled; 2584 + return 0; 2585 + } 2586 + EXPORT_SYMBOL_GPL(mlx4_vf_set_enable_smi_admin);
+2 -2
drivers/net/ethernet/mellanox/mlx4/cq.c
··· 173 173 if (*cqn == -1) 174 174 return -ENOMEM; 175 175 176 - err = mlx4_table_get(dev, &cq_table->table, *cqn); 176 + err = mlx4_table_get(dev, &cq_table->table, *cqn, GFP_KERNEL); 177 177 if (err) 178 178 goto err_out; 179 179 180 - err = mlx4_table_get(dev, &cq_table->cmpt_table, *cqn); 180 + err = mlx4_table_get(dev, &cq_table->cmpt_table, *cqn, GFP_KERNEL); 181 181 if (err) 182 182 goto err_put; 183 183 return 0;
+3 -3
drivers/net/ethernet/mellanox/mlx4/en_rx.c
··· 972 972 if (!context) 973 973 return -ENOMEM; 974 974 975 - err = mlx4_qp_alloc(mdev->dev, qpn, qp); 975 + err = mlx4_qp_alloc(mdev->dev, qpn, qp, GFP_KERNEL); 976 976 if (err) { 977 977 en_err(priv, "Failed to allocate qp #%x\n", qpn); 978 978 goto out; ··· 1012 1012 en_err(priv, "Failed reserving drop qpn\n"); 1013 1013 return err; 1014 1014 } 1015 - err = mlx4_qp_alloc(priv->mdev->dev, qpn, &priv->drop_qp); 1015 + err = mlx4_qp_alloc(priv->mdev->dev, qpn, &priv->drop_qp, GFP_KERNEL); 1016 1016 if (err) { 1017 1017 en_err(priv, "Failed allocating drop qp\n"); 1018 1018 mlx4_qp_release_range(priv->mdev->dev, qpn, 1); ··· 1071 1071 } 1072 1072 1073 1073 /* Configure RSS indirection qp */ 1074 - err = mlx4_qp_alloc(mdev->dev, priv->base_qpn, &rss_map->indir_qp); 1074 + err = mlx4_qp_alloc(mdev->dev, priv->base_qpn, &rss_map->indir_qp, GFP_KERNEL); 1075 1075 if (err) { 1076 1076 en_err(priv, "Failed to allocate RSS indirection QP\n"); 1077 1077 goto rss_err;
+1 -1
drivers/net/ethernet/mellanox/mlx4/en_tx.c
··· 113 113 ring->buf_size, (unsigned long long) ring->wqres.buf.direct.map); 114 114 115 115 ring->qpn = qpn; 116 - err = mlx4_qp_alloc(mdev->dev, ring->qpn, &ring->qp); 116 + err = mlx4_qp_alloc(mdev->dev, ring->qpn, &ring->qp, GFP_KERNEL); 117 117 if (err) { 118 118 en_err(priv, "Failed allocating qp %d\n", ring->qpn); 119 119 goto err_map;
+31 -15
drivers/net/ethernet/mellanox/mlx4/fw.c
··· 178 178 struct mlx4_cmd_info *cmd) 179 179 { 180 180 struct mlx4_priv *priv = mlx4_priv(dev); 181 - u8 field; 182 - u32 size; 181 + u8 field, port; 182 + u32 size, proxy_qp, qkey; 183 183 int err = 0; 184 184 185 185 #define QUERY_FUNC_CAP_FLAGS_OFFSET 0x0 ··· 209 209 210 210 /* when opcode modifier = 1 */ 211 211 #define QUERY_FUNC_CAP_PHYS_PORT_OFFSET 0x3 212 + #define QUERY_FUNC_CAP_PRIV_VF_QKEY_OFFSET 0x4 212 213 #define QUERY_FUNC_CAP_FLAGS0_OFFSET 0x8 213 214 #define QUERY_FUNC_CAP_FLAGS1_OFFSET 0xc 214 215 ··· 222 221 #define QUERY_FUNC_CAP_FLAGS1_FORCE_MAC 0x40 223 222 #define QUERY_FUNC_CAP_FLAGS1_FORCE_VLAN 0x80 224 223 #define QUERY_FUNC_CAP_FLAGS1_NIC_INFO 0x10 224 + #define QUERY_FUNC_CAP_VF_ENABLE_QP0 0x08 225 225 226 226 #define QUERY_FUNC_CAP_FLAGS0_FORCE_PHY_WQE_GID 0x80 227 227 ··· 236 234 return -EINVAL; 237 235 238 236 vhcr->in_modifier = converted_port; 239 - /* Set nic_info bit to mark new fields support */ 240 - field = QUERY_FUNC_CAP_FLAGS1_NIC_INFO; 241 - MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FLAGS1_OFFSET); 242 - 243 237 /* phys-port = logical-port */ 244 238 field = vhcr->in_modifier - 245 239 find_first_bit(actv_ports.ports, dev->caps.num_ports); 246 240 MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_PHYS_PORT_OFFSET); 247 241 248 - field = vhcr->in_modifier; 242 + port = vhcr->in_modifier; 243 + proxy_qp = dev->phys_caps.base_proxy_sqpn + 8 * slave + port - 1; 244 + 245 + /* Set nic_info bit to mark new fields support */ 246 + field = QUERY_FUNC_CAP_FLAGS1_NIC_INFO; 247 + 248 + if (mlx4_vf_smi_enabled(dev, slave, port) && 249 + !mlx4_get_parav_qkey(dev, proxy_qp, &qkey)) { 250 + field |= QUERY_FUNC_CAP_VF_ENABLE_QP0; 251 + MLX4_PUT(outbox->buf, qkey, 252 + QUERY_FUNC_CAP_PRIV_VF_QKEY_OFFSET); 253 + } 254 + MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FLAGS1_OFFSET); 255 + 249 256 /* size is now the QP number */ 250 - size = dev->phys_caps.base_tunnel_sqpn + 8 * slave + field - 1; 257 + size = dev->phys_caps.base_tunnel_sqpn + 8 * slave + port - 1; 251 258 MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP0_TUNNEL); 252 259 253 260 size += 2; 254 261 MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP1_TUNNEL); 255 262 256 - size = dev->phys_caps.base_proxy_sqpn + 8 * slave + field - 1; 257 - MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP0_PROXY); 258 - 259 - size += 2; 260 - MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP1_PROXY); 263 + MLX4_PUT(outbox->buf, proxy_qp, QUERY_FUNC_CAP_QP0_PROXY); 264 + proxy_qp += 2; 265 + MLX4_PUT(outbox->buf, proxy_qp, QUERY_FUNC_CAP_QP1_PROXY); 261 266 262 267 MLX4_PUT(outbox->buf, dev->caps.phys_port_id[vhcr->in_modifier], 263 268 QUERY_FUNC_CAP_PHYS_PORT_ID); ··· 335 326 struct mlx4_cmd_mailbox *mailbox; 336 327 u32 *outbox; 337 328 u8 field, op_modifier; 338 - u32 size; 329 + u32 size, qkey; 339 330 int err = 0, quotas = 0; 340 331 341 332 op_modifier = !!gen_or_port; /* 0 = general, 1 = logical port */ ··· 423 414 424 415 MLX4_GET(func_cap->flags1, outbox, QUERY_FUNC_CAP_FLAGS1_OFFSET); 425 416 if (dev->caps.port_type[gen_or_port] == MLX4_PORT_TYPE_ETH) { 426 - if (func_cap->flags1 & QUERY_FUNC_CAP_FLAGS1_OFFSET) { 417 + if (func_cap->flags1 & QUERY_FUNC_CAP_FLAGS1_FORCE_VLAN) { 427 418 mlx4_err(dev, "VLAN is enforced on this port\n"); 428 419 err = -EPROTONOSUPPORT; 429 420 goto out; ··· 449 440 if (func_cap->physical_port != gen_or_port) { 450 441 err = -ENOSYS; 451 442 goto out; 443 + } 444 + 445 + if (func_cap->flags1 & QUERY_FUNC_CAP_VF_ENABLE_QP0) { 446 + MLX4_GET(qkey, outbox, QUERY_FUNC_CAP_PRIV_VF_QKEY_OFFSET); 447 + func_cap->qp0_qkey = qkey; 448 + } else { 449 + func_cap->qp0_qkey = 0; 452 450 } 453 451 454 452 MLX4_GET(size, outbox, QUERY_FUNC_CAP_QP0_TUNNEL);
+1
drivers/net/ethernet/mellanox/mlx4/fw.h
··· 134 134 int max_eq; 135 135 int reserved_eq; 136 136 int mcg_quota; 137 + u32 qp0_qkey; 137 138 u32 qp0_tunnel_qpn; 138 139 u32 qp0_proxy_qpn; 139 140 u32 qp1_tunnel_qpn;
+4 -3
drivers/net/ethernet/mellanox/mlx4/icm.c
··· 245 245 MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE); 246 246 } 247 247 248 - int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj) 248 + int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj, 249 + gfp_t gfp) 249 250 { 250 251 u32 i = (obj & (table->num_obj - 1)) / 251 252 (MLX4_TABLE_CHUNK_SIZE / table->obj_size); ··· 260 259 } 261 260 262 261 table->icm[i] = mlx4_alloc_icm(dev, MLX4_TABLE_CHUNK_SIZE >> PAGE_SHIFT, 263 - (table->lowmem ? GFP_KERNEL : GFP_HIGHUSER) | 262 + (table->lowmem ? gfp : GFP_HIGHUSER) | 264 263 __GFP_NOWARN, table->coherent); 265 264 if (!table->icm[i]) { 266 265 ret = -ENOMEM; ··· 357 356 u32 i; 358 357 359 358 for (i = start; i <= end; i += inc) { 360 - err = mlx4_table_get(dev, table, i); 359 + err = mlx4_table_get(dev, table, i, GFP_KERNEL); 361 360 if (err) 362 361 goto fail; 363 362 }
+2 -1
drivers/net/ethernet/mellanox/mlx4/icm.h
··· 71 71 gfp_t gfp_mask, int coherent); 72 72 void mlx4_free_icm(struct mlx4_dev *dev, struct mlx4_icm *icm, int coherent); 73 73 74 - int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj); 74 + int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj, 75 + gfp_t gfp); 75 76 void mlx4_table_put(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj); 76 77 int mlx4_table_get_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, 77 78 u32 start, u32 end);
+27 -3
drivers/net/ethernet/mellanox/mlx4/main.c
··· 666 666 return -ENODEV; 667 667 } 668 668 669 + dev->caps.qp0_qkey = kcalloc(dev->caps.num_ports, sizeof(u32), GFP_KERNEL); 669 670 dev->caps.qp0_tunnel = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL); 670 671 dev->caps.qp0_proxy = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL); 671 672 dev->caps.qp1_tunnel = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL); 672 673 dev->caps.qp1_proxy = kcalloc(dev->caps.num_ports, sizeof (u32), GFP_KERNEL); 673 674 674 675 if (!dev->caps.qp0_tunnel || !dev->caps.qp0_proxy || 675 - !dev->caps.qp1_tunnel || !dev->caps.qp1_proxy) { 676 + !dev->caps.qp1_tunnel || !dev->caps.qp1_proxy || 677 + !dev->caps.qp0_qkey) { 676 678 err = -ENOMEM; 677 679 goto err_mem; 678 680 } ··· 686 684 " port %d, aborting (%d).\n", i, err); 687 685 goto err_mem; 688 686 } 687 + dev->caps.qp0_qkey[i - 1] = func_cap.qp0_qkey; 689 688 dev->caps.qp0_tunnel[i - 1] = func_cap.qp0_tunnel_qpn; 690 689 dev->caps.qp0_proxy[i - 1] = func_cap.qp0_proxy_qpn; 691 690 dev->caps.qp1_tunnel[i - 1] = func_cap.qp1_tunnel_qpn; ··· 732 729 return 0; 733 730 734 731 err_mem: 732 + kfree(dev->caps.qp0_qkey); 735 733 kfree(dev->caps.qp0_tunnel); 736 734 kfree(dev->caps.qp0_proxy); 737 735 kfree(dev->caps.qp1_tunnel); 738 736 kfree(dev->caps.qp1_proxy); 739 - dev->caps.qp0_tunnel = dev->caps.qp0_proxy = 740 - dev->caps.qp1_tunnel = dev->caps.qp1_proxy = NULL; 737 + dev->caps.qp0_qkey = NULL; 738 + dev->caps.qp0_tunnel = NULL; 739 + dev->caps.qp0_proxy = NULL; 740 + dev->caps.qp1_tunnel = NULL; 741 + dev->caps.qp1_proxy = NULL; 741 742 742 743 return err; 743 744 } ··· 1703 1696 unmap_internal_clock(dev); 1704 1697 unmap_bf_area(dev); 1705 1698 1699 + if (mlx4_is_slave(dev)) { 1700 + kfree(dev->caps.qp0_qkey); 1701 + kfree(dev->caps.qp0_tunnel); 1702 + kfree(dev->caps.qp0_proxy); 1703 + kfree(dev->caps.qp1_tunnel); 1704 + kfree(dev->caps.qp1_proxy); 1705 + } 1706 + 1706 1707 err_close: 1707 1708 if (mlx4_is_slave(dev)) 1708 1709 mlx4_slave_exit(dev); ··· 2580 2565 if (mlx4_is_master(dev)) 2581 2566 mlx4_multi_func_cleanup(dev); 2582 2567 2568 + if (mlx4_is_slave(dev)) { 2569 + kfree(dev->caps.qp0_qkey); 2570 + kfree(dev->caps.qp0_tunnel); 2571 + kfree(dev->caps.qp0_proxy); 2572 + kfree(dev->caps.qp1_tunnel); 2573 + kfree(dev->caps.qp1_proxy); 2574 + } 2575 + 2583 2576 err_close: 2584 2577 if (dev->flags & MLX4_FLAG_MSI_X) 2585 2578 pci_disable_msix(pdev); ··· 2711 2688 if (!mlx4_is_slave(dev)) 2712 2689 mlx4_free_ownership(dev); 2713 2690 2691 + kfree(dev->caps.qp0_qkey); 2714 2692 kfree(dev->caps.qp0_tunnel); 2715 2693 kfree(dev->caps.qp0_proxy); 2716 2694 kfree(dev->caps.qp1_tunnel);
+10 -2
drivers/net/ethernet/mellanox/mlx4/mlx4.h
··· 133 133 MLX4_COMM_CMD_FLR = 254 134 134 }; 135 135 136 + enum { 137 + MLX4_VF_SMI_DISABLED, 138 + MLX4_VF_SMI_ENABLED 139 + }; 140 + 136 141 /*The flag indicates that the slave should delay the RESET cmd*/ 137 142 #define MLX4_DELAY_RESET_SLAVE 0xbbbbbbb 138 143 /*indicates how many retries will be done if we are in the middle of FLR*/ ··· 493 488 494 489 struct mlx4_vf_admin_state { 495 490 struct mlx4_vport_state vport[MLX4_MAX_PORTS + 1]; 491 + u8 enable_smi[MLX4_MAX_PORTS + 1]; 496 492 }; 497 493 498 494 struct mlx4_vport_oper_state { ··· 501 495 int mac_idx; 502 496 int vlan_idx; 503 497 }; 498 + 504 499 struct mlx4_vf_oper_state { 505 500 struct mlx4_vport_oper_state vport[MLX4_MAX_PORTS + 1]; 501 + u8 smi_enabled[MLX4_MAX_PORTS + 1]; 506 502 }; 507 503 508 504 struct slave_list { ··· 896 888 void mlx4_cleanup_qp_table(struct mlx4_dev *dev); 897 889 void mlx4_cleanup_srq_table(struct mlx4_dev *dev); 898 890 void mlx4_cleanup_mcg_table(struct mlx4_dev *dev); 899 - int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn); 891 + int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn, gfp_t gfp); 900 892 void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn); 901 893 int __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn); 902 894 void __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn); ··· 904 896 void __mlx4_srq_free_icm(struct mlx4_dev *dev, int srqn); 905 897 int __mlx4_mpt_reserve(struct mlx4_dev *dev); 906 898 void __mlx4_mpt_release(struct mlx4_dev *dev, u32 index); 907 - int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index); 899 + int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index, gfp_t gfp); 908 900 void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index); 909 901 u32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order); 910 902 void __mlx4_free_mtt_range(struct mlx4_dev *dev, u32 first_seg, int order);
+9 -8
drivers/net/ethernet/mellanox/mlx4/mr.c
··· 364 364 __mlx4_mpt_release(dev, index); 365 365 } 366 366 367 - int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index) 367 + int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index, gfp_t gfp) 368 368 { 369 369 struct mlx4_mr_table *mr_table = &mlx4_priv(dev)->mr_table; 370 370 371 - return mlx4_table_get(dev, &mr_table->dmpt_table, index); 371 + return mlx4_table_get(dev, &mr_table->dmpt_table, index, gfp); 372 372 } 373 373 374 - static int mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index) 374 + static int mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index, gfp_t gfp) 375 375 { 376 376 u64 param = 0; 377 377 ··· 382 382 MLX4_CMD_TIME_CLASS_A, 383 383 MLX4_CMD_WRAPPED); 384 384 } 385 - return __mlx4_mpt_alloc_icm(dev, index); 385 + return __mlx4_mpt_alloc_icm(dev, index, gfp); 386 386 } 387 387 388 388 void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index) ··· 469 469 struct mlx4_mpt_entry *mpt_entry; 470 470 int err; 471 471 472 - err = mlx4_mpt_alloc_icm(dev, key_to_hw_index(mr->key)); 472 + err = mlx4_mpt_alloc_icm(dev, key_to_hw_index(mr->key), GFP_KERNEL); 473 473 if (err) 474 474 return err; 475 475 ··· 627 627 EXPORT_SYMBOL_GPL(mlx4_write_mtt); 628 628 629 629 int mlx4_buf_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, 630 - struct mlx4_buf *buf) 630 + struct mlx4_buf *buf, gfp_t gfp) 631 631 { 632 632 u64 *page_list; 633 633 int err; 634 634 int i; 635 635 636 - page_list = kmalloc(buf->npages * sizeof *page_list, GFP_KERNEL); 636 + page_list = kmalloc(buf->npages * sizeof *page_list, 637 + gfp); 637 638 if (!page_list) 638 639 return -ENOMEM; 639 640 ··· 681 680 struct mlx4_mpt_entry *mpt_entry; 682 681 int err; 683 682 684 - err = mlx4_mpt_alloc_icm(dev, key_to_hw_index(mw->key)); 683 + err = mlx4_mpt_alloc_icm(dev, key_to_hw_index(mw->key), GFP_KERNEL); 685 684 if (err) 686 685 return err; 687 686
+10 -10
drivers/net/ethernet/mellanox/mlx4/qp.c
··· 272 272 } 273 273 EXPORT_SYMBOL_GPL(mlx4_qp_release_range); 274 274 275 - int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn) 275 + int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn, gfp_t gfp) 276 276 { 277 277 struct mlx4_priv *priv = mlx4_priv(dev); 278 278 struct mlx4_qp_table *qp_table = &priv->qp_table; 279 279 int err; 280 280 281 - err = mlx4_table_get(dev, &qp_table->qp_table, qpn); 281 + err = mlx4_table_get(dev, &qp_table->qp_table, qpn, gfp); 282 282 if (err) 283 283 goto err_out; 284 284 285 - err = mlx4_table_get(dev, &qp_table->auxc_table, qpn); 285 + err = mlx4_table_get(dev, &qp_table->auxc_table, qpn, gfp); 286 286 if (err) 287 287 goto err_put_qp; 288 288 289 - err = mlx4_table_get(dev, &qp_table->altc_table, qpn); 289 + err = mlx4_table_get(dev, &qp_table->altc_table, qpn, gfp); 290 290 if (err) 291 291 goto err_put_auxc; 292 292 293 - err = mlx4_table_get(dev, &qp_table->rdmarc_table, qpn); 293 + err = mlx4_table_get(dev, &qp_table->rdmarc_table, qpn, gfp); 294 294 if (err) 295 295 goto err_put_altc; 296 296 297 - err = mlx4_table_get(dev, &qp_table->cmpt_table, qpn); 297 + err = mlx4_table_get(dev, &qp_table->cmpt_table, qpn, gfp); 298 298 if (err) 299 299 goto err_put_rdmarc; 300 300 ··· 316 316 return err; 317 317 } 318 318 319 - static int mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn) 319 + static int mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn, gfp_t gfp) 320 320 { 321 321 u64 param = 0; 322 322 ··· 326 326 MLX4_CMD_ALLOC_RES, MLX4_CMD_TIME_CLASS_A, 327 327 MLX4_CMD_WRAPPED); 328 328 } 329 - return __mlx4_qp_alloc_icm(dev, qpn); 329 + return __mlx4_qp_alloc_icm(dev, qpn, gfp); 330 330 } 331 331 332 332 void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn) ··· 355 355 __mlx4_qp_free_icm(dev, qpn); 356 356 } 357 357 358 - int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp) 358 + int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp, gfp_t gfp) 359 359 { 360 360 struct mlx4_priv *priv = mlx4_priv(dev); 361 361 struct mlx4_qp_table *qp_table = &priv->qp_table; ··· 366 366 367 367 qp->qpn = qpn; 368 368 369 - err = mlx4_qp_alloc_icm(dev, qpn); 369 + err = mlx4_qp_alloc_icm(dev, qpn, gfp); 370 370 if (err) 371 371 return err; 372 372
+24 -8
drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
··· 1532 1532 return err; 1533 1533 1534 1534 if (!fw_reserved(dev, qpn)) { 1535 - err = __mlx4_qp_alloc_icm(dev, qpn); 1535 + err = __mlx4_qp_alloc_icm(dev, qpn, GFP_KERNEL); 1536 1536 if (err) { 1537 1537 res_abort_move(dev, slave, RES_QP, qpn); 1538 1538 return err; ··· 1619 1619 if (err) 1620 1620 return err; 1621 1621 1622 - err = __mlx4_mpt_alloc_icm(dev, mpt->key); 1622 + err = __mlx4_mpt_alloc_icm(dev, mpt->key, GFP_KERNEL); 1623 1623 if (err) { 1624 1624 res_abort_move(dev, slave, RES_MPT, id); 1625 1625 return err; ··· 2827 2827 } 2828 2828 2829 2829 static int verify_qp_parameters(struct mlx4_dev *dev, 2830 + struct mlx4_vhcr *vhcr, 2830 2831 struct mlx4_cmd_mailbox *inbox, 2831 2832 enum qp_transition transition, u8 slave) 2832 2833 { 2833 2834 u32 qp_type; 2835 + u32 qpn; 2834 2836 struct mlx4_qp_context *qp_ctx; 2835 2837 enum mlx4_qp_optpar optpar; 2836 2838 int port; ··· 2875 2873 default: 2876 2874 break; 2877 2875 } 2878 - 2879 2876 break; 2877 + 2878 + case MLX4_QP_ST_MLX: 2879 + qpn = vhcr->in_modifier & 0x7fffff; 2880 + port = (qp_ctx->pri_path.sched_queue >> 6 & 1) + 1; 2881 + if (transition == QP_TRANS_INIT2RTR && 2882 + slave != mlx4_master_func_num(dev) && 2883 + mlx4_is_qp_reserved(dev, qpn) && 2884 + !mlx4_vf_smi_enabled(dev, slave, port)) { 2885 + /* only enabled VFs may create MLX proxy QPs */ 2886 + mlx4_err(dev, "%s: unprivileged slave %d attempting to create an MLX proxy special QP on port %d\n", 2887 + __func__, slave, port); 2888 + return -EPERM; 2889 + } 2890 + break; 2891 + 2880 2892 default: 2881 2893 break; 2882 2894 } ··· 3470 3454 err = adjust_qp_sched_queue(dev, slave, qpc, inbox); 3471 3455 if (err) 3472 3456 return err; 3473 - err = verify_qp_parameters(dev, inbox, QP_TRANS_INIT2RTR, slave); 3457 + err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_INIT2RTR, slave); 3474 3458 if (err) 3475 3459 return err; 3476 3460 ··· 3524 3508 err = adjust_qp_sched_queue(dev, slave, context, inbox); 3525 3509 if (err) 3526 3510 return err; 3527 - err = verify_qp_parameters(dev, inbox, QP_TRANS_RTR2RTS, slave); 3511 + err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTR2RTS, slave); 3528 3512 if (err) 3529 3513 return err; 3530 3514 ··· 3546 3530 err = adjust_qp_sched_queue(dev, slave, context, inbox); 3547 3531 if (err) 3548 3532 return err; 3549 - err = verify_qp_parameters(dev, inbox, QP_TRANS_RTS2RTS, slave); 3533 + err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTS2RTS, slave); 3550 3534 if (err) 3551 3535 return err; 3552 3536 ··· 3583 3567 err = adjust_qp_sched_queue(dev, slave, context, inbox); 3584 3568 if (err) 3585 3569 return err; 3586 - err = verify_qp_parameters(dev, inbox, QP_TRANS_SQD2SQD, slave); 3570 + err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2SQD, slave); 3587 3571 if (err) 3588 3572 return err; 3589 3573 ··· 3605 3589 err = adjust_qp_sched_queue(dev, slave, context, inbox); 3606 3590 if (err) 3607 3591 return err; 3608 - err = verify_qp_parameters(dev, inbox, QP_TRANS_SQD2RTS, slave); 3592 + err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2RTS, slave); 3609 3593 if (err) 3610 3594 return err; 3611 3595
+2 -2
drivers/net/ethernet/mellanox/mlx4/srq.c
··· 103 103 if (*srqn == -1) 104 104 return -ENOMEM; 105 105 106 - err = mlx4_table_get(dev, &srq_table->table, *srqn); 106 + err = mlx4_table_get(dev, &srq_table->table, *srqn, GFP_KERNEL); 107 107 if (err) 108 108 goto err_out; 109 109 110 - err = mlx4_table_get(dev, &srq_table->cmpt_table, *srqn); 110 + err = mlx4_table_get(dev, &srq_table->cmpt_table, *srqn, GFP_KERNEL); 111 111 if (err) 112 112 goto err_put; 113 113 return 0;
+4
drivers/net/ethernet/mellanox/mlx5/core/mr.c
··· 82 82 return mlx5_cmd_status_to_err(&lout.hdr); 83 83 } 84 84 85 + mr->iova = be64_to_cpu(in->seg.start_addr); 86 + mr->size = be64_to_cpu(in->seg.len); 85 87 mr->key = mlx5_idx_to_mkey(be32_to_cpu(lout.mkey) & 0xffffff) | key; 88 + mr->pd = be32_to_cpu(in->seg.flags_pd) & 0xffffff; 89 + 86 90 mlx5_core_dbg(dev, "out 0x%x, key 0x%x, mkey 0x%x\n", 87 91 be32_to_cpu(lout.mkey), key, mr->key); 88 92
+11 -4
include/linux/mlx4/device.h
··· 401 401 int max_rq_desc_sz; 402 402 int max_qp_init_rdma; 403 403 int max_qp_dest_rdma; 404 + u32 *qp0_qkey; 404 405 u32 *qp0_proxy; 405 406 u32 *qp1_proxy; 406 407 u32 *qp0_tunnel; ··· 838 837 } 839 838 840 839 int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, 841 - struct mlx4_buf *buf); 840 + struct mlx4_buf *buf, gfp_t gfp); 842 841 void mlx4_buf_free(struct mlx4_dev *dev, int size, struct mlx4_buf *buf); 843 842 static inline void *mlx4_buf_offset(struct mlx4_buf *buf, int offset) 844 843 { ··· 875 874 int mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, 876 875 int start_index, int npages, u64 *page_list); 877 876 int mlx4_buf_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, 878 - struct mlx4_buf *buf); 877 + struct mlx4_buf *buf, gfp_t gfp); 879 878 880 - int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order); 879 + int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order, 880 + gfp_t gfp); 881 881 void mlx4_db_free(struct mlx4_dev *dev, struct mlx4_db *db); 882 882 883 883 int mlx4_alloc_hwq_res(struct mlx4_dev *dev, struct mlx4_hwq_resources *wqres, ··· 894 892 int mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align, int *base); 895 893 void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt); 896 894 897 - int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp); 895 + int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp, 896 + gfp_t gfp); 898 897 void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp); 899 898 900 899 int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcdn, ··· 1237 1234 int mlx4_get_base_gid_ix(struct mlx4_dev *dev, int slave, int port); 1238 1235 1239 1236 int mlx4_config_vxlan_port(struct mlx4_dev *dev, __be16 udp_port); 1237 + int mlx4_vf_smi_enabled(struct mlx4_dev *dev, int slave, int port); 1238 + int mlx4_vf_get_enable_smi_admin(struct mlx4_dev *dev, int slave, int port); 1239 + int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port, 1240 + int enable); 1240 1241 #endif /* MLX4_DEVICE_H */
-1
include/linux/mlx5/driver.h
··· 427 427 u64 size; 428 428 u32 key; 429 429 u32 pd; 430 - u32 access; 431 430 }; 432 431 433 432 struct mlx5_core_srq {
+6 -5
include/rdma/ib_verbs.h
··· 80 80 RDMA_TRANSPORT_USNIC_UDP 81 81 }; 82 82 83 - enum rdma_transport_type 84 - rdma_node_get_transport(enum rdma_node_type node_type) __attribute_const__; 83 + __attribute_const__ enum rdma_transport_type 84 + rdma_node_get_transport(enum rdma_node_type node_type); 85 85 86 86 enum rdma_link_layer { 87 87 IB_LINK_LAYER_UNSPECIFIED, ··· 466 466 * converted to 2, since 5 Gbit/sec is 2 * 2.5 Gbit/sec. 467 467 * @rate: rate to convert. 468 468 */ 469 - int ib_rate_to_mult(enum ib_rate rate) __attribute_const__; 469 + __attribute_const__ int ib_rate_to_mult(enum ib_rate rate); 470 470 471 471 /** 472 472 * ib_rate_to_mbps - Convert the IB rate enum to Mbps. 473 473 * For example, IB_RATE_2_5_GBPS will be converted to 2500. 474 474 * @rate: rate to convert. 475 475 */ 476 - int ib_rate_to_mbps(enum ib_rate rate) __attribute_const__; 476 + __attribute_const__ int ib_rate_to_mbps(enum ib_rate rate); 477 477 478 478 enum ib_mr_create_flags { 479 479 IB_MR_SIGNATURE_EN = 1, ··· 604 604 * enum. 605 605 * @mult: multiple to convert. 606 606 */ 607 - enum ib_rate mult_to_ib_rate(int mult) __attribute_const__; 607 + __attribute_const__ enum ib_rate mult_to_ib_rate(int mult); 608 608 609 609 struct ib_ah_attr { 610 610 struct ib_global_route grh; ··· 783 783 IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 1 << 1, 784 784 IB_QP_CREATE_NETIF_QP = 1 << 5, 785 785 IB_QP_CREATE_SIGNATURE_EN = 1 << 6, 786 + IB_QP_CREATE_USE_GFP_NOIO = 1 << 7, 786 787 /* reserve bits 26-31 for low level drivers' internal use */ 787 788 IB_QP_CREATE_RESERVED_START = 1 << 26, 788 789 IB_QP_CREATE_RESERVED_END = 1 << 31,
+199
include/rdma/iw_portmap.h
··· 1 + /* 2 + * Copyright (c) 2014 Intel Corporation. All rights reserved. 3 + * Copyright (c) 2014 Chelsio, Inc. All rights reserved. 4 + * 5 + * This software is available to you under a choice of one of two 6 + * licenses. You may choose to be licensed under the terms of the GNU 7 + * General Public License (GPL) Version 2, available from the file 8 + * COPYING in the main directory of this source tree, or the 9 + * OpenIB.org BSD license below: 10 + * 11 + * Redistribution and use in source and binary forms, with or 12 + * without modification, are permitted provided that the following 13 + * conditions are met: 14 + * 15 + * - Redistributions of source code must retain the above 16 + * copyright notice, this list of conditions and the following 17 + * disclaimer. 18 + * 19 + * - Redistributions in binary form must reproduce the above 20 + * copyright notice, this list of conditions and the following 21 + * disclaimer in the documentation and/or other materials 22 + * provided with the distribution. 23 + * 24 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 + * SOFTWARE. 32 + */ 33 + #ifndef _IW_PORTMAP_H 34 + #define _IW_PORTMAP_H 35 + 36 + #define IWPM_ULIBNAME_SIZE 32 37 + #define IWPM_DEVNAME_SIZE 32 38 + #define IWPM_IFNAME_SIZE 16 39 + #define IWPM_IPADDR_SIZE 16 40 + 41 + enum { 42 + IWPM_INVALID_NLMSG_ERR = 10, 43 + IWPM_CREATE_MAPPING_ERR, 44 + IWPM_DUPLICATE_MAPPING_ERR, 45 + IWPM_UNKNOWN_MAPPING_ERR, 46 + IWPM_CLIENT_DEV_INFO_ERR, 47 + IWPM_USER_LIB_INFO_ERR, 48 + IWPM_REMOTE_QUERY_REJECT 49 + }; 50 + 51 + struct iwpm_dev_data { 52 + char dev_name[IWPM_DEVNAME_SIZE]; 53 + char if_name[IWPM_IFNAME_SIZE]; 54 + }; 55 + 56 + struct iwpm_sa_data { 57 + struct sockaddr_storage loc_addr; 58 + struct sockaddr_storage mapped_loc_addr; 59 + struct sockaddr_storage rem_addr; 60 + struct sockaddr_storage mapped_rem_addr; 61 + }; 62 + 63 + /** 64 + * iwpm_init - Allocate resources for the iwarp port mapper 65 + * 66 + * Should be called when network interface goes up. 67 + */ 68 + int iwpm_init(u8); 69 + 70 + /** 71 + * iwpm_exit - Deallocate resources for the iwarp port mapper 72 + * 73 + * Should be called when network interface goes down. 74 + */ 75 + int iwpm_exit(u8); 76 + 77 + /** 78 + * iwpm_valid_pid - Check if the userspace iwarp port mapper pid is valid 79 + * 80 + * Returns true if the pid is greater than zero, otherwise returns false 81 + */ 82 + int iwpm_valid_pid(void); 83 + 84 + /** 85 + * iwpm_register_pid - Send a netlink query to userspace 86 + * to get the iwarp port mapper pid 87 + * @pm_msg: Contains driver info to send to the userspace port mapper 88 + * @nl_client: The index of the netlink client 89 + */ 90 + int iwpm_register_pid(struct iwpm_dev_data *pm_msg, u8 nl_client); 91 + 92 + /** 93 + * iwpm_add_mapping - Send a netlink add mapping request to 94 + * the userspace port mapper 95 + * @pm_msg: Contains the local ip/tcp address info to send 96 + * @nl_client: The index of the netlink client 97 + * 98 + * If the request is successful, the pm_msg stores 99 + * the port mapper response (mapped address info) 100 + */ 101 + int iwpm_add_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client); 102 + 103 + /** 104 + * iwpm_add_and_query_mapping - Send a netlink add and query mapping request 105 + * to the userspace port mapper 106 + * @pm_msg: Contains the local and remote ip/tcp address info to send 107 + * @nl_client: The index of the netlink client 108 + * 109 + * If the request is successful, the pm_msg stores the 110 + * port mapper response (mapped local and remote address info) 111 + */ 112 + int iwpm_add_and_query_mapping(struct iwpm_sa_data *pm_msg, u8 nl_client); 113 + 114 + /** 115 + * iwpm_remove_mapping - Send a netlink remove mapping request 116 + * to the userspace port mapper 117 + * 118 + * @local_addr: Local ip/tcp address to remove 119 + * @nl_client: The index of the netlink client 120 + */ 121 + int iwpm_remove_mapping(struct sockaddr_storage *local_addr, u8 nl_client); 122 + 123 + /** 124 + * iwpm_register_pid_cb - Process the port mapper response to 125 + * iwpm_register_pid query 126 + * @skb: 127 + * @cb: Contains the received message (payload and netlink header) 128 + * 129 + * If successful, the function receives the userspace port mapper pid 130 + * which is used in future communication with the port mapper 131 + */ 132 + int iwpm_register_pid_cb(struct sk_buff *, struct netlink_callback *); 133 + 134 + /** 135 + * iwpm_add_mapping_cb - Process the port mapper response to 136 + * iwpm_add_mapping request 137 + * @skb: 138 + * @cb: Contains the received message (payload and netlink header) 139 + */ 140 + int iwpm_add_mapping_cb(struct sk_buff *, struct netlink_callback *); 141 + 142 + /** 143 + * iwpm_add_and_query_mapping_cb - Process the port mapper response to 144 + * iwpm_add_and_query_mapping request 145 + * @skb: 146 + * @cb: Contains the received message (payload and netlink header) 147 + */ 148 + int iwpm_add_and_query_mapping_cb(struct sk_buff *, struct netlink_callback *); 149 + 150 + /** 151 + * iwpm_mapping_error_cb - Process port mapper notification for error 152 + * 153 + * @skb: 154 + * @cb: Contains the received message (payload and netlink header) 155 + */ 156 + int iwpm_mapping_error_cb(struct sk_buff *, struct netlink_callback *); 157 + 158 + /** 159 + * iwpm_mapping_info_cb - Process a notification that the userspace 160 + * port mapper daemon is started 161 + * @skb: 162 + * @cb: Contains the received message (payload and netlink header) 163 + * 164 + * Using the received port mapper pid, send all the local mapping 165 + * info records to the userspace port mapper 166 + */ 167 + int iwpm_mapping_info_cb(struct sk_buff *, struct netlink_callback *); 168 + 169 + /** 170 + * iwpm_ack_mapping_info_cb - Process the port mapper ack for 171 + * the provided local mapping info records 172 + * @skb: 173 + * @cb: Contains the received message (payload and netlink header) 174 + */ 175 + int iwpm_ack_mapping_info_cb(struct sk_buff *, struct netlink_callback *); 176 + 177 + /** 178 + * iwpm_create_mapinfo - Store local and mapped IPv4/IPv6 address 179 + * info in a hash table 180 + * @local_addr: Local ip/tcp address 181 + * @mapped_addr: Mapped local ip/tcp address 182 + * @nl_client: The index of the netlink client 183 + */ 184 + int iwpm_create_mapinfo(struct sockaddr_storage *local_addr, 185 + struct sockaddr_storage *mapped_addr, u8 nl_client); 186 + 187 + /** 188 + * iwpm_remove_mapinfo - Remove local and mapped IPv4/IPv6 address 189 + * info from the hash table 190 + * @local_addr: Local ip/tcp address 191 + * @mapped_addr: Mapped local ip/tcp address 192 + * 193 + * Returns err code if mapping info is not found in the hash table, 194 + * otherwise returns 0 195 + */ 196 + int iwpm_remove_mapinfo(struct sockaddr_storage *local_addr, 197 + struct sockaddr_storage *mapped_addr); 198 + 199 + #endif /* _IW_PORTMAP_H */
+22 -1
include/rdma/rdma_netlink.h
··· 43 43 * Returns the allocated buffer on success and NULL on failure. 44 44 */ 45 45 void *ibnl_put_msg(struct sk_buff *skb, struct nlmsghdr **nlh, int seq, 46 - int len, int client, int op); 46 + int len, int client, int op, int flags); 47 47 /** 48 48 * Put a new attribute in a supplied skb. 49 49 * @skb: The netlink skb. ··· 55 55 */ 56 56 int ibnl_put_attr(struct sk_buff *skb, struct nlmsghdr *nlh, 57 57 int len, void *data, int type); 58 + 59 + /** 60 + * Send the supplied skb to a specific userspace PID. 61 + * @skb: The netlink skb 62 + * @nlh: Header of the netlink message to send 63 + * @pid: Userspace netlink process ID 64 + * Returns 0 on success or a negative error code. 65 + */ 66 + int ibnl_unicast(struct sk_buff *skb, struct nlmsghdr *nlh, 67 + __u32 pid); 68 + 69 + /** 70 + * Send the supplied skb to a netlink group. 71 + * @skb: The netlink skb 72 + * @nlh: Header of the netlink message to send 73 + * @group: Netlink group ID 74 + * @flags: allocation flags 75 + * Returns 0 on success or a negative error code. 76 + */ 77 + int ibnl_multicast(struct sk_buff *skb, struct nlmsghdr *nlh, 78 + unsigned int group, gfp_t flags); 58 79 59 80 #endif /* _RDMA_NETLINK_H */
+95 -1
include/uapi/rdma/rdma_netlink.h
··· 4 4 #include <linux/types.h> 5 5 6 6 enum { 7 - RDMA_NL_RDMA_CM = 1 7 + RDMA_NL_RDMA_CM = 1, 8 + RDMA_NL_NES, 9 + RDMA_NL_C4IW, 10 + RDMA_NL_NUM_CLIENTS 11 + }; 12 + 13 + enum { 14 + RDMA_NL_GROUP_CM = 1, 15 + RDMA_NL_GROUP_IWPM, 16 + RDMA_NL_NUM_GROUPS 8 17 }; 9 18 10 19 #define RDMA_NL_GET_CLIENT(type) ((type & (((1 << 6) - 1) << 10)) >> 10) ··· 31 22 RDMA_NL_RDMA_CM_NUM_ATTR, 32 23 }; 33 24 25 + /* iwarp port mapper op-codes */ 26 + enum { 27 + RDMA_NL_IWPM_REG_PID = 0, 28 + RDMA_NL_IWPM_ADD_MAPPING, 29 + RDMA_NL_IWPM_QUERY_MAPPING, 30 + RDMA_NL_IWPM_REMOVE_MAPPING, 31 + RDMA_NL_IWPM_HANDLE_ERR, 32 + RDMA_NL_IWPM_MAPINFO, 33 + RDMA_NL_IWPM_MAPINFO_NUM, 34 + RDMA_NL_IWPM_NUM_OPS 35 + }; 36 + 34 37 struct rdma_cm_id_stats { 35 38 __u32 qp_num; 36 39 __u32 bound_dev_if; ··· 52 31 __u8 node_type; 53 32 __u8 port_num; 54 33 __u8 qp_type; 34 + }; 35 + 36 + enum { 37 + IWPM_NLA_REG_PID_UNSPEC = 0, 38 + IWPM_NLA_REG_PID_SEQ, 39 + IWPM_NLA_REG_IF_NAME, 40 + IWPM_NLA_REG_IBDEV_NAME, 41 + IWPM_NLA_REG_ULIB_NAME, 42 + IWPM_NLA_REG_PID_MAX 43 + }; 44 + 45 + enum { 46 + IWPM_NLA_RREG_PID_UNSPEC = 0, 47 + IWPM_NLA_RREG_PID_SEQ, 48 + IWPM_NLA_RREG_IBDEV_NAME, 49 + IWPM_NLA_RREG_ULIB_NAME, 50 + IWPM_NLA_RREG_ULIB_VER, 51 + IWPM_NLA_RREG_PID_ERR, 52 + IWPM_NLA_RREG_PID_MAX 53 + 54 + }; 55 + 56 + enum { 57 + IWPM_NLA_MANAGE_MAPPING_UNSPEC = 0, 58 + IWPM_NLA_MANAGE_MAPPING_SEQ, 59 + IWPM_NLA_MANAGE_ADDR, 60 + IWPM_NLA_MANAGE_MAPPED_LOC_ADDR, 61 + IWPM_NLA_RMANAGE_MAPPING_ERR, 62 + IWPM_NLA_RMANAGE_MAPPING_MAX 63 + }; 64 + 65 + #define IWPM_NLA_MANAGE_MAPPING_MAX 3 66 + #define IWPM_NLA_QUERY_MAPPING_MAX 4 67 + #define IWPM_NLA_MAPINFO_SEND_MAX 3 68 + 69 + enum { 70 + IWPM_NLA_QUERY_MAPPING_UNSPEC = 0, 71 + IWPM_NLA_QUERY_MAPPING_SEQ, 72 + IWPM_NLA_QUERY_LOCAL_ADDR, 73 + IWPM_NLA_QUERY_REMOTE_ADDR, 74 + IWPM_NLA_RQUERY_MAPPED_LOC_ADDR, 75 + IWPM_NLA_RQUERY_MAPPED_REM_ADDR, 76 + IWPM_NLA_RQUERY_MAPPING_ERR, 77 + IWPM_NLA_RQUERY_MAPPING_MAX 78 + }; 79 + 80 + enum { 81 + IWPM_NLA_MAPINFO_REQ_UNSPEC = 0, 82 + IWPM_NLA_MAPINFO_ULIB_NAME, 83 + IWPM_NLA_MAPINFO_ULIB_VER, 84 + IWPM_NLA_MAPINFO_REQ_MAX 85 + }; 86 + 87 + enum { 88 + IWPM_NLA_MAPINFO_UNSPEC = 0, 89 + IWPM_NLA_MAPINFO_LOCAL_ADDR, 90 + IWPM_NLA_MAPINFO_MAPPED_ADDR, 91 + IWPM_NLA_MAPINFO_MAX 92 + }; 93 + 94 + enum { 95 + IWPM_NLA_MAPINFO_NUM_UNSPEC = 0, 96 + IWPM_NLA_MAPINFO_SEQ, 97 + IWPM_NLA_MAPINFO_SEND_NUM, 98 + IWPM_NLA_MAPINFO_ACK_NUM, 99 + IWPM_NLA_MAPINFO_NUM_MAX 100 + }; 101 + 102 + enum { 103 + IWPM_NLA_ERR_UNSPEC = 0, 104 + IWPM_NLA_ERR_SEQ, 105 + IWPM_NLA_ERR_CODE, 106 + IWPM_NLA_ERR_MAX 55 107 }; 56 108 57 109