Hello Paul, On Thu, Jun 20, 2019 at 05:40:04PM +0000, Paul Burton wrote: > Hi Serge, > > On Fri, Jun 14, 2019 at 09:33:42AM +0300, Serge Semin wrote: > > There are some generic drivers in the kernel, which make use of the > > q-accessors or their derivatives. While at current asm/io.h the accessors > > are defined, their implementation is only applicable either for 64bit > > systems, or for systems with cpu_has_64bits flag set. Obviously there > > are MIPS systems which are neither of these, but still need to have > > those drivers supported. In this case the solution is to define some > > generic versions of the q-accessors, but with a limitation to be > > non-atomic. Such accessors are defined in the > > io-64-nonatomic-{hi-lo,lo-hi}.h file. The drivers which utilize the > > q-suffixed IO-methods are supposed to include the header file, so > > in case if these accessors aren't defined for the platform, the generic > > non-atomic versions are utilized. Currently the MIPS-specific asm/io.h > > file provides the q-accessors for any MIPS system even for ones, which > > in fact don't support them and raise BUG() in case if any of them is > > called. Due to this the generic versions of the accessors are never > > used while an attempt to call the IO-methods causes the kernel BUG(). > > In order to fix this we need to define the q-accessors only for > > the MIPS systems, which actually support them, and don't define them > > otherwise, so to let the corresponding drivers to use the non-atomic > > q-suffixed accessors. > > > > Signed-off-by: Serge Semin <fancer.lan...@gmail.com> > > Suggested-by: Arnd Bergmann <a...@arndb.de> > > Cc: Vadim V. Vlasov <vadim.vla...@t-platforms.ru> > > --- > > arch/mips/include/asm/io.h | 11 +++++++++++ > > 1 file changed, 11 insertions(+) > > So this seems pretty reasonable. Build testing all our defconfigs only > showed up one issue for decstation_defconfig & decstation_r4k_defconfig: > > drivers/net/fddi/defza.c: In function 'fza_reads': > drivers/net/fddi/defza.c:88:17: error: implicit declaration of > function 'readq_relaxed'; did you mean 'readw_relaxed'? > [-Werror=implicit-function-declaration] > #define readq_u readq_relaxed > ^~~~~~~~~~~~~ > drivers/net/fddi/defza.c:126:13: note: in expansion of macro 'readq_u' > *dst++ = readq_u(src++); > ^~~~~~~ > drivers/net/fddi/defza.c: In function 'fza_writes': > drivers/net/fddi/defza.c:92:18: error: implicit declaration of > function 'writeq_relaxed'; did you mean 'writel_relaxed'? > [-Werror=implicit-function-declaration] > #define writeq_u writeq_relaxed > ^~~~~~~~~~~~~~ > drivers/net/fddi/defza.c:151:4: note: in expansion of macro 'writeq_u' > writeq_u(*src++, dst++); > ^~~~~~~~ > CC net/core/scm.o > cc1: some warnings being treated as errors > make[4]: *** [scripts/Makefile.build:279: drivers/net/fddi/defza.o] Error 1 >
Thanks for review and testing this for each target. I see you and Maciej already agreed regarding the solution, and you even sent the fixup. So I don't have to send the v2 patch.) Regards, -Sergey > These uses of readq_relaxed & writeq_relaxed are both conditional upon > sizeof(unsigned long) == 8, ie. upon CONFIG_64BIT=y so they're not going > to present a runtime issue but we need to provide some implementation of > the *q accessors to keep the compiler happy. > > I see a few options: > > 1) We could just have defza.c include <io-64-nonatomic-lo-hi.h> to get > the appropriate declarations, which should then get optimized away by > the compiler anyway & never actually be used. > > 2) We could have defza.h #define its readq_u & writeq_u macros > differently for CONFIG_32BIT=y kernels, perhaps using > __compiletime_error to catch any bogus use of them. > > 3) We could do the same in a generic header, though if nobody else has > needed it so far & this is the only place we need it then maybe it's > not worth it. > > So I'm thinking option 2 might be best, as below. Having said that I > don't mind option 1 either - it's simple. Maciej do you have any > preference? > > Thanks, > Paul > > --- > diff --git a/drivers/net/fddi/defza.c b/drivers/net/fddi/defza.c > index c5cae8e74dc4..85d6a7f22fe7 100644 > --- a/drivers/net/fddi/defza.c > +++ b/drivers/net/fddi/defza.c > @@ -85,11 +85,21 @@ static u8 hw_addr_beacon[8] = { 0x01, 0x80, 0xc2, 0x00, > 0x01, 0x00 }; > */ > #define readw_u readw_relaxed > #define readl_u readl_relaxed > -#define readq_u readq_relaxed > > #define writew_u writew_relaxed > #define writel_u writel_relaxed > -#define writeq_u writeq_relaxed > + > +#ifdef CONFIG_32BIT > +extern u64 defza_readq_u(const void *ptr) > + __compiletime_error("readq_u should not be used by 32b kernels"); > +extern void defza_writeq_u(u64 val, void *ptr) > + __compiletime_error("writeq_u should not be used by 32b kernels"); > +# define readq_u defza_readq_u > +# define writeq_u defza_writeq_u > +#else > +# define readq_u readq_relaxed > +# define writeq_u writeq_relaxed > +#endif > > static inline struct sk_buff *fza_alloc_skb_irq(struct net_device *dev, > unsigned int length) >