]> Git Repo - linux.git/commitdiff
Merge branches 'core', 'cxgb3', 'cxgb4', 'iser', 'iwpm', 'misc', 'mlx4', 'mlx5',...
authorRoland Dreier <[email protected]>
Tue, 10 Jun 2014 17:12:14 +0000 (10:12 -0700)
committerRoland Dreier <[email protected]>
Tue, 10 Jun 2014 17:12:14 +0000 (10:12 -0700)
1  2  3  4  5  6  7  8  9  10  11  12  13 
drivers/infiniband/hw/cxgb4/cm.c
drivers/infiniband/hw/cxgb4/device.c
drivers/infiniband/hw/mlx4/qp.c
drivers/net/ethernet/mellanox/mlx4/mlx4.h
drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
include/linux/mlx4/device.h
include/rdma/ib_verbs.h

index 1f863a96a480fd1ab087989acea029a781c7c23e,1f863a96a480fd1ab087989acea029a781c7c23e,28114e6b02e96bda7cf503e8e74a73fde19399d0,1f863a96a480fd1ab087989acea029a781c7c23e,7de6c9fcf883f861235b8def8085ea9ff1ec2ea1,1f863a96a480fd1ab087989acea029a781c7c23e,1f863a96a480fd1ab087989acea029a781c7c23e,1f863a96a480fd1ab087989acea029a781c7c23e,1f863a96a480fd1ab087989acea029a781c7c23e,1f863a96a480fd1ab087989acea029a781c7c23e,1f863a96a480fd1ab087989acea029a781c7c23e,1f863a96a480fd1ab087989acea029a781c7c23e,1f863a96a480fd1ab087989acea029a781c7c23e..96d7131ab974bbb1baffcef9be2a4521890c82e9
@@@@@@@@@@@@@@ -1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5 -1,5 +1,5 @@@@@@@@@@@@@@
             /*
---- -------- * Copyright (c) 2009-2010 Chelsio, Inc. All rights reserved.
++++ ++++++++ * Copyright (c) 2009-2014 Chelsio, Inc. All rights reserved.
              *
              * This software is available to you under a choice of one of two
              * licenses.  You may choose to be licensed under the terms of the GNU
             #include <net/ip6_route.h>
             #include <net/addrconf.h>
             
++ ++++++++++#include <rdma/ib_addr.h>
++ ++++++++++
             #include "iw_cxgb4.h"
             
             static char *states[] = {
@@@@@@@@@@@@@@ -294,6 -294,6 -296,6 -294,6 -294,12 -294,6 -294,6 -294,6 -294,6 -294,6 -294,6 -294,6 -294,6 +296,12 @@@@@@@@@@@@@@ void _c4iw_free_ep(struct kref *kref
                        dst_release(ep->dst);
                        cxgb4_l2t_release(ep->l2t);
                }
++++ ++++++++   if (test_bit(RELEASE_MAPINFO, &ep->com.flags)) {
++++ ++++++++           print_addr(&ep->com, __func__, "remove_mapinfo/mapping");
++++ ++++++++           iwpm_remove_mapinfo(&ep->com.local_addr,
++++ ++++++++                               &ep->com.mapped_local_addr);
++++ ++++++++           iwpm_remove_mapping(&ep->com.local_addr, RDMA_NL_C4IW);
++++ ++++++++   }
                kfree(ep);
             }
             
@@@@@@@@@@@@@@ -341,10 -341,10 -343,7 -341,10 -347,10 -341,10 -341,10 -341,10 -341,10 -341,10 -341,10 -341,10 -341,10 +349,7 @@@@@@@@@@@@@@ static struct sk_buff *get_skb(struct s
             
             static struct net_device *get_real_dev(struct net_device *egress_dev)
             {
-- ----------   struct net_device *phys_dev = egress_dev;
-- ----------   if (egress_dev->priv_flags & IFF_802_1Q_VLAN)
-- ----------           phys_dev = vlan_dev_real_dev(egress_dev);
-- ----------   return phys_dev;
++ ++++++++++   return rdma_vlan_dev_real_dev(egress_dev) ? : egress_dev;
             }
             
             static int our_interface(struct c4iw_dev *dev, struct net_device *egress_dev)
@@@@@@@@@@@@@@ -528,6 -528,6 -527,6 -528,6 -534,38 -528,6 -528,6 -528,6 -528,6 -528,6 -528,6 -528,6 -528,6 +533,38 @@@@@@@@@@@@@@ static int send_abort(struct c4iw_ep *e
                return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);
             }
             
++++ ++++++++/*
++++ ++++++++ * c4iw_form_pm_msg - Form a port mapper message with mapping info
++++ ++++++++ */
++++ ++++++++static void c4iw_form_pm_msg(struct c4iw_ep *ep,
++++ ++++++++                           struct iwpm_sa_data *pm_msg)
++++ ++++++++{
++++ ++++++++   memcpy(&pm_msg->loc_addr, &ep->com.local_addr,
++++ ++++++++           sizeof(ep->com.local_addr));
++++ ++++++++   memcpy(&pm_msg->rem_addr, &ep->com.remote_addr,
++++ ++++++++           sizeof(ep->com.remote_addr));
++++ ++++++++}
++++ ++++++++
++++ ++++++++/*
++++ ++++++++ * c4iw_form_reg_msg - Form a port mapper message with dev info
++++ ++++++++ */
++++ ++++++++static void c4iw_form_reg_msg(struct c4iw_dev *dev,
++++ ++++++++                           struct iwpm_dev_data *pm_msg)
++++ ++++++++{
++++ ++++++++   memcpy(pm_msg->dev_name, dev->ibdev.name, IWPM_DEVNAME_SIZE);
++++ ++++++++   memcpy(pm_msg->if_name, dev->rdev.lldi.ports[0]->name,
++++ ++++++++                           IWPM_IFNAME_SIZE);
++++ ++++++++}
++++ ++++++++
++++ ++++++++static void c4iw_record_pm_msg(struct c4iw_ep *ep,
++++ ++++++++                   struct iwpm_sa_data *pm_msg)
++++ ++++++++{
++++ ++++++++   memcpy(&ep->com.mapped_local_addr, &pm_msg->mapped_loc_addr,
++++ ++++++++           sizeof(ep->com.mapped_local_addr));
++++ ++++++++   memcpy(&ep->com.mapped_remote_addr, &pm_msg->mapped_rem_addr,
++++ ++++++++           sizeof(ep->com.mapped_remote_addr));
++++ ++++++++}
++++ ++++++++
             static int send_connect(struct c4iw_ep *ep)
             {
                struct cpl_act_open_req *req;
                int sizev6 = is_t4(ep->com.dev->rdev.lldi.adapter_type) ?
                                        sizeof(struct cpl_act_open_req6) :
                                        sizeof(struct cpl_t5_act_open_req6);
---- --------   struct sockaddr_in *la = (struct sockaddr_in *)&ep->com.local_addr;
---- --------   struct sockaddr_in *ra = (struct sockaddr_in *)&ep->com.remote_addr;
---- --------   struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)&ep->com.local_addr;
---- --------   struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)&ep->com.remote_addr;
++++ ++++++++   struct sockaddr_in *la = (struct sockaddr_in *)
++++ ++++++++                            &ep->com.mapped_local_addr;
++++ ++++++++   struct sockaddr_in *ra = (struct sockaddr_in *)
++++ ++++++++                            &ep->com.mapped_remote_addr;
++++ ++++++++   struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)
++++ ++++++++                              &ep->com.mapped_local_addr;
++++ ++++++++   struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)
++++ ++++++++                              &ep->com.mapped_remote_addr;
             
                wrlen = (ep->com.remote_addr.ss_family == AF_INET) ?
                                roundup(sizev4, 16) :
@@@@@@@@@@@@@@ -1627,10 -1627,10 -1626,10 -1627,10 -1669,10 -1627,10 -1627,10 -1627,10 -1627,10 -1627,10 -1627,10 -1627,10 -1627,10 +1668,10 @@@@@@@@@@@@@@ static void send_fw_act_open_req(struc
                req->le.filter = cpu_to_be32(cxgb4_select_ntuple(
                                             ep->com.dev->rdev.lldi.ports[0],
                                             ep->l2t));
---- --------   sin = (struct sockaddr_in *)&ep->com.local_addr;
++++ ++++++++   sin = (struct sockaddr_in *)&ep->com.mapped_local_addr;
                req->le.lport = sin->sin_port;
                req->le.u.ipv4.lip = sin->sin_addr.s_addr;
---- --------   sin = (struct sockaddr_in *)&ep->com.remote_addr;
++++ ++++++++   sin = (struct sockaddr_in *)&ep->com.mapped_remote_addr;
                req->le.pport = sin->sin_port;
                req->le.u.ipv4.pip = sin->sin_addr.s_addr;
                req->tcb.t_state_to_astid =
@@@@@@@@@@@@@@ -1746,16 -1746,16 -1745,16 -1746,16 -1788,16 -1746,16 -1746,16 -1746,16 -1746,16 -1746,16 -1746,16 -1746,16 -1746,16 +1787,16 @@@@@@@@@@@@@@ static int import_ep(struct c4iw_ep *ep
                        if (!ep->l2t)
                                goto out;
                        ep->mtu = dst_mtu(dst);
-- ----------           ep->tx_chan = cxgb4_port_chan(n->dev);
-- ----------           ep->smac_idx = (cxgb4_port_viid(n->dev) & 0x7F) << 1;
++ ++++++++++           ep->tx_chan = cxgb4_port_chan(pdev);
++ ++++++++++           ep->smac_idx = (cxgb4_port_viid(pdev) & 0x7F) << 1;
                        step = cdev->rdev.lldi.ntxq /
                                cdev->rdev.lldi.nchan;
-- ----------           ep->txq_idx = cxgb4_port_idx(n->dev) * step;
-- ----------           ep->ctrlq_idx = cxgb4_port_idx(n->dev);
++ ++++++++++           ep->txq_idx = cxgb4_port_idx(pdev) * step;
++ ++++++++++           ep->ctrlq_idx = cxgb4_port_idx(pdev);
                        step = cdev->rdev.lldi.nrxq /
                                cdev->rdev.lldi.nchan;
                        ep->rss_qid = cdev->rdev.lldi.rxq_ids[
-- ----------                   cxgb4_port_idx(n->dev) * step];
++ ++++++++++                   cxgb4_port_idx(pdev) * step];
             
                        if (clear_mpa_v1) {
                                ep->retry_with_mpa_v1 = 0;
@@@@@@@@@@@@@@ -1870,10 -1870,10 -1869,10 -1870,10 -1912,10 -1870,10 -1870,10 -1870,10 -1870,10 -1870,10 -1870,10 -1870,10 -1870,10 +1911,10 @@@@@@@@@@@@@@ static int act_open_rpl(struct c4iw_de
                struct sockaddr_in6 *ra6;
             
                ep = lookup_atid(t, atid);
---- --------   la = (struct sockaddr_in *)&ep->com.local_addr;
---- --------   ra = (struct sockaddr_in *)&ep->com.remote_addr;
---- --------   la6 = (struct sockaddr_in6 *)&ep->com.local_addr;
---- --------   ra6 = (struct sockaddr_in6 *)&ep->com.remote_addr;
++++ ++++++++   la = (struct sockaddr_in *)&ep->com.mapped_local_addr;
++++ ++++++++   ra = (struct sockaddr_in *)&ep->com.mapped_remote_addr;
++++ ++++++++   la6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
++++ ++++++++   ra6 = (struct sockaddr_in6 *)&ep->com.mapped_remote_addr;
             
                PDBG("%s ep %p atid %u status %u errno %d\n", __func__, ep, atid,
                     status, status2errno(status));
@@@@@@@@@@@@@@ -2730,13 -2730,13 -2729,13 -2730,13 -2772,15 -2730,13 -2730,13 -2730,13 -2730,13 -2730,13 -2730,13 -2730,13 -2730,13 +2771,15 @@@@@@@@@@@@@@ int c4iw_connect(struct iw_cm_id *cm_id
                struct c4iw_dev *dev = to_c4iw_dev(cm_id->device);
                struct c4iw_ep *ep;
                int err = 0;
---- --------   struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr;
---- --------   struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
---- --------   struct sockaddr_in6 *laddr6 = (struct sockaddr_in6 *)&cm_id->local_addr;
---- --------   struct sockaddr_in6 *raddr6 = (struct sockaddr_in6 *)
---- --------                                 &cm_id->remote_addr;
++++ ++++++++   struct sockaddr_in *laddr;
++++ ++++++++   struct sockaddr_in *raddr;
++++ ++++++++   struct sockaddr_in6 *laddr6;
++++ ++++++++   struct sockaddr_in6 *raddr6;
++++ ++++++++   struct iwpm_dev_data pm_reg_msg;
++++ ++++++++   struct iwpm_sa_data pm_msg;
                __u8 *ra;
                int iptype;
++++ ++++++++   int iwpm_err = 0;
             
                if ((conn_param->ord > c4iw_max_read_depth) ||
                    (conn_param->ird > c4iw_max_read_depth)) {
                if (!ep->com.qp) {
                        PDBG("%s qpn 0x%x not found!\n", __func__, conn_param->qpn);
                        err = -EINVAL;
---- --------           goto fail2;
++++ ++++++++           goto fail1;
                }
                ref_qp(ep);
                PDBG("%s qpn 0x%x qp %p cm_id %p\n", __func__, conn_param->qpn,
                if (ep->atid == -1) {
                        printk(KERN_ERR MOD "%s - cannot alloc atid.\n", __func__);
                        err = -ENOMEM;
---- --------           goto fail2;
++++ ++++++++           goto fail1;
                }
                insert_handle(dev, &dev->atid_idr, ep, ep->atid);
             
++++ ++++++++   memcpy(&ep->com.local_addr, &cm_id->local_addr,
++++ ++++++++          sizeof(ep->com.local_addr));
++++ ++++++++   memcpy(&ep->com.remote_addr, &cm_id->remote_addr,
++++ ++++++++          sizeof(ep->com.remote_addr));
++++ ++++++++
++++ ++++++++   /* No port mapper available, go with the specified peer information */
++++ ++++++++   memcpy(&ep->com.mapped_local_addr, &cm_id->local_addr,
++++ ++++++++          sizeof(ep->com.mapped_local_addr));
++++ ++++++++   memcpy(&ep->com.mapped_remote_addr, &cm_id->remote_addr,
++++ ++++++++          sizeof(ep->com.mapped_remote_addr));
++++ ++++++++
++++ ++++++++   c4iw_form_reg_msg(dev, &pm_reg_msg);
++++ ++++++++   iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_C4IW);
++++ ++++++++   if (iwpm_err) {
++++ ++++++++           PDBG("%s: Port Mapper reg pid fail (err = %d).\n",
++++ ++++++++                   __func__, iwpm_err);
++++ ++++++++   }
++++ ++++++++   if (iwpm_valid_pid() && !iwpm_err) {
++++ ++++++++           c4iw_form_pm_msg(ep, &pm_msg);
++++ ++++++++           iwpm_err = iwpm_add_and_query_mapping(&pm_msg, RDMA_NL_C4IW);
++++ ++++++++           if (iwpm_err)
++++ ++++++++                   PDBG("%s: Port Mapper query fail (err = %d).\n",
++++ ++++++++                           __func__, iwpm_err);
++++ ++++++++           else
++++ ++++++++                   c4iw_record_pm_msg(ep, &pm_msg);
++++ ++++++++   }
++++ ++++++++   if (iwpm_create_mapinfo(&ep->com.local_addr,
++++ ++++++++                           &ep->com.mapped_local_addr, RDMA_NL_C4IW)) {
++++ ++++++++           iwpm_remove_mapping(&ep->com.local_addr, RDMA_NL_C4IW);
++++ ++++++++           err = -ENOMEM;
++++ ++++++++           goto fail1;
++++ ++++++++   }
++++ ++++++++   print_addr(&ep->com, __func__, "add_query/create_mapinfo");
++++ ++++++++   set_bit(RELEASE_MAPINFO, &ep->com.flags);
++++ ++++++++
++++ ++++++++   laddr = (struct sockaddr_in *)&ep->com.mapped_local_addr;
++++ ++++++++   raddr = (struct sockaddr_in *)&ep->com.mapped_remote_addr;
++++ ++++++++   laddr6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
++++ ++++++++   raddr6 = (struct sockaddr_in6 *) &ep->com.mapped_remote_addr;
++++ ++++++++
                if (cm_id->remote_addr.ss_family == AF_INET) {
                        iptype = 4;
                        ra = (__u8 *)&raddr->sin_addr;
                        if ((__force int)raddr->sin_addr.s_addr == INADDR_ANY) {
                                err = pick_local_ipaddrs(dev, cm_id);
                                if (err)
---- --------                           goto fail2;
++++ ++++++++                           goto fail1;
                        }
             
                        /* find a route */
                        if (ipv6_addr_type(&raddr6->sin6_addr) == IPV6_ADDR_ANY) {
                                err = pick_local_ip6addrs(dev, cm_id);
                                if (err)
---- --------                           goto fail2;
++++ ++++++++                           goto fail1;
                        }
             
                        /* find a route */
                if (!ep->dst) {
                        printk(KERN_ERR MOD "%s - cannot find route.\n", __func__);
                        err = -EHOSTUNREACH;
---- --------           goto fail3;
++++ ++++++++           goto fail2;
                }
             
                err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, true);
                if (err) {
                        printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);
---- --------           goto fail4;
++++ ++++++++           goto fail3;
                }
             
                PDBG("%s txq_idx %u tx_chan %u smac_idx %u rss_qid %u l2t_idx %u\n",
             
                state_set(&ep->com, CONNECTING);
                ep->tos = 0;
---- --------   memcpy(&ep->com.local_addr, &cm_id->local_addr,
---- --------          sizeof(ep->com.local_addr));
---- --------   memcpy(&ep->com.remote_addr, &cm_id->remote_addr,
---- --------          sizeof(ep->com.remote_addr));
             
                /* send connect request to rnic */
                err = send_connect(ep);
                        goto out;
             
                cxgb4_l2t_release(ep->l2t);
---- --------fail4:
---- --------   dst_release(ep->dst);
             fail3:
++++ ++++++++   dst_release(ep->dst);
++++ ++++++++fail2:
                remove_handle(ep->com.dev, &ep->com.dev->atid_idr, ep->atid);
                cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);
---- --------fail2:
++++ ++++++++fail1:
                cm_id->rem_ref(cm_id);
                c4iw_put_ep(&ep->com);
             out:
             static int create_server6(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)
             {
                int err;
---- --------   struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ep->com.local_addr;
++++ ++++++++   struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)
++++ ++++++++                               &ep->com.mapped_local_addr;
             
                c4iw_init_wr_wait(&ep->com.wr_wait);
                err = cxgb4_create_server6(ep->com.dev->rdev.lldi.ports[0],
             static int create_server4(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)
             {
                int err;
---- --------   struct sockaddr_in *sin = (struct sockaddr_in *)&ep->com.local_addr;
++++ ++++++++   struct sockaddr_in *sin = (struct sockaddr_in *)
++++ ++++++++                             &ep->com.mapped_local_addr;
             
                if (dev->rdev.lldi.enable_fw_ofld_conn) {
                        do {
@@@@@@@@@@@@@@ -2927,6 -2927,6 -2926,6 -2927,6 -3009,9 -2927,6 -2927,6 -2927,6 -2927,6 -2927,6 -2927,6 -2927,6 -2927,6 +3008,9 @@@@@@@@@@@@@@ int c4iw_create_listen(struct iw_cm_id 
                int err = 0;
                struct c4iw_dev *dev = to_c4iw_dev(cm_id->device);
                struct c4iw_listen_ep *ep;
++++ ++++++++   struct iwpm_dev_data pm_reg_msg;
++++ ++++++++   struct iwpm_sa_data pm_msg;
++++ ++++++++   int iwpm_err = 0;
             
                might_sleep();
             
                        goto fail2;
                }
                insert_handle(dev, &dev->stid_idr, ep, ep->stid);
++++ ++++++++
++++ ++++++++   /* No port mapper available, go with the specified info */
++++ ++++++++   memcpy(&ep->com.mapped_local_addr, &cm_id->local_addr,
++++ ++++++++          sizeof(ep->com.mapped_local_addr));
++++ ++++++++
++++ ++++++++   c4iw_form_reg_msg(dev, &pm_reg_msg);
++++ ++++++++   iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_C4IW);
++++ ++++++++   if (iwpm_err) {
++++ ++++++++           PDBG("%s: Port Mapper reg pid fail (err = %d).\n",
++++ ++++++++                   __func__, iwpm_err);
++++ ++++++++   }
++++ ++++++++   if (iwpm_valid_pid() && !iwpm_err) {
++++ ++++++++           memcpy(&pm_msg.loc_addr, &ep->com.local_addr,
++++ ++++++++                           sizeof(ep->com.local_addr));
++++ ++++++++           iwpm_err = iwpm_add_mapping(&pm_msg, RDMA_NL_C4IW);
++++ ++++++++           if (iwpm_err)
++++ ++++++++                   PDBG("%s: Port Mapper query fail (err = %d).\n",
++++ ++++++++                           __func__, iwpm_err);
++++ ++++++++           else
++++ ++++++++                   memcpy(&ep->com.mapped_local_addr,
++++ ++++++++                           &pm_msg.mapped_loc_addr,
++++ ++++++++                           sizeof(ep->com.mapped_local_addr));
++++ ++++++++   }
++++ ++++++++   if (iwpm_create_mapinfo(&ep->com.local_addr,
++++ ++++++++                           &ep->com.mapped_local_addr, RDMA_NL_C4IW)) {
++++ ++++++++           err = -ENOMEM;
++++ ++++++++           goto fail3;
++++ ++++++++   }
++++ ++++++++   print_addr(&ep->com, __func__, "add_mapping/create_mapinfo");
++++ ++++++++
++++ ++++++++   set_bit(RELEASE_MAPINFO, &ep->com.flags);
                state_set(&ep->com, LISTEN);
                if (ep->com.local_addr.ss_family == AF_INET)
                        err = create_server4(dev, ep);
                        cm_id->provider_data = ep;
                        goto out;
                }
++++ ++++++++
++++ ++++++++fail3:
                cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid,
                                ep->com.local_addr.ss_family);
             fail2:
index f4fa50a609e21f5ef1fe0ee3660bc921fdded72e,f4fa50a609e21f5ef1fe0ee3660bc921fdded72e,8914ea90ddd9ef8d4d7f9d844d85703bbd324b76,f4fa50a609e21f5ef1fe0ee3660bc921fdded72e,bd749e75cec418f470e61a5f8f7b7228e326fc5c,f4fa50a609e21f5ef1fe0ee3660bc921fdded72e,f4fa50a609e21f5ef1fe0ee3660bc921fdded72e,f4fa50a609e21f5ef1fe0ee3660bc921fdded72e,f4fa50a609e21f5ef1fe0ee3660bc921fdded72e,f4fa50a609e21f5ef1fe0ee3660bc921fdded72e,f4fa50a609e21f5ef1fe0ee3660bc921fdded72e,f4fa50a609e21f5ef1fe0ee3660bc921fdded72e,f4fa50a609e21f5ef1fe0ee3660bc921fdded72e..dd93aadc996e1ca15e0739a1d60e9c4930b449b8
@@@@@@@@@@@@@@ -77,6 -77,6 -77,6 -77,6 -77,16 -77,6 -77,6 -77,6 -77,6 -77,6 -77,6 -77,6 -77,6 +77,16 @@@@@@@@@@@@@@ struct c4iw_debugfs_data 
                int pos;
             };
             
++++ ++++++++/* registered cxgb4 netlink callbacks */
++++ ++++++++static struct ibnl_client_cbs c4iw_nl_cb_table[] = {
++++ ++++++++   [RDMA_NL_IWPM_REG_PID] = {.dump = iwpm_register_pid_cb},
++++ ++++++++   [RDMA_NL_IWPM_ADD_MAPPING] = {.dump = iwpm_add_mapping_cb},
++++ ++++++++   [RDMA_NL_IWPM_QUERY_MAPPING] = {.dump = iwpm_add_and_query_mapping_cb},
++++ ++++++++   [RDMA_NL_IWPM_HANDLE_ERR] = {.dump = iwpm_mapping_error_cb},
++++ ++++++++   [RDMA_NL_IWPM_MAPINFO] = {.dump = iwpm_mapping_info_cb},
++++ ++++++++   [RDMA_NL_IWPM_MAPINFO_NUM] = {.dump = iwpm_ack_mapping_info_cb}
++++ ++++++++};
++++ ++++++++
             static int count_idrs(int id, void *p, void *data)
             {
                int *countp = data;
@@@@@@@@@@@@@@ -113,35 -113,35 -113,35 -113,35 -123,49 -113,35 -113,35 -113,35 -113,35 -113,35 -113,35 -113,35 -113,35 +123,49 @@@@@@@@@@@@@@ static int dump_qp(int id, void *p, voi
                                        &qp->ep->com.local_addr;
                                struct sockaddr_in *rsin = (struct sockaddr_in *)
                                        &qp->ep->com.remote_addr;
++++ ++++++++                   struct sockaddr_in *mapped_lsin = (struct sockaddr_in *)
++++ ++++++++                           &qp->ep->com.mapped_local_addr;
++++ ++++++++                   struct sockaddr_in *mapped_rsin = (struct sockaddr_in *)
++++ ++++++++                           &qp->ep->com.mapped_remote_addr;
             
                                cc = snprintf(qpd->buf + qpd->pos, space,
                                              "rc qp sq id %u rq id %u state %u "
                                              "onchip %u ep tid %u state %u "
---- --------                                 "%pI4:%u->%pI4:%u\n",
++++ ++++++++                                 "%pI4:%u/%u->%pI4:%u/%u\n",
                                              qp->wq.sq.qid, qp->wq.rq.qid,
                                              (int)qp->attr.state,
                                              qp->wq.sq.flags & T4_SQ_ONCHIP,
                                              qp->ep->hwtid, (int)qp->ep->com.state,
                                              &lsin->sin_addr, ntohs(lsin->sin_port),
---- --------                                 &rsin->sin_addr, ntohs(rsin->sin_port));
++++ ++++++++                                 ntohs(mapped_lsin->sin_port),
++++ ++++++++                                 &rsin->sin_addr, ntohs(rsin->sin_port),
++++ ++++++++                                 ntohs(mapped_rsin->sin_port));
                        } else {
                                struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *)
                                        &qp->ep->com.local_addr;
                                struct sockaddr_in6 *rsin6 = (struct sockaddr_in6 *)
                                        &qp->ep->com.remote_addr;
++++ ++++++++                   struct sockaddr_in6 *mapped_lsin6 =
++++ ++++++++                           (struct sockaddr_in6 *)
++++ ++++++++                           &qp->ep->com.mapped_local_addr;
++++ ++++++++                   struct sockaddr_in6 *mapped_rsin6 =
++++ ++++++++                           (struct sockaddr_in6 *)
++++ ++++++++                           &qp->ep->com.mapped_remote_addr;
             
                                cc = snprintf(qpd->buf + qpd->pos, space,
                                              "rc qp sq id %u rq id %u state %u "
                                              "onchip %u ep tid %u state %u "
---- --------                                 "%pI6:%u->%pI6:%u\n",
++++ ++++++++                                 "%pI6:%u/%u->%pI6:%u/%u\n",
                                              qp->wq.sq.qid, qp->wq.rq.qid,
                                              (int)qp->attr.state,
                                              qp->wq.sq.flags & T4_SQ_ONCHIP,
                                              qp->ep->hwtid, (int)qp->ep->com.state,
                                              &lsin6->sin6_addr,
                                              ntohs(lsin6->sin6_port),
++++ ++++++++                                 ntohs(mapped_lsin6->sin6_port),
                                              &rsin6->sin6_addr,
---- --------                                 ntohs(rsin6->sin6_port));
++++ ++++++++                                 ntohs(rsin6->sin6_port),
++++ ++++++++                                 ntohs(mapped_rsin6->sin6_port));
                        }
                } else
                        cc = snprintf(qpd->buf + qpd->pos, space,
@@@@@@@@@@@@@@ -386,31 -386,31 -386,31 -386,31 -410,43 -386,31 -386,31 -386,31 -386,31 -386,31 -386,31 -386,31 -386,31 +410,43 @@@@@@@@@@@@@@ static int dump_ep(int id, void *p, voi
                                &ep->com.local_addr;
                        struct sockaddr_in *rsin = (struct sockaddr_in *)
                                &ep->com.remote_addr;
++++ ++++++++           struct sockaddr_in *mapped_lsin = (struct sockaddr_in *)
++++ ++++++++                   &ep->com.mapped_local_addr;
++++ ++++++++           struct sockaddr_in *mapped_rsin = (struct sockaddr_in *)
++++ ++++++++                   &ep->com.mapped_remote_addr;
             
                        cc = snprintf(epd->buf + epd->pos, space,
                                      "ep %p cm_id %p qp %p state %d flags 0x%lx "
                                      "history 0x%lx hwtid %d atid %d "
---- --------                         "%pI4:%d <-> %pI4:%d\n",
++++ ++++++++                         "%pI4:%d/%d <-> %pI4:%d/%d\n",
                                      ep, ep->com.cm_id, ep->com.qp,
                                      (int)ep->com.state, ep->com.flags,
                                      ep->com.history, ep->hwtid, ep->atid,
                                      &lsin->sin_addr, ntohs(lsin->sin_port),
---- --------                         &rsin->sin_addr, ntohs(rsin->sin_port));
++++ ++++++++                         ntohs(mapped_lsin->sin_port),
++++ ++++++++                         &rsin->sin_addr, ntohs(rsin->sin_port),
++++ ++++++++                         ntohs(mapped_rsin->sin_port));
                } else {
                        struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *)
                                &ep->com.local_addr;
                        struct sockaddr_in6 *rsin6 = (struct sockaddr_in6 *)
                                &ep->com.remote_addr;
++++ ++++++++           struct sockaddr_in6 *mapped_lsin6 = (struct sockaddr_in6 *)
++++ ++++++++                   &ep->com.mapped_local_addr;
++++ ++++++++           struct sockaddr_in6 *mapped_rsin6 = (struct sockaddr_in6 *)
++++ ++++++++                   &ep->com.mapped_remote_addr;
             
                        cc = snprintf(epd->buf + epd->pos, space,
                                      "ep %p cm_id %p qp %p state %d flags 0x%lx "
                                      "history 0x%lx hwtid %d atid %d "
---- --------                         "%pI6:%d <-> %pI6:%d\n",
++++ ++++++++                         "%pI6:%d/%d <-> %pI6:%d/%d\n",
                                      ep, ep->com.cm_id, ep->com.qp,
                                      (int)ep->com.state, ep->com.flags,
                                      ep->com.history, ep->hwtid, ep->atid,
                                      &lsin6->sin6_addr, ntohs(lsin6->sin6_port),
---- --------                         &rsin6->sin6_addr, ntohs(rsin6->sin6_port));
++++ ++++++++                         ntohs(mapped_lsin6->sin6_port),
++++ ++++++++                         &rsin6->sin6_addr, ntohs(rsin6->sin6_port),
++++ ++++++++                         ntohs(mapped_rsin6->sin6_port));
                }
                if (cc < space)
                        epd->pos += cc;
@@@@@@@@@@@@@@ -431,23 -431,23 -431,23 -431,23 -467,29 -431,23 -431,23 -431,23 -431,23 -431,23 -431,23 -431,23 -431,23 +467,29 @@@@@@@@@@@@@@ static int dump_listen_ep(int id, void 
                if (ep->com.local_addr.ss_family == AF_INET) {
                        struct sockaddr_in *lsin = (struct sockaddr_in *)
                                &ep->com.local_addr;
++++ ++++++++           struct sockaddr_in *mapped_lsin = (struct sockaddr_in *)
++++ ++++++++                   &ep->com.mapped_local_addr;
             
                        cc = snprintf(epd->buf + epd->pos, space,
                                      "ep %p cm_id %p state %d flags 0x%lx stid %d "
---- --------                         "backlog %d %pI4:%d\n",
++++ ++++++++                         "backlog %d %pI4:%d/%d\n",
                                      ep, ep->com.cm_id, (int)ep->com.state,
                                      ep->com.flags, ep->stid, ep->backlog,
---- --------                         &lsin->sin_addr, ntohs(lsin->sin_port));
++++ ++++++++                         &lsin->sin_addr, ntohs(lsin->sin_port),
++++ ++++++++                         ntohs(mapped_lsin->sin_port));
                } else {
                        struct sockaddr_in6 *lsin6 = (struct sockaddr_in6 *)
                                &ep->com.local_addr;
++++ ++++++++           struct sockaddr_in6 *mapped_lsin6 = (struct sockaddr_in6 *)
++++ ++++++++                   &ep->com.mapped_local_addr;
             
                        cc = snprintf(epd->buf + epd->pos, space,
                                      "ep %p cm_id %p state %d flags 0x%lx stid %d "
---- --------                         "backlog %d %pI6:%d\n",
++++ ++++++++                         "backlog %d %pI6:%d/%d\n",
                                      ep, ep->com.cm_id, (int)ep->com.state,
                                      ep->com.flags, ep->stid, ep->backlog,
---- --------                         &lsin6->sin6_addr, ntohs(lsin6->sin6_port));
++++ ++++++++                         &lsin6->sin6_addr, ntohs(lsin6->sin6_port),
++++ ++++++++                         ntohs(mapped_lsin6->sin6_port));
                }
                if (cc < space)
                        epd->pos += cc;
@@@@@@@@@@@@@@ -687,6 -687,6 -687,6 -687,6 -729,7 -687,6 -687,6 -687,6 -687,6 -687,6 -687,6 -687,6 -687,6 +729,7 @@@@@@@@@@@@@@ static void c4iw_dealloc(struct uld_ct
                if (ctx->dev->rdev.oc_mw_kva)
                        iounmap(ctx->dev->rdev.oc_mw_kva);
                ib_dealloc_device(&ctx->dev->ibdev);
++++ ++++++++   iwpm_exit(RDMA_NL_C4IW);
                ctx->dev = NULL;
             }
             
@@@@@@@@@@@@@@ -736,6 -736,6 -736,7 -736,6 -779,6 -736,6 -736,6 -736,6 -736,6 -736,6 -736,6 -736,6 -736,6 +779,7 @@@@@@@@@@@@@@ static struct c4iw_dev *c4iw_alloc(cons
                                pci_resource_len(devp->rdev.lldi.pdev, 2));
                        if (!devp->rdev.bar2_kva) {
                                pr_err(MOD "Unable to ioremap BAR2\n");
++ ++++++++++                   ib_dealloc_device(&devp->ibdev);
                                return ERR_PTR(-EINVAL);
                        }
                } else if (ocqp_supported(infop)) {
                                devp->rdev.lldi.vr->ocq.size);
                        if (!devp->rdev.oc_mw_kva) {
                                pr_err(MOD "Unable to ioremap onchip mem\n");
++ ++++++++++                   ib_dealloc_device(&devp->ibdev);
                                return ERR_PTR(-EINVAL);
                        }
                }
                                                c4iw_debugfs_root);
                        setup_debugfs(devp);
                }
++++ ++++++++
++++ ++++++++   ret = iwpm_init(RDMA_NL_C4IW);
++++ ++++++++   if (ret) {
++++ ++++++++           pr_err("port mapper initialization failed with %d\n", ret);
++++ ++++++++           ib_dealloc_device(&devp->ibdev);
++++ ++++++++           return ERR_PTR(ret);
++++ ++++++++   }
++++ ++++++++
                return devp;
             }
             
@@@@@@@@@@@@@@ -1274,6 -1274,6 -1276,6 -1274,6 -1325,11 -1274,6 -1274,6 -1274,6 -1274,6 -1274,6 -1274,6 -1274,6 -1274,6 +1327,11 @@@@@@@@@@@@@@ static int __init c4iw_init_module(void
                        printk(KERN_WARNING MOD
                               "could not create debugfs entry, continuing\n");
             
++++ ++++++++   if (ibnl_add_client(RDMA_NL_C4IW, RDMA_NL_IWPM_NUM_OPS,
++++ ++++++++                       c4iw_nl_cb_table))
++++ ++++++++           pr_err("%s[%u]: Failed to add netlink callback\n"
++++ ++++++++                  , __func__, __LINE__);
++++ ++++++++
                cxgb4_register_uld(CXGB4_ULD_RDMA, &c4iw_uld_info);
             
                return 0;
@@@@@@@@@@@@@@ -1291,6 -1291,6 -1293,6 -1291,6 -1347,7 -1291,6 -1291,6 -1291,6 -1291,6 -1291,6 -1291,6 -1291,6 -1291,6 +1349,7 @@@@@@@@@@@@@@ static void __exit c4iw_exit_module(voi
                }
                mutex_unlock(&dev_mutex);
                cxgb4_unregister_uld(CXGB4_ULD_RDMA);
++++ ++++++++   ibnl_remove_client(RDMA_NL_C4IW);
                c4iw_cm_term();
                debugfs_remove_recursive(c4iw_debugfs_root);
             }
index 41308af4163c3dc852adc23f983bdd86d279374e,41308af4163c3dc852adc23f983bdd86d279374e,41308af4163c3dc852adc23f983bdd86d279374e,41308af4163c3dc852adc23f983bdd86d279374e,41308af4163c3dc852adc23f983bdd86d279374e,41308af4163c3dc852adc23f983bdd86d279374e,b25600997cb656daa2c75b867cf4d11fedcc6ac1,41308af4163c3dc852adc23f983bdd86d279374e,a0bfda275647b786c84914ddb167cfbd638c71ac,41308af4163c3dc852adc23f983bdd86d279374e,41308af4163c3dc852adc23f983bdd86d279374e,41308af4163c3dc852adc23f983bdd86d279374e,41308af4163c3dc852adc23f983bdd86d279374e..5b0cb8e2d807ed16d1742d3f6e6d1722510158f7
@@@@@@@@@@@@@@ -608,9 -608,9 -608,9 -608,9 -608,9 -608,9 -608,19 -608,9 -608,10 -608,9 -608,9 -608,9 -608,9 +608,20 @@@@@@@@@@@@@@ static int qp_has_rq(struct ib_qp_init_
                return !attr->srq;
             }
             
++++++ ++++++static int qp0_enabled_vf(struct mlx4_dev *dev, int qpn)
++++++ ++++++{
++++++ ++++++   int i;
++++++ ++++++   for (i = 0; i < dev->caps.num_ports; i++) {
++++++ ++++++           if (qpn == dev->caps.qp0_proxy[i])
++++++ ++++++                   return !!dev->caps.qp0_qkey[i];
++++++ ++++++   }
++++++ ++++++   return 0;
++++++ ++++++}
++++++ ++++++
             static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
                                    struct ib_qp_init_attr *init_attr,
-------- ----                       struct ib_udata *udata, int sqpn, struct mlx4_ib_qp **caller_qp)
++++++++ ++++                       struct ib_udata *udata, int sqpn, struct mlx4_ib_qp **caller_qp,
++++++++ ++++                       gfp_t gfp)
             {
                int qpn;
                int err;
                             !(init_attr->create_flags & MLX4_IB_SRIOV_SQP))) {
                                if (init_attr->qp_type == IB_QPT_GSI)
                                        qp_type = MLX4_IB_QPT_PROXY_GSI;
------ ------                   else if (mlx4_is_master(dev->dev))
------ ------                           qp_type = MLX4_IB_QPT_PROXY_SMI_OWNER;
------ ------                   else
------ ------                           qp_type = MLX4_IB_QPT_PROXY_SMI;
++++++ ++++++                   else {
++++++ ++++++                           if (mlx4_is_master(dev->dev) ||
++++++ ++++++                               qp0_enabled_vf(dev->dev, sqpn))
++++++ ++++++                                   qp_type = MLX4_IB_QPT_PROXY_SMI_OWNER;
++++++ ++++++                           else
++++++ ++++++                                   qp_type = MLX4_IB_QPT_PROXY_SMI;
++++++ ++++++                   }
                        }
                        qpn = sqpn;
                        /* add extra sg entry for tunneling */
                                return -EINVAL;
                        if (tnl_init->proxy_qp_type == IB_QPT_GSI)
                                qp_type = MLX4_IB_QPT_TUN_GSI;
------ ------           else if (tnl_init->slave == mlx4_master_func_num(dev->dev))
++++++ ++++++           else if (tnl_init->slave == mlx4_master_func_num(dev->dev) ||
++++++ ++++++                    mlx4_vf_smi_enabled(dev->dev, tnl_init->slave,
++++++ ++++++                                        tnl_init->port))
                                qp_type = MLX4_IB_QPT_TUN_SMI_OWNER;
                        else
                                qp_type = MLX4_IB_QPT_TUN_SMI;
                        if (qp_type == MLX4_IB_QPT_SMI || qp_type == MLX4_IB_QPT_GSI ||
                            (qp_type & (MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_SMI_OWNER |
                                        MLX4_IB_QPT_PROXY_GSI | MLX4_IB_QPT_TUN_SMI_OWNER))) {
-------- ----                   sqp = kzalloc(sizeof (struct mlx4_ib_sqp), GFP_KERNEL);
++++++++ ++++                   sqp = kzalloc(sizeof (struct mlx4_ib_sqp), gfp);
                                if (!sqp)
                                        return -ENOMEM;
                                qp = &sqp->qp;
                                qp->pri.vid = 0xFFFF;
                                qp->alt.vid = 0xFFFF;
                        } else {
-------- ----                   qp = kzalloc(sizeof (struct mlx4_ib_qp), GFP_KERNEL);
++++++++ ++++                   qp = kzalloc(sizeof (struct mlx4_ib_qp), gfp);
                                if (!qp)
                                        return -ENOMEM;
                                qp->pri.vid = 0xFFFF;
                                goto err;
             
                        if (qp_has_rq(init_attr)) {
-------- ----                   err = mlx4_db_alloc(dev->dev, &qp->db, 0);
++++++++ ++++                   err = mlx4_db_alloc(dev->dev, &qp->db, 0, gfp);
                                if (err)
                                        goto err;
             
                                *qp->db.db = 0;
                        }
             
-------- ----           if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf)) {
++++++++ ++++           if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf, gfp)) {
                                err = -ENOMEM;
                                goto err_db;
                        }
                        if (err)
                                goto err_buf;
             
-------- ----           err = mlx4_buf_write_mtt(dev->dev, &qp->mtt, &qp->buf);
++++++++ ++++           err = mlx4_buf_write_mtt(dev->dev, &qp->mtt, &qp->buf, gfp);
                        if (err)
                                goto err_mtt;
             
-------- ----           qp->sq.wrid  = kmalloc(qp->sq.wqe_cnt * sizeof (u64), GFP_KERNEL);
-------- ----           qp->rq.wrid  = kmalloc(qp->rq.wqe_cnt * sizeof (u64), GFP_KERNEL);
-------- ----
++++++++ ++++           qp->sq.wrid  = kmalloc(qp->sq.wqe_cnt * sizeof (u64), gfp);
++++++++ ++++           qp->rq.wrid  = kmalloc(qp->rq.wqe_cnt * sizeof (u64), gfp);
                        if (!qp->sq.wrid || !qp->rq.wrid) {
                                err = -ENOMEM;
                                goto err_wrid;
                                goto err_proxy;
                }
             
-------- ----   err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp);
++++++++ ++++   err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp, gfp);
                if (err)
                        goto err_qpn;
             
@@@@@@@@@@@@@@ -1040,7 -1040,7 -1040,7 -1040,7 -1040,7 -1040,7 -1055,7 -1040,7 -1040,10 -1040,7 -1040,7 -1040,7 -1040,7 +1055,10 @@@@@@@@@@@@@@ struct ib_qp *mlx4_ib_create_qp(struct 
                struct mlx4_ib_qp *qp = NULL;
                int err;
                u16 xrcdn = 0;
++++++++ ++++   gfp_t gfp;
             
++++++++ ++++   gfp = (init_attr->create_flags & MLX4_IB_QP_CREATE_USE_GFP_NOIO) ?
++++++++ ++++           GFP_NOIO : GFP_KERNEL;
                /*
                 * We only support LSO, vendor flag1, and multicast loopback blocking,
                 * and only for kernel UD QPs.
                                                MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK |
                                                MLX4_IB_SRIOV_TUNNEL_QP |
                                                MLX4_IB_SRIOV_SQP |
-------- ----                                   MLX4_IB_QP_NETIF))
++++++++ ++++                                   MLX4_IB_QP_NETIF |
++++++++ ++++                                   MLX4_IB_QP_CREATE_USE_GFP_NOIO))
                        return ERR_PTR(-EINVAL);
             
                if (init_attr->create_flags & IB_QP_CREATE_NETIF_QP) {
             
                if (init_attr->create_flags &&
                    (udata ||
-------- ----        ((init_attr->create_flags & ~MLX4_IB_SRIOV_SQP) &&
++++++++ ++++        ((init_attr->create_flags & ~(MLX4_IB_SRIOV_SQP | MLX4_IB_QP_CREATE_USE_GFP_NOIO)) &&
                      init_attr->qp_type != IB_QPT_UD) ||
                     ((init_attr->create_flags & MLX4_IB_SRIOV_SQP) &&
                      init_attr->qp_type > IB_QPT_GSI)))
                case IB_QPT_RC:
                case IB_QPT_UC:
                case IB_QPT_RAW_PACKET:
-------- ----           qp = kzalloc(sizeof *qp, GFP_KERNEL);
++++++++ ++++           qp = kzalloc(sizeof *qp, gfp);
                        if (!qp)
                                return ERR_PTR(-ENOMEM);
                        qp->pri.vid = 0xFFFF;
                case IB_QPT_UD:
                {
                        err = create_qp_common(to_mdev(pd->device), pd, init_attr,
-------- ----                                  udata, 0, &qp);
++++++++ ++++                                  udata, 0, &qp, gfp);
                        if (err)
                                return ERR_PTR(err);
             
             
                        err = create_qp_common(to_mdev(pd->device), pd, init_attr, udata,
                                               get_sqp_num(to_mdev(pd->device), init_attr),
-------- ----                                  &qp);
++++++++ ++++                                  &qp, gfp);
                        if (err)
                                return ERR_PTR(err);
             
                return err;
             }
             
++++++ ++++++static int vf_get_qp0_qkey(struct mlx4_dev *dev, int qpn, u32 *qkey)
++++++ ++++++{
++++++ ++++++   int i;
++++++ ++++++   for (i = 0; i < dev->caps.num_ports; i++) {
++++++ ++++++           if (qpn == dev->caps.qp0_proxy[i] ||
++++++ ++++++               qpn == dev->caps.qp0_tunnel[i]) {
++++++ ++++++                   *qkey = dev->caps.qp0_qkey[i];
++++++ ++++++                   return 0;
++++++ ++++++           }
++++++ ++++++   }
++++++ ++++++   return -EINVAL;
++++++ ++++++}
++++++ ++++++
             static int build_sriov_qp0_header(struct mlx4_ib_sqp *sqp,
                                          struct ib_send_wr *wr,
                                          void *wqe, unsigned *mlx_seg_len)
                                cpu_to_be32(mdev->dev->caps.qp0_tunnel[sqp->qp.port - 1]);
             
                sqp->ud_header.bth.psn = cpu_to_be32((sqp->send_psn++) & ((1 << 24) - 1));
------ ------   if (mlx4_get_parav_qkey(mdev->dev, sqp->qp.mqp.qpn, &qkey))
------ ------           return -EINVAL;
++++++ ++++++   if (mlx4_is_master(mdev->dev)) {
++++++ ++++++           if (mlx4_get_parav_qkey(mdev->dev, sqp->qp.mqp.qpn, &qkey))
++++++ ++++++                   return -EINVAL;
++++++ ++++++   } else {
++++++ ++++++           if (vf_get_qp0_qkey(mdev->dev, sqp->qp.mqp.qpn, &qkey))
++++++ ++++++                   return -EINVAL;
++++++ ++++++   }
                sqp->ud_header.deth.qkey = cpu_to_be32(qkey);
                sqp->ud_header.deth.source_qpn = cpu_to_be32(sqp->qp.mqp.qpn);
             
@@@@@@@@@@@@@@ -2370,7 -2370,7 -2370,7 -2370,7 -2370,7 -2370,7 -2403,8 -2370,7 -2374,7 -2370,7 -2370,7 -2370,7 -2370,7 +2407,8 @@@@@@@@@@@@@@ static void set_datagram_seg(struct mlx
             
             static void set_tunnel_datagram_seg(struct mlx4_ib_dev *dev,
                                            struct mlx4_wqe_datagram_seg *dseg,
------ ------                               struct ib_send_wr *wr, enum ib_qp_type qpt)
++++++ ++++++                               struct ib_send_wr *wr,
++++++ ++++++                               enum mlx4_ib_qp_type qpt)
             {
                union mlx4_ext_av *av = &to_mah(wr->wr.ud.ah)->av;
                struct mlx4_av sqp_av = {0};
                                cpu_to_be32(0xf0000000);
             
                memcpy(dseg->av, &sqp_av, sizeof (struct mlx4_av));
------ ------   /* This function used only for sending on QP1 proxies */
------ ------   dseg->dqpn = cpu_to_be32(dev->dev->caps.qp1_tunnel[port - 1]);
++++++ ++++++   if (qpt == MLX4_IB_QPT_PROXY_GSI)
++++++ ++++++           dseg->dqpn = cpu_to_be32(dev->dev->caps.qp1_tunnel[port - 1]);
++++++ ++++++   else
++++++ ++++++           dseg->dqpn = cpu_to_be32(dev->dev->caps.qp0_tunnel[port - 1]);
                /* Use QKEY from the QP context, which is set by master */
                dseg->qkey = cpu_to_be32(IB_QP_SET_QKEY);
             }
@@@@@@@@@@@@@@ -2679,11 -2679,11 -2679,11 -2679,11 -2679,11 -2679,11 -2715,6 -2679,11 -2683,11 -2679,11 -2679,11 -2679,11 -2679,11 +2719,6 @@@@@@@@@@@@@@ int mlx4_ib_post_send(struct ib_qp *ibq
                                break;
             
                        case MLX4_IB_QPT_PROXY_SMI_OWNER:
------ ------                   if (unlikely(!mlx4_is_master(to_mdev(ibqp->device)->dev))) {
------ ------                           err = -ENOSYS;
------ ------                           *bad_wr = wr;
------ ------                           goto out;
------ ------                   }
                                err = build_sriov_qp0_header(to_msqp(qp), wr, ctrl, &seglen);
                                if (unlikely(err)) {
                                        *bad_wr = wr;
                                size += seglen / 16;
                                break;
                        case MLX4_IB_QPT_PROXY_SMI:
------ ------                   /* don't allow QP0 sends on guests */
------ ------                   err = -ENOSYS;
------ ------                   *bad_wr = wr;
------ ------                   goto out;
                        case MLX4_IB_QPT_PROXY_GSI:
                                /* If we are tunneling special qps, this is a UD qp.
                                 * In this case we first add a UD segment targeting
                                 * the tunnel qp, and then add a header with address
                                 * information */
------ ------                   set_tunnel_datagram_seg(to_mdev(ibqp->device), wqe, wr, ibqp->qp_type);
++++++ ++++++                   set_tunnel_datagram_seg(to_mdev(ibqp->device), wqe, wr,
++++++ ++++++                                           qp->mlx4_ib_qp_type);
                                wqe  += sizeof (struct mlx4_wqe_datagram_seg);
                                size += sizeof (struct mlx4_wqe_datagram_seg) / 16;
                                build_tunnel_header(wr, wqe, &seglen);
index f9c46510196341a6089b0a23d7b53455dad69ae5,f9c46510196341a6089b0a23d7b53455dad69ae5,f9c46510196341a6089b0a23d7b53455dad69ae5,f9c46510196341a6089b0a23d7b53455dad69ae5,f9c46510196341a6089b0a23d7b53455dad69ae5,f9c46510196341a6089b0a23d7b53455dad69ae5,0efd1738fcb3a7817dc10ce86ad95b63da5febef,f9c46510196341a6089b0a23d7b53455dad69ae5,627a54ef2955ff999da8ae605559c18bd9933544,f9c46510196341a6089b0a23d7b53455dad69ae5,f9c46510196341a6089b0a23d7b53455dad69ae5,f9c46510196341a6089b0a23d7b53455dad69ae5,f9c46510196341a6089b0a23d7b53455dad69ae5..7d39cb30c883b90afa7529bac2ffedf8da134ebc
                MLX4_COMM_CMD_FLR = 254
             };
             
++++++ ++++++enum {
++++++ ++++++   MLX4_VF_SMI_DISABLED,
++++++ ++++++   MLX4_VF_SMI_ENABLED
++++++ ++++++};
++++++ ++++++
             /*The flag indicates that the slave should delay the RESET cmd*/
             #define MLX4_DELAY_RESET_SLAVE 0xbbbbbbb
             /*indicates how many retries will be done if we are in the middle of FLR*/
@@@@@@@@@@@@@@ -488,6 -488,6 -488,6 -488,6 -488,6 -488,6 -493,7 -488,6 -488,6 -488,6 -488,6 -488,6 -488,6 +493,7 @@@@@@@@@@@@@@ struct mlx4_vport_state 
             
             struct mlx4_vf_admin_state {
                struct mlx4_vport_state vport[MLX4_MAX_PORTS + 1];
++++++ ++++++   u8 enable_smi[MLX4_MAX_PORTS + 1];
             };
             
             struct mlx4_vport_oper_state {
                int mac_idx;
                int vlan_idx;
             };
++++++ ++++++
             struct mlx4_vf_oper_state {
                struct mlx4_vport_oper_state vport[MLX4_MAX_PORTS + 1];
++++++ ++++++   u8 smi_enabled[MLX4_MAX_PORTS + 1];
             };
             
             struct slave_list {
@@@@@@@@@@@@@@ -888,7 -888,7 -888,7 -888,7 -888,7 -888,7 -896,7 -888,7 -888,7 -888,7 -888,7 -888,7 -888,7 +896,7 @@@@@@@@@@@@@@ void mlx4_cleanup_cq_table(struct mlx4_
             void mlx4_cleanup_qp_table(struct mlx4_dev *dev);
             void mlx4_cleanup_srq_table(struct mlx4_dev *dev);
             void mlx4_cleanup_mcg_table(struct mlx4_dev *dev);
-------- ----int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn);
++++++++ ++++int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn, gfp_t gfp);
             void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn);
             int __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn);
             void __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn);
@@@@@@@@@@@@@@ -896,7 -896,7 -896,7 -896,7 -896,7 -896,7 -904,7 -896,7 -896,7 -896,7 -896,7 -896,7 -896,7 +904,7 @@@@@@@@@@@@@@ int __mlx4_srq_alloc_icm(struct mlx4_de
             void __mlx4_srq_free_icm(struct mlx4_dev *dev, int srqn);
             int __mlx4_mpt_reserve(struct mlx4_dev *dev);
             void __mlx4_mpt_release(struct mlx4_dev *dev, u32 index);
-------- ----int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index);
++++++++ ++++int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index, gfp_t gfp);
             void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index);
             u32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order);
             void __mlx4_free_mtt_range(struct mlx4_dev *dev, u32 first_seg, int order);
index 1c3fdd4a1f7df3fe84847ae7ff278d652db13463,1c3fdd4a1f7df3fe84847ae7ff278d652db13463,1c3fdd4a1f7df3fe84847ae7ff278d652db13463,1c3fdd4a1f7df3fe84847ae7ff278d652db13463,1c3fdd4a1f7df3fe84847ae7ff278d652db13463,1c3fdd4a1f7df3fe84847ae7ff278d652db13463,10db83ee0e5851f31c6a142133221ac906af8b80,1c3fdd4a1f7df3fe84847ae7ff278d652db13463,45da913b5679baa125dbc8ae39b7e88e479b8a41,1c3fdd4a1f7df3fe84847ae7ff278d652db13463,1c3fdd4a1f7df3fe84847ae7ff278d652db13463,1c3fdd4a1f7df3fe84847ae7ff278d652db13463,1c3fdd4a1f7df3fe84847ae7ff278d652db13463..abdb000bba302c24660c94984e9a472f9ee7968c
@@@@@@@@@@@@@@ -1532,7 -1532,7 -1532,7 -1532,7 -1532,7 -1532,7 -1532,7 -1532,7 -1532,7 -1532,7 -1532,7 -1532,7 -1532,7 +1532,7 @@@@@@@@@@@@@@ static int qp_alloc_res(struct mlx4_de
                                return err;
             
                        if (!fw_reserved(dev, qpn)) {
-------- ----                   err = __mlx4_qp_alloc_icm(dev, qpn);
++++++++ ++++                   err = __mlx4_qp_alloc_icm(dev, qpn, GFP_KERNEL);
                                if (err) {
                                        res_abort_move(dev, slave, RES_QP, qpn);
                                        return err;
@@@@@@@@@@@@@@ -1619,7 -1619,7 -1619,7 -1619,7 -1619,7 -1619,7 -1619,7 -1619,7 -1619,7 -1619,7 -1619,7 -1619,7 -1619,7 +1619,7 @@@@@@@@@@@@@@ static int mpt_alloc_res(struct mlx4_de
                        if (err)
                                return err;
             
-------- ----           err = __mlx4_mpt_alloc_icm(dev, mpt->key);
++++++++ ++++           err = __mlx4_mpt_alloc_icm(dev, mpt->key, GFP_KERNEL);
                        if (err) {
                                res_abort_move(dev, slave, RES_MPT, id);
                                return err;
@@@@@@@@@@@@@@ -2827,10 -2827,10 -2827,10 -2827,10 -2827,10 -2827,10 -2827,12 -2827,10 -2827,10 -2827,10 -2827,10 -2827,10 -2827,10 +2827,12 @@@@@@@@@@@@@@ static int get_containing_mtt(struct ml
             }
             
             static int verify_qp_parameters(struct mlx4_dev *dev,
++++++ ++++++                           struct mlx4_vhcr *vhcr,
                                        struct mlx4_cmd_mailbox *inbox,
                                        enum qp_transition transition, u8 slave)
             {
                u32                     qp_type;
++++++ ++++++   u32                     qpn;
                struct mlx4_qp_context  *qp_ctx;
                enum mlx4_qp_optpar     optpar;
                int port;
                        default:
                                break;
                        }
++++++ ++++++           break;
             
++++++ ++++++   case MLX4_QP_ST_MLX:
++++++ ++++++           qpn = vhcr->in_modifier & 0x7fffff;
++++++ ++++++           port = (qp_ctx->pri_path.sched_queue >> 6 & 1) + 1;
++++++ ++++++           if (transition == QP_TRANS_INIT2RTR &&
++++++ ++++++               slave != mlx4_master_func_num(dev) &&
++++++ ++++++               mlx4_is_qp_reserved(dev, qpn) &&
++++++ ++++++               !mlx4_vf_smi_enabled(dev, slave, port)) {
++++++ ++++++                   /* only enabled VFs may create MLX proxy QPs */
++++++ ++++++                   mlx4_err(dev, "%s: unprivileged slave %d attempting to create an MLX proxy special QP on port %d\n",
++++++ ++++++                            __func__, slave, port);
++++++ ++++++                   return -EPERM;
++++++ ++++++           }
                        break;
++++++ ++++++
                default:
                        break;
                }
@@@@@@@@@@@@@@ -3454,7 -3454,7 -3454,7 -3454,7 -3454,7 -3454,7 -3470,7 -3454,7 -3454,7 -3454,7 -3454,7 -3454,7 -3454,7 +3470,7 @@@@@@@@@@@@@@ int mlx4_INIT2RTR_QP_wrapper(struct mlx
                err = adjust_qp_sched_queue(dev, slave, qpc, inbox);
                if (err)
                        return err;
------ ------   err = verify_qp_parameters(dev, inbox, QP_TRANS_INIT2RTR, slave);
++++++ ++++++   err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_INIT2RTR, slave);
                if (err)
                        return err;
             
@@@@@@@@@@@@@@ -3508,7 -3508,7 -3508,7 -3508,7 -3508,7 -3508,7 -3524,7 -3508,7 -3508,7 -3508,7 -3508,7 -3508,7 -3508,7 +3524,7 @@@@@@@@@@@@@@ int mlx4_RTR2RTS_QP_wrapper(struct mlx4
                err = adjust_qp_sched_queue(dev, slave, context, inbox);
                if (err)
                        return err;
------ ------   err = verify_qp_parameters(dev, inbox, QP_TRANS_RTR2RTS, slave);
++++++ ++++++   err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTR2RTS, slave);
                if (err)
                        return err;
             
@@@@@@@@@@@@@@ -3530,7 -3530,7 -3530,7 -3530,7 -3530,7 -3530,7 -3546,7 -3530,7 -3530,7 -3530,7 -3530,7 -3530,7 -3530,7 +3546,7 @@@@@@@@@@@@@@ int mlx4_RTS2RTS_QP_wrapper(struct mlx4
                err = adjust_qp_sched_queue(dev, slave, context, inbox);
                if (err)
                        return err;
------ ------   err = verify_qp_parameters(dev, inbox, QP_TRANS_RTS2RTS, slave);
++++++ ++++++   err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_RTS2RTS, slave);
                if (err)
                        return err;
             
@@@@@@@@@@@@@@ -3567,7 -3567,7 -3567,7 -3567,7 -3567,7 -3567,7 -3583,7 -3567,7 -3567,7 -3567,7 -3567,7 -3567,7 -3567,7 +3583,7 @@@@@@@@@@@@@@ int mlx4_SQD2SQD_QP_wrapper(struct mlx4
                err = adjust_qp_sched_queue(dev, slave, context, inbox);
                if (err)
                        return err;
------ ------   err = verify_qp_parameters(dev, inbox, QP_TRANS_SQD2SQD, slave);
++++++ ++++++   err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2SQD, slave);
                if (err)
                        return err;
             
@@@@@@@@@@@@@@ -3589,7 -3589,7 -3589,7 -3589,7 -3589,7 -3589,7 -3605,7 -3589,7 -3589,7 -3589,7 -3589,7 -3589,7 -3589,7 +3605,7 @@@@@@@@@@@@@@ int mlx4_SQD2RTS_QP_wrapper(struct mlx4
                err = adjust_qp_sched_queue(dev, slave, context, inbox);
                if (err)
                        return err;
------ ------   err = verify_qp_parameters(dev, inbox, QP_TRANS_SQD2RTS, slave);
++++++ ++++++   err = verify_qp_parameters(dev, vhcr, inbox, QP_TRANS_SQD2RTS, slave);
                if (err)
                        return err;
             
index ba87bd21295a533c8d6941bc4c11d29bceba0112,ba87bd21295a533c8d6941bc4c11d29bceba0112,ba87bd21295a533c8d6941bc4c11d29bceba0112,ba87bd21295a533c8d6941bc4c11d29bceba0112,ba87bd21295a533c8d6941bc4c11d29bceba0112,ba87bd21295a533c8d6941bc4c11d29bceba0112,dcabe11f37f7fde5dc5e197447189a07522fd0d4,ba87bd21295a533c8d6941bc4c11d29bceba0112,be60b002bb379269b684afb0c73b510ad23300b7,ba87bd21295a533c8d6941bc4c11d29bceba0112,ba87bd21295a533c8d6941bc4c11d29bceba0112,ba87bd21295a533c8d6941bc4c11d29bceba0112,ba87bd21295a533c8d6941bc4c11d29bceba0112..3447bead962015d1dce95a694d85c2d4ba7d4fd2
@@@@@@@@@@@@@@ -401,6 -401,6 -401,6 -401,6 -401,6 -401,6 -401,7 -401,6 -401,6 -401,6 -401,6 -401,6 -401,6 +401,7 @@@@@@@@@@@@@@ struct mlx4_caps 
                int                     max_rq_desc_sz;
                int                     max_qp_init_rdma;
                int                     max_qp_dest_rdma;
++++++ ++++++   u32                     *qp0_qkey;
                u32                     *qp0_proxy;
                u32                     *qp1_proxy;
                u32                     *qp0_tunnel;
@@@@@@@@@@@@@@ -837,7 -837,7 -837,7 -837,7 -837,7 -837,7 -838,7 -837,7 -837,7 -837,7 -837,7 -837,7 -837,7 +838,7 @@@@@@@@@@@@@@ static inline int mlx4_is_slave(struct 
             }
             
             int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct,
-------- ----              struct mlx4_buf *buf);
++++++++ ++++              struct mlx4_buf *buf, gfp_t gfp);
             void mlx4_buf_free(struct mlx4_dev *dev, int size, struct mlx4_buf *buf);
             static inline void *mlx4_buf_offset(struct mlx4_buf *buf, int offset)
             {
@@@@@@@@@@@@@@ -874,9 -874,9 -874,9 -874,9 -874,9 -874,9 -875,9 -874,9 -874,10 -874,9 -874,9 -874,9 -874,9 +875,10 @@@@@@@@@@@@@@ int mlx4_mw_enable(struct mlx4_dev *dev
             int mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
                           int start_index, int npages, u64 *page_list);
             int mlx4_buf_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
-------- ----                  struct mlx4_buf *buf);
++++++++ ++++                  struct mlx4_buf *buf, gfp_t gfp);
             
-------- ----int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order);
++++++++ ++++int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order,
++++++++ ++++             gfp_t gfp);
             void mlx4_db_free(struct mlx4_dev *dev, struct mlx4_db *db);
             
             int mlx4_alloc_hwq_res(struct mlx4_dev *dev, struct mlx4_hwq_resources *wqres,
@@@@@@@@@@@@@@ -892,7 -892,7 -892,7 -892,7 -892,7 -892,7 -893,7 -892,7 -893,8 -892,7 -892,7 -892,7 -892,7 +894,8 @@@@@@@@@@@@@@ void mlx4_cq_free(struct mlx4_dev *dev
             int mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align, int *base);
             void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt);
             
-------- ----int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp);
++++++++ ++++int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp,
++++++++ ++++             gfp_t gfp);
             void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp);
             
             int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcdn,
@@@@@@@@@@@@@@ -1234,4 -1234,4 -1234,4 -1234,4 -1234,4 -1234,4 -1235,8 -1234,4 -1236,4 -1234,4 -1234,4 -1234,4 -1234,4 +1237,8 @@@@@@@@@@@@@@ int mlx4_phys_to_slave_port(struct mlx4
             int mlx4_get_base_gid_ix(struct mlx4_dev *dev, int slave, int port);
             
             int mlx4_config_vxlan_port(struct mlx4_dev *dev, __be16 udp_port);
++++++ ++++++int mlx4_vf_smi_enabled(struct mlx4_dev *dev, int slave, int port);
++++++ ++++++int mlx4_vf_get_enable_smi_admin(struct mlx4_dev *dev, int slave, int port);
++++++ ++++++int mlx4_vf_set_enable_smi_admin(struct mlx4_dev *dev, int slave, int port,
++++++ ++++++                            int enable);
             #endif /* MLX4_DEVICE_H */
diff --combined include/rdma/ib_verbs.h
index acd825182977ca73ec0eb161af9d768a0dc365b9,acd825182977ca73ec0eb161af9d768a0dc365b9,acd825182977ca73ec0eb161af9d768a0dc365b9,acd825182977ca73ec0eb161af9d768a0dc365b9,acd825182977ca73ec0eb161af9d768a0dc365b9,e9da1bc89d25c8fa7865eb038d43ddd316cbac19,acd825182977ca73ec0eb161af9d768a0dc365b9,acd825182977ca73ec0eb161af9d768a0dc365b9,d75b02f9c80dbbbfa2855aa9e96ceec9bcd1aa4b,acd825182977ca73ec0eb161af9d768a0dc365b9,acd825182977ca73ec0eb161af9d768a0dc365b9,acd825182977ca73ec0eb161af9d768a0dc365b9,acd825182977ca73ec0eb161af9d768a0dc365b9..7ccef342f72420a1c54a14341793a99ff59bd047
@@@@@@@@@@@@@@ -80,8 -80,8 -80,8 -80,8 -80,8 -80,8 -80,8 -80,8 -80,8 -80,8 -80,8 -80,8 -80,8 +80,8 @@@@@@@@@@@@@@ enum rdma_transport_type 
                RDMA_TRANSPORT_USNIC_UDP
             };
             
----- -------enum rdma_transport_type
----- -------rdma_node_get_transport(enum rdma_node_type node_type) __attribute_const__;
+++++ +++++++__attribute_const__ enum rdma_transport_type
+++++ +++++++rdma_node_get_transport(enum rdma_node_type node_type);
             
             enum rdma_link_layer {
                IB_LINK_LAYER_UNSPECIFIED,
              * converted to 2, since 5 Gbit/sec is 2 * 2.5 Gbit/sec.
              * @rate: rate to convert.
              */
----- -------int ib_rate_to_mult(enum ib_rate rate) __attribute_const__;
+++++ +++++++__attribute_const__ int ib_rate_to_mult(enum ib_rate rate);
             
             /**
              * ib_rate_to_mbps - Convert the IB rate enum to Mbps.
              * For example, IB_RATE_2_5_GBPS will be converted to 2500.
              * @rate: rate to convert.
              */
----- -------int ib_rate_to_mbps(enum ib_rate rate) __attribute_const__;
+++++ +++++++__attribute_const__ int ib_rate_to_mbps(enum ib_rate rate);
             
             enum ib_mr_create_flags {
                IB_MR_SIGNATURE_EN = 1,
@@@@@@@@@@@@@@ -604,7 -604,7 -604,7 -604,7 -604,7 -604,7 -604,7 -604,7 -604,7 -604,7 -604,7 -604,7 -604,7 +604,7 @@@@@@@@@@@@@@ struct ib_mr_status 
              * enum.
              * @mult: multiple to convert.
              */
----- -------enum ib_rate mult_to_ib_rate(int mult) __attribute_const__;
+++++ +++++++__attribute_const__ enum ib_rate mult_to_ib_rate(int mult);
             
             struct ib_ah_attr {
                struct ib_global_route  grh;
@@@@@@@@@@@@@@ -783,6 -783,6 -783,6 -783,6 -783,6 -783,6 -783,6 -783,6 -783,7 -783,6 -783,6 -783,6 -783,6 +783,7 @@@@@@@@@@@@@@ enum ib_qp_create_flags 
                IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK   = 1 << 1,
                IB_QP_CREATE_NETIF_QP                   = 1 << 5,
                IB_QP_CREATE_SIGNATURE_EN               = 1 << 6,
++++++++ ++++   IB_QP_CREATE_USE_GFP_NOIO               = 1 << 7,
                /* reserve bits 26-31 for low level drivers' internal use */
                IB_QP_CREATE_RESERVED_START             = 1 << 26,
                IB_QP_CREATE_RESERVED_END               = 1 << 31,
This page took 0.167332 seconds and 4 git commands to generate.