Re: [PATCH] misc: pci_endpoint_test: Defer IRQ allocation until ioctl(PCITEST_SET_IRQTYPE)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Apr 02, 2025 at 10:57:00AM +0200, Niklas Cassel wrote:
> Commit a402006d48a9 ("misc: pci_endpoint_test: Remove global 'irq_type'
> and 'no_msi'") changed so that the default IRQ vector requested by
> pci_endpoint_test_probe() was no longer the module param 'irq_type',
> but instead test->irq_type. test->irq_type is by default
> IRQ_TYPE_UNDEFINED (until someone calls ioctl(PCITEST_SET_IRQTYPE)).
>
> However, the commit also changed so that after initializing test->irq_type
> to IRQ_TYPE_UNDEFINED, it also overrides it with driver_data->irq_type, if
> the PCI device and vendor ID provides driver_data.
>
> This causes a regression for PCI device and vendor IDs that do not provide
> driver_data, and the driver now fails to probe on such platforms.
>
> Considering that the pci endpoint selftests and the old pcitest always
> call ioctl(PCITEST_SET_IRQTYPE)

Maybe my pcitest is too old. "pcitest -r" have not call ioctl(PCITEST_SET_IRQTYPE).
I need run "pcitest -i 1" firstly. It'd better remove pcitest information
because pcitest already was removed from git tree. and now pcitest always
show NOT OKAY.

> before performing any test that requires
> IRQs, simply remove the allocation of IRQs in pci_endpoint_test_probe(),
> and defer it until ioctl(PCITEST_SET_IRQTYPE) has been called.
>
> A positive side effect of this is that even if the endpoint controller has
> issues with IRQs, the user can do still do all the tests/ioctls() that do
> not require working IRQs, e.g. PCITEST_BAR and PCITEST_BARS.
>
> This also means that we can remove the now unused irq_type from
> driver_data. The irq_type will always be the one configured by the user
> using ioctl(PCITEST_SET_IRQTYPE). (A user that does not know, or care
> which irq_type that is used, can use PCITEST_IRQ_TYPE_AUTO. This has
> superseded the need for a default irq_type in driver_data.)

But you remove "irq_type" at driver_data, does it means PCITEST_IRQ_TYPE_AUTO
will not be supported?

Frank

>
> Fixes: a402006d48a9c ("misc: pci_endpoint_test: Remove global 'irq_type' and 'no_msi'")
> Signed-off-by: Niklas Cassel <cassel@xxxxxxxxxx>
> ---
>  drivers/misc/pci_endpoint_test.c | 21 +--------------------
>  1 file changed, 1 insertion(+), 20 deletions(-)
>
> diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c
> index d294850a35a1..c4e5e2c977be 100644
> --- a/drivers/misc/pci_endpoint_test.c
> +++ b/drivers/misc/pci_endpoint_test.c
> @@ -122,7 +122,6 @@ struct pci_endpoint_test {
>  struct pci_endpoint_test_data {
>  	enum pci_barno test_reg_bar;
>  	size_t alignment;
> -	int irq_type;
>  };
>
>  static inline u32 pci_endpoint_test_readl(struct pci_endpoint_test *test,
> @@ -948,7 +947,6 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
>  		test_reg_bar = data->test_reg_bar;
>  		test->test_reg_bar = test_reg_bar;
>  		test->alignment = data->alignment;
> -		test->irq_type = data->irq_type;
>  	}
>
>  	init_completion(&test->irq_raised);
> @@ -970,10 +968,6 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
>
>  	pci_set_master(pdev);
>
> -	ret = pci_endpoint_test_alloc_irq_vectors(test, test->irq_type);
> -	if (ret)
> -		goto err_disable_irq;
> -
>  	for (bar = 0; bar < PCI_STD_NUM_BARS; bar++) {
>  		if (pci_resource_flags(pdev, bar) & IORESOURCE_MEM) {
>  			base = pci_ioremap_bar(pdev, bar);
> @@ -1009,10 +1003,6 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
>  		goto err_ida_remove;
>  	}
>
> -	ret = pci_endpoint_test_request_irq(test);
> -	if (ret)
> -		goto err_kfree_test_name;
> -
>  	pci_endpoint_test_get_capabilities(test);
>
>  	misc_device = &test->miscdev;
> @@ -1020,7 +1010,7 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
>  	misc_device->name = kstrdup(name, GFP_KERNEL);
>  	if (!misc_device->name) {
>  		ret = -ENOMEM;
> -		goto err_release_irq;
> +		goto err_kfree_test_name;
>  	}
>  	misc_device->parent = &pdev->dev;
>  	misc_device->fops = &pci_endpoint_test_fops;
> @@ -1036,9 +1026,6 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
>  err_kfree_name:
>  	kfree(misc_device->name);
>
> -err_release_irq:
> -	pci_endpoint_test_release_irq(test);
> -
>  err_kfree_test_name:
>  	kfree(test->name);
>
> @@ -1051,8 +1038,6 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
>  			pci_iounmap(pdev, test->bar[bar]);
>  	}
>
> -err_disable_irq:
> -	pci_endpoint_test_free_irq_vectors(test);
>  	pci_release_regions(pdev);
>
>  err_disable_pdev:
> @@ -1092,23 +1077,19 @@ static void pci_endpoint_test_remove(struct pci_dev *pdev)
>  static const struct pci_endpoint_test_data default_data = {
>  	.test_reg_bar = BAR_0,
>  	.alignment = SZ_4K,
> -	.irq_type = PCITEST_IRQ_TYPE_MSI,
>  };
>
>  static const struct pci_endpoint_test_data am654_data = {
>  	.test_reg_bar = BAR_2,
>  	.alignment = SZ_64K,
> -	.irq_type = PCITEST_IRQ_TYPE_MSI,
>  };
>
>  static const struct pci_endpoint_test_data j721e_data = {
>  	.alignment = 256,
> -	.irq_type = PCITEST_IRQ_TYPE_MSI,
>  };
>
>  static const struct pci_endpoint_test_data rk3588_data = {
>  	.alignment = SZ_64K,
> -	.irq_type = PCITEST_IRQ_TYPE_MSI,
>  };
>
>  /*
> --
> 2.49.0
>




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux