mirror of https://gitee.com/openkylin/linux.git
5.2 First rc pull request
The usual driver bug fixes and fixes for a couple of regressions introduced in 5.2: - Fix a race on bootup with RDMA device renaming and srp. SRP also needs to rename its internal sys files - Fix a memory leak in hns - Don't leak resources in efa on certain error unwinds - Don't panic in certain error unwinds in ib_register_device - Various small user visible bug fix patches for the hfi and efa drivers - Fix the 32 bit compilation break -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEfB7FMLh+8QxL+6i3OG33FX4gmxoFAlz5c5oACgkQOG33FX4g mxpEEhAAk64phaKUih9KVT0MpC1zezB1C0EGKg45GKuMOFUFJQ5tZ0g4s6aDEbG3 374ZE9h82HMgKn4tQ95110AKvCI+VAbbKOS7kzk1rLWE1ruJxk5DNsvp1v5/S3FE GXBSws+HtZtdiRAMTYyEOfz0MqpvghFg0vor4PugrmOuqIe2a0bkYPEzYPjYbaNH jSctd/q4s/o02n6gfbCrFpXsW0Va3OIaDX5a+Fx5+lWW+GPr/Uzk/3kN95mFbDRp XsCE80V+n3ceKSQUp0lYtxU3tm2mT1JpiiZjXuKyjRV8IMUS+xkdJ8scEz0upGcg +Jr74mN/xKT3toHaMv7fZ3RGlYgFsSsZcAApm6LrIlTNQXKjJ8hl+2BWdi4nRfYZ X89RRWEl3j8i6URu65iH7y7IlfFEhjJGmATUQFdrfECR9hBMJ8VHzBfcz7aYgoac Ggi+2Vjm7GQlr9mzW/phXb25PWqP5yVTW6/3BUtMs3oY7kd6vE2n9XzGIy13uBpX fzY/tnIMrgZMjphYPPbBAbwl+tBKZCu4k6lpP7cLsVsIwY0NIWS26JCnCdO0efqR SnAUPjoAV7nkpG3mMO9Qv7h7yar3HrG7ED15hfmB4VowRNQMfDoTLc8jVWDvGk4/ aFBSH8dEjszZ5tMO9HL+RXnvpkRcDyQpfVQJttY5adZFQlUOd+0= =RmxY -----END PGP SIGNATURE----- Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma Pull rdma fixes from Jason Gunthorpe: "Things are looking pretty quiet here in RDMA, not too many bug fixes rolling in right now. The usual driver bug fixes and fixes for a couple of regressions introduced in 5.2: - Fix a race on bootup with RDMA device renaming and srp. SRP also needs to rename its internal sys files - Fix a memory leak in hns - Don't leak resources in efa on certain error unwinds - Don't panic in certain error unwinds in ib_register_device - Various small user visible bug fix patches for the hfi and efa drivers - Fix the 32 bit compilation break" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: RDMA/efa: Remove MAYEXEC flag check from mmap flow mlx5: avoid 64-bit division IB/hfi1: Validate page aligned for a given virtual address IB/{qib, hfi1, rdmavt}: Correct ibv_devinfo max_mr value IB/hfi1: Insure freeze_work work_struct is canceled on shutdown IB/rdmavt: Fix alloc_qpn() WARN_ON() RDMA/core: Fix panic when port_data isn't initialized RDMA/uverbs: Pass udata on uverbs error unwind RDMA/core: Clear out the udata before error unwind RDMA/hns: Fix PD memory leak for internal allocation RDMA/srp: Rename SRP sysfs name after IB device rename trigger
This commit is contained in:
commit
6e38335dcc
|
@ -409,27 +409,44 @@ static int rename_compat_devs(struct ib_device *device)
|
|||
|
||||
int ib_device_rename(struct ib_device *ibdev, const char *name)
|
||||
{
|
||||
unsigned long index;
|
||||
void *client_data;
|
||||
int ret;
|
||||
|
||||
down_write(&devices_rwsem);
|
||||
if (!strcmp(name, dev_name(&ibdev->dev))) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
up_write(&devices_rwsem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (__ib_device_get_by_name(name)) {
|
||||
ret = -EEXIST;
|
||||
goto out;
|
||||
up_write(&devices_rwsem);
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
ret = device_rename(&ibdev->dev, name);
|
||||
if (ret)
|
||||
goto out;
|
||||
if (ret) {
|
||||
up_write(&devices_rwsem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
strlcpy(ibdev->name, name, IB_DEVICE_NAME_MAX);
|
||||
ret = rename_compat_devs(ibdev);
|
||||
out:
|
||||
up_write(&devices_rwsem);
|
||||
return ret;
|
||||
|
||||
downgrade_write(&devices_rwsem);
|
||||
down_read(&ibdev->client_data_rwsem);
|
||||
xan_for_each_marked(&ibdev->client_data, index, client_data,
|
||||
CLIENT_DATA_REGISTERED) {
|
||||
struct ib_client *client = xa_load(&clients, index);
|
||||
|
||||
if (!client || !client->rename)
|
||||
continue;
|
||||
|
||||
client->rename(ibdev, client_data);
|
||||
}
|
||||
up_read(&ibdev->client_data_rwsem);
|
||||
up_read(&devices_rwsem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alloc_name(struct ib_device *ibdev, const char *name)
|
||||
|
@ -474,14 +491,15 @@ static void ib_device_release(struct device *device)
|
|||
|
||||
free_netdevs(dev);
|
||||
WARN_ON(refcount_read(&dev->refcount));
|
||||
ib_cache_release_one(dev);
|
||||
ib_security_release_port_pkey_list(dev);
|
||||
xa_destroy(&dev->compat_devs);
|
||||
xa_destroy(&dev->client_data);
|
||||
if (dev->port_data)
|
||||
if (dev->port_data) {
|
||||
ib_cache_release_one(dev);
|
||||
ib_security_release_port_pkey_list(dev);
|
||||
kfree_rcu(container_of(dev->port_data, struct ib_port_data_rcu,
|
||||
pdata[0]),
|
||||
rcu_head);
|
||||
}
|
||||
xa_destroy(&dev->compat_devs);
|
||||
xa_destroy(&dev->client_data);
|
||||
kfree_rcu(dev, rcu_head);
|
||||
}
|
||||
|
||||
|
@ -1935,6 +1953,9 @@ static void free_netdevs(struct ib_device *ib_dev)
|
|||
unsigned long flags;
|
||||
unsigned int port;
|
||||
|
||||
if (!ib_dev->port_data)
|
||||
return;
|
||||
|
||||
rdma_for_each_port (ib_dev, port) {
|
||||
struct ib_port_data *pdata = &ib_dev->port_data[port];
|
||||
struct net_device *ndev;
|
||||
|
|
|
@ -110,6 +110,8 @@ int uverbs_output_written(const struct uverbs_attr_bundle *bundle, size_t idx);
|
|||
void setup_ufile_idr_uobject(struct ib_uverbs_file *ufile);
|
||||
void release_ufile_idr_uobject(struct ib_uverbs_file *ufile);
|
||||
|
||||
struct ib_udata *uverbs_get_cleared_udata(struct uverbs_attr_bundle *attrs);
|
||||
|
||||
/*
|
||||
* This is the runtime description of the uverbs API, used by the syscall
|
||||
* machinery to validate and dispatch calls.
|
||||
|
|
|
@ -174,6 +174,17 @@ static int uverbs_request_finish(struct uverbs_req_iter *iter)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* When calling a destroy function during an error unwind we need to pass in
|
||||
* the udata that is sanitized of all user arguments. Ie from the driver
|
||||
* perspective it looks like no udata was passed.
|
||||
*/
|
||||
struct ib_udata *uverbs_get_cleared_udata(struct uverbs_attr_bundle *attrs)
|
||||
{
|
||||
attrs->driver_udata = (struct ib_udata){};
|
||||
return &attrs->driver_udata;
|
||||
}
|
||||
|
||||
static struct ib_uverbs_completion_event_file *
|
||||
_ib_uverbs_lookup_comp_file(s32 fd, struct uverbs_attr_bundle *attrs)
|
||||
{
|
||||
|
@ -441,7 +452,7 @@ static int ib_uverbs_alloc_pd(struct uverbs_attr_bundle *attrs)
|
|||
return uobj_alloc_commit(uobj, attrs);
|
||||
|
||||
err_copy:
|
||||
ib_dealloc_pd_user(pd, &attrs->driver_udata);
|
||||
ib_dealloc_pd_user(pd, uverbs_get_cleared_udata(attrs));
|
||||
pd = NULL;
|
||||
err_alloc:
|
||||
kfree(pd);
|
||||
|
@ -644,7 +655,7 @@ static int ib_uverbs_open_xrcd(struct uverbs_attr_bundle *attrs)
|
|||
}
|
||||
|
||||
err_dealloc_xrcd:
|
||||
ib_dealloc_xrcd(xrcd, &attrs->driver_udata);
|
||||
ib_dealloc_xrcd(xrcd, uverbs_get_cleared_udata(attrs));
|
||||
|
||||
err:
|
||||
uobj_alloc_abort(&obj->uobject, attrs);
|
||||
|
@ -767,7 +778,7 @@ static int ib_uverbs_reg_mr(struct uverbs_attr_bundle *attrs)
|
|||
return uobj_alloc_commit(uobj, attrs);
|
||||
|
||||
err_copy:
|
||||
ib_dereg_mr_user(mr, &attrs->driver_udata);
|
||||
ib_dereg_mr_user(mr, uverbs_get_cleared_udata(attrs));
|
||||
|
||||
err_put:
|
||||
uobj_put_obj_read(pd);
|
||||
|
@ -1042,7 +1053,7 @@ static struct ib_ucq_object *create_cq(struct uverbs_attr_bundle *attrs,
|
|||
return obj;
|
||||
|
||||
err_cb:
|
||||
ib_destroy_cq(cq);
|
||||
ib_destroy_cq_user(cq, uverbs_get_cleared_udata(attrs));
|
||||
|
||||
err_file:
|
||||
if (ev_file)
|
||||
|
@ -1478,7 +1489,7 @@ static int create_qp(struct uverbs_attr_bundle *attrs,
|
|||
|
||||
return uobj_alloc_commit(&obj->uevent.uobject, attrs);
|
||||
err_cb:
|
||||
ib_destroy_qp(qp);
|
||||
ib_destroy_qp_user(qp, uverbs_get_cleared_udata(attrs));
|
||||
|
||||
err_put:
|
||||
if (!IS_ERR(xrcd_uobj))
|
||||
|
@ -1611,7 +1622,7 @@ static int ib_uverbs_open_qp(struct uverbs_attr_bundle *attrs)
|
|||
return uobj_alloc_commit(&obj->uevent.uobject, attrs);
|
||||
|
||||
err_destroy:
|
||||
ib_destroy_qp(qp);
|
||||
ib_destroy_qp_user(qp, uverbs_get_cleared_udata(attrs));
|
||||
err_xrcd:
|
||||
uobj_put_read(xrcd_uobj);
|
||||
err_put:
|
||||
|
@ -2453,7 +2464,8 @@ static int ib_uverbs_create_ah(struct uverbs_attr_bundle *attrs)
|
|||
return uobj_alloc_commit(uobj, attrs);
|
||||
|
||||
err_copy:
|
||||
rdma_destroy_ah(ah, RDMA_DESTROY_AH_SLEEPABLE);
|
||||
rdma_destroy_ah_user(ah, RDMA_DESTROY_AH_SLEEPABLE,
|
||||
uverbs_get_cleared_udata(attrs));
|
||||
|
||||
err_put:
|
||||
uobj_put_obj_read(pd);
|
||||
|
@ -2964,7 +2976,7 @@ static int ib_uverbs_ex_create_wq(struct uverbs_attr_bundle *attrs)
|
|||
return uobj_alloc_commit(&obj->uevent.uobject, attrs);
|
||||
|
||||
err_copy:
|
||||
ib_destroy_wq(wq, &attrs->driver_udata);
|
||||
ib_destroy_wq(wq, uverbs_get_cleared_udata(attrs));
|
||||
err_put_cq:
|
||||
uobj_put_obj_read(cq);
|
||||
err_put_pd:
|
||||
|
@ -3464,7 +3476,7 @@ static int __uverbs_create_xsrq(struct uverbs_attr_bundle *attrs,
|
|||
return uobj_alloc_commit(&obj->uevent.uobject, attrs);
|
||||
|
||||
err_copy:
|
||||
ib_destroy_srq_user(srq, &attrs->driver_udata);
|
||||
ib_destroy_srq_user(srq, uverbs_get_cleared_udata(attrs));
|
||||
|
||||
err_free:
|
||||
kfree(srq);
|
||||
|
|
|
@ -135,7 +135,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_CQ_CREATE)(
|
|||
|
||||
return 0;
|
||||
err_cq:
|
||||
ib_destroy_cq(cq);
|
||||
ib_destroy_cq_user(cq, uverbs_get_cleared_udata(attrs));
|
||||
|
||||
err_event_file:
|
||||
if (ev_file)
|
||||
|
|
|
@ -148,7 +148,7 @@ static int UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)(
|
|||
return 0;
|
||||
|
||||
err_dereg:
|
||||
ib_dereg_mr_user(mr, &attrs->driver_udata);
|
||||
ib_dereg_mr_user(mr, uverbs_get_cleared_udata(attrs));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1728,7 +1728,6 @@ int efa_mmap(struct ib_ucontext *ibucontext,
|
|||
ibdev_dbg(&dev->ibdev, "Mapping executable pages is not permitted\n");
|
||||
return -EPERM;
|
||||
}
|
||||
vma->vm_flags &= ~VM_MAYEXEC;
|
||||
|
||||
return __efa_mmap(dev, ucontext, vma, key, length);
|
||||
}
|
||||
|
|
|
@ -9850,6 +9850,7 @@ void hfi1_quiet_serdes(struct hfi1_pportdata *ppd)
|
|||
|
||||
/* disable the port */
|
||||
clear_rcvctrl(dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK);
|
||||
cancel_work_sync(&ppd->freeze_work);
|
||||
}
|
||||
|
||||
static inline int init_cpu_counters(struct hfi1_devdata *dd)
|
||||
|
|
|
@ -324,6 +324,9 @@ int hfi1_user_exp_rcv_setup(struct hfi1_filedata *fd,
|
|||
u32 *tidlist = NULL;
|
||||
struct tid_user_buf *tidbuf;
|
||||
|
||||
if (!PAGE_ALIGNED(tinfo->vaddr))
|
||||
return -EINVAL;
|
||||
|
||||
tidbuf = kzalloc(sizeof(*tidbuf), GFP_KERNEL);
|
||||
if (!tidbuf)
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -1356,8 +1356,6 @@ static void hfi1_fill_device_attr(struct hfi1_devdata *dd)
|
|||
rdi->dparms.props.max_cq = hfi1_max_cqs;
|
||||
rdi->dparms.props.max_ah = hfi1_max_ahs;
|
||||
rdi->dparms.props.max_cqe = hfi1_max_cqes;
|
||||
rdi->dparms.props.max_mr = rdi->lkey_table.max;
|
||||
rdi->dparms.props.max_fmr = rdi->lkey_table.max;
|
||||
rdi->dparms.props.max_map_per_fmr = 32767;
|
||||
rdi->dparms.props.max_pd = hfi1_max_pds;
|
||||
rdi->dparms.props.max_qp_rd_atom = HFI1_MAX_RDMA_ATOMIC;
|
||||
|
|
|
@ -899,6 +899,7 @@ static void hns_roce_v1_release_lp_qp(struct hns_roce_dev *hr_dev)
|
|||
dev_err(dev, "Destroy cq for mr_free failed(%d)!\n", ret);
|
||||
|
||||
hns_roce_dealloc_pd(&free_mr->mr_free_pd->ibpd, NULL);
|
||||
kfree(&free_mr->mr_free_pd->ibpd);
|
||||
}
|
||||
|
||||
static int hns_roce_db_init(struct hns_roce_dev *hr_dev)
|
||||
|
|
|
@ -190,12 +190,12 @@ int mlx5_cmd_alloc_sw_icm(struct mlx5_dm *dm, int type, u64 length,
|
|||
u16 uid, phys_addr_t *addr, u32 *obj_id)
|
||||
{
|
||||
struct mlx5_core_dev *dev = dm->dev;
|
||||
u32 num_blocks = DIV_ROUND_UP(length, MLX5_SW_ICM_BLOCK_SIZE(dev));
|
||||
u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {};
|
||||
u32 in[MLX5_ST_SZ_DW(create_sw_icm_in)] = {};
|
||||
unsigned long *block_map;
|
||||
u64 icm_start_addr;
|
||||
u32 log_icm_size;
|
||||
u32 num_blocks;
|
||||
u32 max_blocks;
|
||||
u64 block_idx;
|
||||
void *sw_icm;
|
||||
|
@ -224,6 +224,8 @@ int mlx5_cmd_alloc_sw_icm(struct mlx5_dm *dm, int type, u64 length,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
num_blocks = (length + MLX5_SW_ICM_BLOCK_SIZE(dev) - 1) >>
|
||||
MLX5_LOG_SW_ICM_BLOCK_SIZE(dev);
|
||||
max_blocks = BIT(log_icm_size - MLX5_LOG_SW_ICM_BLOCK_SIZE(dev));
|
||||
spin_lock(&dm->lock);
|
||||
block_idx = bitmap_find_next_zero_area(block_map,
|
||||
|
@ -266,13 +268,16 @@ int mlx5_cmd_dealloc_sw_icm(struct mlx5_dm *dm, int type, u64 length,
|
|||
u16 uid, phys_addr_t addr, u32 obj_id)
|
||||
{
|
||||
struct mlx5_core_dev *dev = dm->dev;
|
||||
u32 num_blocks = DIV_ROUND_UP(length, MLX5_SW_ICM_BLOCK_SIZE(dev));
|
||||
u32 out[MLX5_ST_SZ_DW(general_obj_out_cmd_hdr)] = {};
|
||||
u32 in[MLX5_ST_SZ_DW(general_obj_in_cmd_hdr)] = {};
|
||||
unsigned long *block_map;
|
||||
u32 num_blocks;
|
||||
u64 start_idx;
|
||||
int err;
|
||||
|
||||
num_blocks = (length + MLX5_SW_ICM_BLOCK_SIZE(dev) - 1) >>
|
||||
MLX5_LOG_SW_ICM_BLOCK_SIZE(dev);
|
||||
|
||||
switch (type) {
|
||||
case MLX5_IB_UAPI_DM_TYPE_STEERING_SW_ICM:
|
||||
start_idx =
|
||||
|
|
|
@ -2344,7 +2344,7 @@ static int handle_alloc_dm_sw_icm(struct ib_ucontext *ctx,
|
|||
/* Allocation size must a multiple of the basic block size
|
||||
* and a power of 2.
|
||||
*/
|
||||
act_size = roundup(attr->length, MLX5_SW_ICM_BLOCK_SIZE(dm_db->dev));
|
||||
act_size = round_up(attr->length, MLX5_SW_ICM_BLOCK_SIZE(dm_db->dev));
|
||||
act_size = roundup_pow_of_two(act_size);
|
||||
|
||||
dm->size = act_size;
|
||||
|
|
|
@ -1459,8 +1459,6 @@ static void qib_fill_device_attr(struct qib_devdata *dd)
|
|||
rdi->dparms.props.max_cq = ib_qib_max_cqs;
|
||||
rdi->dparms.props.max_cqe = ib_qib_max_cqes;
|
||||
rdi->dparms.props.max_ah = ib_qib_max_ahs;
|
||||
rdi->dparms.props.max_mr = rdi->lkey_table.max;
|
||||
rdi->dparms.props.max_fmr = rdi->lkey_table.max;
|
||||
rdi->dparms.props.max_map_per_fmr = 32767;
|
||||
rdi->dparms.props.max_qp_rd_atom = QIB_MAX_RDMA_ATOMIC;
|
||||
rdi->dparms.props.max_qp_init_rd_atom = 255;
|
||||
|
|
|
@ -96,6 +96,8 @@ int rvt_driver_mr_init(struct rvt_dev_info *rdi)
|
|||
for (i = 0; i < rdi->lkey_table.max; i++)
|
||||
RCU_INIT_POINTER(rdi->lkey_table.table[i], NULL);
|
||||
|
||||
rdi->dparms.props.max_mr = rdi->lkey_table.max;
|
||||
rdi->dparms.props.max_fmr = rdi->lkey_table.max;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -594,7 +594,8 @@ static int alloc_qpn(struct rvt_dev_info *rdi, struct rvt_qpn_table *qpt,
|
|||
offset = qpt->incr | ((offset & 1) ^ 1);
|
||||
}
|
||||
/* there can be no set bits in low-order QoS bits */
|
||||
WARN_ON(offset & (BIT(rdi->dparms.qos_shift) - 1));
|
||||
WARN_ON(rdi->dparms.qos_shift > 1 &&
|
||||
offset & ((BIT(rdi->dparms.qos_shift - 1) - 1) << 1));
|
||||
qpn = mk_qpn(qpt, map, offset);
|
||||
}
|
||||
|
||||
|
|
|
@ -148,6 +148,7 @@ MODULE_PARM_DESC(ch_count,
|
|||
|
||||
static void srp_add_one(struct ib_device *device);
|
||||
static void srp_remove_one(struct ib_device *device, void *client_data);
|
||||
static void srp_rename_dev(struct ib_device *device, void *client_data);
|
||||
static void srp_recv_done(struct ib_cq *cq, struct ib_wc *wc);
|
||||
static void srp_handle_qp_err(struct ib_cq *cq, struct ib_wc *wc,
|
||||
const char *opname);
|
||||
|
@ -162,7 +163,8 @@ static struct workqueue_struct *srp_remove_wq;
|
|||
static struct ib_client srp_client = {
|
||||
.name = "srp",
|
||||
.add = srp_add_one,
|
||||
.remove = srp_remove_one
|
||||
.remove = srp_remove_one,
|
||||
.rename = srp_rename_dev
|
||||
};
|
||||
|
||||
static struct ib_sa_client srp_sa_client;
|
||||
|
@ -4112,6 +4114,20 @@ static struct srp_host *srp_add_port(struct srp_device *device, u8 port)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void srp_rename_dev(struct ib_device *device, void *client_data)
|
||||
{
|
||||
struct srp_device *srp_dev = client_data;
|
||||
struct srp_host *host, *tmp_host;
|
||||
|
||||
list_for_each_entry_safe(host, tmp_host, &srp_dev->dev_list, list) {
|
||||
char name[IB_DEVICE_NAME_MAX + 8];
|
||||
|
||||
snprintf(name, sizeof(name), "srp-%s-%d",
|
||||
dev_name(&device->dev), host->port);
|
||||
device_rename(&host->dev, name);
|
||||
}
|
||||
}
|
||||
|
||||
static void srp_add_one(struct ib_device *device)
|
||||
{
|
||||
struct srp_device *srp_dev;
|
||||
|
|
|
@ -2698,6 +2698,7 @@ struct ib_client {
|
|||
const char *name;
|
||||
void (*add) (struct ib_device *);
|
||||
void (*remove)(struct ib_device *, void *client_data);
|
||||
void (*rename)(struct ib_device *dev, void *client_data);
|
||||
|
||||
/* Returns the net_dev belonging to this ib_client and matching the
|
||||
* given parameters.
|
||||
|
|
Loading…
Reference in New Issue