Commit b021d05e authored by Brett Creeley's avatar Brett Creeley Committed by Alex Williamson
Browse files

pds_core: Require callers of register/unregister to pass PF drvdata



Pass a pointer to the PF's private data structure rather than
bouncing in and out of the PF's PCI function address.

Signed-off-by: default avatarShannon Nelson <shannon.nelson@amd.com>
Signed-off-by: default avatarBrett Creeley <brett.creeley@amd.com>
Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Reviewed-by: default avatarShameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/20230807205755.29579-4-brett.creeley@amd.com


Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 38fe3975
Loading
Loading
Loading
Loading
+5 −15
Original line number Diff line number Diff line
@@ -14,18 +14,13 @@
 * Return: 0 on success, or
 *         negative for error
 */
int pds_client_register(struct pci_dev *pf_pdev, char *devname)
int pds_client_register(struct pdsc *pf, char *devname)
{
	union pds_core_adminq_comp comp = {};
	union pds_core_adminq_cmd cmd = {};
	struct pdsc *pf;
	int err;
	u16 ci;

	pf = pci_get_drvdata(pf_pdev);
	if (pf->state)
		return -ENXIO;

	cmd.client_reg.opcode = PDS_AQ_CMD_CLIENT_REG;
	strscpy(cmd.client_reg.devname, devname,
		sizeof(cmd.client_reg.devname));
@@ -59,17 +54,12 @@ EXPORT_SYMBOL_GPL(pds_client_register);
 * Return: 0 on success, or
 *         negative for error
 */
int pds_client_unregister(struct pci_dev *pf_pdev, u16 client_id)
int pds_client_unregister(struct pdsc *pf, u16 client_id)
{
	union pds_core_adminq_comp comp = {};
	union pds_core_adminq_cmd cmd = {};
	struct pdsc *pf;
	int err;

	pf = pci_get_drvdata(pf_pdev);
	if (pf->state)
		return -ENXIO;

	cmd.client_unreg.opcode = PDS_AQ_CMD_CLIENT_UNREG;
	cmd.client_unreg.client_id = cpu_to_le16(client_id);

@@ -198,7 +188,7 @@ int pdsc_auxbus_dev_del(struct pdsc *cf, struct pdsc *pf)

	padev = pf->vfs[cf->vf_id].padev;
	if (padev) {
		pds_client_unregister(pf->pdev, padev->client_id);
		pds_client_unregister(pf, padev->client_id);
		auxiliary_device_delete(&padev->aux_dev);
		auxiliary_device_uninit(&padev->aux_dev);
		padev->client_id = 0;
@@ -243,7 +233,7 @@ int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf)
	 */
	snprintf(devname, sizeof(devname), "%s.%s.%d",
		 PDS_CORE_DRV_NAME, pf->viftype_status[vt].name, cf->uid);
	client_id = pds_client_register(pf->pdev, devname);
	client_id = pds_client_register(pf, devname);
	if (client_id < 0) {
		err = client_id;
		goto out_unlock;
@@ -252,7 +242,7 @@ int pdsc_auxbus_dev_add(struct pdsc *cf, struct pdsc *pf)
	padev = pdsc_auxbus_dev_register(cf, pf, client_id,
					 pf->viftype_status[vt].name);
	if (IS_ERR(padev)) {
		pds_client_unregister(pf->pdev, client_id);
		pds_client_unregister(pf, client_id);
		err = PTR_ERR(padev);
		goto out_unlock;
	}
+4 −2
Original line number Diff line number Diff line
@@ -41,9 +41,11 @@ enum pds_core_vif_types {

#define PDS_VDPA_DEV_NAME	PDS_CORE_DRV_NAME "." PDS_DEV_TYPE_VDPA_STR

struct pdsc;

int pdsc_register_notify(struct notifier_block *nb);
void pdsc_unregister_notify(struct notifier_block *nb);
void *pdsc_get_pf_struct(struct pci_dev *vf_pdev);
int pds_client_register(struct pci_dev *pf_pdev, char *devname);
int pds_client_unregister(struct pci_dev *pf_pdev, u16 client_id);
int pds_client_register(struct pdsc *pf, char *devname);
int pds_client_unregister(struct pdsc *pf, u16 client_id);
#endif /* _PDS_COMMON_H_ */