From: Damien Le Moal <dlemoal@kernel.org>
To: Rick Wertenbroek <rick.wertenbroek@gmail.com>,
rick.wertenbroek@heig-vd.ch
Cc: alberto.dassatti@heig-vd.ch,
"Manivannan Sadhasivam" <manivannan.sadhasivam@linaro.org>,
"Krzysztof Wilczyński" <kw@linux.com>,
"Kishon Vijay Abraham I" <kishon@kernel.org>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Niklas Cassel" <cassel@kernel.org>,
"Frank Li" <Frank.Li@nxp.com>,
"Lars-Peter Clausen" <lars@metafoo.de>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] PCI: endpoint: pci-epf-test: Move DMA check into read/write/copy functions
Date: Wed, 7 Aug 2024 09:08:29 -0700 [thread overview]
Message-ID: <7a44e4cb-9f91-47e3-badc-8c6d406d1ea0@kernel.org> (raw)
In-Reply-To: <20240806162756.607002-1-rick.wertenbroek@gmail.com>
On 2024/08/06 9:27, Rick Wertenbroek wrote:
> The test for a DMA transfer was done in pci_epf_test_cmd_handler, which
> if not supported would lead to the endpoint function just printing an
> error message and waiting for further commands. This would leave the
> host side PCI driver waiting for an interrupt because the call to
> pci_epf_test_raise_irq is skipped. The host side driver
> drivers/misc/pci_endpoint_test.c would hang indefinitely when sending
> a transfer request with DMA if the endpoint does not support it.
> This is because wait_for_completion() is used in the host side driver.
>
> Move the DMA check into the read/write/copy functions so that they
> report a transfer (IO) error so that pci_epf_test_raise_irq() is
> called when a transfer with DMA is requested, even if unsupported.
>
> The host side driver will still report an error on transfer thanks
> to the checksum, because no data was moved, but will not hang anymore
> waiting for an interrupt that will never arrive.
>
> Signed-off-by: Rick Wertenbroek <rick.wertenbroek@gmail.com>
> ---
> drivers/pci/endpoint/functions/pci-epf-test.c | 29 +++++++++++++++----
> 1 file changed, 23 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
> index 7c2ed6eae53a..bd4b37f46f41 100644
> --- a/drivers/pci/endpoint/functions/pci-epf-test.c
> +++ b/drivers/pci/endpoint/functions/pci-epf-test.c
> @@ -314,6 +314,17 @@ static void pci_epf_test_print_rate(struct pci_epf_test *epf_test,
> (u64)ts.tv_sec, (u32)ts.tv_nsec, rate);
> }
>
> +static int pci_epf_test_check_dma(struct pci_epf_test *epf_test,
> + struct pci_epf_test_reg *reg)
> +{
> + if ((READ_ONCE(reg->flags) & FLAG_USE_DMA) &&
> + !epf_test->dma_supported) {
> + dev_err(&epf_test->epf->dev, "Cannot transfer data using DMA\n");
While at it, can we change this message to be clear, e.g. "DMA not supported".
"Cannot ..." is vague and does not state the reason why it cannot be done :)
> + return -EIO;
> + }
> + return 0;
> +}
> +
> static void pci_epf_test_copy(struct pci_epf_test *epf_test,
> struct pci_epf_test_reg *reg)
> {
> @@ -327,6 +338,10 @@ static void pci_epf_test_copy(struct pci_epf_test *epf_test,
> struct device *dev = &epf->dev;
> struct pci_epc *epc = epf->epc;
>
> + ret = pci_epf_test_check_dma(epf_test, reg);
> + if (ret)
> + goto err;
> +
> src_addr = pci_epc_mem_alloc_addr(epc, &src_phys_addr, reg->size);
> if (!src_addr) {
> dev_err(dev, "Failed to allocate source address\n");
> @@ -423,6 +438,10 @@ static void pci_epf_test_read(struct pci_epf_test *epf_test,
> struct pci_epc *epc = epf->epc;
> struct device *dma_dev = epf->epc->dev.parent;
>
> + ret = pci_epf_test_check_dma(epf_test, reg);
> + if (ret)
> + goto err;
> +
> src_addr = pci_epc_mem_alloc_addr(epc, &phys_addr, reg->size);
> if (!src_addr) {
> dev_err(dev, "Failed to allocate address\n");
> @@ -507,6 +526,10 @@ static void pci_epf_test_write(struct pci_epf_test *epf_test,
> struct pci_epc *epc = epf->epc;
> struct device *dma_dev = epf->epc->dev.parent;
>
> + ret = pci_epf_test_check_dma(epf_test, reg);
> + if (ret)
> + goto err;
> +
> dst_addr = pci_epc_mem_alloc_addr(epc, &phys_addr, reg->size);
> if (!dst_addr) {
> dev_err(dev, "Failed to allocate address\n");
> @@ -647,12 +670,6 @@ static void pci_epf_test_cmd_handler(struct work_struct *work)
> WRITE_ONCE(reg->command, 0);
> WRITE_ONCE(reg->status, 0);
>
> - if ((READ_ONCE(reg->flags) & FLAG_USE_DMA) &&
> - !epf_test->dma_supported) {
> - dev_err(dev, "Cannot transfer data using DMA\n");
> - goto reset_handler;
> - }
> -
> if (reg->irq_type > IRQ_TYPE_MSIX) {
> dev_err(dev, "Failed to detect IRQ type\n");
> goto reset_handler;
--
Damien Le Moal
Western Digital Research
next prev parent reply other threads:[~2024-08-07 16:08 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-06 16:27 [PATCH] PCI: endpoint: pci-epf-test: Move DMA check into read/write/copy functions Rick Wertenbroek
2024-08-06 19:15 ` Bjorn Helgaas
2024-08-09 6:56 ` Rick Wertenbroek
2024-08-09 18:41 ` Bjorn Helgaas
2024-08-07 16:08 ` Damien Le Moal [this message]
2024-08-09 6:58 ` Rick Wertenbroek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7a44e4cb-9f91-47e3-badc-8c6d406d1ea0@kernel.org \
--to=dlemoal@kernel.org \
--cc=Frank.Li@nxp.com \
--cc=alberto.dassatti@heig-vd.ch \
--cc=bhelgaas@google.com \
--cc=cassel@kernel.org \
--cc=kishon@kernel.org \
--cc=kw@linux.com \
--cc=lars@metafoo.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=manivannan.sadhasivam@linaro.org \
--cc=rick.wertenbroek@gmail.com \
--cc=rick.wertenbroek@heig-vd.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.