io_uring/parisc: Adjust pgoff in io_uring mmap() for parisc
The changes from commit32832a407a
("io_uring: Fix io_uring mmap() by using architecture-provided get_unmapped_area()") to the parisc implementation of get_unmapped_area() broke glibc's locale-gen executable when running on parisc. This patch reverts those architecture-specific changes, and instead adjusts in io_uring_mmu_get_unmapped_area() the pgoff offset which is then given to parisc's get_unmapped_area() function. This is much cleaner than the previous approach, and we still will get a coherent addresss. This patch has no effect on other architectures (SHM_COLOUR is only defined on parisc), and the liburing testcase stil passes on parisc. Cc: stable@vger.kernel.org # 6.4 Signed-off-by: Helge Deller <deller@gmx.de> Reported-by: Christoph Biedl <linux-kernel.bfrz@manchmal.in-ulm.de> Fixes:32832a407a
("io_uring: Fix io_uring mmap() by using architecture-provided get_unmapped_area()") Fixes:d808459b2e
("io_uring: Adjust mapping wrt architecture aliasing requirements") Link: https://lore.kernel.org/r/ZNEyGV0jyI8kOOfz@p100 Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
72dbde0f2a
commit
56675f8b9f
|
@ -27,17 +27,12 @@
|
|||
#include <linux/elf-randomize.h>
|
||||
|
||||
/*
|
||||
* Construct an artificial page offset for the mapping based on the virtual
|
||||
* Construct an artificial page offset for the mapping based on the physical
|
||||
* address of the kernel file mapping variable.
|
||||
* If filp is zero the calculated pgoff value aliases the memory of the given
|
||||
* address. This is useful for io_uring where the mapping shall alias a kernel
|
||||
* address and a userspace adress where both the kernel and the userspace
|
||||
* access the same memory region.
|
||||
*/
|
||||
#define GET_FILP_PGOFF(filp, addr) \
|
||||
((filp ? (((unsigned long) filp->f_mapping) >> 8) \
|
||||
& ((SHM_COLOUR-1) >> PAGE_SHIFT) : 0UL) \
|
||||
+ (addr >> PAGE_SHIFT))
|
||||
#define GET_FILP_PGOFF(filp) \
|
||||
(filp ? (((unsigned long) filp->f_mapping) >> 8) \
|
||||
& ((SHM_COLOUR-1) >> PAGE_SHIFT) : 0UL)
|
||||
|
||||
static unsigned long shared_align_offset(unsigned long filp_pgoff,
|
||||
unsigned long pgoff)
|
||||
|
@ -117,7 +112,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp,
|
|||
do_color_align = 0;
|
||||
if (filp || (flags & MAP_SHARED))
|
||||
do_color_align = 1;
|
||||
filp_pgoff = GET_FILP_PGOFF(filp, addr);
|
||||
filp_pgoff = GET_FILP_PGOFF(filp);
|
||||
|
||||
if (flags & MAP_FIXED) {
|
||||
/* Even MAP_FIXED mappings must reside within TASK_SIZE */
|
||||
|
|
|
@ -3470,6 +3470,8 @@ static unsigned long io_uring_mmu_get_unmapped_area(struct file *filp,
|
|||
* - use the kernel virtual address of the shared io_uring context
|
||||
* (instead of the userspace-provided address, which has to be 0UL
|
||||
* anyway).
|
||||
* - use the same pgoff which the get_unmapped_area() uses to
|
||||
* calculate the page colouring.
|
||||
* For architectures without such aliasing requirements, the
|
||||
* architecture will return any suitable mapping because addr is 0.
|
||||
*/
|
||||
|
@ -3478,6 +3480,7 @@ static unsigned long io_uring_mmu_get_unmapped_area(struct file *filp,
|
|||
pgoff = 0; /* has been translated to ptr above */
|
||||
#ifdef SHM_COLOUR
|
||||
addr = (uintptr_t) ptr;
|
||||
pgoff = addr >> PAGE_SHIFT;
|
||||
#else
|
||||
addr = 0UL;
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue