mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 14:14:24 +08:00
Merge branch 'akpm' (patches from Andrew)
Merge more updates from Andrew Morton: - some of the rest of MM - various misc things - dynamic-debug updates - checkpatch - some epoll speedups - autofs - rapidio - lib/, lib/lzo/ updates * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (83 commits) samples/mic/mpssd/mpssd.h: remove duplicate header kernel/fork.c: remove duplicated include include/linux/relay.h: fix percpu annotation in struct rchan arch/nios2/mm/fault.c: remove duplicate include unicore32: stop printing the virtual memory layout MAINTAINERS: fix GTA02 entry and mark as orphan mm: create the new vm_fault_t type arm, s390, unicore32: remove oneliner wrappers for memblock_alloc() arch: simplify several early memory allocations openrisc: simplify pte_alloc_one_kernel() sh: prefer memblock APIs returning virtual address microblaze: prefer memblock API returning virtual address powerpc: prefer memblock APIs returning virtual address lib/lzo: separate lzo-rle from lzo lib/lzo: implement run-length encoding lib/lzo: fast 8-byte copy on arm64 lib/lzo: 64-bit CTZ on arm64 lib/lzo: tidy-up ifdefs ipc/sem.c: replace kvmalloc/memset with kvzalloc and use struct_size ipc: annotate implicit fall through ...
This commit is contained in:
commit
b5dd0c658c
@ -106,7 +106,6 @@ compile.h*
|
||||
conf
|
||||
config
|
||||
config-*
|
||||
config_data.h*
|
||||
config.mak
|
||||
config.mak.autogen
|
||||
conmakehash
|
||||
|
@ -78,16 +78,34 @@ Description
|
||||
is an implementation design choice independent on the algorithm or
|
||||
encoding.
|
||||
|
||||
Versions
|
||||
|
||||
0: Original version
|
||||
1: LZO-RLE
|
||||
|
||||
Version 1 of LZO implements an extension to encode runs of zeros using run
|
||||
length encoding. This improves speed for data with many zeros, which is a
|
||||
common case for zram. This modifies the bitstream in a backwards compatible way
|
||||
(v1 can correctly decompress v0 compressed data, but v0 cannot read v1 data).
|
||||
|
||||
For maximum compatibility, both versions are available under different names
|
||||
(lzo and lzo-rle). Differences in the encoding are noted in this document with
|
||||
e.g.: version 1 only.
|
||||
|
||||
Byte sequences
|
||||
==============
|
||||
|
||||
First byte encoding::
|
||||
|
||||
0..17 : follow regular instruction encoding, see below. It is worth
|
||||
noting that codes 16 and 17 will represent a block copy from
|
||||
the dictionary which is empty, and that they will always be
|
||||
0..16 : follow regular instruction encoding, see below. It is worth
|
||||
noting that code 16 will represent a block copy from the
|
||||
dictionary which is empty, and that it will always be
|
||||
invalid at this place.
|
||||
|
||||
17 : bitstream version. If the first byte is 17, the next byte
|
||||
gives the bitstream version (version 1 only). If the first byte
|
||||
is not 17, the bitstream version is 0.
|
||||
|
||||
18..21 : copy 0..3 literals
|
||||
state = (byte - 17) = 0..3 [ copy <state> literals ]
|
||||
skip byte
|
||||
@ -140,6 +158,11 @@ Byte sequences
|
||||
state = S (copy S literals after this block)
|
||||
End of stream is reached if distance == 16384
|
||||
|
||||
In version 1 only, this instruction is also used to encode a run of
|
||||
zeros if distance = 0xbfff, i.e. H = 1 and the D bits are all 1.
|
||||
In this case, it is followed by a fourth byte, X.
|
||||
run length = ((X << 3) | (0 0 0 0 0 L L L)) + 4.
|
||||
|
||||
0 0 1 L L L L L (32..63)
|
||||
Copy of small block within 16kB distance (preferably less than 34B)
|
||||
length = 2 + (L ?: 31 + (zero_bytes * 255) + non_zero_byte)
|
||||
@ -165,7 +188,9 @@ Authors
|
||||
=======
|
||||
|
||||
This document was written by Willy Tarreau <w@1wt.eu> on 2014/07/19 during an
|
||||
analysis of the decompression code available in Linux 3.16-rc5. The code is
|
||||
tricky, it is possible that this document contains mistakes or that a few
|
||||
corner cases were overlooked. In any case, please report any doubt, fix, or
|
||||
proposed updates to the author(s) so that the document can be updated.
|
||||
analysis of the decompression code available in Linux 3.16-rc5, and updated
|
||||
by Dave Rodgman <dave.rodgman@arm.com> on 2018/10/30 to introduce run-length
|
||||
encoding. The code is tricky, it is possible that this document contains
|
||||
mistakes or that a few corner cases were overlooked. In any case, please
|
||||
report any doubt, fix, or proposed updates to the author(s) so that the
|
||||
document can be updated.
|
||||
|
@ -249,7 +249,7 @@ features; most of these are found in the "kernel hacking" submenu. Several
|
||||
of these options should be turned on for any kernel used for development or
|
||||
testing purposes. In particular, you should turn on:
|
||||
|
||||
- ENABLE_WARN_DEPRECATED, ENABLE_MUST_CHECK, and FRAME_WARN to get an
|
||||
- ENABLE_MUST_CHECK and FRAME_WARN to get an
|
||||
extra set of warnings for problems like the use of deprecated interfaces
|
||||
or ignoring an important return value from a function. The output
|
||||
generated by these warnings can be verbose, but one need not worry about
|
||||
|
@ -264,7 +264,7 @@ La maggior parte di queste opzioni possono essere attivate per qualsiasi
|
||||
kernel utilizzato per lo sviluppo o a scopo di test. In particolare dovreste
|
||||
attivare:
|
||||
|
||||
- ENABLE_WARN_DEPRECATED, ENABLE_MUST_CHECK, e FRAME_WARN per ottenere degli
|
||||
- ENABLE_MUST_CHECK e FRAME_WARN per ottenere degli
|
||||
avvertimenti dedicati a problemi come l'uso di interfacce deprecate o
|
||||
l'ignorare un importante valore di ritorno di una funzione. Il risultato
|
||||
generato da questi avvertimenti può risultare verboso, ma non bisogna
|
||||
|
@ -1899,10 +1899,11 @@ F: drivers/usb/host/ehci-w90x900.c
|
||||
F: drivers/video/fbdev/nuc900fb.c
|
||||
|
||||
ARM/OPENMOKO NEO FREERUNNER (GTA02) MACHINE SUPPORT
|
||||
M: Nelson Castillo <arhuaco@freaks-unidos.net>
|
||||
L: openmoko-kernel@lists.openmoko.org (subscribers-only)
|
||||
W: http://wiki.openmoko.org/wiki/Neo_FreeRunner
|
||||
S: Supported
|
||||
S: Orphan
|
||||
F: arch/arm/mach-s3c24xx/mach-gta02.c
|
||||
F: arch/arm/mach-s3c24xx/gta02.h
|
||||
|
||||
ARM/Orion SoC/Technologic Systems TS-78xx platform support
|
||||
M: Alexander Clouter <alex@digriz.org.uk>
|
||||
|
@ -99,7 +99,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_STRIP_ASM_SYMS=y
|
||||
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||
|
@ -97,7 +97,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_STRIP_ASM_SYMS=y
|
||||
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||
|
@ -100,7 +100,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_STRIP_ASM_SYMS=y
|
||||
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||
|
@ -75,7 +75,6 @@ CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_NFS_FS=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_MEMORY_INIT=y
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
|
@ -78,7 +78,6 @@ CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_NFS_FS=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
|
@ -71,7 +71,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_STRIP_ASM_SYMS=y
|
||||
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||
|
@ -76,7 +76,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_MEMORY_INIT=y
|
||||
|
@ -56,6 +56,5 @@ CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_NFS_FS=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
|
@ -56,6 +56,5 @@ CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_NFS_FS=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
|
@ -55,5 +55,4 @@ CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_NFS_FS=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
|
@ -68,5 +68,4 @@ CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
|
@ -66,5 +66,4 @@ CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
|
@ -77,6 +77,5 @@ CONFIG_TMPFS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_FTRACE=y
|
||||
|
@ -92,7 +92,6 @@ CONFIG_CONFIGFS_FS=y
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
# CONFIG_NETWORK_FILESYSTEMS is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
CONFIG_STRIP_ASM_SYMS=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_HEADERS_CHECK=y
|
||||
|
@ -87,7 +87,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_STRIP_ASM_SYMS=y
|
||||
CONFIG_DEBUG_SHIRQ=y
|
||||
|
@ -91,7 +91,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_STRIP_ASM_SYMS=y
|
||||
CONFIG_DEBUG_SHIRQ=y
|
||||
|
@ -161,7 +161,6 @@ CONFIG_PRINTK_TIME=y
|
||||
CONFIG_BOOT_PRINTK_DELAY=y
|
||||
CONFIG_DYNAMIC_DEBUG=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_DEBUG_MEMORY_INIT=y
|
||||
|
@ -60,7 +60,6 @@ CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_AUTOFS4_FS=y
|
||||
CONFIG_FSCACHE=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_ARM_UNWIND is not set
|
||||
|
@ -94,7 +94,6 @@ CONFIG_ROMFS_BACKED_BY_MTD=y
|
||||
# CONFIG_NETWORK_FILESYSTEMS is not set
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
|
@ -103,7 +103,6 @@ CONFIG_NFS_V3=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_CRYPTO_CBC=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
|
@ -87,6 +87,5 @@ CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_ROMFS_FS=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
|
@ -298,7 +298,6 @@ CONFIG_NLS_KOI8_R=m
|
||||
CONFIG_NLS_KOI8_U=m
|
||||
CONFIG_NLS_UTF8=m
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_STRIP_ASM_SYMS=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
|
@ -125,7 +125,6 @@ CONFIG_CONFIGFS_FS=y
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_PAGEALLOC=y
|
||||
CONFIG_DEBUG_OBJECTS=y
|
||||
|
@ -100,7 +100,6 @@ CONFIG_ROOT_NFS=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
|
@ -47,7 +47,6 @@ CONFIG_ROMFS_FS=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_CRC32 is not set
|
||||
|
@ -64,6 +64,5 @@ CONFIG_ROMFS_FS=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
|
@ -53,7 +53,6 @@ CONFIG_ROMFS_FS=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_CRC32 is not set
|
||||
|
@ -80,7 +80,6 @@ CONFIG_EXT3_FS=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
|
@ -719,16 +719,9 @@ EXPORT_SYMBOL(phys_mem_access_prot);
|
||||
|
||||
#define vectors_base() (vectors_high() ? 0xffff0000 : 0)
|
||||
|
||||
static void __init *early_alloc_aligned(unsigned long sz, unsigned long align)
|
||||
{
|
||||
void *ptr = __va(memblock_phys_alloc(sz, align));
|
||||
memset(ptr, 0, sz);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static void __init *early_alloc(unsigned long sz)
|
||||
{
|
||||
return early_alloc_aligned(sz, sz);
|
||||
return memblock_alloc(sz, sz);
|
||||
}
|
||||
|
||||
static void *__init late_alloc(unsigned long sz)
|
||||
@ -1000,7 +993,7 @@ void __init iotable_init(struct map_desc *io_desc, int nr)
|
||||
if (!nr)
|
||||
return;
|
||||
|
||||
svm = early_alloc_aligned(sizeof(*svm) * nr, __alignof__(*svm));
|
||||
svm = memblock_alloc(sizeof(*svm) * nr, __alignof__(*svm));
|
||||
|
||||
for (md = io_desc; nr; md++, nr--) {
|
||||
create_mapping(md);
|
||||
@ -1022,7 +1015,7 @@ void __init vm_reserve_area_early(unsigned long addr, unsigned long size,
|
||||
struct vm_struct *vm;
|
||||
struct static_vm *svm;
|
||||
|
||||
svm = early_alloc_aligned(sizeof(*svm), __alignof__(*svm));
|
||||
svm = memblock_alloc(sizeof(*svm), __alignof__(*svm));
|
||||
|
||||
vm = &svm->vm;
|
||||
vm->addr = (void *)addr;
|
||||
|
@ -121,8 +121,6 @@ void arch_dma_free(struct device *dev, size_t size, void *vaddr,
|
||||
*/
|
||||
void __init coherent_mem_init(phys_addr_t start, u32 size)
|
||||
{
|
||||
phys_addr_t bitmap_phys;
|
||||
|
||||
if (!size)
|
||||
return;
|
||||
|
||||
@ -138,11 +136,8 @@ void __init coherent_mem_init(phys_addr_t start, u32 size)
|
||||
if (dma_size & (PAGE_SIZE - 1))
|
||||
++dma_pages;
|
||||
|
||||
bitmap_phys = memblock_phys_alloc(BITS_TO_LONGS(dma_pages) * sizeof(long),
|
||||
sizeof(long));
|
||||
|
||||
dma_bitmap = phys_to_virt(bitmap_phys);
|
||||
memset(dma_bitmap, 0, dma_pages * PAGE_SIZE);
|
||||
dma_bitmap = memblock_alloc(BITS_TO_LONGS(dma_pages) * sizeof(long),
|
||||
sizeof(long));
|
||||
}
|
||||
|
||||
static void c6x_dma_sync(struct device *dev, phys_addr_t paddr, size_t size,
|
||||
|
@ -45,5 +45,4 @@ CONFIG_SERIAL_SH_SCI_CONSOLE=y
|
||||
# CONFIG_SYSFS is not set
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
|
@ -45,5 +45,4 @@ CONFIG_SERIAL_SH_SCI_EARLYCON=y
|
||||
# CONFIG_SYSFS is not set
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
|
@ -45,5 +45,4 @@ CONFIG_SERIAL_SH_SCI_CONSOLE=y
|
||||
# CONFIG_SYSFS is not set
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
|
@ -88,7 +88,6 @@ CONFIG_ROMFS_FS=y
|
||||
CONFIG_ROMFS_BACKED_BY_BOTH=y
|
||||
# CONFIG_NETWORK_FILESYSTEMS is not set
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
|
@ -76,7 +76,6 @@ CONFIG_GPIO_GENERIC_PLATFORM=y
|
||||
CONFIG_FSCACHE=y
|
||||
# CONFIG_PROC_SYSCTL is not set
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_SECTION_MISMATCH_WARN_ONLY is not set
|
||||
CONFIG_SLUB_DEBUG_ON=y
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
|
@ -363,8 +363,9 @@ void __init *early_get_page(void)
|
||||
* Mem start + kernel_tlb -> here is limit
|
||||
* because of mem mapping from head.S
|
||||
*/
|
||||
return __va(memblock_alloc_base(PAGE_SIZE, PAGE_SIZE,
|
||||
memory_start + kernel_tlb));
|
||||
return memblock_alloc_try_nid_raw(PAGE_SIZE, PAGE_SIZE,
|
||||
MEMBLOCK_LOW_LIMIT, memory_start + kernel_tlb,
|
||||
NUMA_NO_NODE);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MMU */
|
||||
|
@ -78,8 +78,7 @@ static void __init map_ram(void)
|
||||
}
|
||||
|
||||
/* Alloc one page for holding PTE's... */
|
||||
pte = (pte_t *) __va(memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE));
|
||||
memset(pte, 0, PAGE_SIZE);
|
||||
pte = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
set_pmd(pme, __pmd(__pa(pte) + _PAGE_KERNEL_TABLE));
|
||||
|
||||
/* Fill the newly allocated page with PTE'S */
|
||||
@ -111,8 +110,7 @@ static void __init fixedrange_init(void)
|
||||
pgd = swapper_pg_dir + pgd_index(vaddr);
|
||||
pud = pud_offset(pgd, vaddr);
|
||||
pmd = pmd_offset(pud, vaddr);
|
||||
fixmap_pmd_p = (pmd_t *) __va(memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE));
|
||||
memset(fixmap_pmd_p, 0, PAGE_SIZE);
|
||||
fixmap_pmd_p = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
set_pmd(pmd, __pmd(__pa(fixmap_pmd_p) + _PAGE_KERNEL_TABLE));
|
||||
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
@ -124,8 +122,7 @@ static void __init fixedrange_init(void)
|
||||
pgd = swapper_pg_dir + pgd_index(vaddr);
|
||||
pud = pud_offset(pgd, vaddr);
|
||||
pmd = pmd_offset(pud, vaddr);
|
||||
pte = (pte_t *) __va(memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE));
|
||||
memset(pte, 0, PAGE_SIZE);
|
||||
pte = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
set_pmd(pmd, __pmd(__pa(pte) + _PAGE_KERNEL_TABLE));
|
||||
pkmap_page_table = pte;
|
||||
#endif /* CONFIG_HIGHMEM */
|
||||
@ -150,8 +147,7 @@ void __init paging_init(void)
|
||||
fixedrange_init();
|
||||
|
||||
/* allocate space for empty_zero_page */
|
||||
zero_page = __va(memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE));
|
||||
memset(zero_page, 0, PAGE_SIZE);
|
||||
zero_page = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
zone_sizes_init();
|
||||
|
||||
empty_zero_page = virt_to_page(zero_page);
|
||||
|
@ -77,4 +77,3 @@ CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_SUNRPC_DEBUG=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
|
@ -74,4 +74,3 @@ CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_SUNRPC_DEBUG=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/ptrace.h>
|
||||
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/traps.h>
|
||||
|
@ -54,5 +54,4 @@ CONFIG_SERIAL_OF_PLATFORM=y
|
||||
# CONFIG_DNOTIFY is not set
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_NFS_FS=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
|
@ -61,6 +61,5 @@ CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_XZ_DEC=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
|
@ -122,13 +122,10 @@ pte_t __ref *pte_alloc_one_kernel(struct mm_struct *mm)
|
||||
{
|
||||
pte_t *pte;
|
||||
|
||||
if (likely(mem_init_done)) {
|
||||
pte = (pte_t *) __get_free_page(GFP_KERNEL);
|
||||
} else {
|
||||
pte = (pte_t *) __va(memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE));
|
||||
}
|
||||
if (likely(mem_init_done))
|
||||
pte = (pte_t *)get_zeroed_page(GFP_KERNEL);
|
||||
else
|
||||
pte = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
|
||||
if (pte)
|
||||
clear_page(pte);
|
||||
return pte;
|
||||
}
|
||||
|
@ -120,6 +120,5 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
# CONFIG_CRYPTO_HW is not set
|
||||
|
@ -1123,7 +1123,6 @@ CONFIG_NLS_ISO8859_15=m
|
||||
CONFIG_NLS_KOI8_R=m
|
||||
CONFIG_NLS_KOI8_U=m
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_HEADERS_CHECK=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
|
@ -28,7 +28,7 @@
|
||||
static void *__init alloc_paca_data(unsigned long size, unsigned long align,
|
||||
unsigned long limit, int cpu)
|
||||
{
|
||||
unsigned long pa;
|
||||
void *ptr;
|
||||
int nid;
|
||||
|
||||
/*
|
||||
@ -43,17 +43,15 @@ static void *__init alloc_paca_data(unsigned long size, unsigned long align,
|
||||
nid = early_cpu_to_node(cpu);
|
||||
}
|
||||
|
||||
pa = memblock_alloc_base_nid(size, align, limit, nid, MEMBLOCK_NONE);
|
||||
if (!pa) {
|
||||
pa = memblock_alloc_base(size, align, limit);
|
||||
if (!pa)
|
||||
panic("cannot allocate paca data");
|
||||
}
|
||||
ptr = memblock_alloc_try_nid(size, align, MEMBLOCK_LOW_LIMIT,
|
||||
limit, nid);
|
||||
if (!ptr)
|
||||
panic("cannot allocate paca data");
|
||||
|
||||
if (cpu == boot_cpuid)
|
||||
memblock_set_bottom_up(false);
|
||||
|
||||
return __va(pa);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
@ -119,7 +117,6 @@ static struct slb_shadow * __init new_slb_shadow(int cpu, unsigned long limit)
|
||||
}
|
||||
|
||||
s = alloc_paca_data(sizeof(*s), L1_CACHE_BYTES, limit, cpu);
|
||||
memset(s, 0, sizeof(*s));
|
||||
|
||||
s->persistent = cpu_to_be32(SLB_NUM_BOLTED);
|
||||
s->buffer_length = cpu_to_be32(sizeof(*s));
|
||||
@ -223,7 +220,6 @@ void __init allocate_paca(int cpu)
|
||||
paca = alloc_paca_data(sizeof(struct paca_struct), L1_CACHE_BYTES,
|
||||
limit, cpu);
|
||||
paca_ptrs[cpu] = paca;
|
||||
memset(paca, 0, sizeof(struct paca_struct));
|
||||
|
||||
initialise_paca(paca, cpu);
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
|
@ -459,8 +459,8 @@ void __init smp_setup_cpu_maps(void)
|
||||
|
||||
DBG("smp_setup_cpu_maps()\n");
|
||||
|
||||
cpu_to_phys_id = __va(memblock_phys_alloc(nr_cpu_ids * sizeof(u32), __alignof__(u32)));
|
||||
memset(cpu_to_phys_id, 0, nr_cpu_ids * sizeof(u32));
|
||||
cpu_to_phys_id = memblock_alloc(nr_cpu_ids * sizeof(u32),
|
||||
__alignof__(u32));
|
||||
|
||||
for_each_node_by_type(dn, "cpu") {
|
||||
const __be32 *intserv;
|
||||
|
@ -902,8 +902,9 @@ static void __ref init_fallback_flush(void)
|
||||
* hardware prefetch runoff. We don't have a recipe for load patterns to
|
||||
* reliably avoid the prefetcher.
|
||||
*/
|
||||
l1d_flush_fallback_area = __va(memblock_alloc_base(l1d_size * 2, l1d_size, limit));
|
||||
memset(l1d_flush_fallback_area, 0, l1d_size * 2);
|
||||
l1d_flush_fallback_area = memblock_alloc_try_nid(l1d_size * 2,
|
||||
l1d_size, MEMBLOCK_LOW_LIMIT,
|
||||
limit, NUMA_NO_NODE);
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct paca_struct *paca = paca_ptrs[cpu];
|
||||
|
@ -908,9 +908,9 @@ static void __init htab_initialize(void)
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
if (debug_pagealloc_enabled()) {
|
||||
linear_map_hash_count = memblock_end_of_DRAM() >> PAGE_SHIFT;
|
||||
linear_map_hash_slots = __va(memblock_alloc_base(
|
||||
linear_map_hash_count, 1, ppc64_rma_size));
|
||||
memset(linear_map_hash_slots, 0, linear_map_hash_count);
|
||||
linear_map_hash_slots = memblock_alloc_try_nid(
|
||||
linear_map_hash_count, 1, MEMBLOCK_LOW_LIMIT,
|
||||
ppc64_rma_size, NUMA_NO_NODE);
|
||||
}
|
||||
#endif /* CONFIG_DEBUG_PAGEALLOC */
|
||||
|
||||
|
@ -57,12 +57,8 @@ void vmemmap_remove_mapping(unsigned long start,
|
||||
|
||||
static __ref void *early_alloc_pgtable(unsigned long size)
|
||||
{
|
||||
void *pt;
|
||||
|
||||
pt = __va(memblock_alloc_base(size, size, __pa(MAX_DMA_ADDRESS)));
|
||||
memset(pt, 0, size);
|
||||
|
||||
return pt;
|
||||
return memblock_alloc_try_nid(size, size, MEMBLOCK_LOW_LIMIT,
|
||||
__pa(MAX_DMA_ADDRESS), NUMA_NO_NODE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -195,11 +195,8 @@ void __init mmu_partition_table_init(void)
|
||||
unsigned long ptcr;
|
||||
|
||||
BUILD_BUG_ON_MSG((PATB_SIZE_SHIFT > 36), "Partition table size too large.");
|
||||
partition_tb = __va(memblock_alloc_base(patb_size, patb_size,
|
||||
MEMBLOCK_ALLOC_ANYWHERE));
|
||||
|
||||
/* Initialize the Partition Table with no entries */
|
||||
memset((void *)partition_tb, 0, patb_size);
|
||||
partition_tb = memblock_alloc(patb_size, patb_size);
|
||||
|
||||
/*
|
||||
* update partition table control register,
|
||||
|
@ -51,26 +51,15 @@ static int native_register_process_table(unsigned long base, unsigned long pg_sz
|
||||
static __ref void *early_alloc_pgtable(unsigned long size, int nid,
|
||||
unsigned long region_start, unsigned long region_end)
|
||||
{
|
||||
unsigned long pa = 0;
|
||||
void *pt;
|
||||
phys_addr_t min_addr = MEMBLOCK_LOW_LIMIT;
|
||||
phys_addr_t max_addr = MEMBLOCK_ALLOC_ANYWHERE;
|
||||
|
||||
if (region_start || region_end) /* has region hint */
|
||||
pa = memblock_alloc_range(size, size, region_start, region_end,
|
||||
MEMBLOCK_NONE);
|
||||
else if (nid != -1) /* has node hint */
|
||||
pa = memblock_alloc_base_nid(size, size,
|
||||
MEMBLOCK_ALLOC_ANYWHERE,
|
||||
nid, MEMBLOCK_NONE);
|
||||
if (region_start)
|
||||
min_addr = region_start;
|
||||
if (region_end)
|
||||
max_addr = region_end;
|
||||
|
||||
if (!pa)
|
||||
pa = memblock_alloc_base(size, size, MEMBLOCK_ALLOC_ANYWHERE);
|
||||
|
||||
BUG_ON(!pa);
|
||||
|
||||
pt = __va(pa);
|
||||
memset(pt, 0, size);
|
||||
|
||||
return pt;
|
||||
return memblock_alloc_try_nid(size, size, min_addr, max_addr, nid);
|
||||
}
|
||||
|
||||
static int early_map_kernel_page(unsigned long ea, unsigned long pa,
|
||||
|
@ -339,8 +339,7 @@ void __init MMU_init_hw(void)
|
||||
* Find some memory for the hash table.
|
||||
*/
|
||||
if ( ppc_md.progress ) ppc_md.progress("hash:find piece", 0x322);
|
||||
Hash = __va(memblock_phys_alloc(Hash_size, Hash_size));
|
||||
memset(Hash, 0, Hash_size);
|
||||
Hash = memblock_alloc(Hash_size, Hash_size);
|
||||
_SDR1 = __pa(Hash) | SDR1_LOW_BITS;
|
||||
|
||||
Hash_end = (struct hash_pte *) ((unsigned long)Hash + Hash_size);
|
||||
|
@ -208,7 +208,9 @@ static int __init iob_init(struct device_node *dn)
|
||||
pr_debug(" -> %s\n", __func__);
|
||||
|
||||
/* For 2G space, 8x64 pages (2^21 bytes) is max total l2 size */
|
||||
iob_l2_base = (u32 *)__va(memblock_alloc_base(1UL<<21, 1UL<<21, 0x80000000));
|
||||
iob_l2_base = memblock_alloc_try_nid_raw(1UL << 21, 1UL << 21,
|
||||
MEMBLOCK_LOW_LIMIT, 0x80000000,
|
||||
NUMA_NO_NODE);
|
||||
|
||||
pr_info("IOBMAP L2 allocated at: %p\n", iob_l2_base);
|
||||
|
||||
@ -269,4 +271,3 @@ void __init iommu_init_early_pasemi(void)
|
||||
pasemi_pci_controller_ops.dma_bus_setup = pci_dma_bus_setup_pasemi;
|
||||
set_pci_dma_ops(&dma_iommu_ops);
|
||||
}
|
||||
|
||||
|
@ -170,8 +170,7 @@ int __init early_init_dt_scan_recoverable_ranges(unsigned long node,
|
||||
/*
|
||||
* Allocate a buffer to hold the MC recoverable ranges.
|
||||
*/
|
||||
mc_recoverable_range =__va(memblock_phys_alloc(size, __alignof__(u64)));
|
||||
memset(mc_recoverable_range, 0, size);
|
||||
mc_recoverable_range = memblock_alloc(size, __alignof__(u64));
|
||||
|
||||
for (i = 0; i < mc_recoverable_range_len; i++) {
|
||||
mc_recoverable_range[i].start_addr =
|
||||
|
@ -130,8 +130,13 @@ static void __init fwnmi_init(void)
|
||||
* It will be used in real mode mce handler, hence it needs to be
|
||||
* below RMA.
|
||||
*/
|
||||
mce_data_buf = __va(memblock_alloc_base(RTAS_ERROR_LOG_MAX * nr_cpus,
|
||||
RTAS_ERROR_LOG_MAX, ppc64_rma_size));
|
||||
mce_data_buf = memblock_alloc_try_nid_raw(RTAS_ERROR_LOG_MAX * nr_cpus,
|
||||
RTAS_ERROR_LOG_MAX, MEMBLOCK_LOW_LIMIT,
|
||||
ppc64_rma_size, NUMA_NO_NODE);
|
||||
if (!mce_data_buf)
|
||||
panic("Failed to allocate %d bytes below %pa for MCE buffer\n",
|
||||
RTAS_ERROR_LOG_MAX * nr_cpus, &ppc64_rma_size);
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
paca_ptrs[i]->mce_data_buf = mce_data_buf +
|
||||
(RTAS_ERROR_LOG_MAX * i);
|
||||
@ -140,8 +145,13 @@ static void __init fwnmi_init(void)
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
/* Allocate per cpu slb area to save old slb contents during MCE */
|
||||
size = sizeof(struct slb_entry) * mmu_slb_size * nr_cpus;
|
||||
slb_ptr = __va(memblock_alloc_base(size, sizeof(struct slb_entry),
|
||||
ppc64_rma_size));
|
||||
slb_ptr = memblock_alloc_try_nid_raw(size, sizeof(struct slb_entry),
|
||||
MEMBLOCK_LOW_LIMIT, ppc64_rma_size,
|
||||
NUMA_NO_NODE);
|
||||
if (!slb_ptr)
|
||||
panic("Failed to allocate %zu bytes below %pa for slb area\n",
|
||||
size, &ppc64_rma_size);
|
||||
|
||||
for_each_possible_cpu(i)
|
||||
paca_ptrs[i]->mce_faulty_slbs = slb_ptr + (mmu_slb_size * i);
|
||||
#endif
|
||||
|
@ -251,8 +251,11 @@ static void allocate_dart(void)
|
||||
* 16MB (1 << 24) alignment. We allocate a full 16Mb chuck since we
|
||||
* will blow up an entire large page anyway in the kernel mapping.
|
||||
*/
|
||||
dart_tablebase = __va(memblock_alloc_base(1UL<<24,
|
||||
1UL<<24, 0x80000000L));
|
||||
dart_tablebase = memblock_alloc_try_nid_raw(SZ_16M, SZ_16M,
|
||||
MEMBLOCK_LOW_LIMIT, SZ_2G,
|
||||
NUMA_NO_NODE);
|
||||
if (!dart_tablebase)
|
||||
panic("Failed to allocate 16MB below 2GB for DART table\n");
|
||||
|
||||
/* There is no point scanning the DART space for leaks*/
|
||||
kmemleak_no_scan((void *)dart_tablebase);
|
||||
|
@ -57,18 +57,6 @@ EXPORT_SYMBOL(__node_distance);
|
||||
|
||||
int numa_debug_enabled;
|
||||
|
||||
/*
|
||||
* alloc_node_data() - Allocate node data
|
||||
*/
|
||||
static __init pg_data_t *alloc_node_data(void)
|
||||
{
|
||||
pg_data_t *res;
|
||||
|
||||
res = (pg_data_t *) memblock_phys_alloc(sizeof(pg_data_t), 8);
|
||||
memset(res, 0, sizeof(pg_data_t));
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* numa_setup_memory() - Assign bootmem to nodes
|
||||
*
|
||||
@ -105,7 +93,7 @@ static void __init numa_setup_memory(void)
|
||||
|
||||
/* Allocate and fill out node_data */
|
||||
for (nid = 0; nid < MAX_NUMNODES; nid++)
|
||||
NODE_DATA(nid) = alloc_node_data();
|
||||
NODE_DATA(nid) = memblock_alloc(sizeof(pg_data_t), 8);
|
||||
|
||||
for_each_online_node(nid) {
|
||||
unsigned long start_pfn, end_pfn;
|
||||
|
@ -81,7 +81,6 @@ CONFIG_NLS_CODEPAGE_932=y
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
|
@ -32,6 +32,5 @@ CONFIG_SH_PCLK_FREQ=31250000
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_PROC_FS is not set
|
||||
# CONFIG_SYSFS is not set
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
# CONFIG_CRC32 is not set
|
||||
|
@ -111,7 +111,6 @@ CONFIG_NLS_ISO8859_15=y
|
||||
CONFIG_NLS_KOI8_R=y
|
||||
CONFIG_NLS_KOI8_U=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
|
@ -209,7 +209,6 @@ CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NLS_ISO8859_15=m
|
||||
CONFIG_NLS_UTF8=m
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
|
@ -157,7 +157,6 @@ CONFIG_NLS_ISO8859_15=y
|
||||
CONFIG_NLS_KOI8_R=y
|
||||
CONFIG_NLS_KOI8_U=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
|
@ -40,6 +40,5 @@ CONFIG_UIO_PDRV_GENIRQ=y
|
||||
# CONFIG_PROC_FS is not set
|
||||
# CONFIG_SYSFS is not set
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
# CONFIG_CRC32 is not set
|
||||
|
@ -113,7 +113,6 @@ CONFIG_NLS_ISO8859_15=y
|
||||
CONFIG_NLS_KOI8_R=y
|
||||
CONFIG_NLS_KOI8_U=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
|
@ -42,6 +42,5 @@ CONFIG_UIO_PDRV_GENIRQ=y
|
||||
# CONFIG_PROC_FS is not set
|
||||
# CONFIG_SYSFS is not set
|
||||
# CONFIG_MISC_FILESYSTEMS is not set
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
# CONFIG_CRC32 is not set
|
||||
|
@ -109,7 +109,6 @@ CONFIG_NFSD_V4=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_932=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
|
@ -82,7 +82,6 @@ CONFIG_NFSD=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_932=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=y
|
||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
|
@ -136,7 +136,6 @@ CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_932=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
|
@ -192,24 +192,16 @@ void __init page_table_range_init(unsigned long start, unsigned long end,
|
||||
void __init allocate_pgdat(unsigned int nid)
|
||||
{
|
||||
unsigned long start_pfn, end_pfn;
|
||||
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
||||
unsigned long phys;
|
||||
#endif
|
||||
|
||||
get_pfn_range_for_nid(nid, &start_pfn, &end_pfn);
|
||||
|
||||
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
||||
phys = __memblock_alloc_base(sizeof(struct pglist_data),
|
||||
SMP_CACHE_BYTES, end_pfn << PAGE_SHIFT);
|
||||
/* Retry with all of system memory */
|
||||
if (!phys)
|
||||
phys = __memblock_alloc_base(sizeof(struct pglist_data),
|
||||
SMP_CACHE_BYTES, memblock_end_of_DRAM());
|
||||
if (!phys)
|
||||
NODE_DATA(nid) = memblock_alloc_try_nid_nopanic(
|
||||
sizeof(struct pglist_data),
|
||||
SMP_CACHE_BYTES, MEMBLOCK_LOW_LIMIT,
|
||||
MEMBLOCK_ALLOC_ACCESSIBLE, nid);
|
||||
if (!NODE_DATA(nid))
|
||||
panic("Can't allocate pgdat for node %d\n", nid);
|
||||
|
||||
NODE_DATA(nid) = __va(phys);
|
||||
memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
|
||||
#endif
|
||||
|
||||
NODE_DATA(nid)->node_start_pfn = start_pfn;
|
||||
|
@ -41,9 +41,8 @@ void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end)
|
||||
__add_active_range(nid, start_pfn, end_pfn);
|
||||
|
||||
/* Node-local pgdat */
|
||||
NODE_DATA(nid) = __va(memblock_alloc_base(sizeof(struct pglist_data),
|
||||
SMP_CACHE_BYTES, end));
|
||||
memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
|
||||
NODE_DATA(nid) = memblock_alloc_node(sizeof(struct pglist_data),
|
||||
SMP_CACHE_BYTES, nid);
|
||||
|
||||
NODE_DATA(nid)->node_start_pfn = start_pfn;
|
||||
NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
|
||||
|
@ -75,7 +75,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_RPCSEC_GSS_KRB5=m
|
||||
CONFIG_NLS=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
|
@ -201,7 +201,6 @@ CONFIG_PROC_KCORE=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_HUGETLBFS=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOCKUP_DETECTOR=y
|
||||
|
@ -34,16 +34,13 @@
|
||||
|
||||
void * __init prom_early_alloc(unsigned long size)
|
||||
{
|
||||
unsigned long paddr = memblock_phys_alloc(size, SMP_CACHE_BYTES);
|
||||
void *ret;
|
||||
void *ret = memblock_alloc(size, SMP_CACHE_BYTES);
|
||||
|
||||
if (!paddr) {
|
||||
if (!ret) {
|
||||
prom_printf("prom_early_alloc(%lu) failed\n", size);
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
ret = __va(paddr);
|
||||
memset(ret, 0, size);
|
||||
prom_early_allocated += size;
|
||||
|
||||
return ret;
|
||||
|
@ -1089,16 +1089,13 @@ static void __init allocate_node_data(int nid)
|
||||
struct pglist_data *p;
|
||||
unsigned long start_pfn, end_pfn;
|
||||
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
||||
unsigned long paddr;
|
||||
|
||||
paddr = memblock_phys_alloc_try_nid(sizeof(struct pglist_data),
|
||||
SMP_CACHE_BYTES, nid);
|
||||
if (!paddr) {
|
||||
NODE_DATA(nid) = memblock_alloc_node(sizeof(struct pglist_data),
|
||||
SMP_CACHE_BYTES, nid);
|
||||
if (!NODE_DATA(nid)) {
|
||||
prom_printf("Cannot allocate pglist_data for nid[%d]\n", nid);
|
||||
prom_halt();
|
||||
}
|
||||
NODE_DATA(nid) = __va(paddr);
|
||||
memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
|
||||
|
||||
NODE_DATA(nid)->node_id = nid;
|
||||
#endif
|
||||
|
@ -274,30 +274,6 @@ void __init mem_init(void)
|
||||
memblock_free_all();
|
||||
|
||||
mem_init_print_info(NULL);
|
||||
printk(KERN_NOTICE "Virtual kernel memory layout:\n"
|
||||
" vector : 0x%08lx - 0x%08lx (%4ld kB)\n"
|
||||
" vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n"
|
||||
" lowmem : 0x%08lx - 0x%08lx (%4ld MB)\n"
|
||||
" modules : 0x%08lx - 0x%08lx (%4ld MB)\n"
|
||||
" .init : 0x%p" " - 0x%p" " (%4d kB)\n"
|
||||
" .text : 0x%p" " - 0x%p" " (%4d kB)\n"
|
||||
" .data : 0x%p" " - 0x%p" " (%4d kB)\n",
|
||||
|
||||
VECTORS_BASE, VECTORS_BASE + PAGE_SIZE,
|
||||
DIV_ROUND_UP(PAGE_SIZE, SZ_1K),
|
||||
VMALLOC_START, VMALLOC_END,
|
||||
DIV_ROUND_UP((VMALLOC_END - VMALLOC_START), SZ_1M),
|
||||
PAGE_OFFSET, (unsigned long)high_memory,
|
||||
DIV_ROUND_UP(((unsigned long)high_memory - PAGE_OFFSET), SZ_1M),
|
||||
MODULES_VADDR, MODULES_END,
|
||||
DIV_ROUND_UP((MODULES_END - MODULES_VADDR), SZ_1M),
|
||||
|
||||
__init_begin, __init_end,
|
||||
DIV_ROUND_UP((__init_end - __init_begin), SZ_1K),
|
||||
_stext, _etext,
|
||||
DIV_ROUND_UP((_etext - _stext), SZ_1K),
|
||||
_sdata, _edata,
|
||||
DIV_ROUND_UP((_edata - _sdata), SZ_1K));
|
||||
|
||||
BUILD_BUG_ON(TASK_SIZE > MODULES_VADDR);
|
||||
BUG_ON(TASK_SIZE > MODULES_VADDR);
|
||||
|
@ -141,18 +141,12 @@ static void __init build_mem_type_table(void)
|
||||
|
||||
#define vectors_base() (vectors_high() ? 0xffff0000 : 0)
|
||||
|
||||
static void __init *early_alloc(unsigned long sz)
|
||||
{
|
||||
void *ptr = __va(memblock_phys_alloc(sz, sz));
|
||||
memset(ptr, 0, sz);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static pte_t * __init early_pte_alloc(pmd_t *pmd, unsigned long addr,
|
||||
unsigned long prot)
|
||||
{
|
||||
if (pmd_none(*pmd)) {
|
||||
pte_t *pte = early_alloc(PTRS_PER_PTE * sizeof(pte_t));
|
||||
pte_t *pte = memblock_alloc(PTRS_PER_PTE * sizeof(pte_t),
|
||||
PTRS_PER_PTE * sizeof(pte_t));
|
||||
__pmd_populate(pmd, __pa(pte) | prot);
|
||||
}
|
||||
BUG_ON(pmd_bad(*pmd));
|
||||
@ -354,7 +348,7 @@ static void __init devicemaps_init(void)
|
||||
/*
|
||||
* Allocate the vector page early.
|
||||
*/
|
||||
vectors = early_alloc(PAGE_SIZE);
|
||||
vectors = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
|
||||
for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE)
|
||||
pmd_clear(pmd_off_k(addr));
|
||||
@ -431,7 +425,7 @@ void __init paging_init(void)
|
||||
top_pmd = pmd_off_k(0xffff0000);
|
||||
|
||||
/* allocate the zero page. */
|
||||
zero_page = early_alloc(PAGE_SIZE);
|
||||
zero_page = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
|
||||
|
||||
bootmem_init();
|
||||
|
||||
|
@ -287,7 +287,6 @@ CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
CONFIG_FRAME_WARN=1024
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
|
@ -286,7 +286,6 @@ CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
|
@ -1031,7 +1031,7 @@ bad_area_access_error(struct pt_regs *regs, unsigned long error_code,
|
||||
|
||||
static void
|
||||
do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
|
||||
unsigned int fault)
|
||||
vm_fault_t fault)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
|
@ -128,7 +128,7 @@ obj-$(CONFIG_CRYPTO_CRC32C) += crc32c_generic.o
|
||||
obj-$(CONFIG_CRYPTO_CRC32) += crc32_generic.o
|
||||
obj-$(CONFIG_CRYPTO_CRCT10DIF) += crct10dif_common.o crct10dif_generic.o
|
||||
obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o authencesn.o
|
||||
obj-$(CONFIG_CRYPTO_LZO) += lzo.o
|
||||
obj-$(CONFIG_CRYPTO_LZO) += lzo.o lzo-rle.o
|
||||
obj-$(CONFIG_CRYPTO_LZ4) += lz4.o
|
||||
obj-$(CONFIG_CRYPTO_LZ4HC) += lz4hc.o
|
||||
obj-$(CONFIG_CRYPTO_842) += 842.o
|
||||
|
175
crypto/lzo-rle.c
Normal file
175
crypto/lzo-rle.c
Normal file
@ -0,0 +1,175 @@
|
||||
/*
|
||||
* Cryptographic API.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 51
|
||||
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/lzo.h>
|
||||
#include <crypto/internal/scompress.h>
|
||||
|
||||
struct lzorle_ctx {
|
||||
void *lzorle_comp_mem;
|
||||
};
|
||||
|
||||
static void *lzorle_alloc_ctx(struct crypto_scomp *tfm)
|
||||
{
|
||||
void *ctx;
|
||||
|
||||
ctx = kvmalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
static int lzorle_init(struct crypto_tfm *tfm)
|
||||
{
|
||||
struct lzorle_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
ctx->lzorle_comp_mem = lzorle_alloc_ctx(NULL);
|
||||
if (IS_ERR(ctx->lzorle_comp_mem))
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void lzorle_free_ctx(struct crypto_scomp *tfm, void *ctx)
|
||||
{
|
||||
kvfree(ctx);
|
||||
}
|
||||
|
||||
static void lzorle_exit(struct crypto_tfm *tfm)
|
||||
{
|
||||
struct lzorle_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
lzorle_free_ctx(NULL, ctx->lzorle_comp_mem);
|
||||
}
|
||||
|
||||
static int __lzorle_compress(const u8 *src, unsigned int slen,
|
||||
u8 *dst, unsigned int *dlen, void *ctx)
|
||||
{
|
||||
size_t tmp_len = *dlen; /* size_t(ulong) <-> uint on 64 bit */
|
||||
int err;
|
||||
|
||||
err = lzorle1x_1_compress(src, slen, dst, &tmp_len, ctx);
|
||||
|
||||
if (err != LZO_E_OK)
|
||||
return -EINVAL;
|
||||
|
||||
*dlen = tmp_len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lzorle_compress(struct crypto_tfm *tfm, const u8 *src,
|
||||
unsigned int slen, u8 *dst, unsigned int *dlen)
|
||||
{
|
||||
struct lzorle_ctx *ctx = crypto_tfm_ctx(tfm);
|
||||
|
||||
return __lzorle_compress(src, slen, dst, dlen, ctx->lzorle_comp_mem);
|
||||
}
|
||||
|
||||
static int lzorle_scompress(struct crypto_scomp *tfm, const u8 *src,
|
||||
unsigned int slen, u8 *dst, unsigned int *dlen,
|
||||
void *ctx)
|
||||
{
|
||||
return __lzorle_compress(src, slen, dst, dlen, ctx);
|
||||
}
|
||||
|
||||
static int __lzorle_decompress(const u8 *src, unsigned int slen,
|
||||
u8 *dst, unsigned int *dlen)
|
||||
{
|
||||
int err;
|
||||
size_t tmp_len = *dlen; /* size_t(ulong) <-> uint on 64 bit */
|
||||
|
||||
err = lzo1x_decompress_safe(src, slen, dst, &tmp_len);
|
||||
|
||||
if (err != LZO_E_OK)
|
||||
return -EINVAL;
|
||||
|
||||
*dlen = tmp_len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lzorle_decompress(struct crypto_tfm *tfm, const u8 *src,
|
||||
unsigned int slen, u8 *dst, unsigned int *dlen)
|
||||
{
|
||||
return __lzorle_decompress(src, slen, dst, dlen);
|
||||
}
|
||||
|
||||
static int lzorle_sdecompress(struct crypto_scomp *tfm, const u8 *src,
|
||||
unsigned int slen, u8 *dst, unsigned int *dlen,
|
||||
void *ctx)
|
||||
{
|
||||
return __lzorle_decompress(src, slen, dst, dlen);
|
||||
}
|
||||
|
||||
static struct crypto_alg alg = {
|
||||
.cra_name = "lzo-rle",
|
||||
.cra_flags = CRYPTO_ALG_TYPE_COMPRESS,
|
||||
.cra_ctxsize = sizeof(struct lzorle_ctx),
|
||||
.cra_module = THIS_MODULE,
|
||||
.cra_init = lzorle_init,
|
||||
.cra_exit = lzorle_exit,
|
||||
.cra_u = { .compress = {
|
||||
.coa_compress = lzorle_compress,
|
||||
.coa_decompress = lzorle_decompress } }
|
||||
};
|
||||
|
||||
static struct scomp_alg scomp = {
|
||||
.alloc_ctx = lzorle_alloc_ctx,
|
||||
.free_ctx = lzorle_free_ctx,
|
||||
.compress = lzorle_scompress,
|
||||
.decompress = lzorle_sdecompress,
|
||||
.base = {
|
||||
.cra_name = "lzo-rle",
|
||||
.cra_driver_name = "lzo-rle-scomp",
|
||||
.cra_module = THIS_MODULE,
|
||||
}
|
||||
};
|
||||
|
||||
static int __init lzorle_mod_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = crypto_register_alg(&alg);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = crypto_register_scomp(&scomp);
|
||||
if (ret) {
|
||||
crypto_unregister_alg(&alg);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit lzorle_mod_fini(void)
|
||||
{
|
||||
crypto_unregister_alg(&alg);
|
||||
crypto_unregister_scomp(&scomp);
|
||||
}
|
||||
|
||||
module_init(lzorle_mod_init);
|
||||
module_exit(lzorle_mod_fini);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("LZO-RLE Compression Algorithm");
|
||||
MODULE_ALIAS_CRYPTO("lzo-rle");
|
@ -76,8 +76,8 @@ static char *check[] = {
|
||||
"cast6", "arc4", "michael_mic", "deflate", "crc32c", "tea", "xtea",
|
||||
"khazad", "wp512", "wp384", "wp256", "tnepres", "xeta", "fcrypt",
|
||||
"camellia", "seed", "salsa20", "rmd128", "rmd160", "rmd256", "rmd320",
|
||||
"lzo", "cts", "sha3-224", "sha3-256", "sha3-384", "sha3-512",
|
||||
"streebog256", "streebog512",
|
||||
"lzo", "lzo-rle", "cts", "sha3-224", "sha3-256", "sha3-384",
|
||||
"sha3-512", "streebog256", "streebog512",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
static const char * const backends[] = {
|
||||
"lzo",
|
||||
"lzo-rle",
|
||||
#if IS_ENABLED(CONFIG_CRYPTO_LZ4)
|
||||
"lz4",
|
||||
#endif
|
||||
|
@ -2149,6 +2149,7 @@ static void mport_release_mapping(struct kref *ref)
|
||||
switch (map->dir) {
|
||||
case MAP_INBOUND:
|
||||
rio_unmap_inb_region(mport, map->phys_addr);
|
||||
/* fall through */
|
||||
case MAP_DMA:
|
||||
dma_free_coherent(mport->dev.parent, map->size,
|
||||
map->virt_addr, map->phys_addr);
|
||||
|
@ -1215,7 +1215,9 @@ static int riocm_ch_listen(u16 ch_id)
|
||||
riocm_debug(CHOP, "(ch_%d)", ch_id);
|
||||
|
||||
ch = riocm_get_channel(ch_id);
|
||||
if (!ch || !riocm_cmp_exch(ch, RIO_CM_CHAN_BOUND, RIO_CM_LISTEN))
|
||||
if (!ch)
|
||||
return -EINVAL;
|
||||
if (!riocm_cmp_exch(ch, RIO_CM_CHAN_BOUND, RIO_CM_LISTEN))
|
||||
ret = -EINVAL;
|
||||
riocm_put_channel(ch);
|
||||
return ret;
|
||||
|
@ -105,6 +105,7 @@ struct autofs_wait_queue {
|
||||
|
||||
#define AUTOFS_SBI_CATATONIC 0x0001
|
||||
#define AUTOFS_SBI_STRICTEXPIRE 0x0002
|
||||
#define AUTOFS_SBI_IGNORE 0x0004
|
||||
|
||||
struct autofs_sb_info {
|
||||
u32 magic;
|
||||
@ -215,6 +216,8 @@ static inline int autofs_prepare_pipe(struct file *pipe)
|
||||
return -EINVAL;
|
||||
/* We want a packet pipe */
|
||||
pipe->f_flags |= O_DIRECT;
|
||||
/* We don't expect -EAGAIN */
|
||||
pipe->f_flags &= ~O_NONBLOCK;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -82,18 +82,20 @@ static int autofs_show_options(struct seq_file *m, struct dentry *root)
|
||||
seq_printf(m, ",maxproto=%d", sbi->max_proto);
|
||||
|
||||
if (autofs_type_offset(sbi->type))
|
||||
seq_printf(m, ",offset");
|
||||
seq_puts(m, ",offset");
|
||||
else if (autofs_type_direct(sbi->type))
|
||||
seq_printf(m, ",direct");
|
||||
seq_puts(m, ",direct");
|
||||
else
|
||||
seq_printf(m, ",indirect");
|
||||
seq_puts(m, ",indirect");
|
||||
if (sbi->flags & AUTOFS_SBI_STRICTEXPIRE)
|
||||
seq_printf(m, ",strictexpire");
|
||||
seq_puts(m, ",strictexpire");
|
||||
if (sbi->flags & AUTOFS_SBI_IGNORE)
|
||||
seq_puts(m, ",ignore");
|
||||
#ifdef CONFIG_CHECKPOINT_RESTORE
|
||||
if (sbi->pipe)
|
||||
seq_printf(m, ",pipe_ino=%ld", file_inode(sbi->pipe)->i_ino);
|
||||
else
|
||||
seq_printf(m, ",pipe_ino=-1");
|
||||
seq_puts(m, ",pipe_ino=-1");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@ -111,7 +113,8 @@ static const struct super_operations autofs_sops = {
|
||||
};
|
||||
|
||||
enum {Opt_err, Opt_fd, Opt_uid, Opt_gid, Opt_pgrp, Opt_minproto, Opt_maxproto,
|
||||
Opt_indirect, Opt_direct, Opt_offset, Opt_strictexpire};
|
||||
Opt_indirect, Opt_direct, Opt_offset, Opt_strictexpire,
|
||||
Opt_ignore};
|
||||
|
||||
static const match_table_t tokens = {
|
||||
{Opt_fd, "fd=%u"},
|
||||
@ -124,6 +127,7 @@ static const match_table_t tokens = {
|
||||
{Opt_direct, "direct"},
|
||||
{Opt_offset, "offset"},
|
||||
{Opt_strictexpire, "strictexpire"},
|
||||
{Opt_ignore, "ignore"},
|
||||
{Opt_err, NULL}
|
||||
};
|
||||
|
||||
@ -206,6 +210,9 @@ static int parse_options(char *options,
|
||||
case Opt_strictexpire:
|
||||
sbi->flags |= AUTOFS_SBI_STRICTEXPIRE;
|
||||
break;
|
||||
case Opt_ignore:
|
||||
sbi->flags |= AUTOFS_SBI_IGNORE;
|
||||
break;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
|
@ -57,8 +57,6 @@
|
||||
#endif
|
||||
|
||||
static int load_elf_binary(struct linux_binprm *bprm);
|
||||
static unsigned long elf_map(struct file *, unsigned long, struct elf_phdr *,
|
||||
int, int, unsigned long);
|
||||
|
||||
#ifdef CONFIG_USELIB
|
||||
static int load_elf_library(struct file *);
|
||||
@ -347,7 +345,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
|
||||
#ifndef elf_map
|
||||
|
||||
static unsigned long elf_map(struct file *filep, unsigned long addr,
|
||||
struct elf_phdr *eppnt, int prot, int type,
|
||||
const struct elf_phdr *eppnt, int prot, int type,
|
||||
unsigned long total_size)
|
||||
{
|
||||
unsigned long map_addr;
|
||||
@ -387,7 +385,7 @@ static unsigned long elf_map(struct file *filep, unsigned long addr,
|
||||
|
||||
#endif /* !elf_map */
|
||||
|
||||
static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr)
|
||||
static unsigned long total_mapping_size(const struct elf_phdr *cmds, int nr)
|
||||
{
|
||||
int i, first_idx = -1, last_idx = -1;
|
||||
|
||||
@ -414,12 +412,13 @@ static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr)
|
||||
* header pointed to by elf_ex, into a newly allocated array. The caller is
|
||||
* responsible for freeing the allocated data. Returns an ERR_PTR upon failure.
|
||||
*/
|
||||
static struct elf_phdr *load_elf_phdrs(struct elfhdr *elf_ex,
|
||||
static struct elf_phdr *load_elf_phdrs(const struct elfhdr *elf_ex,
|
||||
struct file *elf_file)
|
||||
{
|
||||
struct elf_phdr *elf_phdata = NULL;
|
||||
int retval, size, err = -1;
|
||||
int retval, err = -1;
|
||||
loff_t pos = elf_ex->e_phoff;
|
||||
unsigned int size;
|
||||
|
||||
/*
|
||||
* If the size of this structure has changed, then punt, since
|
||||
@ -429,13 +428,9 @@ static struct elf_phdr *load_elf_phdrs(struct elfhdr *elf_ex,
|
||||
goto out;
|
||||
|
||||
/* Sanity check the number of program headers... */
|
||||
if (elf_ex->e_phnum < 1 ||
|
||||
elf_ex->e_phnum > 65536U / sizeof(struct elf_phdr))
|
||||
goto out;
|
||||
|
||||
/* ...and their total size. */
|
||||
size = sizeof(struct elf_phdr) * elf_ex->e_phnum;
|
||||
if (size > ELF_MIN_ALIGN)
|
||||
if (size == 0 || size > 65536 || size > ELF_MIN_ALIGN)
|
||||
goto out;
|
||||
|
||||
elf_phdata = kmalloc(size, GFP_KERNEL);
|
||||
@ -2033,7 +2028,6 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
|
||||
struct elf_note_info *info,
|
||||
const kernel_siginfo_t *siginfo, struct pt_regs *regs)
|
||||
{
|
||||
struct list_head *t;
|
||||
struct core_thread *ct;
|
||||
struct elf_thread_status *ets;
|
||||
|
||||
@ -2050,10 +2044,9 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
|
||||
list_add(&ets->list, &info->thread_list);
|
||||
}
|
||||
|
||||
list_for_each(t, &info->thread_list) {
|
||||
list_for_each_entry(ets, &info->thread_list, list) {
|
||||
int sz;
|
||||
|
||||
ets = list_entry(t, struct elf_thread_status, list);
|
||||
sz = elf_dump_thread_status(siginfo->si_signo, ets);
|
||||
info->thread_status_size += sz;
|
||||
}
|
||||
@ -2117,20 +2110,17 @@ static size_t get_note_info_size(struct elf_note_info *info)
|
||||
static int write_note_info(struct elf_note_info *info,
|
||||
struct coredump_params *cprm)
|
||||
{
|
||||
struct elf_thread_status *ets;
|
||||
int i;
|
||||
struct list_head *t;
|
||||
|
||||
for (i = 0; i < info->numnote; i++)
|
||||
if (!writenote(info->notes + i, cprm))
|
||||
return 0;
|
||||
|
||||
/* write out the thread status notes section */
|
||||
list_for_each(t, &info->thread_list) {
|
||||
struct elf_thread_status *tmp =
|
||||
list_entry(t, struct elf_thread_status, list);
|
||||
|
||||
for (i = 0; i < tmp->num_notes; i++)
|
||||
if (!writenote(&tmp->notes[i], cprm))
|
||||
list_for_each_entry(ets, &info->thread_list, list) {
|
||||
for (i = 0; i < ets->num_notes; i++)
|
||||
if (!writenote(&ets->notes[i], cprm))
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3449,31 +3449,17 @@ void btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt, ...);
|
||||
|
||||
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||
#define btrfs_debug(fs_info, fmt, args...) \
|
||||
do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
|
||||
btrfs_printk(fs_info, KERN_DEBUG fmt, ##args); \
|
||||
} while (0)
|
||||
#define btrfs_debug_in_rcu(fs_info, fmt, args...) \
|
||||
do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
|
||||
btrfs_printk_in_rcu(fs_info, KERN_DEBUG fmt, ##args); \
|
||||
} while (0)
|
||||
_dynamic_func_call_no_desc(fmt, btrfs_printk, \
|
||||
fs_info, KERN_DEBUG fmt, ##args)
|
||||
#define btrfs_debug_in_rcu(fs_info, fmt, args...) \
|
||||
_dynamic_func_call_no_desc(fmt, btrfs_printk_in_rcu, \
|
||||
fs_info, KERN_DEBUG fmt, ##args)
|
||||
#define btrfs_debug_rl_in_rcu(fs_info, fmt, args...) \
|
||||
do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
|
||||
btrfs_printk_rl_in_rcu(fs_info, KERN_DEBUG fmt, \
|
||||
##args);\
|
||||
} while (0)
|
||||
#define btrfs_debug_rl(fs_info, fmt, args...) \
|
||||
do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
|
||||
btrfs_printk_ratelimited(fs_info, KERN_DEBUG fmt, \
|
||||
##args); \
|
||||
} while (0)
|
||||
_dynamic_func_call_no_desc(fmt, btrfs_printk_rl_in_rcu, \
|
||||
fs_info, KERN_DEBUG fmt, ##args)
|
||||
#define btrfs_debug_rl(fs_info, fmt, args...) \
|
||||
_dynamic_func_call_no_desc(fmt, btrfs_printk_ratelimited, \
|
||||
fs_info, KERN_DEBUG fmt, ##args)
|
||||
#elif defined(DEBUG)
|
||||
#define btrfs_debug(fs_info, fmt, args...) \
|
||||
btrfs_printk(fs_info, KERN_DEBUG fmt, ##args)
|
||||
|
173
fs/eventpoll.c
173
fs/eventpoll.c
@ -50,10 +50,10 @@
|
||||
*
|
||||
* 1) epmutex (mutex)
|
||||
* 2) ep->mtx (mutex)
|
||||
* 3) ep->wq.lock (spinlock)
|
||||
* 3) ep->lock (rwlock)
|
||||
*
|
||||
* The acquire order is the one listed above, from 1 to 3.
|
||||
* We need a spinlock (ep->wq.lock) because we manipulate objects
|
||||
* We need a rwlock (ep->lock) because we manipulate objects
|
||||
* from inside the poll callback, that might be triggered from
|
||||
* a wake_up() that in turn might be called from IRQ context.
|
||||
* So we can't sleep inside the poll callback and hence we need
|
||||
@ -85,7 +85,7 @@
|
||||
* of epoll file descriptors, we use the current recursion depth as
|
||||
* the lockdep subkey.
|
||||
* It is possible to drop the "ep->mtx" and to use the global
|
||||
* mutex "epmutex" (together with "ep->wq.lock") to have it working,
|
||||
* mutex "epmutex" (together with "ep->lock") to have it working,
|
||||
* but having "ep->mtx" will make the interface more scalable.
|
||||
* Events that require holding "epmutex" are very rare, while for
|
||||
* normal operations the epoll private "ep->mtx" will guarantee
|
||||
@ -182,8 +182,6 @@ struct epitem {
|
||||
* This structure is stored inside the "private_data" member of the file
|
||||
* structure and represents the main data structure for the eventpoll
|
||||
* interface.
|
||||
*
|
||||
* Access to it is protected by the lock inside wq.
|
||||
*/
|
||||
struct eventpoll {
|
||||
/*
|
||||
@ -203,13 +201,16 @@ struct eventpoll {
|
||||
/* List of ready file descriptors */
|
||||
struct list_head rdllist;
|
||||
|
||||
/* Lock which protects rdllist and ovflist */
|
||||
rwlock_t lock;
|
||||
|
||||
/* RB tree root used to store monitored fd structs */
|
||||
struct rb_root_cached rbr;
|
||||
|
||||
/*
|
||||
* This is a single linked list that chains all the "struct epitem" that
|
||||
* happened while transferring ready events to userspace w/out
|
||||
* holding ->wq.lock.
|
||||
* holding ->lock.
|
||||
*/
|
||||
struct epitem *ovflist;
|
||||
|
||||
@ -697,17 +698,17 @@ static __poll_t ep_scan_ready_list(struct eventpoll *ep,
|
||||
* because we want the "sproc" callback to be able to do it
|
||||
* in a lockless way.
|
||||
*/
|
||||
spin_lock_irq(&ep->wq.lock);
|
||||
write_lock_irq(&ep->lock);
|
||||
list_splice_init(&ep->rdllist, &txlist);
|
||||
WRITE_ONCE(ep->ovflist, NULL);
|
||||
spin_unlock_irq(&ep->wq.lock);
|
||||
write_unlock_irq(&ep->lock);
|
||||
|
||||
/*
|
||||
* Now call the callback function.
|
||||
*/
|
||||
res = (*sproc)(ep, &txlist, priv);
|
||||
|
||||
spin_lock_irq(&ep->wq.lock);
|
||||
write_lock_irq(&ep->lock);
|
||||
/*
|
||||
* During the time we spent inside the "sproc" callback, some
|
||||
* other events might have been queued by the poll callback.
|
||||
@ -722,7 +723,11 @@ static __poll_t ep_scan_ready_list(struct eventpoll *ep,
|
||||
* contain them, and the list_splice() below takes care of them.
|
||||
*/
|
||||
if (!ep_is_linked(epi)) {
|
||||
list_add_tail(&epi->rdllink, &ep->rdllist);
|
||||
/*
|
||||
* ->ovflist is LIFO, so we have to reverse it in order
|
||||
* to keep in FIFO.
|
||||
*/
|
||||
list_add(&epi->rdllink, &ep->rdllist);
|
||||
ep_pm_stay_awake(epi);
|
||||
}
|
||||
}
|
||||
@ -745,11 +750,11 @@ static __poll_t ep_scan_ready_list(struct eventpoll *ep,
|
||||
* the ->poll() wait list (delayed after we release the lock).
|
||||
*/
|
||||
if (waitqueue_active(&ep->wq))
|
||||
wake_up_locked(&ep->wq);
|
||||
wake_up(&ep->wq);
|
||||
if (waitqueue_active(&ep->poll_wait))
|
||||
pwake++;
|
||||
}
|
||||
spin_unlock_irq(&ep->wq.lock);
|
||||
write_unlock_irq(&ep->lock);
|
||||
|
||||
if (!ep_locked)
|
||||
mutex_unlock(&ep->mtx);
|
||||
@ -789,10 +794,10 @@ static int ep_remove(struct eventpoll *ep, struct epitem *epi)
|
||||
|
||||
rb_erase_cached(&epi->rbn, &ep->rbr);
|
||||
|
||||
spin_lock_irq(&ep->wq.lock);
|
||||
write_lock_irq(&ep->lock);
|
||||
if (ep_is_linked(epi))
|
||||
list_del_init(&epi->rdllink);
|
||||
spin_unlock_irq(&ep->wq.lock);
|
||||
write_unlock_irq(&ep->lock);
|
||||
|
||||
wakeup_source_unregister(ep_wakeup_source(epi));
|
||||
/*
|
||||
@ -842,7 +847,7 @@ static void ep_free(struct eventpoll *ep)
|
||||
* Walks through the whole tree by freeing each "struct epitem". At this
|
||||
* point we are sure no poll callbacks will be lingering around, and also by
|
||||
* holding "epmutex" we can be sure that no file cleanup code will hit
|
||||
* us during this operation. So we can avoid the lock on "ep->wq.lock".
|
||||
* us during this operation. So we can avoid the lock on "ep->lock".
|
||||
* We do not need to lock ep->mtx, either, we only do it to prevent
|
||||
* a lockdep warning.
|
||||
*/
|
||||
@ -1023,6 +1028,7 @@ static int ep_alloc(struct eventpoll **pep)
|
||||
goto free_uid;
|
||||
|
||||
mutex_init(&ep->mtx);
|
||||
rwlock_init(&ep->lock);
|
||||
init_waitqueue_head(&ep->wq);
|
||||
init_waitqueue_head(&ep->poll_wait);
|
||||
INIT_LIST_HEAD(&ep->rdllist);
|
||||
@ -1112,21 +1118,107 @@ struct file *get_epoll_tfile_raw_ptr(struct file *file, int tfd,
|
||||
}
|
||||
#endif /* CONFIG_CHECKPOINT_RESTORE */
|
||||
|
||||
/**
|
||||
* Adds a new entry to the tail of the list in a lockless way, i.e.
|
||||
* multiple CPUs are allowed to call this function concurrently.
|
||||
*
|
||||
* Beware: it is necessary to prevent any other modifications of the
|
||||
* existing list until all changes are completed, in other words
|
||||
* concurrent list_add_tail_lockless() calls should be protected
|
||||
* with a read lock, where write lock acts as a barrier which
|
||||
* makes sure all list_add_tail_lockless() calls are fully
|
||||
* completed.
|
||||
*
|
||||
* Also an element can be locklessly added to the list only in one
|
||||
* direction i.e. either to the tail either to the head, otherwise
|
||||
* concurrent access will corrupt the list.
|
||||
*
|
||||
* Returns %false if element has been already added to the list, %true
|
||||
* otherwise.
|
||||
*/
|
||||
static inline bool list_add_tail_lockless(struct list_head *new,
|
||||
struct list_head *head)
|
||||
{
|
||||
struct list_head *prev;
|
||||
|
||||
/*
|
||||
* This is simple 'new->next = head' operation, but cmpxchg()
|
||||
* is used in order to detect that same element has been just
|
||||
* added to the list from another CPU: the winner observes
|
||||
* new->next == new.
|
||||
*/
|
||||
if (cmpxchg(&new->next, new, head) != new)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* Initially ->next of a new element must be updated with the head
|
||||
* (we are inserting to the tail) and only then pointers are atomically
|
||||
* exchanged. XCHG guarantees memory ordering, thus ->next should be
|
||||
* updated before pointers are actually swapped and pointers are
|
||||
* swapped before prev->next is updated.
|
||||
*/
|
||||
|
||||
prev = xchg(&head->prev, new);
|
||||
|
||||
/*
|
||||
* It is safe to modify prev->next and new->prev, because a new element
|
||||
* is added only to the tail and new->next is updated before XCHG.
|
||||
*/
|
||||
|
||||
prev->next = new;
|
||||
new->prev = prev;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Chains a new epi entry to the tail of the ep->ovflist in a lockless way,
|
||||
* i.e. multiple CPUs are allowed to call this function concurrently.
|
||||
*
|
||||
* Returns %false if epi element has been already chained, %true otherwise.
|
||||
*/
|
||||
static inline bool chain_epi_lockless(struct epitem *epi)
|
||||
{
|
||||
struct eventpoll *ep = epi->ep;
|
||||
|
||||
/* Check that the same epi has not been just chained from another CPU */
|
||||
if (cmpxchg(&epi->next, EP_UNACTIVE_PTR, NULL) != EP_UNACTIVE_PTR)
|
||||
return false;
|
||||
|
||||
/* Atomically exchange tail */
|
||||
epi->next = xchg(&ep->ovflist, epi);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the callback that is passed to the wait queue wakeup
|
||||
* mechanism. It is called by the stored file descriptors when they
|
||||
* have events to report.
|
||||
*
|
||||
* This callback takes a read lock in order not to content with concurrent
|
||||
* events from another file descriptors, thus all modifications to ->rdllist
|
||||
* or ->ovflist are lockless. Read lock is paired with the write lock from
|
||||
* ep_scan_ready_list(), which stops all list modifications and guarantees
|
||||
* that lists state is seen correctly.
|
||||
*
|
||||
* Another thing worth to mention is that ep_poll_callback() can be called
|
||||
* concurrently for the same @epi from different CPUs if poll table was inited
|
||||
* with several wait queues entries. Plural wakeup from different CPUs of a
|
||||
* single wait queue is serialized by wq.lock, but the case when multiple wait
|
||||
* queues are used should be detected accordingly. This is detected using
|
||||
* cmpxchg() operation.
|
||||
*/
|
||||
static int ep_poll_callback(wait_queue_entry_t *wait, unsigned mode, int sync, void *key)
|
||||
{
|
||||
int pwake = 0;
|
||||
unsigned long flags;
|
||||
struct epitem *epi = ep_item_from_wait(wait);
|
||||
struct eventpoll *ep = epi->ep;
|
||||
__poll_t pollflags = key_to_poll(key);
|
||||
unsigned long flags;
|
||||
int ewake = 0;
|
||||
|
||||
spin_lock_irqsave(&ep->wq.lock, flags);
|
||||
read_lock_irqsave(&ep->lock, flags);
|
||||
|
||||
ep_set_busy_poll_napi_id(epi);
|
||||
|
||||
@ -1155,24 +1247,15 @@ static int ep_poll_callback(wait_queue_entry_t *wait, unsigned mode, int sync, v
|
||||
* chained in ep->ovflist and requeued later on.
|
||||
*/
|
||||
if (READ_ONCE(ep->ovflist) != EP_UNACTIVE_PTR) {
|
||||
if (epi->next == EP_UNACTIVE_PTR) {
|
||||
epi->next = READ_ONCE(ep->ovflist);
|
||||
WRITE_ONCE(ep->ovflist, epi);
|
||||
if (epi->ws) {
|
||||
/*
|
||||
* Activate ep->ws since epi->ws may get
|
||||
* deactivated at any time.
|
||||
*/
|
||||
__pm_stay_awake(ep->ws);
|
||||
}
|
||||
|
||||
}
|
||||
if (epi->next == EP_UNACTIVE_PTR &&
|
||||
chain_epi_lockless(epi))
|
||||
ep_pm_stay_awake_rcu(epi);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* If this file is already in the ready list we exit soon */
|
||||
if (!ep_is_linked(epi)) {
|
||||
list_add_tail(&epi->rdllink, &ep->rdllist);
|
||||
if (!ep_is_linked(epi) &&
|
||||
list_add_tail_lockless(&epi->rdllink, &ep->rdllist)) {
|
||||
ep_pm_stay_awake_rcu(epi);
|
||||
}
|
||||
|
||||
@ -1197,13 +1280,13 @@ static int ep_poll_callback(wait_queue_entry_t *wait, unsigned mode, int sync, v
|
||||
break;
|
||||
}
|
||||
}
|
||||
wake_up_locked(&ep->wq);
|
||||
wake_up(&ep->wq);
|
||||
}
|
||||
if (waitqueue_active(&ep->poll_wait))
|
||||
pwake++;
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(&ep->wq.lock, flags);
|
||||
read_unlock_irqrestore(&ep->lock, flags);
|
||||
|
||||
/* We have to call this outside the lock */
|
||||
if (pwake)
|
||||
@ -1488,7 +1571,7 @@ static int ep_insert(struct eventpoll *ep, const struct epoll_event *event,
|
||||
goto error_remove_epi;
|
||||
|
||||
/* We have to drop the new item inside our item list to keep track of it */
|
||||
spin_lock_irq(&ep->wq.lock);
|
||||
write_lock_irq(&ep->lock);
|
||||
|
||||
/* record NAPI ID of new item if present */
|
||||
ep_set_busy_poll_napi_id(epi);
|
||||
@ -1500,12 +1583,12 @@ static int ep_insert(struct eventpoll *ep, const struct epoll_event *event,
|
||||
|
||||
/* Notify waiting tasks that events are available */
|
||||
if (waitqueue_active(&ep->wq))
|
||||
wake_up_locked(&ep->wq);
|
||||
wake_up(&ep->wq);
|
||||
if (waitqueue_active(&ep->poll_wait))
|
||||
pwake++;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&ep->wq.lock);
|
||||
write_unlock_irq(&ep->lock);
|
||||
|
||||
atomic_long_inc(&ep->user->epoll_watches);
|
||||
|
||||
@ -1531,10 +1614,10 @@ error_unregister:
|
||||
* list, since that is used/cleaned only inside a section bound by "mtx".
|
||||
* And ep_insert() is called with "mtx" held.
|
||||
*/
|
||||
spin_lock_irq(&ep->wq.lock);
|
||||
write_lock_irq(&ep->lock);
|
||||
if (ep_is_linked(epi))
|
||||
list_del_init(&epi->rdllink);
|
||||
spin_unlock_irq(&ep->wq.lock);
|
||||
write_unlock_irq(&ep->lock);
|
||||
|
||||
wakeup_source_unregister(ep_wakeup_source(epi));
|
||||
|
||||
@ -1578,9 +1661,9 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi,
|
||||
* 1) Flush epi changes above to other CPUs. This ensures
|
||||
* we do not miss events from ep_poll_callback if an
|
||||
* event occurs immediately after we call f_op->poll().
|
||||
* We need this because we did not take ep->wq.lock while
|
||||
* We need this because we did not take ep->lock while
|
||||
* changing epi above (but ep_poll_callback does take
|
||||
* ep->wq.lock).
|
||||
* ep->lock).
|
||||
*
|
||||
* 2) We also need to ensure we do not miss _past_ events
|
||||
* when calling f_op->poll(). This barrier also
|
||||
@ -1599,18 +1682,18 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi,
|
||||
* list, push it inside.
|
||||
*/
|
||||
if (ep_item_poll(epi, &pt, 1)) {
|
||||
spin_lock_irq(&ep->wq.lock);
|
||||
write_lock_irq(&ep->lock);
|
||||
if (!ep_is_linked(epi)) {
|
||||
list_add_tail(&epi->rdllink, &ep->rdllist);
|
||||
ep_pm_stay_awake(epi);
|
||||
|
||||
/* Notify waiting tasks that events are available */
|
||||
if (waitqueue_active(&ep->wq))
|
||||
wake_up_locked(&ep->wq);
|
||||
wake_up(&ep->wq);
|
||||
if (waitqueue_active(&ep->poll_wait))
|
||||
pwake++;
|
||||
}
|
||||
spin_unlock_irq(&ep->wq.lock);
|
||||
write_unlock_irq(&ep->lock);
|
||||
}
|
||||
|
||||
/* We have to call this outside the lock */
|
||||
@ -1771,9 +1854,9 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,
|
||||
*/
|
||||
timed_out = 1;
|
||||
|
||||
spin_lock_irq(&ep->wq.lock);
|
||||
write_lock_irq(&ep->lock);
|
||||
eavail = ep_events_available(ep);
|
||||
spin_unlock_irq(&ep->wq.lock);
|
||||
write_unlock_irq(&ep->lock);
|
||||
|
||||
goto send_events;
|
||||
}
|
||||
|
@ -1563,7 +1563,7 @@ static void bprm_fill_uid(struct linux_binprm *bprm)
|
||||
|
||||
/*
|
||||
* Fill the binprm structure from the inode.
|
||||
* Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes
|
||||
* Check permissions, then read the first BINPRM_BUF_SIZE bytes
|
||||
*
|
||||
* This may be called multiple times for binary chains (scripts for example).
|
||||
*/
|
||||
@ -1944,15 +1944,10 @@ EXPORT_SYMBOL(set_binfmt);
|
||||
*/
|
||||
void set_dumpable(struct mm_struct *mm, int value)
|
||||
{
|
||||
unsigned long old, new;
|
||||
|
||||
if (WARN_ON((unsigned)value > SUID_DUMP_ROOT))
|
||||
return;
|
||||
|
||||
do {
|
||||
old = READ_ONCE(mm->flags);
|
||||
new = (old & ~MMF_DUMPABLE_MASK) | value;
|
||||
} while (cmpxchg(&mm->flags, old, new) != old);
|
||||
set_mask_bits(&mm->flags, MMF_DUMPABLE_MASK, value);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE3(execve,
|
||||
|
@ -214,6 +214,7 @@ const struct file_operations fat_file_operations = {
|
||||
#endif
|
||||
.fsync = fat_file_fsync,
|
||||
.splice_read = generic_file_splice_read,
|
||||
.splice_write = iter_file_splice_write,
|
||||
.fallocate = fat_fallocate,
|
||||
};
|
||||
|
||||
|
@ -39,7 +39,6 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/init_task.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/build_bug.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include "mount.h"
|
||||
@ -131,7 +130,6 @@ getname_flags(const char __user *filename, int flags, int *empty)
|
||||
struct filename *result;
|
||||
char *kname;
|
||||
int len;
|
||||
BUILD_BUG_ON(offsetof(struct filename, iname) % sizeof(long) != 0);
|
||||
|
||||
result = audit_reusename(filename);
|
||||
if (result)
|
||||
|
@ -953,9 +953,6 @@ acpi_handle_printk(const char *level, void *handle, const char *fmt, ...) {}
|
||||
#if defined(CONFIG_ACPI) && defined(CONFIG_DYNAMIC_DEBUG)
|
||||
__printf(3, 4)
|
||||
void __acpi_handle_debug(struct _ddebug *descriptor, acpi_handle handle, const char *fmt, ...);
|
||||
#else
|
||||
#define __acpi_handle_debug(descriptor, handle, fmt, ...) \
|
||||
acpi_handle_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__);
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -985,12 +982,8 @@ void __acpi_handle_debug(struct _ddebug *descriptor, acpi_handle handle, const c
|
||||
#else
|
||||
#if defined(CONFIG_DYNAMIC_DEBUG)
|
||||
#define acpi_handle_debug(handle, fmt, ...) \
|
||||
do { \
|
||||
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
|
||||
if (unlikely(descriptor.flags & _DPRINTK_FLAGS_PRINT)) \
|
||||
__acpi_handle_debug(&descriptor, handle, pr_fmt(fmt), \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
_dynamic_func_call(fmt, __acpi_handle_debug, \
|
||||
handle, pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#else
|
||||
#define acpi_handle_debug(handle, fmt, ...) \
|
||||
({ \
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user