mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-19 20:34:20 +08:00
Merge branch 'akpm' (patches from Andrew)
Merge misc fixes from Andrew Morton: "11 fixes" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: MAINTAINERS: add files related to kdump z3fold: fix use-after-free when freeing handles sparc32: use PUD rather than PGD to get PMD in srmmu_nocache_init() MAINTAINERS: update email address for Naoya Horiguchi sh: include linux/time_types.h for sockios kasan: disable branch tracing for core runtime selftests/vm/write_to_hugetlbfs.c: fix unused variable warning selftests/vm/.gitignore: add mremap_dontunmap rapidio: fix an error in get_user_pages_fast() error handling x86: bitops: fix build regression device-dax: don't leak kernel memory to user space after unloading kmem
This commit is contained in:
commit
423b8baf18
@ -7829,7 +7829,7 @@ T: git git://linuxtv.org/media_tree.git
|
||||
F: drivers/media/platform/sti/hva
|
||||
|
||||
HWPOISON MEMORY FAILURE HANDLING
|
||||
M: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
|
||||
M: Naoya Horiguchi <naoya.horiguchi@nec.com>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
F: mm/hwpoison-inject.c
|
||||
@ -9185,6 +9185,11 @@ L: kexec@lists.infradead.org
|
||||
S: Maintained
|
||||
W: http://lse.sourceforge.net/kdump/
|
||||
F: Documentation/admin-guide/kdump/
|
||||
F: fs/proc/vmcore.c
|
||||
F: include/linux/crash_core.h
|
||||
F: include/linux/crash_dump.h
|
||||
F: include/uapi/linux/vmcore.h
|
||||
F: kernel/crash_*.c
|
||||
|
||||
KEENE FM RADIO TRANSMITTER DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
|
@ -2,6 +2,8 @@
|
||||
#ifndef __ASM_SH_SOCKIOS_H
|
||||
#define __ASM_SH_SOCKIOS_H
|
||||
|
||||
#include <linux/time_types.h>
|
||||
|
||||
/* Socket-level I/O control calls. */
|
||||
#define FIOGETOWN _IOR('f', 123, int)
|
||||
#define FIOSETOWN _IOW('f', 124, int)
|
||||
|
@ -333,7 +333,7 @@ static void __init srmmu_nocache_init(void)
|
||||
pgd = pgd_offset_k(vaddr);
|
||||
p4d = p4d_offset(__nocache_fix(pgd), vaddr);
|
||||
pud = pud_offset(__nocache_fix(p4d), vaddr);
|
||||
pmd = pmd_offset(__nocache_fix(pgd), vaddr);
|
||||
pmd = pmd_offset(__nocache_fix(pud), vaddr);
|
||||
pte = pte_offset_kernel(__nocache_fix(pmd), vaddr);
|
||||
|
||||
pteval = ((paddr >> 4) | SRMMU_ET_PTE | SRMMU_PRIV);
|
||||
|
@ -52,9 +52,9 @@ static __always_inline void
|
||||
arch_set_bit(long nr, volatile unsigned long *addr)
|
||||
{
|
||||
if (__builtin_constant_p(nr)) {
|
||||
asm volatile(LOCK_PREFIX "orb %1,%0"
|
||||
asm volatile(LOCK_PREFIX "orb %b1,%0"
|
||||
: CONST_MASK_ADDR(nr, addr)
|
||||
: "iq" (CONST_MASK(nr) & 0xff)
|
||||
: "iq" (CONST_MASK(nr))
|
||||
: "memory");
|
||||
} else {
|
||||
asm volatile(LOCK_PREFIX __ASM_SIZE(bts) " %1,%0"
|
||||
@ -72,9 +72,9 @@ static __always_inline void
|
||||
arch_clear_bit(long nr, volatile unsigned long *addr)
|
||||
{
|
||||
if (__builtin_constant_p(nr)) {
|
||||
asm volatile(LOCK_PREFIX "andb %1,%0"
|
||||
asm volatile(LOCK_PREFIX "andb %b1,%0"
|
||||
: CONST_MASK_ADDR(nr, addr)
|
||||
: "iq" (CONST_MASK(nr) ^ 0xff));
|
||||
: "iq" (~CONST_MASK(nr)));
|
||||
} else {
|
||||
asm volatile(LOCK_PREFIX __ASM_SIZE(btr) " %1,%0"
|
||||
: : RLONG_ADDR(addr), "Ir" (nr) : "memory");
|
||||
@ -123,9 +123,9 @@ static __always_inline void
|
||||
arch_change_bit(long nr, volatile unsigned long *addr)
|
||||
{
|
||||
if (__builtin_constant_p(nr)) {
|
||||
asm volatile(LOCK_PREFIX "xorb %1,%0"
|
||||
asm volatile(LOCK_PREFIX "xorb %b1,%0"
|
||||
: CONST_MASK_ADDR(nr, addr)
|
||||
: "iq" ((u8)CONST_MASK(nr)));
|
||||
: "iq" (CONST_MASK(nr)));
|
||||
} else {
|
||||
asm volatile(LOCK_PREFIX __ASM_SIZE(btc) " %1,%0"
|
||||
: : RLONG_ADDR(addr), "Ir" (nr) : "memory");
|
||||
|
@ -22,6 +22,7 @@ int dev_dax_kmem_probe(struct device *dev)
|
||||
resource_size_t kmem_size;
|
||||
resource_size_t kmem_end;
|
||||
struct resource *new_res;
|
||||
const char *new_res_name;
|
||||
int numa_node;
|
||||
int rc;
|
||||
|
||||
@ -48,11 +49,16 @@ int dev_dax_kmem_probe(struct device *dev)
|
||||
kmem_size &= ~(memory_block_size_bytes() - 1);
|
||||
kmem_end = kmem_start + kmem_size;
|
||||
|
||||
/* Region is permanently reserved. Hot-remove not yet implemented. */
|
||||
new_res = request_mem_region(kmem_start, kmem_size, dev_name(dev));
|
||||
new_res_name = kstrdup(dev_name(dev), GFP_KERNEL);
|
||||
if (!new_res_name)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Region is permanently reserved if hotremove fails. */
|
||||
new_res = request_mem_region(kmem_start, kmem_size, new_res_name);
|
||||
if (!new_res) {
|
||||
dev_warn(dev, "could not reserve region [%pa-%pa]\n",
|
||||
&kmem_start, &kmem_end);
|
||||
kfree(new_res_name);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
@ -63,12 +69,12 @@ int dev_dax_kmem_probe(struct device *dev)
|
||||
* unknown to us that will break add_memory() below.
|
||||
*/
|
||||
new_res->flags = IORESOURCE_SYSTEM_RAM;
|
||||
new_res->name = dev_name(dev);
|
||||
|
||||
rc = add_memory(numa_node, new_res->start, resource_size(new_res));
|
||||
if (rc) {
|
||||
release_resource(new_res);
|
||||
kfree(new_res);
|
||||
kfree(new_res_name);
|
||||
return rc;
|
||||
}
|
||||
dev_dax->dax_kmem_res = new_res;
|
||||
@ -83,6 +89,7 @@ static int dev_dax_kmem_remove(struct device *dev)
|
||||
struct resource *res = dev_dax->dax_kmem_res;
|
||||
resource_size_t kmem_start = res->start;
|
||||
resource_size_t kmem_size = resource_size(res);
|
||||
const char *res_name = res->name;
|
||||
int rc;
|
||||
|
||||
/*
|
||||
@ -102,6 +109,7 @@ static int dev_dax_kmem_remove(struct device *dev)
|
||||
/* Release and free dax resources */
|
||||
release_resource(res);
|
||||
kfree(res);
|
||||
kfree(res_name);
|
||||
dev_dax->dax_kmem_res = NULL;
|
||||
|
||||
return 0;
|
||||
|
@ -877,6 +877,11 @@ rio_dma_transfer(struct file *filp, u32 transfer_mode,
|
||||
rmcd_error("pinned %ld out of %ld pages",
|
||||
pinned, nr_pages);
|
||||
ret = -EFAULT;
|
||||
/*
|
||||
* Set nr_pages up to mean "how many pages to unpin, in
|
||||
* the error handler:
|
||||
*/
|
||||
nr_pages = pinned;
|
||||
goto err_pg;
|
||||
}
|
||||
|
||||
|
@ -15,14 +15,14 @@ CFLAGS_REMOVE_tags_report.o = $(CC_FLAGS_FTRACE)
|
||||
|
||||
# Function splitter causes unnecessary splits in __asan_load1/__asan_store1
|
||||
# see: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63533
|
||||
CFLAGS_common.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
|
||||
CFLAGS_generic.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
|
||||
CFLAGS_generic_report.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
|
||||
CFLAGS_init.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
|
||||
CFLAGS_quarantine.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
|
||||
CFLAGS_report.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
|
||||
CFLAGS_tags.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
|
||||
CFLAGS_tags_report.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector)
|
||||
CFLAGS_common.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_generic.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_generic_report.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_init.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_quarantine.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_report.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_tags.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_tags_report.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) -DDISABLE_BRANCH_PROFILING
|
||||
|
||||
obj-$(CONFIG_KASAN) := common.o init.o report.o
|
||||
obj-$(CONFIG_KASAN_GENERIC) += generic.o generic_report.o quarantine.o
|
||||
|
@ -15,7 +15,6 @@
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#define DISABLE_BRANCH_PROFILING
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -12,7 +12,6 @@
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#define DISABLE_BRANCH_PROFILING
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
11
mm/z3fold.c
11
mm/z3fold.c
@ -318,16 +318,16 @@ static inline void free_handle(unsigned long handle)
|
||||
slots = handle_to_slots(handle);
|
||||
write_lock(&slots->lock);
|
||||
*(unsigned long *)handle = 0;
|
||||
write_unlock(&slots->lock);
|
||||
if (zhdr->slots == slots)
|
||||
if (zhdr->slots == slots) {
|
||||
write_unlock(&slots->lock);
|
||||
return; /* simple case, nothing else to do */
|
||||
}
|
||||
|
||||
/* we are freeing a foreign handle if we are here */
|
||||
zhdr->foreign_handles--;
|
||||
is_free = true;
|
||||
read_lock(&slots->lock);
|
||||
if (!test_bit(HANDLES_ORPHANED, &slots->pool)) {
|
||||
read_unlock(&slots->lock);
|
||||
write_unlock(&slots->lock);
|
||||
return;
|
||||
}
|
||||
for (i = 0; i <= BUDDY_MASK; i++) {
|
||||
@ -336,7 +336,7 @@ static inline void free_handle(unsigned long handle)
|
||||
break;
|
||||
}
|
||||
}
|
||||
read_unlock(&slots->lock);
|
||||
write_unlock(&slots->lock);
|
||||
|
||||
if (is_free) {
|
||||
struct z3fold_pool *pool = slots_to_pool(slots);
|
||||
@ -422,6 +422,7 @@ static struct z3fold_header *init_z3fold_page(struct page *page, bool headless,
|
||||
zhdr->start_middle = 0;
|
||||
zhdr->cpu = -1;
|
||||
zhdr->foreign_handles = 0;
|
||||
zhdr->mapped_count = 0;
|
||||
zhdr->slots = slots;
|
||||
zhdr->pool = pool;
|
||||
INIT_LIST_HEAD(&zhdr->buddy);
|
||||
|
1
tools/testing/selftests/vm/.gitignore
vendored
1
tools/testing/selftests/vm/.gitignore
vendored
@ -6,6 +6,7 @@ map_populate
|
||||
thuge-gen
|
||||
compaction_test
|
||||
mlock2-tests
|
||||
mremap_dontunmap
|
||||
on-fault-limit
|
||||
transhuge-stress
|
||||
userfaultfd
|
||||
|
@ -74,8 +74,6 @@ int main(int argc, char **argv)
|
||||
int write = 0;
|
||||
int reserve = 1;
|
||||
|
||||
unsigned long i;
|
||||
|
||||
if (signal(SIGINT, sig_handler) == SIG_ERR)
|
||||
err(1, "\ncan't catch SIGINT\n");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user