On Saturday 30 May 2015 14:39:48 Dan Williams wrote: > On Sat, May 30, 2015 at 2:00 PM, Arnd Bergmann <arnd@xxxxxxxx> wrote: > > On Saturday 30 May 2015, Dan Williams wrote: > >> > >> +/* > >> + * memremap() is "ioremap" for cases where it is known that the resource > >> + * being mapped does not have i/o side effects and the __iomem > >> + * annotation is not applicable. > >> + */ > >> + > >> +static inline void *memremap(resource_size_t offset, size_t size) > >> +{ > >> + return (void __force *) ioremap(offset, size); > >> +} > >> + > >> +static inline void *memremap_nocache(resource_size_t offset, size_t size) > >> +{ > >> + return (void __force *) ioremap_nocache(offset, size); > >> +} > >> + > >> +static inline void *memremap_cache(resource_size_t offset, size_t size) > >> +{ > >> + return (void __force *) ioremap_cache(offset, size); > >> +} > >> + > > > > There are architectures on which the result of ioremap is not necessarily > > a pointer, but instead indicates that the access is to be done through > > some other indirect access, or require special instructions. I think implementing > > the memremap() interfaces is generally helpful, but don't rely on the > > ioremap implementation. > > Is it enough to detect the archs where ioremap() does return an > otherwise usable pointer and set ARCH_HAS_MEMREMAP, in the first take > of this introduction? Regardless, it seems that drivers should have > Kconfig dependency checks for archs where ioremap can not be used in > this manner. Yes, that should work. > > Adding both cached an uncached versions is also dangerous, because you > > typically get either undefined behavior or a system checkstop when a > > single page is mapped both cached and uncached at the same time. This > > means that doing memremap() or memremap_nocache() on something that > > may be part of the linear kernel mapping is a bug, and we should probably > > check for that here. > > Part of the reason for relying on ioremap() was to borrow its internal > checks to fail attempts that try to remap ranges that are already in > the kernel linear map. Hmm, that's a guarantee x86 ioremap gives, but > maybe that's not universal? I haven't seen that check elsewhere. IIRC what ioremap() guarantees on ARM is that if there is an existing boot-time mapping (similar to x86 fixmap, but more commonly used), we use the same flags in the new ioremap and override the ones that are provided by the caller. Arnd -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>