This is the 2nd patch of 3 of the work for decreasing size of mlx4_ib_dev. The field takes about 36K and could be safely allocated with kvzalloc. Signed-off-by: Jan Dakinevich <jan.dakinevich@xxxxxxxxxxxxx> --- drivers/infiniband/hw/mlx4/mad.c | 18 +++++++++--------- drivers/infiniband/hw/mlx4/main.c | 11 ++++++++--- drivers/infiniband/hw/mlx4/mlx4_ib.h | 2 +- drivers/infiniband/hw/mlx4/sysfs.c | 30 +++++++++++++++--------------- 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c index e5466d7..3eceb46 100644 --- a/drivers/infiniband/hw/mlx4/mad.c +++ b/drivers/infiniband/hw/mlx4/mad.c @@ -268,9 +268,9 @@ static void smp_snoop(struct ib_device *ibdev, u8 port_num, const struct ib_mad pr_debug("PKEY[%d] = x%x\n", i + bn*32, be16_to_cpu(base[i])); if (be16_to_cpu(base[i]) != - dev->pkeys.phys_pkey_cache[port_num - 1][i + bn*32]) { + dev->pkeys->phys_pkey_cache[port_num - 1][i + bn*32]) { pkey_change_bitmap |= (1 << i); - dev->pkeys.phys_pkey_cache[port_num - 1][i + bn*32] = + dev->pkeys->phys_pkey_cache[port_num - 1][i + bn*32] = be16_to_cpu(base[i]); } } @@ -348,7 +348,7 @@ static void __propagate_pkey_ev(struct mlx4_ib_dev *dev, int port_num, continue; for (ix = 0; ix < dev->dev->caps.pkey_table_len[port_num]; ix++) { - if (dev->pkeys.virt2phys_pkey[slave][port_num - 1] + if (dev->pkeys->virt2phys_pkey[slave][port_num - 1] [ix] == i + 32 * block) { err = mlx4_gen_pkey_eqe(dev->dev, slave, port_num); pr_debug("propagate_pkey_ev: slave %d," @@ -455,10 +455,10 @@ static int find_slave_port_pkey_ix(struct mlx4_ib_dev *dev, int slave, unassigned_pkey_ix = dev->dev->phys_caps.pkey_phys_table_len[port] - 1; for (i = 0; i < dev->dev->caps.pkey_table_len[port]; i++) { - if (dev->pkeys.virt2phys_pkey[slave][port - 1][i] == unassigned_pkey_ix) + if (dev->pkeys->virt2phys_pkey[slave][port - 1][i] == unassigned_pkey_ix) continue; - pkey_ix = dev->pkeys.virt2phys_pkey[slave][port - 1][i]; + pkey_ix = dev->pkeys->virt2phys_pkey[slave][port - 1][i]; ret = ib_get_cached_pkey(&dev->ib_dev, port, pkey_ix, &slot_pkey); if (ret) @@ -546,7 +546,7 @@ int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u8 port, return -EINVAL; tun_pkey_ix = pkey_ix; } else - tun_pkey_ix = dev->pkeys.virt2phys_pkey[slave][port - 1][0]; + tun_pkey_ix = dev->pkeys->virt2phys_pkey[slave][port - 1][0]; dqpn = dev->dev->phys_caps.base_proxy_sqpn + 8 * slave + port + (dest_qpt * 2) - 1; @@ -1382,11 +1382,11 @@ int mlx4_ib_send_to_wire(struct mlx4_ib_dev *dev, int slave, u8 port, if (dest_qpt == IB_QPT_SMI) { src_qpnum = 0; sqp = &sqp_ctx->qp[0]; - wire_pkey_ix = dev->pkeys.virt2phys_pkey[slave][port - 1][0]; + wire_pkey_ix = dev->pkeys->virt2phys_pkey[slave][port - 1][0]; } else { src_qpnum = 1; sqp = &sqp_ctx->qp[1]; - wire_pkey_ix = dev->pkeys.virt2phys_pkey[slave][port - 1][pkey_index]; + wire_pkey_ix = dev->pkeys->virt2phys_pkey[slave][port - 1][pkey_index]; } send_qp = sqp->qp; @@ -1840,7 +1840,7 @@ static int create_pv_sqp(struct mlx4_ib_demux_pv_ctx *ctx, &attr.pkey_index); if (ret || !create_tun) attr.pkey_index = - to_mdev(ctx->ib_dev)->pkeys.virt2phys_pkey[ctx->slave][ctx->port - 1][0]; + to_mdev(ctx->ib_dev)->pkeys->virt2phys_pkey[ctx->slave][ctx->port - 1][0]; attr.qkey = IB_QP1_QKEY; attr.port_num = ctx->port; ret = ib_modify_qp(tun_qp->qp, &attr, qp_attr_mask_INIT); diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 1e3bb67..8ba0103 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c @@ -2477,12 +2477,12 @@ static void init_pkeys(struct mlx4_ib_dev *ibdev) for (i = 0; i < ibdev->dev->phys_caps.pkey_phys_table_len[port]; ++i) { - ibdev->pkeys.virt2phys_pkey[slave][port - 1][i] = + ibdev->pkeys->virt2phys_pkey[slave][port - 1][i] = /* master has the identity virt2phys pkey mapping */ (slave == mlx4_master_func_num(ibdev->dev) || !i) ? i : ibdev->dev->phys_caps.pkey_phys_table_len[port] - 1; mlx4_sync_pkey_table(ibdev->dev, slave, port, i, - ibdev->pkeys.virt2phys_pkey[slave][port - 1][i]); + ibdev->pkeys->virt2phys_pkey[slave][port - 1][i]); } } } @@ -2491,7 +2491,7 @@ static void init_pkeys(struct mlx4_ib_dev *ibdev) for (i = 0; i < ibdev->dev->phys_caps.pkey_phys_table_len[port]; ++i) - ibdev->pkeys.phys_pkey_cache[port-1][i] = + ibdev->pkeys->phys_pkey_cache[port-1][i] = (i) ? 0 : 0xFFFF; } } @@ -2595,6 +2595,7 @@ static void mlx4_ib_release(struct ib_device *device) ib_dev); kvfree(ibdev->iboe); + kvfree(ibdev->pkeys); } static void *mlx4_ib_add(struct mlx4_dev *dev) @@ -2636,6 +2637,10 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) ibdev->iboe->parent = ibdev; iboe = ibdev->iboe; + ibdev->pkeys = kvzalloc(sizeof(struct pkey_mgt), GFP_KERNEL); + if (!ibdev->pkeys) + goto err_dealloc; + if (mlx4_pd_alloc(dev, &ibdev->priv_pdn)) goto err_dealloc; diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h index 2996c61..2b5a9b2 100644 --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h @@ -608,7 +608,7 @@ struct mlx4_ib_dev { struct kobject *ports_parent; struct kobject *dev_ports_parent[MLX4_MFUNC_MAX]; struct mlx4_ib_iov_port iov_ports[MLX4_MAX_PORTS]; - struct pkey_mgt pkeys; + struct pkey_mgt *pkeys; unsigned long *ib_uc_qpns_bitmap; int steer_qpn_count; int steer_qpn_base; diff --git a/drivers/infiniband/hw/mlx4/sysfs.c b/drivers/infiniband/hw/mlx4/sysfs.c index e219093..a5b4592a 100644 --- a/drivers/infiniband/hw/mlx4/sysfs.c +++ b/drivers/infiniband/hw/mlx4/sysfs.c @@ -447,12 +447,12 @@ static ssize_t show_port_pkey(struct mlx4_port *p, struct port_attribute *attr, container_of(attr, struct port_table_attribute, attr); ssize_t ret = -ENODEV; - if (p->dev->pkeys.virt2phys_pkey[p->slave][p->port_num - 1][tab_attr->index] >= + if (p->dev->pkeys->virt2phys_pkey[p->slave][p->port_num - 1][tab_attr->index] >= (p->dev->dev->caps.pkey_table_len[p->port_num])) ret = sprintf(buf, "none\n"); else ret = sprintf(buf, "%d\n", - p->dev->pkeys.virt2phys_pkey[p->slave] + p->dev->pkeys->virt2phys_pkey[p->slave] [p->port_num - 1][tab_attr->index]); return ret; } @@ -476,8 +476,8 @@ static ssize_t store_port_pkey(struct mlx4_port *p, struct port_attribute *attr, idx < 0) return -EINVAL; - p->dev->pkeys.virt2phys_pkey[p->slave][p->port_num - 1] - [tab_attr->index] = idx; + p->dev->pkeys->virt2phys_pkey[p->slave][p->port_num - 1] + [tab_attr->index] = idx; mlx4_sync_pkey_table(p->dev->dev, p->slave, p->port_num, tab_attr->index, idx); err = mlx4_gen_pkey_eqe(p->dev->dev, p->slave, p->port_num); @@ -687,7 +687,7 @@ static int add_port(struct mlx4_ib_dev *dev, int port_num, int slave) if (ret) goto err_free_gid; - list_add_tail(&p->kobj.entry, &dev->pkeys.pkey_port_list[slave]); + list_add_tail(&p->kobj.entry, &dev->pkeys->pkey_port_list[slave]); return 0; err_free_gid: @@ -716,19 +716,19 @@ static int register_one_pkey_tree(struct mlx4_ib_dev *dev, int slave) get_name(dev, name, slave, sizeof name); - dev->pkeys.device_parent[slave] = + dev->pkeys->device_parent[slave] = kobject_create_and_add(name, kobject_get(dev->iov_parent)); - if (!dev->pkeys.device_parent[slave]) { + if (!dev->pkeys->device_parent[slave]) { err = -ENOMEM; goto fail_dev; } - INIT_LIST_HEAD(&dev->pkeys.pkey_port_list[slave]); + INIT_LIST_HEAD(&dev->pkeys->pkey_port_list[slave]); dev->dev_ports_parent[slave] = kobject_create_and_add("ports", - kobject_get(dev->pkeys.device_parent[slave])); + kobject_get(dev->pkeys->device_parent[slave])); if (!dev->dev_ports_parent[slave]) { err = -ENOMEM; @@ -748,7 +748,7 @@ static int register_one_pkey_tree(struct mlx4_ib_dev *dev, int slave) err_add: list_for_each_entry_safe(p, t, - &dev->pkeys.pkey_port_list[slave], + &dev->pkeys->pkey_port_list[slave], entry) { list_del(&p->entry); mport = container_of(p, struct mlx4_port, kobj); @@ -760,9 +760,9 @@ static int register_one_pkey_tree(struct mlx4_ib_dev *dev, int slave) kobject_put(dev->dev_ports_parent[slave]); err_ports: - kobject_put(dev->pkeys.device_parent[slave]); + kobject_put(dev->pkeys->device_parent[slave]); /* extra put for the device_parent create_and_add */ - kobject_put(dev->pkeys.device_parent[slave]); + kobject_put(dev->pkeys->device_parent[slave]); fail_dev: kobject_put(dev->iov_parent); @@ -793,7 +793,7 @@ static void unregister_pkey_tree(struct mlx4_ib_dev *device) for (slave = device->dev->persist->num_vfs; slave >= 0; --slave) { list_for_each_entry_safe(p, t, - &device->pkeys.pkey_port_list[slave], + &device->pkeys->pkey_port_list[slave], entry) { list_del(&p->entry); port = container_of(p, struct mlx4_port, kobj); @@ -804,8 +804,8 @@ static void unregister_pkey_tree(struct mlx4_ib_dev *device) kobject_put(device->dev_ports_parent[slave]); } kobject_put(device->dev_ports_parent[slave]); - kobject_put(device->pkeys.device_parent[slave]); - kobject_put(device->pkeys.device_parent[slave]); + kobject_put(device->pkeys->device_parent[slave]); + kobject_put(device->pkeys->device_parent[slave]); kobject_put(device->iov_parent); } } -- 2.1.4