From: Niklas Cassel <cassel@kernel.org>
To: Frank Li <Frank.li@nxp.com>
Cc: "Manivannan Sadhasivam" <manivannan.sadhasivam@linaro.org>,
"Krzysztof Wilczyński" <kw@linux.com>,
"Kishon Vijay Abraham I" <kishon@kernel.org>,
"Arnd Bergmann" <arnd@arndb.de>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Jon Hunter" <jonathanh@nvidia.com>,
"Hans Zhang" <18255117159@163.com>,
linux-pci@vger.kernel.org
Subject: Re: [PATCH] misc: pci_endpoint_test: Handle BAR sizes larger than INT_MAX
Date: Thu, 23 Jan 2025 19:35:06 +0100 [thread overview]
Message-ID: <Z5KL2o0hREaVDiTC@ryzen> (raw)
In-Reply-To: <Z5JmK3tAtNi2K2bO@lizhi-Precision-Tower-5810>
On Thu, Jan 23, 2025 at 10:54:19AM -0500, Frank Li wrote:
> On Thu, Jan 23, 2025 at 10:59:07AM +0100, Niklas Cassel wrote:
> > Running 'pcitest -b 0' fails with "TEST FAILED" when the BAR0 size
> > is e.g. 8 GB.
> >
> > The return value of the pci_resource_len() macro can be larger than that
> > of a signed integer type. Thus, when using 'pcitest' with an 8 GB BAR,
> > the bar_size of the integer type will overflow.
> >
> > Change bar_size from integer to resource_size_t to prevent integer
> > overflow for large BAR sizes with 32-bit compilers.
> >
> > Co-developed-by: Hans Zhang <18255117159@163.com>
> > Signed-off-by: Hans Zhang <18255117159@163.com>
> > Signed-off-by: Niklas Cassel <cassel@kernel.org>
> > ---
> > Hans submitted a patch for this that was reverted because apparently some
> > gcc-7 arm32 compiler doesn't like div_u64(). In order to avoid debugging
> > gcc-7 arm32 compiler issues, simply replace the division with addition,
> > which arguably makes the code simpler as well.
> >
> > drivers/misc/pci_endpoint_test.c | 18 ++++++++++--------
> > 1 file changed, 10 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c
> > index d5ac71a49386..8e48a15100f1 100644
> > --- a/drivers/misc/pci_endpoint_test.c
> > +++ b/drivers/misc/pci_endpoint_test.c
> > @@ -272,9 +272,9 @@ static const u32 bar_test_pattern[] = {
> > };
> >
> > static int pci_endpoint_test_bar_memcmp(struct pci_endpoint_test *test,
> > - enum pci_barno barno, int offset,
> > - void *write_buf, void *read_buf,
> > - int size)
> > + enum pci_barno barno,
> > + resource_size_t offset, void *write_buf,
> > + void *read_buf, int size)
> > {
> > memset(write_buf, bar_test_pattern[barno], size);
> > memcpy_toio(test->bar[barno] + offset, write_buf, size);
> > @@ -287,10 +287,11 @@ static int pci_endpoint_test_bar_memcmp(struct pci_endpoint_test *test,
> > static int pci_endpoint_test_bar(struct pci_endpoint_test *test,
> > enum pci_barno barno)
> > {
> > - int j, bar_size, buf_size, iters;
> > + resource_size_t bar_size, offset = 0;
> > void *write_buf __free(kfree) = NULL;
> > void *read_buf __free(kfree) = NULL;
> > struct pci_dev *pdev = test->pdev;
> > + int buf_size;
> >
> > if (!test->bar[barno])
> > return -ENOMEM;
> > @@ -314,11 +315,12 @@ static int pci_endpoint_test_bar(struct pci_endpoint_test *test,
> > if (!read_buf)
> > return -ENOMEM;
> >
> > - iters = bar_size / buf_size;
> > - for (j = 0; j < iters; j++)
> > - if (pci_endpoint_test_bar_memcmp(test, barno, buf_size * j,
> > - write_buf, read_buf, buf_size))
> > + while (offset < bar_size) {
> > + if (pci_endpoint_test_bar_memcmp(test, barno, offset, write_buf,
> > + read_buf, buf_size))
> > return -EIO;
> > + offset += buf_size;
> > + }
>
> Actually, you change code logic although functionality is the same. I feel
> like you should mention at commit message or use origial code by just
> change variable type.
>
> #ifdef CONFIG_PHYS_ADDR_T_64BIT
> typedef u64 phys_addr_t;
> #else
> typedef u32 phys_addr_t;
> #endif
Hello Frank,
I personally think that is a horrible idea :)
We do not want to introduce ifdefs in the middle of the code, unless
in exceptional circumstances, like architecture specific optimized code.
Kind regards,
Niklas
next prev parent reply other threads:[~2025-01-23 18:35 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-23 9:59 [PATCH] misc: pci_endpoint_test: Handle BAR sizes larger than INT_MAX Niklas Cassel
2025-01-23 15:54 ` Frank Li
2025-01-23 18:35 ` Niklas Cassel [this message]
2025-01-23 19:09 ` Frank Li
2025-01-24 9:29 ` Niklas Cassel
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=Z5KL2o0hREaVDiTC@ryzen \
--to=cassel@kernel.org \
--cc=18255117159@163.com \
--cc=Frank.li@nxp.com \
--cc=arnd@arndb.de \
--cc=gregkh@linuxfoundation.org \
--cc=jonathanh@nvidia.com \
--cc=kishon@kernel.org \
--cc=kw@linux.com \
--cc=linux-pci@vger.kernel.org \
--cc=manivannan.sadhasivam@linaro.org \
/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.