Merge d3d1556696 ("Merge tag 'mm-hotfixes-stable-2024-10-09-15-46' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm") into android-mainline
Steps on the way to 6.12-rc3 Change-Id: I6ec4a94f8206044529f52186cd62f42bbbb4580a Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -203,6 +203,7 @@ Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> <ezequiel@collabora.com>
|
||||
Faith Ekstrand <faith.ekstrand@collabora.com> <jason@jlekstrand.net>
|
||||
Faith Ekstrand <faith.ekstrand@collabora.com> <jason.ekstrand@intel.com>
|
||||
Faith Ekstrand <faith.ekstrand@collabora.com> <jason.ekstrand@collabora.com>
|
||||
Fangrui Song <i@maskray.me> <maskray@google.com>
|
||||
Felipe W Damasio <felipewd@terra.com.br>
|
||||
Felix Kuhling <fxkuehl@gmx.de>
|
||||
Felix Moeller <felix@derklecks.de>
|
||||
|
||||
@@ -1358,10 +1358,6 @@ D: Major kbuild rework during the 2.5 cycle
|
||||
D: ISDN Maintainer
|
||||
S: USA
|
||||
|
||||
N: Gerrit Renker
|
||||
E: gerrit@erg.abdn.ac.uk
|
||||
D: DCCP protocol support.
|
||||
|
||||
N: Philip Gladstone
|
||||
E: philip@gladstonefamily.net
|
||||
D: Kernel / timekeeping stuff
|
||||
@@ -1677,11 +1673,6 @@ W: http://www.carumba.com/
|
||||
D: bug toaster (A1 sauce makes all the difference)
|
||||
D: Random linux hacker
|
||||
|
||||
N: James Hogan
|
||||
E: jhogan@kernel.org
|
||||
D: Metag architecture maintainer
|
||||
D: TZ1090 SoC maintainer
|
||||
|
||||
N: Tim Hockin
|
||||
E: thockin@hockin.org
|
||||
W: http://www.hockin.org/~thockin
|
||||
@@ -1697,6 +1688,11 @@ D: hwmon subsystem maintainer
|
||||
D: i2c-sis96x and i2c-stub SMBus drivers
|
||||
S: USA
|
||||
|
||||
N: James Hogan
|
||||
E: jhogan@kernel.org
|
||||
D: Metag architecture maintainer
|
||||
D: TZ1090 SoC maintainer
|
||||
|
||||
N: Dirk Hohndel
|
||||
E: hohndel@suse.de
|
||||
D: The XFree86[tm] Project
|
||||
@@ -1872,6 +1868,10 @@ S: K osmidomkum 723
|
||||
S: 160 00 Praha 6
|
||||
S: Czech Republic
|
||||
|
||||
N: Seth Jennings
|
||||
E: sjenning@redhat.com
|
||||
D: Creation and maintenance of zswap
|
||||
|
||||
N: Jeremy Kerr
|
||||
D: Maintainer of SPU File System
|
||||
|
||||
@@ -2188,19 +2188,6 @@ N: Mike Kravetz
|
||||
E: mike.kravetz@oracle.com
|
||||
D: Maintenance and development of the hugetlb subsystem
|
||||
|
||||
N: Seth Jennings
|
||||
E: sjenning@redhat.com
|
||||
D: Creation and maintenance of zswap
|
||||
|
||||
N: Dan Streetman
|
||||
E: ddstreet@ieee.org
|
||||
D: Maintenance and development of zswap
|
||||
D: Creation and maintenance of the zpool API
|
||||
|
||||
N: Vitaly Wool
|
||||
E: vitaly.wool@konsulko.com
|
||||
D: Maintenance and development of zswap
|
||||
|
||||
N: Andreas S. Krebs
|
||||
E: akrebs@altavista.net
|
||||
D: CYPRESS CY82C693 chipset IDE, Digital's PC-Alpha 164SX boards
|
||||
@@ -3191,6 +3178,11 @@ N: Ken Pizzini
|
||||
E: ken@halcyon.com
|
||||
D: CDROM driver "sonycd535" (Sony CDU-535/531)
|
||||
|
||||
N: Mathieu Poirier
|
||||
E: mathieu.poirier@linaro.org
|
||||
D: CoreSight kernel subsystem, Maintainer 2014-2022
|
||||
D: Perf tool support for CoreSight
|
||||
|
||||
N: Stelian Pop
|
||||
E: stelian@popies.net
|
||||
P: 1024D/EDBB6147 7B36 0E07 04BC 11DC A7A0 D3F7 7185 9E7A EDBB 6147
|
||||
@@ -3300,6 +3292,10 @@ S: Schlossbergring 9
|
||||
S: 79098 Freiburg
|
||||
S: Germany
|
||||
|
||||
N: Gerrit Renker
|
||||
E: gerrit@erg.abdn.ac.uk
|
||||
D: DCCP protocol support.
|
||||
|
||||
N: Thomas Renninger
|
||||
E: trenn@suse.de
|
||||
D: cpupowerutils
|
||||
@@ -3576,11 +3572,6 @@ D: several improvements to system programs
|
||||
S: Oldenburg
|
||||
S: Germany
|
||||
|
||||
N: Mathieu Poirier
|
||||
E: mathieu.poirier@linaro.org
|
||||
D: CoreSight kernel subsystem, Maintainer 2014-2022
|
||||
D: Perf tool support for CoreSight
|
||||
|
||||
N: Robert Schwebel
|
||||
E: robert@schwebel.de
|
||||
W: https://www.schwebel.de
|
||||
@@ -3771,6 +3762,11 @@ S: Chr. Winthersvej 1 B, st.th.
|
||||
S: DK-1860 Frederiksberg C
|
||||
S: Denmark
|
||||
|
||||
N: Dan Streetman
|
||||
E: ddstreet@ieee.org
|
||||
D: Maintenance and development of zswap
|
||||
D: Creation and maintenance of the zpool API
|
||||
|
||||
N: Drew Sullivan
|
||||
E: drew@ss.org
|
||||
W: http://www.ss.org/
|
||||
@@ -4286,6 +4282,10 @@ S: Pipers Way
|
||||
S: Swindon. SN3 1RJ
|
||||
S: England
|
||||
|
||||
N: Vitaly Wool
|
||||
E: vitaly.wool@konsulko.com
|
||||
D: Maintenance and development of zswap
|
||||
|
||||
N: Chris Wright
|
||||
E: chrisw@sous-sol.org
|
||||
D: hacking on LSM framework and security modules.
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
#include <asm/pci_io.h>
|
||||
|
||||
#define xlate_dev_mem_ptr xlate_dev_mem_ptr
|
||||
#define kc_xlate_dev_mem_ptr xlate_dev_mem_ptr
|
||||
void *xlate_dev_mem_ptr(phys_addr_t phys);
|
||||
#define unxlate_dev_mem_ptr unxlate_dev_mem_ptr
|
||||
#define kc_unxlate_dev_mem_ptr unxlate_dev_mem_ptr
|
||||
void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr);
|
||||
|
||||
#define IO_SPACE_LIMIT 0
|
||||
|
||||
@@ -86,7 +86,7 @@ static void dax_set_mapping(struct vm_fault *vmf, pfn_t pfn,
|
||||
nr_pages = 1;
|
||||
|
||||
pgoff = linear_page_index(vmf->vma,
|
||||
ALIGN(vmf->address, fault_size));
|
||||
ALIGN_DOWN(vmf->address, fault_size));
|
||||
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
struct page *page = pfn_to_page(pfn_t_to_pfn(pfn) + i);
|
||||
|
||||
@@ -258,7 +258,6 @@ static int gru_get_cpu_resources(int dsr_bytes, void **cb, void **dsr)
|
||||
int lcpu;
|
||||
|
||||
BUG_ON(dsr_bytes > GRU_NUM_KERNEL_DSR_BYTES);
|
||||
preempt_disable();
|
||||
bs = gru_lock_kernel_context(-1);
|
||||
lcpu = uv_blade_processor_id();
|
||||
*cb = bs->kernel_cb + lcpu * GRU_HANDLE_STRIDE;
|
||||
@@ -272,7 +271,6 @@ static int gru_get_cpu_resources(int dsr_bytes, void **cb, void **dsr)
|
||||
static void gru_free_cpu_resources(void *cb, void *dsr)
|
||||
{
|
||||
gru_unlock_kernel_context(uv_numa_blade_id());
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -937,10 +937,8 @@ vm_fault_t gru_fault(struct vm_fault *vmf)
|
||||
|
||||
again:
|
||||
mutex_lock(>s->ts_ctxlock);
|
||||
preempt_disable();
|
||||
|
||||
if (gru_check_context_placement(gts)) {
|
||||
preempt_enable();
|
||||
mutex_unlock(>s->ts_ctxlock);
|
||||
gru_unload_context(gts, 1);
|
||||
return VM_FAULT_NOPAGE;
|
||||
@@ -949,7 +947,6 @@ again:
|
||||
if (!gts->ts_gru) {
|
||||
STAT(load_user_context);
|
||||
if (!gru_assign_gru_context(gts)) {
|
||||
preempt_enable();
|
||||
mutex_unlock(>s->ts_ctxlock);
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
schedule_timeout(GRU_ASSIGN_DELAY); /* true hack ZZZ */
|
||||
@@ -965,7 +962,6 @@ again:
|
||||
vma->vm_page_prot);
|
||||
}
|
||||
|
||||
preempt_enable();
|
||||
mutex_unlock(>s->ts_ctxlock);
|
||||
|
||||
return VM_FAULT_NOPAGE;
|
||||
|
||||
@@ -65,7 +65,6 @@ static struct gru_tlb_global_handle *get_lock_tgh_handle(struct gru_state
|
||||
struct gru_tlb_global_handle *tgh;
|
||||
int n;
|
||||
|
||||
preempt_disable();
|
||||
if (uv_numa_blade_id() == gru->gs_blade_id)
|
||||
n = get_on_blade_tgh(gru);
|
||||
else
|
||||
@@ -79,7 +78,6 @@ static struct gru_tlb_global_handle *get_lock_tgh_handle(struct gru_state
|
||||
static void get_unlock_tgh_handle(struct gru_tlb_global_handle *tgh)
|
||||
{
|
||||
unlock_tgh_handle(tgh);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+6
-8
@@ -300,10 +300,10 @@ static struct inode *bch2_alloc_inode(struct super_block *sb)
|
||||
BUG();
|
||||
}
|
||||
|
||||
static struct bch_inode_info *__bch2_new_inode(struct bch_fs *c)
|
||||
static struct bch_inode_info *__bch2_new_inode(struct bch_fs *c, gfp_t gfp)
|
||||
{
|
||||
struct bch_inode_info *inode = alloc_inode_sb(c->vfs_sb,
|
||||
bch2_inode_cache, GFP_NOFS);
|
||||
bch2_inode_cache, gfp);
|
||||
if (!inode)
|
||||
return NULL;
|
||||
|
||||
@@ -315,7 +315,7 @@ static struct bch_inode_info *__bch2_new_inode(struct bch_fs *c)
|
||||
mutex_init(&inode->ei_quota_lock);
|
||||
memset(&inode->ei_devs_need_flush, 0, sizeof(inode->ei_devs_need_flush));
|
||||
|
||||
if (unlikely(inode_init_always(c->vfs_sb, &inode->v))) {
|
||||
if (unlikely(inode_init_always_gfp(c->vfs_sb, &inode->v, gfp))) {
|
||||
kmem_cache_free(bch2_inode_cache, inode);
|
||||
return NULL;
|
||||
}
|
||||
@@ -328,12 +328,10 @@ static struct bch_inode_info *__bch2_new_inode(struct bch_fs *c)
|
||||
*/
|
||||
static struct bch_inode_info *bch2_new_inode(struct btree_trans *trans)
|
||||
{
|
||||
struct bch_inode_info *inode =
|
||||
memalloc_flags_do(PF_MEMALLOC_NORECLAIM|PF_MEMALLOC_NOWARN,
|
||||
__bch2_new_inode(trans->c));
|
||||
struct bch_inode_info *inode = __bch2_new_inode(trans->c, GFP_NOWAIT);
|
||||
|
||||
if (unlikely(!inode)) {
|
||||
int ret = drop_locks_do(trans, (inode = __bch2_new_inode(trans->c)) ? 0 : -ENOMEM);
|
||||
int ret = drop_locks_do(trans, (inode = __bch2_new_inode(trans->c, GFP_NOFS)) ? 0 : -ENOMEM);
|
||||
if (ret && inode) {
|
||||
__destroy_inode(&inode->v);
|
||||
kmem_cache_free(bch2_inode_cache, inode);
|
||||
@@ -407,7 +405,7 @@ __bch2_create(struct mnt_idmap *idmap,
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
#endif
|
||||
inode = __bch2_new_inode(c);
|
||||
inode = __bch2_new_inode(c, GFP_NOFS);
|
||||
if (unlikely(!inode)) {
|
||||
inode = ERR_PTR(-ENOMEM);
|
||||
goto err;
|
||||
|
||||
+6
-4
@@ -146,14 +146,16 @@ static int no_open(struct inode *inode, struct file *file)
|
||||
}
|
||||
|
||||
/**
|
||||
* inode_init_always - perform inode structure initialisation
|
||||
* inode_init_always_gfp - perform inode structure initialisation
|
||||
* @sb: superblock inode belongs to
|
||||
* @inode: inode to initialise
|
||||
* @gfp: allocation flags
|
||||
*
|
||||
* These are initializations that need to be done on every inode
|
||||
* allocation as the fields are not initialised by slab allocation.
|
||||
* If there are additional allocations required @gfp is used.
|
||||
*/
|
||||
int inode_init_always(struct super_block *sb, struct inode *inode)
|
||||
int inode_init_always_gfp(struct super_block *sb, struct inode *inode, gfp_t gfp)
|
||||
{
|
||||
static const struct inode_operations empty_iops;
|
||||
static const struct file_operations no_open_fops = {.open = no_open};
|
||||
@@ -230,14 +232,14 @@ int inode_init_always(struct super_block *sb, struct inode *inode)
|
||||
#endif
|
||||
inode->i_flctx = NULL;
|
||||
|
||||
if (unlikely(security_inode_alloc(inode)))
|
||||
if (unlikely(security_inode_alloc(inode, gfp)))
|
||||
return -ENOMEM;
|
||||
|
||||
this_cpu_inc(nr_inodes);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(inode_init_always);
|
||||
EXPORT_SYMBOL(inode_init_always_gfp);
|
||||
|
||||
void free_inode_nonrcu(struct inode *inode)
|
||||
{
|
||||
|
||||
+34
-2
@@ -50,6 +50,20 @@ static struct proc_dir_entry *proc_root_kcore;
|
||||
#define kc_offset_to_vaddr(o) ((o) + PAGE_OFFSET)
|
||||
#endif
|
||||
|
||||
#ifndef kc_xlate_dev_mem_ptr
|
||||
#define kc_xlate_dev_mem_ptr kc_xlate_dev_mem_ptr
|
||||
static inline void *kc_xlate_dev_mem_ptr(phys_addr_t phys)
|
||||
{
|
||||
return __va(phys);
|
||||
}
|
||||
#endif
|
||||
#ifndef kc_unxlate_dev_mem_ptr
|
||||
#define kc_unxlate_dev_mem_ptr kc_unxlate_dev_mem_ptr
|
||||
static inline void kc_unxlate_dev_mem_ptr(phys_addr_t phys, void *virt)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static LIST_HEAD(kclist_head);
|
||||
static DECLARE_RWSEM(kclist_lock);
|
||||
static int kcore_need_update = 1;
|
||||
@@ -471,6 +485,8 @@ static ssize_t read_kcore_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
while (buflen) {
|
||||
struct page *page;
|
||||
unsigned long pfn;
|
||||
phys_addr_t phys;
|
||||
void *__start;
|
||||
|
||||
/*
|
||||
* If this is the first iteration or the address is not within
|
||||
@@ -537,7 +553,8 @@ static ssize_t read_kcore_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
}
|
||||
break;
|
||||
case KCORE_RAM:
|
||||
pfn = __pa(start) >> PAGE_SHIFT;
|
||||
phys = __pa(start);
|
||||
pfn = phys >> PAGE_SHIFT;
|
||||
page = pfn_to_online_page(pfn);
|
||||
|
||||
/*
|
||||
@@ -557,13 +574,28 @@ static ssize_t read_kcore_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
fallthrough;
|
||||
case KCORE_VMEMMAP:
|
||||
case KCORE_TEXT:
|
||||
if (m->type == KCORE_RAM) {
|
||||
__start = kc_xlate_dev_mem_ptr(phys);
|
||||
if (!__start) {
|
||||
ret = -ENOMEM;
|
||||
if (iov_iter_zero(tsz, iter) != tsz)
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
__start = (void *)start;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sadly we must use a bounce buffer here to be able to
|
||||
* make use of copy_from_kernel_nofault(), as these
|
||||
* memory regions might not always be mapped on all
|
||||
* architectures.
|
||||
*/
|
||||
if (copy_from_kernel_nofault(buf, (void *)start, tsz)) {
|
||||
ret = copy_from_kernel_nofault(buf, __start, tsz);
|
||||
if (m->type == KCORE_RAM)
|
||||
kc_unxlate_dev_mem_ptr(phys, __start);
|
||||
if (ret) {
|
||||
if (iov_iter_zero(tsz, iter) != tsz) {
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
|
||||
@@ -2230,75 +2230,6 @@ static void nfdicf_init(void)
|
||||
file_fail(fold_name);
|
||||
}
|
||||
|
||||
static void ignore_init(void)
|
||||
{
|
||||
FILE *file;
|
||||
unsigned int unichar;
|
||||
unsigned int first;
|
||||
unsigned int last;
|
||||
unsigned int *um;
|
||||
int count;
|
||||
int ret;
|
||||
|
||||
if (verbose > 0)
|
||||
printf("Parsing %s\n", prop_name);
|
||||
file = fopen(prop_name, "r");
|
||||
if (!file)
|
||||
open_fail(prop_name, errno);
|
||||
assert(file);
|
||||
count = 0;
|
||||
while (fgets(line, LINESIZE, file)) {
|
||||
ret = sscanf(line, "%X..%X ; %s # ", &first, &last, buf0);
|
||||
if (ret == 3) {
|
||||
if (strcmp(buf0, "Default_Ignorable_Code_Point"))
|
||||
continue;
|
||||
if (!utf32valid(first) || !utf32valid(last))
|
||||
line_fail(prop_name, line);
|
||||
for (unichar = first; unichar <= last; unichar++) {
|
||||
free(unicode_data[unichar].utf32nfdi);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdi = um;
|
||||
free(unicode_data[unichar].utf32nfdicf);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdicf = um;
|
||||
count++;
|
||||
}
|
||||
if (verbose > 1)
|
||||
printf(" %X..%X Default_Ignorable_Code_Point\n",
|
||||
first, last);
|
||||
continue;
|
||||
}
|
||||
ret = sscanf(line, "%X ; %s # ", &unichar, buf0);
|
||||
if (ret == 2) {
|
||||
if (strcmp(buf0, "Default_Ignorable_Code_Point"))
|
||||
continue;
|
||||
if (!utf32valid(unichar))
|
||||
line_fail(prop_name, line);
|
||||
free(unicode_data[unichar].utf32nfdi);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdi = um;
|
||||
free(unicode_data[unichar].utf32nfdicf);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdicf = um;
|
||||
if (verbose > 1)
|
||||
printf(" %X Default_Ignorable_Code_Point\n",
|
||||
unichar);
|
||||
count++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
fclose(file);
|
||||
|
||||
if (verbose > 0)
|
||||
printf("Found %d entries\n", count);
|
||||
if (count == 0)
|
||||
file_fail(prop_name);
|
||||
}
|
||||
|
||||
static void corrections_init(void)
|
||||
{
|
||||
FILE *file;
|
||||
@@ -3411,7 +3342,6 @@ int main(int argc, char *argv[])
|
||||
ccc_init();
|
||||
nfdi_init();
|
||||
nfdicf_init();
|
||||
ignore_init();
|
||||
corrections_init();
|
||||
hangul_decompose();
|
||||
nfdi_decompose();
|
||||
|
||||
+3346
-3357
File diff suppressed because it is too large
Load Diff
+6
-1
@@ -3082,7 +3082,12 @@ extern loff_t default_llseek(struct file *file, loff_t offset, int whence);
|
||||
|
||||
extern loff_t vfs_llseek(struct file *file, loff_t offset, int whence);
|
||||
|
||||
extern int inode_init_always(struct super_block *, struct inode *);
|
||||
extern int inode_init_always_gfp(struct super_block *, struct inode *, gfp_t);
|
||||
static inline int inode_init_always(struct super_block *sb, struct inode *inode)
|
||||
{
|
||||
return inode_init_always_gfp(sb, inode, GFP_NOFS);
|
||||
}
|
||||
|
||||
extern void inode_init_once(struct inode *);
|
||||
extern void address_space_init_once(struct address_space *mapping);
|
||||
extern struct inode * igrab(struct inode *);
|
||||
|
||||
@@ -1690,8 +1690,8 @@ extern struct pid *cad_pid;
|
||||
* I am cleaning dirty pages from some other bdi. */
|
||||
#define PF_KTHREAD 0x00200000 /* I am a kernel thread */
|
||||
#define PF_RANDOMIZE 0x00400000 /* Randomize virtual address space */
|
||||
#define PF_MEMALLOC_NORECLAIM 0x00800000 /* All allocation requests will clear __GFP_DIRECT_RECLAIM */
|
||||
#define PF_MEMALLOC_NOWARN 0x01000000 /* All allocation requests will inherit __GFP_NOWARN */
|
||||
#define PF__HOLE__00800000 0x00800000
|
||||
#define PF__HOLE__01000000 0x01000000
|
||||
#define PF__HOLE__02000000 0x02000000
|
||||
#define PF_NO_SETAFFINITY 0x04000000 /* Userland is not allowed to meddle with cpus_mask */
|
||||
#define PF_MCE_EARLY 0x08000000 /* Early kill for mce process policy */
|
||||
|
||||
@@ -251,25 +251,16 @@ static inline gfp_t current_gfp_context(gfp_t flags)
|
||||
{
|
||||
unsigned int pflags = READ_ONCE(current->flags);
|
||||
|
||||
if (unlikely(pflags & (PF_MEMALLOC_NOIO |
|
||||
PF_MEMALLOC_NOFS |
|
||||
PF_MEMALLOC_NORECLAIM |
|
||||
PF_MEMALLOC_NOWARN |
|
||||
PF_MEMALLOC_PIN))) {
|
||||
if (unlikely(pflags & (PF_MEMALLOC_NOIO | PF_MEMALLOC_NOFS | PF_MEMALLOC_PIN))) {
|
||||
/*
|
||||
* Stronger flags before weaker flags:
|
||||
* NORECLAIM implies NOIO, which in turn implies NOFS
|
||||
* NOIO implies both NOIO and NOFS and it is a weaker context
|
||||
* so always make sure it makes precedence
|
||||
*/
|
||||
if (pflags & PF_MEMALLOC_NORECLAIM)
|
||||
flags &= ~__GFP_DIRECT_RECLAIM;
|
||||
else if (pflags & PF_MEMALLOC_NOIO)
|
||||
if (pflags & PF_MEMALLOC_NOIO)
|
||||
flags &= ~(__GFP_IO | __GFP_FS);
|
||||
else if (pflags & PF_MEMALLOC_NOFS)
|
||||
flags &= ~__GFP_FS;
|
||||
|
||||
if (pflags & PF_MEMALLOC_NOWARN)
|
||||
flags |= __GFP_NOWARN;
|
||||
|
||||
if (pflags & PF_MEMALLOC_PIN)
|
||||
flags &= ~__GFP_MOVABLE;
|
||||
}
|
||||
|
||||
@@ -348,7 +348,7 @@ int security_dentry_create_files_as(struct dentry *dentry, int mode,
|
||||
struct cred *new);
|
||||
int security_path_notify(const struct path *path, u64 mask,
|
||||
unsigned int obj_type);
|
||||
int security_inode_alloc(struct inode *inode);
|
||||
int security_inode_alloc(struct inode *inode, gfp_t gfp);
|
||||
void security_inode_free(struct inode *inode);
|
||||
int security_inode_init_security(struct inode *inode, struct inode *dir,
|
||||
const struct qstr *qstr,
|
||||
@@ -789,7 +789,7 @@ static inline int security_path_notify(const struct path *path, u64 mask,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int security_inode_alloc(struct inode *inode)
|
||||
static inline int security_inode_alloc(struct inode *inode, gfp_t gfp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -625,6 +625,8 @@ void kthread_unpark(struct task_struct *k)
|
||||
{
|
||||
struct kthread *kthread = to_kthread(k);
|
||||
|
||||
if (!test_bit(KTHREAD_SHOULD_PARK, &kthread->flags))
|
||||
return;
|
||||
/*
|
||||
* Newly created kthread was parked when the CPU was offline.
|
||||
* The binding was lost and we need to set it again.
|
||||
|
||||
+14
-4
@@ -169,6 +169,8 @@ static void resource_test_intersection(struct kunit *test)
|
||||
#define RES_TEST_RAM3_SIZE SZ_1M
|
||||
#define RES_TEST_TOTAL_SIZE ((RES_TEST_WIN1_OFFSET + RES_TEST_WIN1_SIZE))
|
||||
|
||||
KUNIT_DEFINE_ACTION_WRAPPER(kfree_wrapper, kfree, const void *);
|
||||
|
||||
static void remove_free_resource(void *ctx)
|
||||
{
|
||||
struct resource *res = (struct resource *)ctx;
|
||||
@@ -177,6 +179,14 @@ static void remove_free_resource(void *ctx)
|
||||
kfree(res);
|
||||
}
|
||||
|
||||
static void resource_test_add_action_or_abort(
|
||||
struct kunit *test, void (*action)(void *), void *ctx)
|
||||
{
|
||||
KUNIT_ASSERT_EQ_MSG(test, 0,
|
||||
kunit_add_action_or_reset(test, action, ctx),
|
||||
"Fail to add action");
|
||||
}
|
||||
|
||||
static void resource_test_request_region(struct kunit *test, struct resource *parent,
|
||||
resource_size_t start, resource_size_t size,
|
||||
const char *name, unsigned long flags)
|
||||
@@ -185,7 +195,7 @@ static void resource_test_request_region(struct kunit *test, struct resource *pa
|
||||
|
||||
res = __request_region(parent, start, size, name, flags);
|
||||
KUNIT_ASSERT_NOT_NULL(test, res);
|
||||
kunit_add_action_or_reset(test, remove_free_resource, res);
|
||||
resource_test_add_action_or_abort(test, remove_free_resource, res);
|
||||
}
|
||||
|
||||
static void resource_test_insert_resource(struct kunit *test, struct resource *parent,
|
||||
@@ -202,11 +212,11 @@ static void resource_test_insert_resource(struct kunit *test, struct resource *p
|
||||
res->end = start + size - 1;
|
||||
res->flags = flags;
|
||||
if (insert_resource(parent, res)) {
|
||||
kfree(res);
|
||||
resource_test_add_action_or_abort(test, kfree_wrapper, res);
|
||||
KUNIT_FAIL_AND_ABORT(test, "Fail to insert resource %pR\n", res);
|
||||
}
|
||||
|
||||
kunit_add_action_or_reset(test, remove_free_resource, res);
|
||||
resource_test_add_action_or_abort(test, remove_free_resource, res);
|
||||
}
|
||||
|
||||
static void resource_test_region_intersects(struct kunit *test)
|
||||
@@ -220,7 +230,7 @@ static void resource_test_region_intersects(struct kunit *test)
|
||||
"test resources");
|
||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent);
|
||||
start = parent->start;
|
||||
kunit_add_action_or_reset(test, remove_free_resource, parent);
|
||||
resource_test_add_action_or_abort(test, remove_free_resource, parent);
|
||||
|
||||
resource_test_request_region(test, parent, start + RES_TEST_RAM0_OFFSET,
|
||||
RES_TEST_RAM0_SIZE, "Test System RAM 0", flags);
|
||||
|
||||
+1
-1
@@ -1586,7 +1586,7 @@ int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,
|
||||
int ret = -ENOMEM;
|
||||
|
||||
pmd = pmdp_get_lockless(src_pmd);
|
||||
if (unlikely(pmd_special(pmd))) {
|
||||
if (unlikely(pmd_present(pmd) && pmd_special(pmd))) {
|
||||
dst_ptl = pmd_lock(dst_mm, dst_pmd);
|
||||
src_ptl = pmd_lockptr(src_mm, src_pmd);
|
||||
spin_lock_nested(src_ptl, SINGLE_DEPTH_NESTING);
|
||||
|
||||
+2
-2
@@ -238,7 +238,7 @@ SYSCALL_DEFINE1(memfd_secret, unsigned int, flags)
|
||||
/* make sure local flags do not confict with global fcntl.h */
|
||||
BUILD_BUG_ON(SECRETMEM_FLAGS_MASK & O_CLOEXEC);
|
||||
|
||||
if (!secretmem_enable)
|
||||
if (!secretmem_enable || !can_set_direct_map())
|
||||
return -ENOSYS;
|
||||
|
||||
if (flags & ~(SECRETMEM_FLAGS_MASK | O_CLOEXEC))
|
||||
@@ -280,7 +280,7 @@ static struct file_system_type secretmem_fs = {
|
||||
|
||||
static int __init secretmem_init(void)
|
||||
{
|
||||
if (!secretmem_enable)
|
||||
if (!secretmem_enable || !can_set_direct_map())
|
||||
return 0;
|
||||
|
||||
secretmem_mnt = kern_mount(&secretmem_fs);
|
||||
|
||||
@@ -190,7 +190,6 @@ static struct shrinker *zswap_shrinker;
|
||||
* section for context.
|
||||
* pool - the zswap_pool the entry's data is in
|
||||
* handle - zpool allocation handle that stores the compressed page data
|
||||
* value - value of the same-value filled pages which have same content
|
||||
* objcg - the obj_cgroup that the compressed memory is charged to
|
||||
* lru - handle to the pool's lru used to evict pages.
|
||||
*/
|
||||
|
||||
+6
-4
@@ -740,19 +740,20 @@ static int lsm_file_alloc(struct file *file)
|
||||
/**
|
||||
* lsm_inode_alloc - allocate a composite inode blob
|
||||
* @inode: the inode that needs a blob
|
||||
* @gfp: allocation flags
|
||||
*
|
||||
* Allocate the inode blob for all the modules
|
||||
*
|
||||
* Returns 0, or -ENOMEM if memory can't be allocated.
|
||||
*/
|
||||
static int lsm_inode_alloc(struct inode *inode)
|
||||
static int lsm_inode_alloc(struct inode *inode, gfp_t gfp)
|
||||
{
|
||||
if (!lsm_inode_cache) {
|
||||
inode->i_security = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
inode->i_security = kmem_cache_zalloc(lsm_inode_cache, GFP_NOFS);
|
||||
inode->i_security = kmem_cache_zalloc(lsm_inode_cache, gfp);
|
||||
if (inode->i_security == NULL)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
@@ -1678,6 +1679,7 @@ int security_path_notify(const struct path *path, u64 mask,
|
||||
/**
|
||||
* security_inode_alloc() - Allocate an inode LSM blob
|
||||
* @inode: the inode
|
||||
* @gfp: allocation flags
|
||||
*
|
||||
* Allocate and attach a security structure to @inode->i_security. The
|
||||
* i_security field is initialized to NULL when the inode structure is
|
||||
@@ -1685,9 +1687,9 @@ int security_path_notify(const struct path *path, u64 mask,
|
||||
*
|
||||
* Return: Return 0 if operation was successful.
|
||||
*/
|
||||
int security_inode_alloc(struct inode *inode)
|
||||
int security_inode_alloc(struct inode *inode, gfp_t gfp)
|
||||
{
|
||||
int rc = lsm_inode_alloc(inode);
|
||||
int rc = lsm_inode_alloc(inode, gfp);
|
||||
|
||||
if (unlikely(rc))
|
||||
return rc;
|
||||
|
||||
@@ -1657,7 +1657,7 @@ TEST_F(hmm2, double_map)
|
||||
|
||||
buffer->fd = -1;
|
||||
buffer->size = size;
|
||||
buffer->mirror = malloc(npages);
|
||||
buffer->mirror = malloc(size);
|
||||
ASSERT_NE(buffer->mirror, NULL);
|
||||
|
||||
/* Reserve a range of addresses. */
|
||||
|
||||
Reference in New Issue
Block a user