Skip to content

Commit e0477b3

Browse files
committed
RDMA: Explicitly pass in the dma_device to ib_register_device
The code in setup_dma_device has become rather convoluted, move all of this to the drivers. Drives now pass in a DMA capable struct device which will be used to setup DMA, or drivers must fully configure the ibdev for DMA and pass in NULL. Other than setting the masks in rvt all drivers were doing this already anyhow. mthca, mlx4 and mlx5 were already setting up maximum DMA segment size for DMA based on their hardweare limits in: __mthca_init_one() dma_set_max_seg_size (1G) __mlx4_init_one() dma_set_max_seg_size (1G) mlx5_pci_init() set_dma_caps() dma_set_max_seg_size (2G) Other non software drivers (except usnic) were extended to UINT_MAX [1, 2] instead of 2G as was before. [1] https://lore.kernel.org/linux-rdma/[email protected]/ [2] https://lore.kernel.org/linux-rdma/[email protected]/ Link: https://lore.kernel.org/r/[email protected] Link: https://lore.kernel.org/r/6b2ed339933d066622d5715903870676d8cc523a.1602590106.git.mchehab+huawei@kernel.org Suggested-by: Christoph Hellwig <[email protected]> Signed-off-by: Parav Pandit <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 9a40401 commit e0477b3

File tree

17 files changed

+59
-80
lines changed

17 files changed

+59
-80
lines changed

drivers/infiniband/core/device.c

Lines changed: 22 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,58 +1177,23 @@ static int assign_name(struct ib_device *device, const char *name)
11771177
return ret;
11781178
}
11791179

1180-
static void setup_dma_device(struct ib_device *device)
1180+
static void setup_dma_device(struct ib_device *device,
1181+
struct device *dma_device)
11811182
{
1182-
struct device *parent = device->dev.parent;
1183-
1184-
WARN_ON_ONCE(device->dma_device);
1185-
1186-
#ifdef CONFIG_DMA_OPS
1187-
if (device->dev.dma_ops) {
1188-
/*
1189-
* The caller provided custom DMA operations. Copy the
1190-
* DMA-related fields that are used by e.g. dma_alloc_coherent()
1191-
* into device->dev.
1192-
*/
1193-
device->dma_device = &device->dev;
1194-
if (!device->dev.dma_mask) {
1195-
if (parent)
1196-
device->dev.dma_mask = parent->dma_mask;
1197-
else
1198-
WARN_ON_ONCE(true);
1199-
}
1200-
if (!device->dev.coherent_dma_mask) {
1201-
if (parent)
1202-
device->dev.coherent_dma_mask =
1203-
parent->coherent_dma_mask;
1204-
else
1205-
WARN_ON_ONCE(true);
1206-
}
1207-
} else
1208-
#endif /* CONFIG_DMA_OPS */
1209-
{
1210-
/*
1211-
* The caller did not provide custom DMA operations. Use the
1212-
* DMA mapping operations of the parent device.
1213-
*/
1214-
WARN_ON_ONCE(!parent);
1215-
device->dma_device = parent;
1216-
}
1217-
1218-
if (!device->dev.dma_parms) {
1219-
if (parent) {
1220-
/*
1221-
* The caller did not provide DMA parameters, so
1222-
* 'parent' probably represents a PCI device. The PCI
1223-
* core sets the maximum segment size to 64
1224-
* KB. Increase this parameter to 2 GB.
1225-
*/
1226-
device->dev.dma_parms = parent->dma_parms;
1227-
dma_set_max_seg_size(device->dma_device, SZ_2G);
1228-
} else {
1229-
WARN_ON_ONCE(true);
1230-
}
1183+
/*
1184+
* If the caller does not provide a DMA capable device then the IB
1185+
* device will be used. In this case the caller should fully setup the
1186+
* ibdev for DMA. This usually means using dma_virt_ops.
1187+
*/
1188+
#ifdef CONFIG_DMA_VIRT_OPS
1189+
if (!dma_device) {
1190+
device->dev.dma_ops = &dma_virt_ops;
1191+
dma_device = &device->dev;
12311192
}
1193+
#endif
1194+
WARN_ON(!dma_device);
1195+
device->dma_device = dma_device;
1196+
WARN_ON(!device->dma_device->dma_parms);
12321197
}
12331198

12341199
/*
@@ -1241,7 +1206,6 @@ static int setup_device(struct ib_device *device)
12411206
struct ib_udata uhw = {.outlen = 0, .inlen = 0};
12421207
int ret;
12431208

1244-
setup_dma_device(device);
12451209
ib_device_check_mandatory(device);
12461210

12471211
ret = setup_port_data(device);
@@ -1354,7 +1318,10 @@ static void prevent_dealloc_device(struct ib_device *ib_dev)
13541318
* ib_register_device - Register an IB device with IB core
13551319
* @device: Device to register
13561320
* @name: unique string device name. This may include a '%' which will
1357-
* cause a unique index to be added to the passed device name.
1321+
* cause a unique index to be added to the passed device name.
1322+
* @dma_device: pointer to a DMA-capable device. If %NULL, then the IB
1323+
* device will be used. In this case the caller should fully
1324+
* setup the ibdev for DMA. This usually means using dma_virt_ops.
13581325
*
13591326
* Low-level drivers use ib_register_device() to register their
13601327
* devices with the IB core. All registered clients will receive a
@@ -1365,14 +1332,16 @@ static void prevent_dealloc_device(struct ib_device *ib_dev)
13651332
* asynchronously then the device pointer may become freed as soon as this
13661333
* function returns.
13671334
*/
1368-
int ib_register_device(struct ib_device *device, const char *name)
1335+
int ib_register_device(struct ib_device *device, const char *name,
1336+
struct device *dma_device)
13691337
{
13701338
int ret;
13711339

13721340
ret = assign_name(device, name);
13731341
if (ret)
13741342
return ret;
13751343

1344+
setup_dma_device(device, dma_device);
13761345
ret = setup_device(device);
13771346
if (ret)
13781347
return ret;

drivers/infiniband/hw/bnxt_re/main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,8 @@ static int bnxt_re_register_ib(struct bnxt_re_dev *rdev)
736736
if (ret)
737737
return ret;
738738

739-
return ib_register_device(ibdev, "bnxt_re%d");
739+
dma_set_max_seg_size(&rdev->en_dev->pdev->dev, UINT_MAX);
740+
return ib_register_device(ibdev, "bnxt_re%d", &rdev->en_dev->pdev->dev);
740741
}
741742

742743
static void bnxt_re_dev_remove(struct bnxt_re_dev *rdev)

drivers/infiniband/hw/cxgb4/provider.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,9 @@ void c4iw_register_device(struct work_struct *work)
570570
ret = set_netdevs(&dev->ibdev, &dev->rdev);
571571
if (ret)
572572
goto err_dealloc_ctx;
573-
ret = ib_register_device(&dev->ibdev, "cxgb4_%d");
573+
dma_set_max_seg_size(&dev->rdev.lldi.pdev->dev, UINT_MAX);
574+
ret = ib_register_device(&dev->ibdev, "cxgb4_%d",
575+
&dev->rdev.lldi.pdev->dev);
574576
if (ret)
575577
goto err_dealloc_ctx;
576578
return;

drivers/infiniband/hw/efa/efa_main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ static int efa_ib_device_add(struct efa_dev *dev)
331331

332332
ib_set_device_ops(&dev->ibdev, &efa_dev_ops);
333333

334-
err = ib_register_device(&dev->ibdev, "efa_%d");
334+
err = ib_register_device(&dev->ibdev, "efa_%d", &pdev->dev);
335335
if (err)
336336
goto err_release_doorbell_bar;
337337

@@ -418,7 +418,7 @@ static int efa_device_init(struct efa_com_dev *edev, struct pci_dev *pdev)
418418
err);
419419
return err;
420420
}
421-
421+
dma_set_max_seg_size(&pdev->dev, UINT_MAX);
422422
return 0;
423423
}
424424

drivers/infiniband/hw/hns/hns_roce_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,8 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev)
549549
if (ret)
550550
return ret;
551551
}
552-
ret = ib_register_device(ib_dev, "hns_%d");
552+
dma_set_max_seg_size(dev, UINT_MAX);
553+
ret = ib_register_device(ib_dev, "hns_%d", dev);
553554
if (ret) {
554555
dev_err(dev, "ib_register_device failed!\n");
555556
return ret;

drivers/infiniband/hw/i40iw/i40iw_verbs.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2761,7 +2761,8 @@ int i40iw_register_rdma_device(struct i40iw_device *iwdev)
27612761
if (ret)
27622762
goto error;
27632763

2764-
ret = ib_register_device(&iwibdev->ibdev, "i40iw%d");
2764+
dma_set_max_seg_size(&iwdev->hw.pcidev->dev, UINT_MAX);
2765+
ret = ib_register_device(&iwibdev->ibdev, "i40iw%d", &iwdev->hw.pcidev->dev);
27652766
if (ret)
27662767
goto error;
27672768

drivers/infiniband/hw/mlx4/main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2841,7 +2841,8 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
28412841
goto err_steer_free_bitmap;
28422842

28432843
rdma_set_device_sysfs_group(&ibdev->ib_dev, &mlx4_attr_group);
2844-
if (ib_register_device(&ibdev->ib_dev, "mlx4_%d"))
2844+
if (ib_register_device(&ibdev->ib_dev, "mlx4_%d",
2845+
&dev->persist->pdev->dev))
28452846
goto err_diag_counters;
28462847

28472848
if (mlx4_ib_mad_init(ibdev))

drivers/infiniband/hw/mlx5/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4380,7 +4380,7 @@ static int mlx5_ib_stage_ib_reg_init(struct mlx5_ib_dev *dev)
43804380
name = "mlx5_%d";
43814381
else
43824382
name = "mlx5_bond_%d";
4383-
return ib_register_device(&dev->ib_dev, name);
4383+
return ib_register_device(&dev->ib_dev, name, &dev->mdev->pdev->dev);
43844384
}
43854385

43864386
static void mlx5_ib_stage_pre_ib_reg_umr_cleanup(struct mlx5_ib_dev *dev)

drivers/infiniband/hw/mthca/mthca_provider.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1206,7 +1206,7 @@ int mthca_register_device(struct mthca_dev *dev)
12061206
mutex_init(&dev->cap_mask_mutex);
12071207

12081208
rdma_set_device_sysfs_group(&dev->ib_dev, &mthca_attr_group);
1209-
ret = ib_register_device(&dev->ib_dev, "mthca%d");
1209+
ret = ib_register_device(&dev->ib_dev, "mthca%d", &dev->pdev->dev);
12101210
if (ret)
12111211
return ret;
12121212

drivers/infiniband/hw/ocrdma/ocrdma_main.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,9 @@ static int ocrdma_register_device(struct ocrdma_dev *dev)
255255
if (ret)
256256
return ret;
257257

258-
return ib_register_device(&dev->ibdev, "ocrdma%d");
258+
dma_set_max_seg_size(&dev->nic_info.pdev->dev, UINT_MAX);
259+
return ib_register_device(&dev->ibdev, "ocrdma%d",
260+
&dev->nic_info.pdev->dev);
259261
}
260262

261263
static int ocrdma_alloc_resources(struct ocrdma_dev *dev)

drivers/infiniband/hw/qedr/main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,8 @@ static int qedr_register_device(struct qedr_dev *dev)
293293
if (rc)
294294
return rc;
295295

296-
return ib_register_device(&dev->ibdev, "qedr%d");
296+
dma_set_max_seg_size(&dev->pdev->dev, UINT_MAX);
297+
return ib_register_device(&dev->ibdev, "qedr%d", &dev->pdev->dev);
297298
}
298299

299300
/* This function allocates fast-path status block memory */

drivers/infiniband/hw/usnic/usnic_ib_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,8 @@ static void *usnic_ib_device_add(struct pci_dev *dev)
425425
if (ret)
426426
goto err_fwd_dealloc;
427427

428-
if (ib_register_device(&us_ibdev->ib_dev, "usnic_%d"))
428+
dma_set_max_seg_size(&dev->dev, SZ_2G);
429+
if (ib_register_device(&us_ibdev->ib_dev, "usnic_%d", &dev->dev))
429430
goto err_fwd_dealloc;
430431

431432
usnic_fwd_set_mtu(us_ibdev->ufdev, us_ibdev->netdev->mtu);

drivers/infiniband/hw/vmw_pvrdma/pvrdma_main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ static int pvrdma_register_device(struct pvrdma_dev *dev)
270270
spin_lock_init(&dev->srq_tbl_lock);
271271
rdma_set_device_sysfs_group(&dev->ib_dev, &pvrdma_attr_group);
272272

273-
ret = ib_register_device(&dev->ib_dev, "vmw_pvrdma%d");
273+
ret = ib_register_device(&dev->ib_dev, "vmw_pvrdma%d", &dev->pdev->dev);
274274
if (ret)
275275
goto err_srq_free;
276276

@@ -854,7 +854,7 @@ static int pvrdma_pci_probe(struct pci_dev *pdev,
854854
goto err_free_resource;
855855
}
856856
}
857-
857+
dma_set_max_seg_size(&pdev->dev, UINT_MAX);
858858
pci_set_master(pdev);
859859

860860
/* Map register space */

drivers/infiniband/sw/rdmavt/vt.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,9 @@ int rvt_register_device(struct rvt_dev_info *rdi)
579579
spin_lock_init(&rdi->n_cqs_lock);
580580

581581
/* DMA Operations */
582-
rdi->ibdev.dev.dma_ops = rdi->ibdev.dev.dma_ops ? : &dma_virt_ops;
582+
rdi->ibdev.dev.dma_parms = rdi->ibdev.dev.parent->dma_parms;
583+
dma_set_coherent_mask(&rdi->ibdev.dev,
584+
rdi->ibdev.dev.parent->coherent_dma_mask);
583585

584586
/* Protection Domain */
585587
spin_lock_init(&rdi->n_pds_lock);
@@ -627,7 +629,7 @@ int rvt_register_device(struct rvt_dev_info *rdi)
627629
rdi->ibdev.num_comp_vectors = 1;
628630

629631
/* We are now good to announce we exist */
630-
ret = ib_register_device(&rdi->ibdev, dev_name(&rdi->ibdev.dev));
632+
ret = ib_register_device(&rdi->ibdev, dev_name(&rdi->ibdev.dev), NULL);
631633
if (ret) {
632634
rvt_pr_err(rdi, "Failed to register driver with ib core.\n");
633635
goto bail_wss;

drivers/infiniband/sw/rxe/rxe_verbs.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,12 +1128,9 @@ int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name)
11281128
dev->local_dma_lkey = 0;
11291129
addrconf_addr_eui48((unsigned char *)&dev->node_guid,
11301130
rxe->ndev->dev_addr);
1131-
dev->dev.dma_ops = &dma_virt_ops;
11321131
dev->dev.dma_parms = &rxe->dma_parms;
1133-
rxe->dma_parms = (struct device_dma_parameters)
1134-
{ .max_segment_size = SZ_2G };
1135-
dma_coerce_mask_and_coherent(&dev->dev,
1136-
dma_get_required_mask(&dev->dev));
1132+
dma_set_max_seg_size(&dev->dev, UINT_MAX);
1133+
dma_set_coherent_mask(&dev->dev, dma_get_required_mask(&dev->dev));
11371134

11381135
dev->uverbs_cmd_mask = BIT_ULL(IB_USER_VERBS_CMD_GET_CONTEXT)
11391136
| BIT_ULL(IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL)
@@ -1182,7 +1179,7 @@ int rxe_register_device(struct rxe_dev *rxe, const char *ibdev_name)
11821179
rxe->tfm = tfm;
11831180

11841181
rdma_set_device_sysfs_group(dev, &rxe_attr_group);
1185-
err = ib_register_device(dev, ibdev_name);
1182+
err = ib_register_device(dev, ibdev_name, NULL);
11861183
if (err)
11871184
pr_warn("%s failed with error %d\n", __func__, err);
11881185

drivers/infiniband/sw/siw/siw_main.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ static int siw_device_register(struct siw_device *sdev, const char *name)
6969

7070
sdev->vendor_part_id = dev_id++;
7171

72-
rv = ib_register_device(base_dev, name);
72+
rv = ib_register_device(base_dev, name, NULL);
7373
if (rv) {
7474
pr_warn("siw: device registration error %d\n", rv);
7575
return rv;
@@ -382,10 +382,10 @@ static struct siw_device *siw_device_create(struct net_device *netdev)
382382
*/
383383
base_dev->phys_port_cnt = 1;
384384
base_dev->dev.parent = parent;
385-
base_dev->dev.dma_ops = &dma_virt_ops;
386385
base_dev->dev.dma_parms = &sdev->dma_parms;
387-
sdev->dma_parms = (struct device_dma_parameters)
388-
{ .max_segment_size = SZ_2G };
386+
dma_set_max_seg_size(&base_dev->dev, UINT_MAX);
387+
dma_set_coherent_mask(&base_dev->dev,
388+
dma_get_required_mask(&base_dev->dev));
389389
base_dev->num_comp_vectors = num_possible_cpus();
390390

391391
xa_init_flags(&sdev->qp_xa, XA_FLAGS_ALLOC1);

include/rdma/ib_verbs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2782,7 +2782,8 @@ void ib_dealloc_device(struct ib_device *device);
27822782

27832783
void ib_get_device_fw_str(struct ib_device *device, char *str);
27842784

2785-
int ib_register_device(struct ib_device *device, const char *name);
2785+
int ib_register_device(struct ib_device *device, const char *name,
2786+
struct device *dma_device);
27862787
void ib_unregister_device(struct ib_device *device);
27872788
void ib_unregister_driver(enum rdma_driver_id driver_id);
27882789
void ib_unregister_device_and_put(struct ib_device *device);

0 commit comments

Comments
 (0)