mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-24 14:07:52 -04:00
io_uring-6.5-2023-07-21
-----BEGIN PGP SIGNATURE----- iQJEBAABCAAuFiEEwPw5LcreJtl1+l5K99NY+ylx4KYFAmS62/kQHGF4Ym9lQGtl cm5lbC5kawAKCRD301j7KXHgpuYYD/9HMf8IG/2i/EmfgHa2O0yyaBprITcMAnCx 3x5szTz2Q4V5Dwdib1xRNAiT5KF4uoio8JJJWeIjeHTucUnVA7hjwAma4qmmVNlM 9dVelH5FL85oNEMVlIqpJ2KHWHH3FaQAyvQvOIXODr+DNAOn+NlgL18B6W5g43Xt e8/d+vmDflr3KfliNOfADdZebJzB6hR497btScr9bcmVNuxHnz8tPUCugdLz5LQh GEGW+iIUIS/Xmfrv2cleO5ANQ245gcCyBBGV/3klj8LndJpeKstFp3dl8mTA372/ ZLXnckKQerErKEcuvB8XJ3JIjlQR6s4JeCBk8fBi04ibHdRQuSDQgNXoFIKuRI2o A4znCK7P/TP7yK1dn7PLFaPtsfUkoUOSuTeMPkh/f8iW/ckurPu7WTQTd8dcyXDj 50U09Aa1V7TpnTCGkfQGTlX5ihlvRHQhGdqUOnR7NuS/KOaFqxpK3X1fuMwoea+s I+BC1hDnSm5uJTzcTY/G4OBXyujlslTbD2bq4Gmpb9JkZVkzhvIpjYHiEmZQJrC2 EvyI0z8MLARjHia6snn5EOJqrX7EsV7GmYcoWadQh/h1zt5TPyEyY0S4u6HrwtwB Rlp/dH60VbrRzoOHVzOr53F505F3DJ/woZXKGIuqTSBNtYudJKkfUbWY4Ga23pPw +i1JhigYgg== =FL// -----END PGP SIGNATURE----- Merge tag 'io_uring-6.5-2023-07-21' of git://git.kernel.dk/linux Pull io_uring fixes from Jens Axboe: - Fix for io-wq not always honoring REQ_F_NOWAIT, if it was set and punted directly (eg via DRAIN) (me) - Capability check fix (Ondrej) - Regression fix for the mmap changes that went into 6.4, which apparently broke IA64 (Helge) * tag 'io_uring-6.5-2023-07-21' of git://git.kernel.dk/linux: ia64: mmap: Consider pgoff when searching for free mapping io_uring: Fix io_uring mmap() by using architecture-provided get_unmapped_area() io_uring: treat -EAGAIN for REQ_F_NOWAIT as final for io-wq io_uring: don't audit the capability check in io_uring_create()
This commit is contained in:
commit
bdd1d82e7d
3 changed files with 38 additions and 33 deletions
|
@ -63,7 +63,7 @@ arch_get_unmapped_area (struct file *filp, unsigned long addr, unsigned long len
|
||||||
info.low_limit = addr;
|
info.low_limit = addr;
|
||||||
info.high_limit = TASK_SIZE;
|
info.high_limit = TASK_SIZE;
|
||||||
info.align_mask = align_mask;
|
info.align_mask = align_mask;
|
||||||
info.align_offset = 0;
|
info.align_offset = pgoff << PAGE_SHIFT;
|
||||||
return vm_unmapped_area(&info);
|
return vm_unmapped_area(&info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,12 +27,17 @@
|
||||||
#include <linux/elf-randomize.h>
|
#include <linux/elf-randomize.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Construct an artificial page offset for the mapping based on the physical
|
* Construct an artificial page offset for the mapping based on the virtual
|
||||||
* address of the kernel file mapping variable.
|
* 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) \
|
#define GET_FILP_PGOFF(filp, addr) \
|
||||||
(filp ? (((unsigned long) filp->f_mapping) >> 8) \
|
((filp ? (((unsigned long) filp->f_mapping) >> 8) \
|
||||||
& ((SHM_COLOUR-1) >> PAGE_SHIFT) : 0UL)
|
& ((SHM_COLOUR-1) >> PAGE_SHIFT) : 0UL) \
|
||||||
|
+ (addr >> PAGE_SHIFT))
|
||||||
|
|
||||||
static unsigned long shared_align_offset(unsigned long filp_pgoff,
|
static unsigned long shared_align_offset(unsigned long filp_pgoff,
|
||||||
unsigned long pgoff)
|
unsigned long pgoff)
|
||||||
|
@ -112,7 +117,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp,
|
||||||
do_color_align = 0;
|
do_color_align = 0;
|
||||||
if (filp || (flags & MAP_SHARED))
|
if (filp || (flags & MAP_SHARED))
|
||||||
do_color_align = 1;
|
do_color_align = 1;
|
||||||
filp_pgoff = GET_FILP_PGOFF(filp);
|
filp_pgoff = GET_FILP_PGOFF(filp, addr);
|
||||||
|
|
||||||
if (flags & MAP_FIXED) {
|
if (flags & MAP_FIXED) {
|
||||||
/* Even MAP_FIXED mappings must reside within TASK_SIZE */
|
/* Even MAP_FIXED mappings must reside within TASK_SIZE */
|
||||||
|
|
|
@ -1948,6 +1948,14 @@ fail:
|
||||||
ret = io_issue_sqe(req, issue_flags);
|
ret = io_issue_sqe(req, issue_flags);
|
||||||
if (ret != -EAGAIN)
|
if (ret != -EAGAIN)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If REQ_F_NOWAIT is set, then don't wait or retry with
|
||||||
|
* poll. -EAGAIN is final for that case.
|
||||||
|
*/
|
||||||
|
if (req->flags & REQ_F_NOWAIT)
|
||||||
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can get EAGAIN for iopolled IO even though we're
|
* We can get EAGAIN for iopolled IO even though we're
|
||||||
* forcing a sync submission from here, since we can't
|
* forcing a sync submission from here, since we can't
|
||||||
|
@ -3429,8 +3437,6 @@ static unsigned long io_uring_mmu_get_unmapped_area(struct file *filp,
|
||||||
unsigned long addr, unsigned long len,
|
unsigned long addr, unsigned long len,
|
||||||
unsigned long pgoff, unsigned long flags)
|
unsigned long pgoff, unsigned long flags)
|
||||||
{
|
{
|
||||||
const unsigned long mmap_end = arch_get_mmap_end(addr, len, flags);
|
|
||||||
struct vm_unmapped_area_info info;
|
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -3445,32 +3451,26 @@ static unsigned long io_uring_mmu_get_unmapped_area(struct file *filp,
|
||||||
if (IS_ERR(ptr))
|
if (IS_ERR(ptr))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
|
|
||||||
info.length = len;
|
|
||||||
info.low_limit = max(PAGE_SIZE, mmap_min_addr);
|
|
||||||
info.high_limit = arch_get_mmap_base(addr, current->mm->mmap_base);
|
|
||||||
#ifdef SHM_COLOUR
|
|
||||||
info.align_mask = PAGE_MASK & (SHM_COLOUR - 1UL);
|
|
||||||
#else
|
|
||||||
info.align_mask = PAGE_MASK & (SHMLBA - 1UL);
|
|
||||||
#endif
|
|
||||||
info.align_offset = (unsigned long) ptr;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A failed mmap() very likely causes application failure,
|
* Some architectures have strong cache aliasing requirements.
|
||||||
* so fall back to the bottom-up function here. This scenario
|
* For such architectures we need a coherent mapping which aliases
|
||||||
* can happen with large stack limits and large mmap()
|
* kernel memory *and* userspace memory. To achieve that:
|
||||||
* allocations.
|
* - use a NULL file pointer to reference physical memory, and
|
||||||
|
* - use the kernel virtual address of the shared io_uring context
|
||||||
|
* (instead of the userspace-provided address, which has to be 0UL
|
||||||
|
* anyway).
|
||||||
|
* For architectures without such aliasing requirements, the
|
||||||
|
* architecture will return any suitable mapping because addr is 0.
|
||||||
*/
|
*/
|
||||||
addr = vm_unmapped_area(&info);
|
filp = NULL;
|
||||||
if (offset_in_page(addr)) {
|
flags |= MAP_SHARED;
|
||||||
info.flags = 0;
|
pgoff = 0; /* has been translated to ptr above */
|
||||||
info.low_limit = TASK_UNMAPPED_BASE;
|
#ifdef SHM_COLOUR
|
||||||
info.high_limit = mmap_end;
|
addr = (uintptr_t) ptr;
|
||||||
addr = vm_unmapped_area(&info);
|
#else
|
||||||
}
|
addr = 0UL;
|
||||||
|
#endif
|
||||||
return addr;
|
return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* !CONFIG_MMU */
|
#else /* !CONFIG_MMU */
|
||||||
|
@ -3870,7 +3870,7 @@ static __cold int io_uring_create(unsigned entries, struct io_uring_params *p,
|
||||||
ctx->syscall_iopoll = 1;
|
ctx->syscall_iopoll = 1;
|
||||||
|
|
||||||
ctx->compat = in_compat_syscall();
|
ctx->compat = in_compat_syscall();
|
||||||
if (!capable(CAP_IPC_LOCK))
|
if (!ns_capable_noaudit(&init_user_ns, CAP_IPC_LOCK))
|
||||||
ctx->user = get_uid(current_user());
|
ctx->user = get_uid(current_user());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue