Re: [v8] misc: pci_endpoint_test: Fix overflow of bar_size

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

 



On Tue, Jan 07, 2025 at 07:43:26PM +0800, Hans Zhang wrote:
> 
> 
> On 2025/1/7 19:33, Niklas Cassel wrote:
> > > Hi Niklas,
> > > 
> > > resource_size_t bar_size;
> > > remain = do_div((u64)bar_size, buf_size);
> > > 
> > > It works for the arm platform.
> > > 
> > > arch/arm/include/asm/div64.h
> > > static inline uint32_t __div64_32(uint64_t *n, uint32_t base)
> > > {
> > > 	register unsigned int __base      asm("r4") = base;
> > > 	register unsigned long long __n   asm("r0") = *n;
> > > 	register unsigned long long __res asm("r2");
> > > 	unsigned int __rem;
> > > 	asm(	__asmeq("%0", "r0")
> > > 		__asmeq("%1", "r2")
> > > 		__asmeq("%2", "r4")
> > > 		"bl	__do_div64"
> > > 		: "+r" (__n), "=r" (__res)
> > > 		: "r" (__base)
> > > 		: "ip", "lr", "cc");
> > > 	__rem = __n >> 32;
> > > 	*n = __res;
> > > 	return __rem;
> > > }
> > > #define __div64_32 __div64_32
> > > 
> > > #define do_div(n, base) __div64_32(&(n), base)
> > > 
> > > 
> > > For X86 platforms, do_div is a macro definition, and the first parameter
> > > does not define its type. If the macro definition is replaced directly, an
> > > error will be reported in the ubuntu20.04 release.
> > 
> > What is the error?
> > 
> > We don't need to use do_div().
> > The current code that does normal / and % works fine on both
> > 32-bit and 64-bit if you just do:
> > 
> >   static bool pci_endpoint_test_bar(struct pci_endpoint_test *test,
> >                                    enum pci_barno barno)
> >   {
> > -       int j, bar_size, buf_size, iters, remain;
> > +       int j, buf_size, iters, remain;
> >          void *write_buf __free(kfree) = NULL;
> >          void *read_buf __free(kfree) = NULL;
> >          struct pci_dev *pdev = test->pdev;
> > +       u64 bar_size;
> > 
> > No?
> 
> 
> Hi Niklas,
> 
> Please look at the robot compilation error.
> 
> https://patchwork.kernel.org/project/linux-pci/patch/20241231065500.168799-1-18255117159@xxxxxxx/
> 
> drivers/misc/pci_endpoint_test.c:315: undefined reference to `__udivmoddi4'

That error was for your patch that changed bar_size to resource_size_t,
which is typedefed to phys_addr_t, which can be either 32-bits or 64-bits
on 32-bit systems (depending on CONFIG_X86_PAE).

I was suggesting to just change it to u64, so it will unconditionally be
64-bits.


Kind regards,
Niklas




[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