You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
Pull rdma updates from Doug Ledford: "This is a fairly plain pull request. Lots of driver updates across the stack, a huge number of static analysis cleanups including a close to 50 patch series from Bart Van Assche, and a number of new features inside the stack such as general CQ moderation support. Nothing really stands out, but there might be a few conflicts as you take things in. In particular, the cleanups touched some of the same lines as the new timer_setup changes. Everything in this pull request has been through 0day and at least two days of linux-next (since Stephen doesn't necessarily flag new errors/warnings until day2). A few more items (about 30 patches) from Intel and Mellanox showed up on the list on Tuesday. I've excluded those from this pull request, and I'm sure some of them qualify as fixes suitable to send any time, but I still have to review them fully. If they contain mostly fixes and little or no new development, then I will probably send them through by the end of the week just to get them out of the way. There was a break in my acceptance of patches which coincides with the computer problems I had, and then when I got things mostly back under control I had a backlog of patches to process, which I did mostly last Friday and Monday. So there is a larger number of patches processed in that timeframe than I was striving for. Summary: - Add iWARP support to qedr driver - Lots of misc fixes across subsystem - Multiple update series to hns roce driver - Multiple update series to hfi1 driver - Updates to vnic driver - Add kref to wait struct in cxgb4 driver - Updates to i40iw driver - Mellanox shared pull request - timer_setup changes - massive cleanup series from Bart Van Assche - Two series of SRP/SRPT changes from Bart Van Assche - Core updates from Mellanox - i40iw updates - IPoIB updates - mlx5 updates - mlx4 updates - hns updates - bnxt_re fixes - PCI write padding support - Sparse/Smatch/warning cleanups/fixes - CQ moderation support - SRQ support in vmw_pvrdma" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: (296 commits) RDMA/core: Rename kernel modify_cq to better describe its usage IB/mlx5: Add CQ moderation capability to query_device IB/mlx4: Add CQ moderation capability to query_device IB/uverbs: Add CQ moderation capability to query_device IB/mlx5: Exposing modify CQ callback to uverbs layer IB/mlx4: Exposing modify CQ callback to uverbs layer IB/uverbs: Allow CQ moderation with modify CQ iw_cxgb4: atomically flush the qp iw_cxgb4: only call the cq comp_handler when the cq is armed iw_cxgb4: Fix possible circular dependency locking warning RDMA/bnxt_re: report vlan_id and sl in qp1 recv completion IB/core: Only maintain real QPs in the security lists IB/ocrdma_hw: remove unnecessary code in ocrdma_mbx_dealloc_lkey RDMA/core: Make function rdma_copy_addr return void RDMA/vmw_pvrdma: Add shared receive queue support RDMA/core: avoid uninitialized variable warning in create_udata RDMA/bnxt_re: synchronize poll_cq and req_notify_cq verbs RDMA/bnxt_re: Flush CQ notification Work Queue before destroying QP RDMA/bnxt_re: Set QP state in case of response completion errors RDMA/bnxt_re: Add memory barriers when processing CQ/EQ entries ...
This commit is contained in:
+1
-2
@@ -6805,8 +6805,6 @@ F: drivers/ipack/
|
||||
|
||||
INFINIBAND SUBSYSTEM
|
||||
M: Doug Ledford <dledford@redhat.com>
|
||||
M: Sean Hefty <sean.hefty@intel.com>
|
||||
M: Hal Rosenstock <hal.rosenstock@gmail.com>
|
||||
L: linux-rdma@vger.kernel.org
|
||||
W: http://www.openfabrics.org/
|
||||
Q: http://patchwork.kernel.org/project/linux-rdma/list/
|
||||
@@ -11116,6 +11114,7 @@ F: drivers/net/ethernet/qlogic/qede/
|
||||
|
||||
QLOGIC QL4xxx RDMA DRIVER
|
||||
M: Ram Amrani <Ram.Amrani@cavium.com>
|
||||
M: Michal Kalderon <Michal.Kalderon@cavium.com>
|
||||
M: Ariel Elior <Ariel.Elior@cavium.com>
|
||||
L: linux-rdma@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
menuconfig INFINIBAND
|
||||
tristate "InfiniBand support"
|
||||
depends on PCI || BROKEN
|
||||
depends on HAS_IOMEM
|
||||
depends on NET
|
||||
depends on INET
|
||||
@@ -46,6 +45,7 @@ config INFINIBAND_EXP_USER_ACCESS
|
||||
config INFINIBAND_USER_MEM
|
||||
bool
|
||||
depends on INFINIBAND_USER_ACCESS != n
|
||||
depends on MMU
|
||||
default y
|
||||
|
||||
config INFINIBAND_ON_DEMAND_PAGING
|
||||
|
||||
@@ -15,7 +15,7 @@ ib_core-y := packer.o ud_header.o verbs.o cq.o rw.o sysfs.o \
|
||||
security.o nldev.o
|
||||
|
||||
ib_core-$(CONFIG_INFINIBAND_USER_MEM) += umem.o
|
||||
ib_core-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) += umem_odp.o umem_rbtree.o
|
||||
ib_core-$(CONFIG_INFINIBAND_ON_DEMAND_PAGING) += umem_odp.o
|
||||
ib_core-$(CONFIG_CGROUP_RDMA) += cgroup.o
|
||||
|
||||
ib_cm-y := cm.o
|
||||
|
||||
@@ -229,8 +229,9 @@ void rdma_addr_unregister_client(struct rdma_addr_client *client)
|
||||
}
|
||||
EXPORT_SYMBOL(rdma_addr_unregister_client);
|
||||
|
||||
int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct net_device *dev,
|
||||
const unsigned char *dst_dev_addr)
|
||||
void rdma_copy_addr(struct rdma_dev_addr *dev_addr,
|
||||
const struct net_device *dev,
|
||||
const unsigned char *dst_dev_addr)
|
||||
{
|
||||
dev_addr->dev_type = dev->type;
|
||||
memcpy(dev_addr->src_dev_addr, dev->dev_addr, MAX_ADDR_LEN);
|
||||
@@ -238,7 +239,6 @@ int rdma_copy_addr(struct rdma_dev_addr *dev_addr, struct net_device *dev,
|
||||
if (dst_dev_addr)
|
||||
memcpy(dev_addr->dst_dev_addr, dst_dev_addr, MAX_ADDR_LEN);
|
||||
dev_addr->bound_dev_if = dev->ifindex;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(rdma_copy_addr);
|
||||
|
||||
@@ -247,15 +247,14 @@ int rdma_translate_ip(const struct sockaddr *addr,
|
||||
u16 *vlan_id)
|
||||
{
|
||||
struct net_device *dev;
|
||||
int ret = -EADDRNOTAVAIL;
|
||||
|
||||
if (dev_addr->bound_dev_if) {
|
||||
dev = dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if);
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
ret = rdma_copy_addr(dev_addr, dev, NULL);
|
||||
rdma_copy_addr(dev_addr, dev, NULL);
|
||||
dev_put(dev);
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (addr->sa_family) {
|
||||
@@ -264,9 +263,9 @@ int rdma_translate_ip(const struct sockaddr *addr,
|
||||
((const struct sockaddr_in *)addr)->sin_addr.s_addr);
|
||||
|
||||
if (!dev)
|
||||
return ret;
|
||||
return -EADDRNOTAVAIL;
|
||||
|
||||
ret = rdma_copy_addr(dev_addr, dev, NULL);
|
||||
rdma_copy_addr(dev_addr, dev, NULL);
|
||||
dev_addr->bound_dev_if = dev->ifindex;
|
||||
if (vlan_id)
|
||||
*vlan_id = rdma_vlan_dev_vlan_id(dev);
|
||||
@@ -279,7 +278,7 @@ int rdma_translate_ip(const struct sockaddr *addr,
|
||||
if (ipv6_chk_addr(dev_addr->net,
|
||||
&((const struct sockaddr_in6 *)addr)->sin6_addr,
|
||||
dev, 1)) {
|
||||
ret = rdma_copy_addr(dev_addr, dev, NULL);
|
||||
rdma_copy_addr(dev_addr, dev, NULL);
|
||||
dev_addr->bound_dev_if = dev->ifindex;
|
||||
if (vlan_id)
|
||||
*vlan_id = rdma_vlan_dev_vlan_id(dev);
|
||||
@@ -290,7 +289,7 @@ int rdma_translate_ip(const struct sockaddr *addr,
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(rdma_translate_ip);
|
||||
|
||||
@@ -336,7 +335,7 @@ static int dst_fetch_ha(struct dst_entry *dst, struct rdma_dev_addr *dev_addr,
|
||||
const void *daddr)
|
||||
{
|
||||
struct neighbour *n;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
n = dst_neigh_lookup(dst, daddr);
|
||||
|
||||
@@ -346,7 +345,7 @@ static int dst_fetch_ha(struct dst_entry *dst, struct rdma_dev_addr *dev_addr,
|
||||
neigh_event_send(n, NULL);
|
||||
ret = -ENODATA;
|
||||
} else {
|
||||
ret = rdma_copy_addr(dev_addr, dst->dev, n->ha);
|
||||
rdma_copy_addr(dev_addr, dst->dev, n->ha);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
@@ -494,7 +493,9 @@ static int addr_resolve_neigh(struct dst_entry *dst,
|
||||
if (!(dst->dev->flags & IFF_NOARP))
|
||||
return fetch_ha(dst, addr, dst_in, seq);
|
||||
|
||||
return rdma_copy_addr(addr, dst->dev, NULL);
|
||||
rdma_copy_addr(addr, dst->dev, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int addr_resolve(struct sockaddr *src_in,
|
||||
@@ -852,7 +853,7 @@ static struct notifier_block nb = {
|
||||
|
||||
int addr_init(void)
|
||||
{
|
||||
addr_wq = alloc_ordered_workqueue("ib_addr", WQ_MEM_RECLAIM);
|
||||
addr_wq = alloc_ordered_workqueue("ib_addr", 0);
|
||||
if (!addr_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
@@ -1472,31 +1472,29 @@ static void cm_format_path_lid_from_req(struct cm_req_msg *req_msg,
|
||||
|
||||
if (primary_path->rec_type != SA_PATH_REC_TYPE_OPA) {
|
||||
sa_path_set_dlid(primary_path,
|
||||
htonl(ntohs(req_msg->primary_local_lid)));
|
||||
ntohs(req_msg->primary_local_lid));
|
||||
sa_path_set_slid(primary_path,
|
||||
htonl(ntohs(req_msg->primary_remote_lid)));
|
||||
ntohs(req_msg->primary_remote_lid));
|
||||
} else {
|
||||
lid = opa_get_lid_from_gid(&req_msg->primary_local_gid);
|
||||
sa_path_set_dlid(primary_path, cpu_to_be32(lid));
|
||||
sa_path_set_dlid(primary_path, lid);
|
||||
|
||||
lid = opa_get_lid_from_gid(&req_msg->primary_remote_gid);
|
||||
sa_path_set_slid(primary_path, cpu_to_be32(lid));
|
||||
sa_path_set_slid(primary_path, lid);
|
||||
}
|
||||
|
||||
if (!cm_req_has_alt_path(req_msg))
|
||||
return;
|
||||
|
||||
if (alt_path->rec_type != SA_PATH_REC_TYPE_OPA) {
|
||||
sa_path_set_dlid(alt_path,
|
||||
htonl(ntohs(req_msg->alt_local_lid)));
|
||||
sa_path_set_slid(alt_path,
|
||||
htonl(ntohs(req_msg->alt_remote_lid)));
|
||||
sa_path_set_dlid(alt_path, ntohs(req_msg->alt_local_lid));
|
||||
sa_path_set_slid(alt_path, ntohs(req_msg->alt_remote_lid));
|
||||
} else {
|
||||
lid = opa_get_lid_from_gid(&req_msg->alt_local_gid);
|
||||
sa_path_set_dlid(alt_path, cpu_to_be32(lid));
|
||||
sa_path_set_dlid(alt_path, lid);
|
||||
|
||||
lid = opa_get_lid_from_gid(&req_msg->alt_remote_gid);
|
||||
sa_path_set_slid(alt_path, cpu_to_be32(lid));
|
||||
sa_path_set_slid(alt_path, lid);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1575,7 +1573,7 @@ static void cm_format_req_event(struct cm_work *work,
|
||||
param->bth_pkey = cm_get_bth_pkey(work);
|
||||
param->port = cm_id_priv->av.port->port_num;
|
||||
param->primary_path = &work->path[0];
|
||||
if (req_msg->alt_local_lid)
|
||||
if (cm_req_has_alt_path(req_msg))
|
||||
param->alternate_path = &work->path[1];
|
||||
else
|
||||
param->alternate_path = NULL;
|
||||
@@ -1856,7 +1854,8 @@ static int cm_req_handler(struct cm_work *work)
|
||||
cm_process_routed_req(req_msg, work->mad_recv_wc->wc);
|
||||
|
||||
memset(&work->path[0], 0, sizeof(work->path[0]));
|
||||
memset(&work->path[1], 0, sizeof(work->path[1]));
|
||||
if (cm_req_has_alt_path(req_msg))
|
||||
memset(&work->path[1], 0, sizeof(work->path[1]));
|
||||
grh = rdma_ah_read_grh(&cm_id_priv->av.ah_attr);
|
||||
ret = ib_get_cached_gid(work->port->cm_dev->ib_device,
|
||||
work->port->port_num,
|
||||
@@ -2810,6 +2809,7 @@ int ib_send_cm_mra(struct ib_cm_id *cm_id,
|
||||
msg_response = CM_MSG_RESPONSE_OTHER;
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
goto error1;
|
||||
@@ -3037,14 +3037,14 @@ static void cm_format_path_lid_from_lap(struct cm_lap_msg *lap_msg,
|
||||
u32 lid;
|
||||
|
||||
if (path->rec_type != SA_PATH_REC_TYPE_OPA) {
|
||||
sa_path_set_dlid(path, htonl(ntohs(lap_msg->alt_local_lid)));
|
||||
sa_path_set_slid(path, htonl(ntohs(lap_msg->alt_remote_lid)));
|
||||
sa_path_set_dlid(path, ntohs(lap_msg->alt_local_lid));
|
||||
sa_path_set_slid(path, ntohs(lap_msg->alt_remote_lid));
|
||||
} else {
|
||||
lid = opa_get_lid_from_gid(&lap_msg->alt_local_gid);
|
||||
sa_path_set_dlid(path, cpu_to_be32(lid));
|
||||
sa_path_set_dlid(path, lid);
|
||||
|
||||
lid = opa_get_lid_from_gid(&lap_msg->alt_remote_gid);
|
||||
sa_path_set_slid(path, cpu_to_be32(lid));
|
||||
sa_path_set_slid(path, lid);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3817,14 +3817,16 @@ static void cm_recv_handler(struct ib_mad_agent *mad_agent,
|
||||
struct cm_port *port = mad_agent->context;
|
||||
struct cm_work *work;
|
||||
enum ib_cm_event_type event;
|
||||
bool alt_path = false;
|
||||
u16 attr_id;
|
||||
int paths = 0;
|
||||
int going_down = 0;
|
||||
|
||||
switch (mad_recv_wc->recv_buf.mad->mad_hdr.attr_id) {
|
||||
case CM_REQ_ATTR_ID:
|
||||
paths = 1 + (((struct cm_req_msg *) mad_recv_wc->recv_buf.mad)->
|
||||
alt_local_lid != 0);
|
||||
alt_path = cm_req_has_alt_path((struct cm_req_msg *)
|
||||
mad_recv_wc->recv_buf.mad);
|
||||
paths = 1 + (alt_path != 0);
|
||||
event = IB_CM_REQ_RECEIVED;
|
||||
break;
|
||||
case CM_MRA_ATTR_ID:
|
||||
|
||||
@@ -1540,7 +1540,7 @@ static struct rdma_id_private *cma_id_from_event(struct ib_cm_id *cm_id,
|
||||
return id_priv;
|
||||
}
|
||||
|
||||
static inline int cma_user_data_offset(struct rdma_id_private *id_priv)
|
||||
static inline u8 cma_user_data_offset(struct rdma_id_private *id_priv)
|
||||
{
|
||||
return cma_family(id_priv) == AF_IB ? 0 : sizeof(struct cma_hdr);
|
||||
}
|
||||
@@ -1846,9 +1846,7 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
|
||||
rt->path_rec[1] = *ib_event->param.req_rcvd.alternate_path;
|
||||
|
||||
if (net_dev) {
|
||||
ret = rdma_copy_addr(&rt->addr.dev_addr, net_dev, NULL);
|
||||
if (ret)
|
||||
goto err;
|
||||
rdma_copy_addr(&rt->addr.dev_addr, net_dev, NULL);
|
||||
} else {
|
||||
if (!cma_protocol_roce(listen_id) &&
|
||||
cma_any_addr(cma_src_addr(id_priv))) {
|
||||
@@ -1894,9 +1892,7 @@ static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
|
||||
goto err;
|
||||
|
||||
if (net_dev) {
|
||||
ret = rdma_copy_addr(&id->route.addr.dev_addr, net_dev, NULL);
|
||||
if (ret)
|
||||
goto err;
|
||||
rdma_copy_addr(&id->route.addr.dev_addr, net_dev, NULL);
|
||||
} else {
|
||||
if (!cma_any_addr(cma_src_addr(id_priv))) {
|
||||
ret = cma_translate_addr(cma_src_addr(id_priv),
|
||||
@@ -1942,7 +1938,8 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
|
||||
struct rdma_id_private *listen_id, *conn_id = NULL;
|
||||
struct rdma_cm_event event;
|
||||
struct net_device *net_dev;
|
||||
int offset, ret;
|
||||
u8 offset;
|
||||
int ret;
|
||||
|
||||
listen_id = cma_id_from_event(cm_id, ib_event, &net_dev);
|
||||
if (IS_ERR(listen_id))
|
||||
@@ -3440,7 +3437,8 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
|
||||
struct ib_cm_sidr_req_param req;
|
||||
struct ib_cm_id *id;
|
||||
void *private_data;
|
||||
int offset, ret;
|
||||
u8 offset;
|
||||
int ret;
|
||||
|
||||
memset(&req, 0, sizeof req);
|
||||
offset = cma_user_data_offset(id_priv);
|
||||
@@ -3497,7 +3495,8 @@ static int cma_connect_ib(struct rdma_id_private *id_priv,
|
||||
struct rdma_route *route;
|
||||
void *private_data;
|
||||
struct ib_cm_id *id;
|
||||
int offset, ret;
|
||||
u8 offset;
|
||||
int ret;
|
||||
|
||||
memset(&req, 0, sizeof req);
|
||||
offset = cma_user_data_offset(id_priv);
|
||||
|
||||
@@ -447,9 +447,6 @@ static void destroy_cm_id(struct iw_cm_id *cm_id)
|
||||
*/
|
||||
void iw_destroy_cm_id(struct iw_cm_id *cm_id)
|
||||
{
|
||||
struct iwcm_id_private *cm_id_priv;
|
||||
|
||||
cm_id_priv = container_of(cm_id, struct iwcm_id_private, id);
|
||||
destroy_cm_id(cm_id);
|
||||
}
|
||||
EXPORT_SYMBOL(iw_destroy_cm_id);
|
||||
|
||||
@@ -1974,14 +1974,15 @@ static void ib_mad_complete_recv(struct ib_mad_agent_private *mad_agent_priv,
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
INIT_LIST_HEAD(&mad_recv_wc->rmpp_list);
|
||||
ret = ib_mad_enforce_security(mad_agent_priv,
|
||||
mad_recv_wc->wc->pkey_index);
|
||||
if (ret) {
|
||||
ib_free_recv_mad(mad_recv_wc);
|
||||
deref_mad_agent(mad_agent_priv);
|
||||
return;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&mad_recv_wc->rmpp_list);
|
||||
list_add(&mad_recv_wc->recv_buf.list, &mad_recv_wc->rmpp_list);
|
||||
if (ib_mad_kernel_rmpp_agent(&mad_agent_priv->agent)) {
|
||||
mad_recv_wc = ib_process_rmpp_recv_wc(mad_agent_priv,
|
||||
|
||||
@@ -384,21 +384,17 @@ int rdma_rw_ctx_signature_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp,
|
||||
count += ret;
|
||||
prev_wr = &ctx->sig->data.reg_wr.wr;
|
||||
|
||||
if (prot_sg_cnt) {
|
||||
ret = rdma_rw_init_one_mr(qp, port_num, &ctx->sig->prot,
|
||||
prot_sg, prot_sg_cnt, 0);
|
||||
if (ret < 0)
|
||||
goto out_destroy_data_mr;
|
||||
count += ret;
|
||||
ret = rdma_rw_init_one_mr(qp, port_num, &ctx->sig->prot,
|
||||
prot_sg, prot_sg_cnt, 0);
|
||||
if (ret < 0)
|
||||
goto out_destroy_data_mr;
|
||||
count += ret;
|
||||
|
||||
if (ctx->sig->prot.inv_wr.next)
|
||||
prev_wr->next = &ctx->sig->prot.inv_wr;
|
||||
else
|
||||
prev_wr->next = &ctx->sig->prot.reg_wr.wr;
|
||||
prev_wr = &ctx->sig->prot.reg_wr.wr;
|
||||
} else {
|
||||
ctx->sig->prot.mr = NULL;
|
||||
}
|
||||
if (ctx->sig->prot.inv_wr.next)
|
||||
prev_wr->next = &ctx->sig->prot.inv_wr;
|
||||
else
|
||||
prev_wr->next = &ctx->sig->prot.reg_wr.wr;
|
||||
prev_wr = &ctx->sig->prot.reg_wr.wr;
|
||||
|
||||
ctx->sig->sig_mr = ib_mr_pool_get(qp, &qp->sig_mrs);
|
||||
if (!ctx->sig->sig_mr) {
|
||||
|
||||
@@ -87,16 +87,14 @@ static int enforce_qp_pkey_security(u16 pkey,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (qp_sec->qp == qp_sec->qp->real_qp) {
|
||||
list_for_each_entry(shared_qp_sec,
|
||||
&qp_sec->shared_qp_list,
|
||||
shared_qp_list) {
|
||||
ret = security_ib_pkey_access(shared_qp_sec->security,
|
||||
subnet_prefix,
|
||||
pkey);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
list_for_each_entry(shared_qp_sec,
|
||||
&qp_sec->shared_qp_list,
|
||||
shared_qp_list) {
|
||||
ret = security_ib_pkey_access(shared_qp_sec->security,
|
||||
subnet_prefix,
|
||||
pkey);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -560,15 +558,22 @@ int ib_security_modify_qp(struct ib_qp *qp,
|
||||
int ret = 0;
|
||||
struct ib_ports_pkeys *tmp_pps;
|
||||
struct ib_ports_pkeys *new_pps;
|
||||
bool special_qp = (qp->qp_type == IB_QPT_SMI ||
|
||||
qp->qp_type == IB_QPT_GSI ||
|
||||
qp->qp_type >= IB_QPT_RESERVED1);
|
||||
struct ib_qp *real_qp = qp->real_qp;
|
||||
bool special_qp = (real_qp->qp_type == IB_QPT_SMI ||
|
||||
real_qp->qp_type == IB_QPT_GSI ||
|
||||
real_qp->qp_type >= IB_QPT_RESERVED1);
|
||||
bool pps_change = ((qp_attr_mask & (IB_QP_PKEY_INDEX | IB_QP_PORT)) ||
|
||||
(qp_attr_mask & IB_QP_ALT_PATH));
|
||||
|
||||
/* The port/pkey settings are maintained only for the real QP. Open
|
||||
* handles on the real QP will be in the shared_qp_list. When
|
||||
* enforcing security on the real QP all the shared QPs will be
|
||||
* checked as well.
|
||||
*/
|
||||
|
||||
if (pps_change && !special_qp) {
|
||||
mutex_lock(&qp->qp_sec->mutex);
|
||||
new_pps = get_new_pps(qp,
|
||||
mutex_lock(&real_qp->qp_sec->mutex);
|
||||
new_pps = get_new_pps(real_qp,
|
||||
qp_attr,
|
||||
qp_attr_mask);
|
||||
|
||||
@@ -586,14 +591,14 @@ int ib_security_modify_qp(struct ib_qp *qp,
|
||||
|
||||
if (!ret)
|
||||
ret = check_qp_port_pkey_settings(new_pps,
|
||||
qp->qp_sec);
|
||||
real_qp->qp_sec);
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
ret = qp->device->modify_qp(qp->real_qp,
|
||||
qp_attr,
|
||||
qp_attr_mask,
|
||||
udata);
|
||||
ret = real_qp->device->modify_qp(real_qp,
|
||||
qp_attr,
|
||||
qp_attr_mask,
|
||||
udata);
|
||||
|
||||
if (pps_change && !special_qp) {
|
||||
/* Clean up the lists and free the appropriate
|
||||
@@ -602,8 +607,8 @@ int ib_security_modify_qp(struct ib_qp *qp,
|
||||
if (ret) {
|
||||
tmp_pps = new_pps;
|
||||
} else {
|
||||
tmp_pps = qp->qp_sec->ports_pkeys;
|
||||
qp->qp_sec->ports_pkeys = new_pps;
|
||||
tmp_pps = real_qp->qp_sec->ports_pkeys;
|
||||
real_qp->qp_sec->ports_pkeys = new_pps;
|
||||
}
|
||||
|
||||
if (tmp_pps) {
|
||||
@@ -611,7 +616,7 @@ int ib_security_modify_qp(struct ib_qp *qp,
|
||||
port_pkey_list_remove(&tmp_pps->alt);
|
||||
}
|
||||
kfree(tmp_pps);
|
||||
mutex_unlock(&qp->qp_sec->mutex);
|
||||
mutex_unlock(&real_qp->qp_sec->mutex);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -692,20 +697,13 @@ void ib_mad_agent_security_cleanup(struct ib_mad_agent *agent)
|
||||
|
||||
int ib_mad_enforce_security(struct ib_mad_agent_private *map, u16 pkey_index)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (map->agent.qp->qp_type == IB_QPT_SMI && !map->agent.smp_allowed)
|
||||
return -EACCES;
|
||||
|
||||
ret = ib_security_pkey_access(map->agent.device,
|
||||
map->agent.port_num,
|
||||
pkey_index,
|
||||
map->agent.security);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
return ib_security_pkey_access(map->agent.device,
|
||||
map->agent.port_num,
|
||||
pkey_index,
|
||||
map->agent.security);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SECURITY_INFINIBAND */
|
||||
|
||||
@@ -108,8 +108,22 @@ static ssize_t port_attr_show(struct kobject *kobj,
|
||||
return port_attr->show(p, port_attr, buf);
|
||||
}
|
||||
|
||||
static ssize_t port_attr_store(struct kobject *kobj,
|
||||
struct attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct port_attribute *port_attr =
|
||||
container_of(attr, struct port_attribute, attr);
|
||||
struct ib_port *p = container_of(kobj, struct ib_port, kobj);
|
||||
|
||||
if (!port_attr->store)
|
||||
return -EIO;
|
||||
return port_attr->store(p, port_attr, buf, count);
|
||||
}
|
||||
|
||||
static const struct sysfs_ops port_sysfs_ops = {
|
||||
.show = port_attr_show
|
||||
.show = port_attr_show,
|
||||
.store = port_attr_store
|
||||
};
|
||||
|
||||
static ssize_t gid_attr_show(struct kobject *kobj,
|
||||
|
||||
@@ -39,11 +39,44 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/interval_tree_generic.h>
|
||||
|
||||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/ib_umem.h>
|
||||
#include <rdma/ib_umem_odp.h>
|
||||
|
||||
/*
|
||||
* The ib_umem list keeps track of memory regions for which the HW
|
||||
* device request to receive notification when the related memory
|
||||
* mapping is changed.
|
||||
*
|
||||
* ib_umem_lock protects the list.
|
||||
*/
|
||||
|
||||
static u64 node_start(struct umem_odp_node *n)
|
||||
{
|
||||
struct ib_umem_odp *umem_odp =
|
||||
container_of(n, struct ib_umem_odp, interval_tree);
|
||||
|
||||
return ib_umem_start(umem_odp->umem);
|
||||
}
|
||||
|
||||
/* Note that the representation of the intervals in the interval tree
|
||||
* considers the ending point as contained in the interval, while the
|
||||
* function ib_umem_end returns the first address which is not contained
|
||||
* in the umem.
|
||||
*/
|
||||
static u64 node_last(struct umem_odp_node *n)
|
||||
{
|
||||
struct ib_umem_odp *umem_odp =
|
||||
container_of(n, struct ib_umem_odp, interval_tree);
|
||||
|
||||
return ib_umem_end(umem_odp->umem) - 1;
|
||||
}
|
||||
|
||||
INTERVAL_TREE_DEFINE(struct umem_odp_node, rb, u64, __subtree_last,
|
||||
node_start, node_last, static, rbt_ib_umem)
|
||||
|
||||
static void ib_umem_notifier_start_account(struct ib_umem *item)
|
||||
{
|
||||
mutex_lock(&item->odp_data->umem_mutex);
|
||||
@@ -754,3 +787,42 @@ void ib_umem_odp_unmap_dma_pages(struct ib_umem *umem, u64 virt,
|
||||
mutex_unlock(&umem->odp_data->umem_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(ib_umem_odp_unmap_dma_pages);
|
||||
|
||||
/* @last is not a part of the interval. See comment for function
|
||||
* node_last.
|
||||
*/
|
||||
int rbt_ib_umem_for_each_in_range(struct rb_root_cached *root,
|
||||
u64 start, u64 last,
|
||||
umem_call_back cb,
|
||||
void *cookie)
|
||||
{
|
||||
int ret_val = 0;
|
||||
struct umem_odp_node *node, *next;
|
||||
struct ib_umem_odp *umem;
|
||||
|
||||
if (unlikely(start == last))
|
||||
return ret_val;
|
||||
|
||||
for (node = rbt_ib_umem_iter_first(root, start, last - 1);
|
||||
node; node = next) {
|
||||
next = rbt_ib_umem_iter_next(node, start, last - 1);
|
||||
umem = container_of(node, struct ib_umem_odp, interval_tree);
|
||||
ret_val = cb(umem->umem, start, last, cookie) || ret_val;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
EXPORT_SYMBOL(rbt_ib_umem_for_each_in_range);
|
||||
|
||||
struct ib_umem_odp *rbt_ib_umem_lookup(struct rb_root_cached *root,
|
||||
u64 addr, u64 length)
|
||||
{
|
||||
struct umem_odp_node *node;
|
||||
|
||||
node = rbt_ib_umem_iter_first(root, addr, addr + length - 1);
|
||||
if (node)
|
||||
return container_of(node, struct ib_umem_odp, interval_tree);
|
||||
return NULL;
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(rbt_ib_umem_lookup);
|
||||
|
||||
@@ -1,109 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2014 Mellanox Technologies. 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
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interval_tree_generic.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <rdma/ib_umem_odp.h>
|
||||
|
||||
/*
|
||||
* The ib_umem list keeps track of memory regions for which the HW
|
||||
* device request to receive notification when the related memory
|
||||
* mapping is changed.
|
||||
*
|
||||
* ib_umem_lock protects the list.
|
||||
*/
|
||||
|
||||
static inline u64 node_start(struct umem_odp_node *n)
|
||||
{
|
||||
struct ib_umem_odp *umem_odp =
|
||||
container_of(n, struct ib_umem_odp, interval_tree);
|
||||
|
||||
return ib_umem_start(umem_odp->umem);
|
||||
}
|
||||
|
||||
/* Note that the representation of the intervals in the interval tree
|
||||
* considers the ending point as contained in the interval, while the
|
||||
* function ib_umem_end returns the first address which is not contained
|
||||
* in the umem.
|
||||
*/
|
||||
static inline u64 node_last(struct umem_odp_node *n)
|
||||
{
|
||||
struct ib_umem_odp *umem_odp =
|
||||
container_of(n, struct ib_umem_odp, interval_tree);
|
||||
|
||||
return ib_umem_end(umem_odp->umem) - 1;
|
||||
}
|
||||
|
||||
INTERVAL_TREE_DEFINE(struct umem_odp_node, rb, u64, __subtree_last,
|
||||
node_start, node_last, , rbt_ib_umem)
|
||||
|
||||
/* @last is not a part of the interval. See comment for function
|
||||
* node_last.
|
||||
*/
|
||||
int rbt_ib_umem_for_each_in_range(struct rb_root_cached *root,
|
||||
u64 start, u64 last,
|
||||
umem_call_back cb,
|
||||
void *cookie)
|
||||
{
|
||||
int ret_val = 0;
|
||||
struct umem_odp_node *node, *next;
|
||||
struct ib_umem_odp *umem;
|
||||
|
||||
if (unlikely(start == last))
|
||||
return ret_val;
|
||||
|
||||
for (node = rbt_ib_umem_iter_first(root, start, last - 1);
|
||||
node; node = next) {
|
||||
next = rbt_ib_umem_iter_next(node, start, last - 1);
|
||||
umem = container_of(node, struct ib_umem_odp, interval_tree);
|
||||
ret_val = cb(umem->umem, start, last, cookie) || ret_val;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
EXPORT_SYMBOL(rbt_ib_umem_for_each_in_range);
|
||||
|
||||
struct ib_umem_odp *rbt_ib_umem_lookup(struct rb_root_cached *root,
|
||||
u64 addr, u64 length)
|
||||
{
|
||||
struct umem_odp_node *node;
|
||||
|
||||
node = rbt_ib_umem_iter_first(root, addr, addr + length - 1);
|
||||
if (node)
|
||||
return container_of(node, struct ib_umem_odp, interval_tree);
|
||||
return NULL;
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(rbt_ib_umem_lookup);
|
||||
@@ -229,7 +229,16 @@ static void recv_handler(struct ib_mad_agent *agent,
|
||||
packet->mad.hdr.status = 0;
|
||||
packet->mad.hdr.length = hdr_size(file) + mad_recv_wc->mad_len;
|
||||
packet->mad.hdr.qpn = cpu_to_be32(mad_recv_wc->wc->src_qp);
|
||||
packet->mad.hdr.lid = ib_lid_be16(mad_recv_wc->wc->slid);
|
||||
/*
|
||||
* On OPA devices it is okay to lose the upper 16 bits of LID as this
|
||||
* information is obtained elsewhere. Mask off the upper 16 bits.
|
||||
*/
|
||||
if (agent->device->port_immutable[agent->port_num].core_cap_flags &
|
||||
RDMA_CORE_PORT_INTEL_OPA)
|
||||
packet->mad.hdr.lid = ib_lid_be16(0xFFFF &
|
||||
mad_recv_wc->wc->slid);
|
||||
else
|
||||
packet->mad.hdr.lid = ib_lid_be16(mad_recv_wc->wc->slid);
|
||||
packet->mad.hdr.sl = mad_recv_wc->wc->sl;
|
||||
packet->mad.hdr.path_bits = mad_recv_wc->wc->dlid_path_bits;
|
||||
packet->mad.hdr.pkey_index = mad_recv_wc->wc->pkey_index;
|
||||
@@ -506,7 +515,7 @@ static ssize_t ib_umad_write(struct file *filp, const char __user *buf,
|
||||
rdma_ah_set_dgid_raw(&ah_attr, packet->mad.hdr.gid);
|
||||
}
|
||||
|
||||
ah = rdma_create_ah(agent->qp->pd, &ah_attr);
|
||||
ah = rdma_create_user_ah(agent->qp->pd, &ah_attr, NULL);
|
||||
if (IS_ERR(ah)) {
|
||||
ret = PTR_ERR(ah);
|
||||
goto err_up;
|
||||
|
||||
@@ -47,21 +47,28 @@
|
||||
#include <rdma/ib_umem.h>
|
||||
#include <rdma/ib_user_verbs.h>
|
||||
|
||||
#define INIT_UDATA(udata, ibuf, obuf, ilen, olen) \
|
||||
do { \
|
||||
(udata)->inbuf = (const void __user *) (ibuf); \
|
||||
(udata)->outbuf = (void __user *) (obuf); \
|
||||
(udata)->inlen = (ilen); \
|
||||
(udata)->outlen = (olen); \
|
||||
} while (0)
|
||||
static inline void
|
||||
ib_uverbs_init_udata(struct ib_udata *udata,
|
||||
const void __user *ibuf,
|
||||
void __user *obuf,
|
||||
size_t ilen, size_t olen)
|
||||
{
|
||||
udata->inbuf = ibuf;
|
||||
udata->outbuf = obuf;
|
||||
udata->inlen = ilen;
|
||||
udata->outlen = olen;
|
||||
}
|
||||
|
||||
#define INIT_UDATA_BUF_OR_NULL(udata, ibuf, obuf, ilen, olen) \
|
||||
do { \
|
||||
(udata)->inbuf = (ilen) ? (const void __user *) (ibuf) : NULL; \
|
||||
(udata)->outbuf = (olen) ? (void __user *) (obuf) : NULL; \
|
||||
(udata)->inlen = (ilen); \
|
||||
(udata)->outlen = (olen); \
|
||||
} while (0)
|
||||
static inline void
|
||||
ib_uverbs_init_udata_buf_or_null(struct ib_udata *udata,
|
||||
const void __user *ibuf,
|
||||
void __user *obuf,
|
||||
size_t ilen, size_t olen)
|
||||
{
|
||||
ib_uverbs_init_udata(udata,
|
||||
ilen ? ibuf : NULL, olen ? obuf : NULL,
|
||||
ilen, olen);
|
||||
}
|
||||
|
||||
/*
|
||||
* Our lifetime rules for these structs are the following:
|
||||
@@ -299,5 +306,6 @@ IB_UVERBS_DECLARE_EX_CMD(destroy_wq);
|
||||
IB_UVERBS_DECLARE_EX_CMD(create_rwq_ind_table);
|
||||
IB_UVERBS_DECLARE_EX_CMD(destroy_rwq_ind_table);
|
||||
IB_UVERBS_DECLARE_EX_CMD(modify_qp);
|
||||
IB_UVERBS_DECLARE_EX_CMD(modify_cq);
|
||||
|
||||
#endif /* UVERBS_H */
|
||||
|
||||
@@ -91,8 +91,8 @@ ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file,
|
||||
goto err;
|
||||
}
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long) cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -141,8 +141,7 @@ ssize_t ib_uverbs_get_context(struct ib_uverbs_file *file,
|
||||
goto err_fd;
|
||||
}
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp)) {
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp)) {
|
||||
ret = -EFAULT;
|
||||
goto err_file;
|
||||
}
|
||||
@@ -238,8 +237,7 @@ ssize_t ib_uverbs_query_device(struct ib_uverbs_file *file,
|
||||
memset(&resp, 0, sizeof resp);
|
||||
copy_query_dev_fields(file, ib_dev, &resp, &ib_dev->attrs);
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp))
|
||||
return -EFAULT;
|
||||
|
||||
return in_len;
|
||||
@@ -295,8 +293,7 @@ ssize_t ib_uverbs_query_port(struct ib_uverbs_file *file,
|
||||
resp.link_layer = rdma_port_get_link_layer(ib_dev,
|
||||
cmd.port_num);
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp))
|
||||
return -EFAULT;
|
||||
|
||||
return in_len;
|
||||
@@ -320,8 +317,8 @@ ssize_t ib_uverbs_alloc_pd(struct ib_uverbs_file *file,
|
||||
if (copy_from_user(&cmd, buf, sizeof cmd))
|
||||
return -EFAULT;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long) cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -344,8 +341,7 @@ ssize_t ib_uverbs_alloc_pd(struct ib_uverbs_file *file,
|
||||
memset(&resp, 0, sizeof resp);
|
||||
resp.pd_handle = uobj->id;
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp)) {
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp)) {
|
||||
ret = -EFAULT;
|
||||
goto err_copy;
|
||||
}
|
||||
@@ -490,8 +486,8 @@ ssize_t ib_uverbs_open_xrcd(struct ib_uverbs_file *file,
|
||||
if (copy_from_user(&cmd, buf, sizeof cmd))
|
||||
return -EFAULT;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long) cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -556,8 +552,7 @@ ssize_t ib_uverbs_open_xrcd(struct ib_uverbs_file *file,
|
||||
atomic_inc(&xrcd->usecnt);
|
||||
}
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp)) {
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp)) {
|
||||
ret = -EFAULT;
|
||||
goto err_copy;
|
||||
}
|
||||
@@ -655,8 +650,8 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file,
|
||||
if (copy_from_user(&cmd, buf, sizeof cmd))
|
||||
return -EFAULT;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long) cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -705,8 +700,7 @@ ssize_t ib_uverbs_reg_mr(struct ib_uverbs_file *file,
|
||||
resp.rkey = mr->rkey;
|
||||
resp.mr_handle = uobj->id;
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp)) {
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp)) {
|
||||
ret = -EFAULT;
|
||||
goto err_copy;
|
||||
}
|
||||
@@ -748,8 +742,8 @@ ssize_t ib_uverbs_rereg_mr(struct ib_uverbs_file *file,
|
||||
if (copy_from_user(&cmd, buf, sizeof(cmd)))
|
||||
return -EFAULT;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long) cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -800,8 +794,7 @@ ssize_t ib_uverbs_rereg_mr(struct ib_uverbs_file *file,
|
||||
resp.lkey = mr->lkey;
|
||||
resp.rkey = mr->rkey;
|
||||
|
||||
if (copy_to_user((void __user *)(unsigned long)cmd.response,
|
||||
&resp, sizeof(resp)))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof(resp)))
|
||||
ret = -EFAULT;
|
||||
else
|
||||
ret = in_len;
|
||||
@@ -867,8 +860,8 @@ ssize_t ib_uverbs_alloc_mw(struct ib_uverbs_file *file,
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long)cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -889,8 +882,7 @@ ssize_t ib_uverbs_alloc_mw(struct ib_uverbs_file *file,
|
||||
resp.rkey = mw->rkey;
|
||||
resp.mw_handle = uobj->id;
|
||||
|
||||
if (copy_to_user((void __user *)(unsigned long)cmd.response,
|
||||
&resp, sizeof(resp))) {
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof(resp))) {
|
||||
ret = -EFAULT;
|
||||
goto err_copy;
|
||||
}
|
||||
@@ -956,8 +948,7 @@ ssize_t ib_uverbs_create_comp_channel(struct ib_uverbs_file *file,
|
||||
uobj_file.uobj);
|
||||
ib_uverbs_init_event_queue(&ev_file->ev_queue);
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp)) {
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp)) {
|
||||
uobj_alloc_abort(uobj);
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -1087,10 +1078,11 @@ ssize_t ib_uverbs_create_cq(struct ib_uverbs_file *file,
|
||||
if (copy_from_user(&cmd, buf, sizeof(cmd)))
|
||||
return -EFAULT;
|
||||
|
||||
INIT_UDATA(&ucore, buf, (unsigned long)cmd.response, sizeof(cmd), sizeof(resp));
|
||||
ib_uverbs_init_udata(&ucore, buf, u64_to_user_ptr(cmd.response),
|
||||
sizeof(cmd), sizeof(resp));
|
||||
|
||||
INIT_UDATA(&uhw, buf + sizeof(cmd),
|
||||
(unsigned long)cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&uhw, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -1173,8 +1165,8 @@ ssize_t ib_uverbs_resize_cq(struct ib_uverbs_file *file,
|
||||
if (copy_from_user(&cmd, buf, sizeof cmd))
|
||||
return -EFAULT;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long) cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -1188,8 +1180,7 @@ ssize_t ib_uverbs_resize_cq(struct ib_uverbs_file *file,
|
||||
|
||||
resp.cqe = cq->cqe;
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp.cqe))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp.cqe))
|
||||
ret = -EFAULT;
|
||||
|
||||
out:
|
||||
@@ -1249,7 +1240,7 @@ ssize_t ib_uverbs_poll_cq(struct ib_uverbs_file *file,
|
||||
return -EINVAL;
|
||||
|
||||
/* we copy a struct ib_uverbs_poll_cq_resp to user space */
|
||||
header_ptr = (void __user *)(unsigned long) cmd.response;
|
||||
header_ptr = u64_to_user_ptr(cmd.response);
|
||||
data_ptr = header_ptr + sizeof resp;
|
||||
|
||||
memset(&resp, 0, sizeof resp);
|
||||
@@ -1343,8 +1334,7 @@ ssize_t ib_uverbs_destroy_cq(struct ib_uverbs_file *file,
|
||||
resp.async_events_reported = obj->async_events_reported;
|
||||
|
||||
uverbs_uobject_put(uobj);
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp))
|
||||
return -EFAULT;
|
||||
|
||||
return in_len;
|
||||
@@ -1501,7 +1491,8 @@ static int create_qp(struct ib_uverbs_file *file,
|
||||
IB_QP_CREATE_MANAGED_RECV |
|
||||
IB_QP_CREATE_SCATTER_FCS |
|
||||
IB_QP_CREATE_CVLAN_STRIPPING |
|
||||
IB_QP_CREATE_SOURCE_QPN)) {
|
||||
IB_QP_CREATE_SOURCE_QPN |
|
||||
IB_QP_CREATE_PCI_WRITE_END_PADDING)) {
|
||||
ret = -EINVAL;
|
||||
goto err_put;
|
||||
}
|
||||
@@ -1650,10 +1641,10 @@ ssize_t ib_uverbs_create_qp(struct ib_uverbs_file *file,
|
||||
if (copy_from_user(&cmd, buf, sizeof(cmd)))
|
||||
return -EFAULT;
|
||||
|
||||
INIT_UDATA(&ucore, buf, (unsigned long)cmd.response, sizeof(cmd),
|
||||
resp_size);
|
||||
INIT_UDATA(&uhw, buf + sizeof(cmd),
|
||||
(unsigned long)cmd.response + resp_size,
|
||||
ib_uverbs_init_udata(&ucore, buf, u64_to_user_ptr(cmd.response),
|
||||
sizeof(cmd), resp_size);
|
||||
ib_uverbs_init_udata(&uhw, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + resp_size,
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - resp_size);
|
||||
|
||||
@@ -1750,8 +1741,8 @@ ssize_t ib_uverbs_open_qp(struct ib_uverbs_file *file,
|
||||
if (copy_from_user(&cmd, buf, sizeof cmd))
|
||||
return -EFAULT;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long) cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -1795,8 +1786,7 @@ ssize_t ib_uverbs_open_qp(struct ib_uverbs_file *file,
|
||||
resp.qpn = qp->qp_num;
|
||||
resp.qp_handle = obj->uevent.uobject.id;
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp)) {
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp)) {
|
||||
ret = -EFAULT;
|
||||
goto err_destroy;
|
||||
}
|
||||
@@ -1911,8 +1901,7 @@ ssize_t ib_uverbs_query_qp(struct ib_uverbs_file *file,
|
||||
resp.max_inline_data = init_attr->cap.max_inline_data;
|
||||
resp.sq_sig_all = init_attr->sq_sig_type == IB_SIGNAL_ALL_WR;
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp))
|
||||
ret = -EFAULT;
|
||||
|
||||
out:
|
||||
@@ -2042,7 +2031,7 @@ ssize_t ib_uverbs_modify_qp(struct ib_uverbs_file *file,
|
||||
~((IB_USER_LEGACY_LAST_QP_ATTR_MASK << 1) - 1))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd.base), NULL,
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd.base), NULL,
|
||||
in_len - sizeof(cmd.base) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len);
|
||||
|
||||
@@ -2126,8 +2115,7 @@ ssize_t ib_uverbs_destroy_qp(struct ib_uverbs_file *file,
|
||||
resp.events_reported = obj->uevent.events_reported;
|
||||
uverbs_uobject_put(uobj);
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp))
|
||||
return -EFAULT;
|
||||
|
||||
return in_len;
|
||||
@@ -2311,8 +2299,7 @@ ssize_t ib_uverbs_post_send(struct ib_uverbs_file *file,
|
||||
break;
|
||||
}
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp))
|
||||
ret = -EFAULT;
|
||||
|
||||
out_put:
|
||||
@@ -2460,8 +2447,7 @@ ssize_t ib_uverbs_post_recv(struct ib_uverbs_file *file,
|
||||
}
|
||||
}
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp))
|
||||
ret = -EFAULT;
|
||||
|
||||
out:
|
||||
@@ -2510,8 +2496,7 @@ ssize_t ib_uverbs_post_srq_recv(struct ib_uverbs_file *file,
|
||||
break;
|
||||
}
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp))
|
||||
ret = -EFAULT;
|
||||
|
||||
out:
|
||||
@@ -2537,7 +2522,6 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file,
|
||||
struct rdma_ah_attr attr;
|
||||
int ret;
|
||||
struct ib_udata udata;
|
||||
u8 *dmac;
|
||||
|
||||
if (out_len < sizeof resp)
|
||||
return -ENOSPC;
|
||||
@@ -2548,8 +2532,8 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file,
|
||||
if (!rdma_is_port_valid(ib_dev, cmd.attr.port_num))
|
||||
return -EINVAL;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long)cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -2580,28 +2564,20 @@ ssize_t ib_uverbs_create_ah(struct ib_uverbs_file *file,
|
||||
} else {
|
||||
rdma_ah_set_ah_flags(&attr, 0);
|
||||
}
|
||||
dmac = rdma_ah_retrieve_dmac(&attr);
|
||||
if (dmac)
|
||||
memset(dmac, 0, ETH_ALEN);
|
||||
|
||||
ah = pd->device->create_ah(pd, &attr, &udata);
|
||||
|
||||
ah = rdma_create_user_ah(pd, &attr, &udata);
|
||||
if (IS_ERR(ah)) {
|
||||
ret = PTR_ERR(ah);
|
||||
goto err_put;
|
||||
}
|
||||
|
||||
ah->device = pd->device;
|
||||
ah->pd = pd;
|
||||
atomic_inc(&pd->usecnt);
|
||||
ah->uobject = uobj;
|
||||
uobj->user_handle = cmd.user_handle;
|
||||
uobj->object = ah;
|
||||
|
||||
resp.ah_handle = uobj->id;
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp)) {
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp)) {
|
||||
ret = -EFAULT;
|
||||
goto err_copy;
|
||||
}
|
||||
@@ -3627,8 +3603,8 @@ ssize_t ib_uverbs_create_srq(struct ib_uverbs_file *file,
|
||||
xcmd.max_sge = cmd.max_sge;
|
||||
xcmd.srq_limit = cmd.srq_limit;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long) cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -3654,8 +3630,8 @@ ssize_t ib_uverbs_create_xsrq(struct ib_uverbs_file *file,
|
||||
if (copy_from_user(&cmd, buf, sizeof cmd))
|
||||
return -EFAULT;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof(cmd),
|
||||
(unsigned long) cmd.response + sizeof(resp),
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof(cmd),
|
||||
u64_to_user_ptr(cmd.response) + sizeof(resp),
|
||||
in_len - sizeof(cmd) - sizeof(struct ib_uverbs_cmd_hdr),
|
||||
out_len - sizeof(resp));
|
||||
|
||||
@@ -3680,7 +3656,7 @@ ssize_t ib_uverbs_modify_srq(struct ib_uverbs_file *file,
|
||||
if (copy_from_user(&cmd, buf, sizeof cmd))
|
||||
return -EFAULT;
|
||||
|
||||
INIT_UDATA(&udata, buf + sizeof cmd, NULL, in_len - sizeof cmd,
|
||||
ib_uverbs_init_udata(&udata, buf + sizeof cmd, NULL, in_len - sizeof cmd,
|
||||
out_len);
|
||||
|
||||
srq = uobj_get_obj_read(srq, cmd.srq_handle, file->ucontext);
|
||||
@@ -3731,8 +3707,7 @@ ssize_t ib_uverbs_query_srq(struct ib_uverbs_file *file,
|
||||
resp.max_sge = attr.max_sge;
|
||||
resp.srq_limit = attr.srq_limit;
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response,
|
||||
&resp, sizeof resp))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof resp))
|
||||
return -EFAULT;
|
||||
|
||||
return in_len;
|
||||
@@ -3773,8 +3748,7 @@ ssize_t ib_uverbs_destroy_srq(struct ib_uverbs_file *file,
|
||||
}
|
||||
resp.events_reported = obj->events_reported;
|
||||
uverbs_uobject_put(uobj);
|
||||
if (copy_to_user((void __user *)(unsigned long)cmd.response,
|
||||
&resp, sizeof(resp)))
|
||||
if (copy_to_user(u64_to_user_ptr(cmd.response), &resp, sizeof(resp)))
|
||||
return -EFAULT;
|
||||
|
||||
return in_len;
|
||||
@@ -3878,7 +3852,58 @@ int ib_uverbs_ex_query_device(struct ib_uverbs_file *file,
|
||||
resp.tm_caps.max_sge = attr.tm_caps.max_sge;
|
||||
resp.tm_caps.flags = attr.tm_caps.flags;
|
||||
resp.response_length += sizeof(resp.tm_caps);
|
||||
|
||||
if (ucore->outlen < resp.response_length + sizeof(resp.cq_moderation_caps))
|
||||
goto end;
|
||||
|
||||
resp.cq_moderation_caps.max_cq_moderation_count =
|
||||
attr.cq_caps.max_cq_moderation_count;
|
||||
resp.cq_moderation_caps.max_cq_moderation_period =
|
||||
attr.cq_caps.max_cq_moderation_period;
|
||||
resp.response_length += sizeof(resp.cq_moderation_caps);
|
||||
end:
|
||||
err = ib_copy_to_udata(ucore, &resp, resp.response_length);
|
||||
return err;
|
||||
}
|
||||
|
||||
int ib_uverbs_ex_modify_cq(struct ib_uverbs_file *file,
|
||||
struct ib_device *ib_dev,
|
||||
struct ib_udata *ucore,
|
||||
struct ib_udata *uhw)
|
||||
{
|
||||
struct ib_uverbs_ex_modify_cq cmd = {};
|
||||
struct ib_cq *cq;
|
||||
size_t required_cmd_sz;
|
||||
int ret;
|
||||
|
||||
required_cmd_sz = offsetof(typeof(cmd), reserved) +
|
||||
sizeof(cmd.reserved);
|
||||
if (ucore->inlen < required_cmd_sz)
|
||||
return -EINVAL;
|
||||
|
||||
/* sanity checks */
|
||||
if (ucore->inlen > sizeof(cmd) &&
|
||||
!ib_is_udata_cleared(ucore, sizeof(cmd),
|
||||
ucore->inlen - sizeof(cmd)))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ret = ib_copy_from_udata(&cmd, ucore, min(sizeof(cmd), ucore->inlen));
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!cmd.attr_mask || cmd.reserved)
|
||||
return -EINVAL;
|
||||
|
||||
if (cmd.attr_mask > IB_CQ_MODERATE)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
cq = uobj_get_obj_read(cq, cmd.cq_handle, file->ucontext);
|
||||
if (!cq)
|
||||
return -EINVAL;
|
||||
|
||||
ret = rdma_set_cq_moderation(cq, cmd.attr.cq_count, cmd.attr.cq_period);
|
||||
|
||||
uobj_put_obj_read(cq);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -241,9 +241,7 @@ static long ib_uverbs_cmd_verbs(struct ib_device *ib_dev,
|
||||
struct uverbs_attr *curr_attr;
|
||||
unsigned long *curr_bitmap;
|
||||
size_t ctx_size;
|
||||
#ifdef UVERBS_OPTIMIZE_USING_STACK_SZ
|
||||
uintptr_t data[UVERBS_OPTIMIZE_USING_STACK_SZ / sizeof(uintptr_t)];
|
||||
#endif
|
||||
|
||||
if (hdr->reserved)
|
||||
return -EINVAL;
|
||||
@@ -269,13 +267,10 @@ static long ib_uverbs_cmd_verbs(struct ib_device *ib_dev,
|
||||
(method_spec->num_child_attrs / BITS_PER_LONG +
|
||||
method_spec->num_buckets);
|
||||
|
||||
#ifdef UVERBS_OPTIMIZE_USING_STACK_SZ
|
||||
if (ctx_size <= UVERBS_OPTIMIZE_USING_STACK_SZ)
|
||||
ctx = (void *)data;
|
||||
|
||||
if (!ctx)
|
||||
#endif
|
||||
ctx = kmalloc(ctx_size, GFP_KERNEL);
|
||||
ctx = kmalloc(ctx_size, GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -311,10 +306,8 @@ static long ib_uverbs_cmd_verbs(struct ib_device *ib_dev,
|
||||
err = uverbs_handle_method(buf, ctx->uattrs, hdr->num_attrs, ib_dev,
|
||||
file, method_spec, ctx->uverbs_attr_bundle);
|
||||
out:
|
||||
#ifdef UVERBS_OPTIMIZE_USING_STACK_SZ
|
||||
if (ctx_size > UVERBS_OPTIMIZE_USING_STACK_SZ)
|
||||
#endif
|
||||
kfree(ctx);
|
||||
if (ctx != (void *)data)
|
||||
kfree(ctx);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -376,7 +376,7 @@ static struct uverbs_method_spec *build_method_with_attrs(const struct uverbs_me
|
||||
min_id) ||
|
||||
WARN(attr_obj_with_special_access &&
|
||||
!(attr->flags & UVERBS_ATTR_SPEC_F_MANDATORY),
|
||||
"ib_uverbs: Tried to merge attr (%d) but it's an object with new/destroy aceess but isn't mandatory\n",
|
||||
"ib_uverbs: Tried to merge attr (%d) but it's an object with new/destroy access but isn't mandatory\n",
|
||||
min_id) ||
|
||||
WARN(IS_ATTR_OBJECT(attr) &&
|
||||
attr->flags & UVERBS_ATTR_SPEC_F_MIN_SZ,
|
||||
|
||||
@@ -128,6 +128,7 @@ static int (*uverbs_ex_cmd_table[])(struct ib_uverbs_file *file,
|
||||
[IB_USER_VERBS_EX_CMD_CREATE_RWQ_IND_TBL] = ib_uverbs_ex_create_rwq_ind_table,
|
||||
[IB_USER_VERBS_EX_CMD_DESTROY_RWQ_IND_TBL] = ib_uverbs_ex_destroy_rwq_ind_table,
|
||||
[IB_USER_VERBS_EX_CMD_MODIFY_QP] = ib_uverbs_ex_modify_qp,
|
||||
[IB_USER_VERBS_EX_CMD_MODIFY_CQ] = ib_uverbs_ex_modify_cq,
|
||||
};
|
||||
|
||||
static void ib_uverbs_add_one(struct ib_device *device);
|
||||
@@ -763,7 +764,7 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
|
||||
}
|
||||
|
||||
if (!access_ok(VERIFY_WRITE,
|
||||
(void __user *) (unsigned long) ex_hdr.response,
|
||||
u64_to_user_ptr(ex_hdr.response),
|
||||
(hdr.out_words + ex_hdr.provider_out_words) * 8)) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
@@ -775,19 +776,17 @@ static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
|
||||
}
|
||||
}
|
||||
|
||||
INIT_UDATA_BUF_OR_NULL(&ucore, buf, (unsigned long) ex_hdr.response,
|
||||
hdr.in_words * 8, hdr.out_words * 8);
|
||||
ib_uverbs_init_udata_buf_or_null(&ucore, buf,
|
||||
u64_to_user_ptr(ex_hdr.response),
|
||||
hdr.in_words * 8, hdr.out_words * 8);
|
||||
|
||||
INIT_UDATA_BUF_OR_NULL(&uhw,
|
||||
buf + ucore.inlen,
|
||||
(unsigned long) ex_hdr.response + ucore.outlen,
|
||||
ex_hdr.provider_in_words * 8,
|
||||
ex_hdr.provider_out_words * 8);
|
||||
ib_uverbs_init_udata_buf_or_null(&uhw,
|
||||
buf + ucore.inlen,
|
||||
u64_to_user_ptr(ex_hdr.response) + ucore.outlen,
|
||||
ex_hdr.provider_in_words * 8,
|
||||
ex_hdr.provider_out_words * 8);
|
||||
|
||||
ret = uverbs_ex_cmd_table[command](file,
|
||||
ib_dev,
|
||||
&ucore,
|
||||
&uhw);
|
||||
ret = uverbs_ex_cmd_table[command](file, ib_dev, &ucore, &uhw);
|
||||
if (!ret)
|
||||
ret = written_count;
|
||||
} else {
|
||||
|
||||
@@ -69,8 +69,7 @@ void ib_copy_ah_attr_to_user(struct ib_device *device,
|
||||
memset(&dst->grh.reserved, 0, sizeof(dst->grh.reserved));
|
||||
|
||||
if ((ah_attr->type == RDMA_AH_ATTR_TYPE_OPA) &&
|
||||
(rdma_ah_get_dlid(ah_attr) >=
|
||||
be16_to_cpu(IB_MULTICAST_LID_BASE)) &&
|
||||
(rdma_ah_get_dlid(ah_attr) > be16_to_cpu(IB_LID_PERMISSIVE)) &&
|
||||
(!rdma_ah_conv_opa_to_ib(device, &conv_ah, ah_attr)))
|
||||
src = &conv_ah;
|
||||
|
||||
@@ -176,18 +175,18 @@ EXPORT_SYMBOL(ib_copy_path_rec_to_user);
|
||||
void ib_copy_path_rec_from_user(struct sa_path_rec *dst,
|
||||
struct ib_user_path_rec *src)
|
||||
{
|
||||
__be32 slid, dlid;
|
||||
u32 slid, dlid;
|
||||
|
||||
memset(dst, 0, sizeof(*dst));
|
||||
if ((ib_is_opa_gid((union ib_gid *)src->sgid)) ||
|
||||
(ib_is_opa_gid((union ib_gid *)src->dgid))) {
|
||||
dst->rec_type = SA_PATH_REC_TYPE_OPA;
|
||||
slid = htonl(opa_get_lid_from_gid((union ib_gid *)src->sgid));
|
||||
dlid = htonl(opa_get_lid_from_gid((union ib_gid *)src->dgid));
|
||||
slid = opa_get_lid_from_gid((union ib_gid *)src->sgid);
|
||||
dlid = opa_get_lid_from_gid((union ib_gid *)src->dgid);
|
||||
} else {
|
||||
dst->rec_type = SA_PATH_REC_TYPE_IB;
|
||||
slid = htonl(ntohs(src->slid));
|
||||
dlid = htonl(ntohs(src->dlid));
|
||||
slid = ntohs(src->slid);
|
||||
dlid = ntohs(src->dlid);
|
||||
}
|
||||
memcpy(dst->dgid.raw, src->dgid, sizeof dst->dgid);
|
||||
memcpy(dst->sgid.raw, src->sgid, sizeof dst->sgid);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user