mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
This is the 4.4.166 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAlwCSnEACgkQONu9yGCS aT6tLg//bXn9+eEGojqXMUxdjbEDheFOjoQ8NmNFmwYjN53N5BJrf9+zkrOEyjOM yPlrp55WHaen7qEtk+WHMw4cMscelXF2sFcNz6F8/PXcHawzO8w0FGyYf9eZ7e+a T6biup71w+2JS29H6nD+p/g4l9eZsPx6Din3lGDwJ8CCwaMGb0UUglEU+nt+LI57 9bEbRqqez+Sx9aPf5oOZ3/hwgZjJ+kvDS9bjohBmjC9iEeLhIRJzcIBJqfDa16+N Ra3hShWHkhin7k3YcyIja6BIxzKSgFyxAUilEMPdZToB8cwnj+mIeYvSSBSJqdoz E/TXrXCt0jAMdfR4R57LJr46FCmKj/PV9svQaXGvULc7c91KfeTl8LzA5mZiRQ3K jHX6FFuGxx1y1tXjHmZKZJCKA2fjuS4TPgF8uJov7IYkur0+GKGr5D8xIXwyU4r6 dbo8hUdqBLXChV+dbvVjex9Gj7rNST2fz3Rk/hlEyxMqusqvpPe3/3m1dqlZR6Z8 LyEqWFP/UnVH/ZG3Mv/UBJMLHnpT2dhxIy+tdUGCMYtw9LLr+UUdUhGafeuBXg+T cPJUs3gEGKMuJM4ZWpK0cWZk5xqvF6NpGOipVVSKSeWl2YL6NFMRBWVn9ghziS0f +/g2h34xRxJAWgBe8FI9KrUihuTmV4E+C77M3pQwd/R/vwCCz2M= =QCXc -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQFHBAABCgAxFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAlwGW9UTHGJyb29uaWVA a2VybmVsLm9yZwAKCRAk1otyXVSH0N9QB/9glmYWrd1oFwiBLT84PR6+1PiUrvTh /0YDBNqokuuMaFUdoMLmP5JlhJQ0OhGYCV0XmXso2wYCkdINWqxKoRfRNKhEM+Du 7+rBC1i2tbqk7egDQLLLw9dFTkvpka1Fpt9ISaH0TUTfkPPo4/qkHlAdOp9CIvz2 xa31QZRwTOB20sXYJj3tGMz6X7AmUW/+q2UPIK4TkgUqBypmvQXYkMk/i1MQJXu5 JJPdYXziGrosQi8XqC4upuuEphYcfUkDWUH1iEoz0vOhMZa2+cMA31+P8kYZ6cAW buM0YgVmMihGRczHuURF6RkUEgal/4WrigP6hM6ZYKqwPqgQzPtLxuxP =o+FZ -----END PGP SIGNATURE----- Merge tag 'v4.4.166' into linux-linaro-lsk-v4.4 This is the 4.4.166 stable release
This commit is contained in:
commit
684d5e05df
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -33,6 +33,7 @@
|
|||
*.lzo
|
||||
*.patch
|
||||
*.gcno
|
||||
*.ll
|
||||
modules.builtin
|
||||
Module.symvers
|
||||
*.dwo
|
||||
|
|
|
|||
|
|
@ -34,7 +34,9 @@ Currently, these files are in /proc/sys/fs:
|
|||
- overflowgid
|
||||
- pipe-user-pages-hard
|
||||
- pipe-user-pages-soft
|
||||
- protected_fifos
|
||||
- protected_hardlinks
|
||||
- protected_regular
|
||||
- protected_symlinks
|
||||
- suid_dumpable
|
||||
- super-max
|
||||
|
|
@ -182,6 +184,24 @@ applied.
|
|||
|
||||
==============================================================
|
||||
|
||||
protected_fifos:
|
||||
|
||||
The intent of this protection is to avoid unintentional writes to
|
||||
an attacker-controlled FIFO, where a program expected to create a regular
|
||||
file.
|
||||
|
||||
When set to "0", writing to FIFOs is unrestricted.
|
||||
|
||||
When set to "1" don't allow O_CREAT open on FIFOs that we don't own
|
||||
in world writable sticky directories, unless they are owned by the
|
||||
owner of the directory.
|
||||
|
||||
When set to "2" it also applies to group writable sticky directories.
|
||||
|
||||
This protection is based on the restrictions in Openwall.
|
||||
|
||||
==============================================================
|
||||
|
||||
protected_hardlinks:
|
||||
|
||||
A long-standing class of security issues is the hardlink-based
|
||||
|
|
@ -202,6 +222,22 @@ This protection is based on the restrictions in Openwall and grsecurity.
|
|||
|
||||
==============================================================
|
||||
|
||||
protected_regular:
|
||||
|
||||
This protection is similar to protected_fifos, but it
|
||||
avoids writes to an attacker-controlled regular file, where a program
|
||||
expected to create one.
|
||||
|
||||
When set to "0", writing to regular files is unrestricted.
|
||||
|
||||
When set to "1" don't allow O_CREAT open on regular files that we
|
||||
don't own in world writable sticky directories, unless they are
|
||||
owned by the owner of the directory.
|
||||
|
||||
When set to "2" it also applies to group writable sticky directories.
|
||||
|
||||
==============================================================
|
||||
|
||||
protected_symlinks:
|
||||
|
||||
A long-standing class of security issues is the symlink-based
|
||||
|
|
|
|||
25
Kbuild
25
Kbuild
|
|
@ -6,31 +6,6 @@
|
|||
# 3) Generate asm-offsets.h (may need bounds.h and timeconst.h)
|
||||
# 4) Check for missing system calls
|
||||
|
||||
# Default sed regexp - multiline due to syntax constraints
|
||||
define sed-y
|
||||
"/^->/{s:->#\(.*\):/* \1 */:; \
|
||||
s:^->\([^ ]*\) [\$$#]*\([-0-9]*\) \(.*\):#define \1 \2 /* \3 */:; \
|
||||
s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
|
||||
s:->::; p;}"
|
||||
endef
|
||||
|
||||
# Use filechk to avoid rebuilds when a header changes, but the resulting file
|
||||
# does not
|
||||
define filechk_offsets
|
||||
(set -e; \
|
||||
echo "#ifndef $2"; \
|
||||
echo "#define $2"; \
|
||||
echo "/*"; \
|
||||
echo " * DO NOT MODIFY."; \
|
||||
echo " *"; \
|
||||
echo " * This file was generated by Kbuild"; \
|
||||
echo " */"; \
|
||||
echo ""; \
|
||||
sed -ne $(sed-y); \
|
||||
echo ""; \
|
||||
echo "#endif" )
|
||||
endef
|
||||
|
||||
#####
|
||||
# 1) Generate bounds.h
|
||||
|
||||
|
|
|
|||
|
|
@ -10153,6 +10153,7 @@ F: arch/alpha/kernel/srm_env.c
|
|||
|
||||
STABLE BRANCH
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
M: Sasha Levin <sashal@kernel.org>
|
||||
L: stable@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/stable_kernel_rules.txt
|
||||
|
|
|
|||
39
Makefile
39
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 164
|
||||
SUBLEVEL = 166
|
||||
EXTRAVERSION =
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
|
|
@ -303,14 +303,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
|
|||
|
||||
HOSTCC = gcc
|
||||
HOSTCXX = g++
|
||||
HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89
|
||||
HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89
|
||||
HOSTCXXFLAGS = -O2
|
||||
|
||||
ifeq ($(shell $(HOSTCC) -v 2>&1 | grep -c "clang version"), 1)
|
||||
HOSTCFLAGS += -Wno-unused-value -Wno-unused-parameter \
|
||||
-Wno-missing-field-initializers -fno-delete-null-pointer-checks
|
||||
endif
|
||||
|
||||
# Decide whether to build built-in, modular, or both.
|
||||
# Normally, just do built-in.
|
||||
|
||||
|
|
@ -612,6 +607,22 @@ endif # $(dot-config)
|
|||
# Defaults to vmlinux, but the arch makefile usually adds further targets
|
||||
all: vmlinux
|
||||
|
||||
ifeq ($(cc-name),clang)
|
||||
ifneq ($(CROSS_COMPILE),)
|
||||
CLANG_TARGET := --target=$(notdir $(CROSS_COMPILE:%-=%))
|
||||
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(LD)))
|
||||
CLANG_PREFIX := --prefix=$(GCC_TOOLCHAIN_DIR)
|
||||
GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..)
|
||||
endif
|
||||
ifneq ($(GCC_TOOLCHAIN),)
|
||||
CLANG_GCC_TC := --gcc-toolchain=$(GCC_TOOLCHAIN)
|
||||
endif
|
||||
KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
|
||||
KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
|
||||
KBUILD_CFLAGS += $(call cc-option, -no-integrated-as)
|
||||
KBUILD_AFLAGS += $(call cc-option, -no-integrated-as)
|
||||
endif
|
||||
|
||||
# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
|
||||
# values of the respective KBUILD_* variables
|
||||
ARCH_CPPFLAGS :=
|
||||
|
|
@ -628,7 +639,7 @@ KBUILD_CFLAGS += $(call cc-disable-warning, int-in-bool-context)
|
|||
KBUILD_CFLAGS += $(call cc-disable-warning, attribute-alias)
|
||||
|
||||
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||
KBUILD_CFLAGS += -Os
|
||||
KBUILD_CFLAGS += $(call cc-option,-Oz,-Os)
|
||||
else
|
||||
ifdef CONFIG_PROFILE_ALL_BRANCHES
|
||||
KBUILD_CFLAGS += -O2
|
||||
|
|
@ -699,10 +710,9 @@ KBUILD_CFLAGS += $(stackp-flag)
|
|||
|
||||
ifeq ($(cc-name),clang)
|
||||
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
||||
KBUILD_CPPFLAGS += $(call cc-option,-Wno-unknown-warning-option,)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-variable)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
|
||||
# Quiet clang warning: comparison of unsigned expression < 0 is always false
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
|
||||
# CLANG uses a _MergedGlobals as optimization, but this breaks modpost, as the
|
||||
|
|
@ -713,11 +723,11 @@ KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior)
|
|||
else
|
||||
|
||||
# These warnings generated too much noise in a regular build.
|
||||
# Use make W=1 to enable them (see scripts/Makefile.build)
|
||||
# Use make W=1 to enable them (see scripts/Makefile.extrawarn)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
|
||||
endif
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
|
||||
ifdef CONFIG_FRAME_POINTER
|
||||
KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
|
||||
else
|
||||
|
|
@ -1297,6 +1307,8 @@ help:
|
|||
@echo ' (default: $$(INSTALL_MOD_PATH)/lib/firmware)'
|
||||
@echo ' dir/ - Build all files in dir and below'
|
||||
@echo ' dir/file.[ois] - Build specified target only'
|
||||
@echo ' dir/file.ll - Build the LLVM assembly file'
|
||||
@echo ' (requires compiler support for LLVM assembly generation)'
|
||||
@echo ' dir/file.lst - Build specified mixed source/assembly target only'
|
||||
@echo ' (requires a recent binutils and recent build (System.map))'
|
||||
@echo ' dir/file.ko - Build module including final link'
|
||||
|
|
@ -1472,6 +1484,7 @@ clean: $(clean-dirs)
|
|||
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
||||
-o -name '*.symtypes' -o -name 'modules.order' \
|
||||
-o -name modules.builtin -o -name '.tmp_*.o.*' \
|
||||
-o -name '*.ll' \
|
||||
-o -name '*.gcno' \) -type f -print | xargs rm -f
|
||||
|
||||
# Generate tags for editors
|
||||
|
|
@ -1575,6 +1588,8 @@ endif
|
|||
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
||||
%.symtypes: %.c prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
||||
%.ll: %.c prepare scripts FORCE
|
||||
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
||||
|
||||
# Modules
|
||||
/: prepare scripts FORCE
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
#
|
||||
# Copyright (C) 1995-2001 by Russell King
|
||||
|
||||
LDFLAGS_vmlinux :=-p --no-undefined -X
|
||||
LDFLAGS_vmlinux :=--no-undefined -X
|
||||
CPPFLAGS_vmlinux.lds = -DTEXT_OFFSET=$(TEXT_OFFSET)
|
||||
OBJCOPYFLAGS :=-O binary -R .note -R .note.gnu.build-id -R .comment -S
|
||||
GZFLAGS :=-9
|
||||
|
|
@ -67,6 +67,10 @@ else
|
|||
TEXT_OFFSET := 0x00080000
|
||||
endif
|
||||
|
||||
ifeq ($(cc-name),clang)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, asm-operand-widths)
|
||||
endif
|
||||
|
||||
# KASAN_SHADOW_OFFSET = VA_START + (1 << (VA_BITS - 3)) - (1 << 61)
|
||||
# in 32-bit arithmetic
|
||||
KASAN_SHADOW_OFFSET := $(shell printf "0x%08x00000000\n" $$(( \
|
||||
|
|
|
|||
|
|
@ -82,7 +82,8 @@ ENTRY(sha1_ce_transform)
|
|||
ldr dgb, [x0, #16]
|
||||
|
||||
/* load sha1_ce_state::finalize */
|
||||
ldr w4, [x0, #:lo12:sha1_ce_offsetof_finalize]
|
||||
ldr_l w4, sha1_ce_offsetof_finalize, x4
|
||||
ldr w4, [x0, x4]
|
||||
|
||||
/* load input */
|
||||
0: ld1 {v8.4s-v11.4s}, [x1], #64
|
||||
|
|
@ -132,7 +133,8 @@ CPU_LE( rev32 v11.16b, v11.16b )
|
|||
* the padding is handled by the C code in that case.
|
||||
*/
|
||||
cbz x4, 3f
|
||||
ldr x4, [x0, #:lo12:sha1_ce_offsetof_count]
|
||||
ldr_l w4, sha1_ce_offsetof_count, x4
|
||||
ldr x4, [x0, x4]
|
||||
movi v9.2d, #0
|
||||
mov x8, #0x80000000
|
||||
movi v10.2d, #0
|
||||
|
|
|
|||
|
|
@ -17,9 +17,6 @@
|
|||
#include <linux/crypto.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#define ASM_EXPORT(sym, val) \
|
||||
asm(".globl " #sym "; .set " #sym ", %0" :: "I"(val));
|
||||
|
||||
MODULE_DESCRIPTION("SHA1 secure hash using ARMv8 Crypto Extensions");
|
||||
MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
@ -32,6 +29,9 @@ struct sha1_ce_state {
|
|||
asmlinkage void sha1_ce_transform(struct sha1_ce_state *sst, u8 const *src,
|
||||
int blocks);
|
||||
|
||||
const u32 sha1_ce_offsetof_count = offsetof(struct sha1_ce_state, sst.count);
|
||||
const u32 sha1_ce_offsetof_finalize = offsetof(struct sha1_ce_state, finalize);
|
||||
|
||||
static int sha1_ce_update(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len)
|
||||
{
|
||||
|
|
@ -52,11 +52,6 @@ static int sha1_ce_finup(struct shash_desc *desc, const u8 *data,
|
|||
struct sha1_ce_state *sctx = shash_desc_ctx(desc);
|
||||
bool finalize = !sctx->sst.count && !(len % SHA1_BLOCK_SIZE);
|
||||
|
||||
ASM_EXPORT(sha1_ce_offsetof_count,
|
||||
offsetof(struct sha1_ce_state, sst.count));
|
||||
ASM_EXPORT(sha1_ce_offsetof_finalize,
|
||||
offsetof(struct sha1_ce_state, finalize));
|
||||
|
||||
/*
|
||||
* Allow the asm code to perform the finalization if there is no
|
||||
* partial data and the input is a round multiple of the block size.
|
||||
|
|
|
|||
|
|
@ -88,7 +88,8 @@ ENTRY(sha2_ce_transform)
|
|||
ld1 {dgav.4s, dgbv.4s}, [x0]
|
||||
|
||||
/* load sha256_ce_state::finalize */
|
||||
ldr w4, [x0, #:lo12:sha256_ce_offsetof_finalize]
|
||||
ldr_l w4, sha256_ce_offsetof_finalize, x4
|
||||
ldr w4, [x0, x4]
|
||||
|
||||
/* load input */
|
||||
0: ld1 {v16.4s-v19.4s}, [x1], #64
|
||||
|
|
@ -136,7 +137,8 @@ CPU_LE( rev32 v19.16b, v19.16b )
|
|||
* the padding is handled by the C code in that case.
|
||||
*/
|
||||
cbz x4, 3f
|
||||
ldr x4, [x0, #:lo12:sha256_ce_offsetof_count]
|
||||
ldr_l w4, sha256_ce_offsetof_count, x4
|
||||
ldr x4, [x0, x4]
|
||||
movi v17.2d, #0
|
||||
mov x8, #0x80000000
|
||||
movi v18.2d, #0
|
||||
|
|
|
|||
|
|
@ -17,9 +17,6 @@
|
|||
#include <linux/crypto.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#define ASM_EXPORT(sym, val) \
|
||||
asm(".globl " #sym "; .set " #sym ", %0" :: "I"(val));
|
||||
|
||||
MODULE_DESCRIPTION("SHA-224/SHA-256 secure hash using ARMv8 Crypto Extensions");
|
||||
MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
@ -32,6 +29,11 @@ struct sha256_ce_state {
|
|||
asmlinkage void sha2_ce_transform(struct sha256_ce_state *sst, u8 const *src,
|
||||
int blocks);
|
||||
|
||||
const u32 sha256_ce_offsetof_count = offsetof(struct sha256_ce_state,
|
||||
sst.count);
|
||||
const u32 sha256_ce_offsetof_finalize = offsetof(struct sha256_ce_state,
|
||||
finalize);
|
||||
|
||||
static int sha256_ce_update(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len)
|
||||
{
|
||||
|
|
@ -52,11 +54,6 @@ static int sha256_ce_finup(struct shash_desc *desc, const u8 *data,
|
|||
struct sha256_ce_state *sctx = shash_desc_ctx(desc);
|
||||
bool finalize = !sctx->sst.count && !(len % SHA256_BLOCK_SIZE);
|
||||
|
||||
ASM_EXPORT(sha256_ce_offsetof_count,
|
||||
offsetof(struct sha256_ce_state, sst.count));
|
||||
ASM_EXPORT(sha256_ce_offsetof_finalize,
|
||||
offsetof(struct sha256_ce_state, finalize));
|
||||
|
||||
/*
|
||||
* Allow the asm code to perform the finalization if there is no
|
||||
* partial data and the input is a round multiple of the block size.
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@ static inline unsigned long __percpu_##op(void *ptr, \
|
|||
: [val] "Ir" (val)); \
|
||||
break; \
|
||||
default: \
|
||||
ret = 0; \
|
||||
BUILD_BUG(); \
|
||||
} \
|
||||
\
|
||||
|
|
@ -113,6 +114,7 @@ static inline unsigned long __percpu_read(void *ptr, int size)
|
|||
ret = ACCESS_ONCE(*(u64 *)ptr);
|
||||
break;
|
||||
default:
|
||||
ret = 0;
|
||||
BUILD_BUG();
|
||||
}
|
||||
|
||||
|
|
@ -182,6 +184,7 @@ static inline unsigned long __percpu_xchg(void *ptr, unsigned long val,
|
|||
: [val] "r" (val));
|
||||
break;
|
||||
default:
|
||||
ret = 0;
|
||||
BUILD_BUG();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -50,32 +50,10 @@ CFLAGS_traps.o += -mfixed-range=f2-f5,f16-f31
|
|||
# The gate DSO image is built using a special linker script.
|
||||
include $(src)/Makefile.gate
|
||||
|
||||
# Calculate NR_IRQ = max(IA64_NATIVE_NR_IRQS, XEN_NR_IRQS, ...) based on config
|
||||
define sed-y
|
||||
"/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"
|
||||
endef
|
||||
quiet_cmd_nr_irqs = GEN $@
|
||||
define cmd_nr_irqs
|
||||
(set -e; \
|
||||
echo "#ifndef __ASM_NR_IRQS_H__"; \
|
||||
echo "#define __ASM_NR_IRQS_H__"; \
|
||||
echo "/*"; \
|
||||
echo " * DO NOT MODIFY."; \
|
||||
echo " *"; \
|
||||
echo " * This file was generated by Kbuild"; \
|
||||
echo " *"; \
|
||||
echo " */"; \
|
||||
echo ""; \
|
||||
sed -ne $(sed-y) $<; \
|
||||
echo ""; \
|
||||
echo "#endif" ) > $@
|
||||
endef
|
||||
|
||||
# We use internal kbuild rules to avoid the "is up to date" message from make
|
||||
arch/$(SRCARCH)/kernel/nr-irqs.s: arch/$(SRCARCH)/kernel/nr-irqs.c
|
||||
$(Q)mkdir -p $(dir $@)
|
||||
$(call if_changed_dep,cc_s_c)
|
||||
|
||||
include/generated/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s
|
||||
$(Q)mkdir -p $(dir $@)
|
||||
$(call cmd,nr_irqs)
|
||||
include/generated/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s FORCE
|
||||
$(call filechk,offsets,__ASM_NR_IRQS_H__)
|
||||
|
|
|
|||
|
|
@ -5,8 +5,6 @@
|
|||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM kvm
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#define TRACE_INCLUDE_FILE trace
|
||||
|
||||
/*
|
||||
* Tracepoint for guest mode entry.
|
||||
|
|
@ -119,4 +117,10 @@ TRACE_EVENT(kvm_check_requests,
|
|||
#endif /* _TRACE_KVM_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#define TRACE_INCLUDE_FILE trace
|
||||
|
||||
#include <trace/define_trace.h>
|
||||
|
|
|
|||
|
|
@ -5,8 +5,6 @@
|
|||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM kvm_booke
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#define TRACE_INCLUDE_FILE trace_booke
|
||||
|
||||
#define kvm_trace_symbol_exit \
|
||||
{0, "CRITICAL"}, \
|
||||
|
|
@ -217,4 +215,11 @@ TRACE_EVENT(kvm_booke_queue_irqprio,
|
|||
#endif
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#define TRACE_INCLUDE_FILE trace_booke
|
||||
|
||||
#include <trace/define_trace.h>
|
||||
|
|
|
|||
|
|
@ -8,8 +8,6 @@
|
|||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM kvm_hv
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#define TRACE_INCLUDE_FILE trace_hv
|
||||
|
||||
#define kvm_trace_symbol_hcall \
|
||||
{H_REMOVE, "H_REMOVE"}, \
|
||||
|
|
@ -474,4 +472,11 @@ TRACE_EVENT(kvmppc_run_vcpu_exit,
|
|||
#endif /* _TRACE_KVM_HV_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#define TRACE_INCLUDE_FILE trace_hv
|
||||
|
||||
#include <trace/define_trace.h>
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@
|
|||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM kvm_pr
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#define TRACE_INCLUDE_FILE trace_pr
|
||||
|
||||
TRACE_EVENT(kvm_book3s_reenter,
|
||||
TP_PROTO(int r, struct kvm_vcpu *vcpu),
|
||||
|
|
@ -271,4 +269,11 @@ TRACE_EVENT(kvm_unmap_hva,
|
|||
#endif /* _TRACE_KVM_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#define TRACE_INCLUDE_FILE trace_pr
|
||||
|
||||
#include <trace/define_trace.h>
|
||||
|
|
|
|||
|
|
@ -1319,7 +1319,7 @@ static long vphn_get_associativity(unsigned long cpu,
|
|||
|
||||
switch (rc) {
|
||||
case H_FUNCTION:
|
||||
printk(KERN_INFO
|
||||
printk_once(KERN_INFO
|
||||
"VPHN is not supported. Disabling polling...\n");
|
||||
stop_topology_update();
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ GCOV_PROFILE := n
|
|||
$(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
|
||||
|
||||
# link rule for the .so file, .lds has to be first
|
||||
$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32)
|
||||
$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32) FORCE
|
||||
$(call if_changed,vdso32ld)
|
||||
|
||||
# strip rule for the .so file
|
||||
|
|
@ -38,12 +38,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE
|
|||
$(call if_changed,objcopy)
|
||||
|
||||
# assembly rules for the .S files
|
||||
$(obj-vdso32): %.o: %.S
|
||||
$(obj-vdso32): %.o: %.S FORCE
|
||||
$(call if_changed_dep,vdso32as)
|
||||
|
||||
# actual build commands
|
||||
quiet_cmd_vdso32ld = VDSO32L $@
|
||||
cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
|
||||
cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@
|
||||
quiet_cmd_vdso32as = VDSO32A $@
|
||||
cmd_vdso32as = $(CC) $(a_flags) -c -o $@ $<
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ GCOV_PROFILE := n
|
|||
$(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
|
||||
|
||||
# link rule for the .so file, .lds has to be first
|
||||
$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64)
|
||||
$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) FORCE
|
||||
$(call if_changed,vdso64ld)
|
||||
|
||||
# strip rule for the .so file
|
||||
|
|
@ -38,12 +38,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE
|
|||
$(call if_changed,objcopy)
|
||||
|
||||
# assembly rules for the .S files
|
||||
$(obj-vdso64): %.o: %.S
|
||||
$(obj-vdso64): %.o: %.S FORCE
|
||||
$(call if_changed_dep,vdso64as)
|
||||
|
||||
# actual build commands
|
||||
quiet_cmd_vdso64ld = VDSO64L $@
|
||||
cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
|
||||
cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@
|
||||
quiet_cmd_vdso64as = VDSO64A $@
|
||||
cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
|
||||
|
||||
|
|
|
|||
|
|
@ -637,6 +637,8 @@ void gmap_discard(struct gmap *gmap, unsigned long from, unsigned long to)
|
|||
vmaddr |= gaddr & ~PMD_MASK;
|
||||
/* Find vma in the parent mm */
|
||||
vma = find_vma(gmap->mm, vmaddr);
|
||||
if (!vma)
|
||||
continue;
|
||||
size = min(to - gaddr, PMD_SIZE - (gaddr & ~PMD_MASK));
|
||||
zap_page_range(vma, vmaddr, size, NULL);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ int __node_distance(int a, int b)
|
|||
{
|
||||
return mode->distance ? mode->distance(a, b) : 0;
|
||||
}
|
||||
EXPORT_SYMBOL(__node_distance);
|
||||
|
||||
int numa_debug_enabled;
|
||||
|
||||
|
|
|
|||
|
|
@ -585,6 +585,11 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
|
|||
fatal_sigsegv();
|
||||
}
|
||||
longjmp(*switch_buf, 1);
|
||||
|
||||
/* unreachable */
|
||||
printk(UM_KERN_ERR "impossible long jump!");
|
||||
fatal_sigsegv();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void initial_thread_cb_skas(void (*proc)(void *), void *arg)
|
||||
|
|
|
|||
|
|
@ -11,6 +11,16 @@ else
|
|||
KBUILD_DEFCONFIG := $(ARCH)_defconfig
|
||||
endif
|
||||
|
||||
# For gcc stack alignment is specified with -mpreferred-stack-boundary,
|
||||
# clang has the option -mstack-alignment for that purpose.
|
||||
ifneq ($(call cc-option, -mpreferred-stack-boundary=4),)
|
||||
cc_stack_align4 := -mpreferred-stack-boundary=2
|
||||
cc_stack_align8 := -mpreferred-stack-boundary=3
|
||||
else ifneq ($(call cc-option, -mstack-alignment=16),)
|
||||
cc_stack_align4 := -mstack-alignment=4
|
||||
cc_stack_align8 := -mstack-alignment=8
|
||||
endif
|
||||
|
||||
# How to compile the 16-bit code. Note we always compile for -march=i386;
|
||||
# that way we can complain to the user if the CPU is insufficient.
|
||||
#
|
||||
|
|
@ -24,10 +34,11 @@ REALMODE_CFLAGS := $(M16_CFLAGS) -g -Os -D__KERNEL__ \
|
|||
-DDISABLE_BRANCH_PROFILING \
|
||||
-Wall -Wstrict-prototypes -march=i386 -mregparm=3 \
|
||||
-fno-strict-aliasing -fomit-frame-pointer -fno-pic \
|
||||
-mno-mmx -mno-sse \
|
||||
$(call cc-option, -ffreestanding) \
|
||||
$(call cc-option, -fno-stack-protector) \
|
||||
$(call cc-option, -mpreferred-stack-boundary=2)
|
||||
-mno-mmx -mno-sse
|
||||
|
||||
REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -ffreestanding)
|
||||
REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -fno-stack-protector)
|
||||
REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), $(cc_stack_align4))
|
||||
export REALMODE_CFLAGS
|
||||
|
||||
# BITS is used as extension for files which are available in a 32 bit
|
||||
|
|
@ -64,8 +75,10 @@ ifeq ($(CONFIG_X86_32),y)
|
|||
# with nonstandard options
|
||||
KBUILD_CFLAGS += -fno-pic
|
||||
|
||||
# prevent gcc from keeping the stack 16 byte aligned
|
||||
KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2)
|
||||
# Align the stack to the register width instead of using the default
|
||||
# alignment of 16 bytes. This reduces stack usage and the number of
|
||||
# alignment instructions.
|
||||
KBUILD_CFLAGS += $(call cc-option,$(cc_stack_align4))
|
||||
|
||||
# Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use
|
||||
# a lot more stack due to the lack of sharing of stacklots:
|
||||
|
|
@ -88,17 +101,23 @@ else
|
|||
KBUILD_CFLAGS += -m64
|
||||
|
||||
# Align jump targets to 1 byte, not the default 16 bytes:
|
||||
KBUILD_CFLAGS += -falign-jumps=1
|
||||
KBUILD_CFLAGS += $(call cc-option,-falign-jumps=1)
|
||||
|
||||
# Pack loops tightly as well:
|
||||
KBUILD_CFLAGS += -falign-loops=1
|
||||
KBUILD_CFLAGS += $(call cc-option,-falign-loops=1)
|
||||
|
||||
# Don't autogenerate traditional x87 instructions
|
||||
KBUILD_CFLAGS += $(call cc-option,-mno-80387)
|
||||
KBUILD_CFLAGS += $(call cc-option,-mno-fp-ret-in-387)
|
||||
|
||||
# Use -mpreferred-stack-boundary=3 if supported.
|
||||
KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3)
|
||||
# By default gcc and clang use a stack alignment of 16 bytes for x86.
|
||||
# However the standard kernel entry on x86-64 leaves the stack on an
|
||||
# 8-byte boundary. If the compiler isn't informed about the actual
|
||||
# alignment it will generate extra alignment instructions for the
|
||||
# default alignment which keep the stack *mis*aligned.
|
||||
# Furthermore an alignment to the register width reduces stack usage
|
||||
# and the number of alignment instructions.
|
||||
KBUILD_CFLAGS += $(call cc-option,$(cc_stack_align8))
|
||||
|
||||
# Use -mskip-rax-setup if supported.
|
||||
KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include "misc.h"
|
||||
|
||||
#include <asm/asm.h>
|
||||
#include <asm/msr.h>
|
||||
#include <asm/archrandom.h>
|
||||
#include <asm/e820.h>
|
||||
|
|
@ -94,7 +95,7 @@ static unsigned long get_random_long(void)
|
|||
}
|
||||
|
||||
/* Circular multiply for better bit diffusion */
|
||||
asm("mul %3"
|
||||
asm(_ASM_MUL "%3"
|
||||
: "=a" (random), "=d" (raw)
|
||||
: "a" (random), "rm" (mix_const));
|
||||
random += raw;
|
||||
|
|
|
|||
|
|
@ -16,6 +16,15 @@
|
|||
#include "ctype.h"
|
||||
#include "string.h"
|
||||
|
||||
/*
|
||||
* Undef these macros so that the functions that we provide
|
||||
* here will have the correct names regardless of how string.h
|
||||
* may have chosen to #define them.
|
||||
*/
|
||||
#undef memcpy
|
||||
#undef memset
|
||||
#undef memcmp
|
||||
|
||||
int memcmp(const void *s1, const void *s2, size_t len)
|
||||
{
|
||||
u8 diff;
|
||||
|
|
|
|||
|
|
@ -65,7 +65,6 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <asm/inst.h>
|
||||
|
||||
#define CONCAT(a,b) a##b
|
||||
#define VMOVDQ vmovdqu
|
||||
|
||||
#define xdata0 %xmm0
|
||||
|
|
@ -92,8 +91,6 @@
|
|||
#define num_bytes %r8
|
||||
|
||||
#define tmp %r10
|
||||
#define DDQ(i) CONCAT(ddq_add_,i)
|
||||
#define XMM(i) CONCAT(%xmm, i)
|
||||
#define DDQ_DATA 0
|
||||
#define XDATA 1
|
||||
#define KEY_128 1
|
||||
|
|
@ -131,12 +128,12 @@ ddq_add_8:
|
|||
/* generate a unique variable for ddq_add_x */
|
||||
|
||||
.macro setddq n
|
||||
var_ddq_add = DDQ(\n)
|
||||
var_ddq_add = ddq_add_\n
|
||||
.endm
|
||||
|
||||
/* generate a unique variable for xmm register */
|
||||
.macro setxdata n
|
||||
var_xdata = XMM(\n)
|
||||
var_xdata = %xmm\n
|
||||
.endm
|
||||
|
||||
/* club the numeric 'id' to the symbol 'name' */
|
||||
|
|
|
|||
|
|
@ -856,7 +856,7 @@ ENTRY(\sym)
|
|||
|
||||
call \do_sym
|
||||
|
||||
jmp error_exit /* %ebx: no swapgs flag */
|
||||
jmp error_exit
|
||||
.endif
|
||||
END(\sym)
|
||||
.endm
|
||||
|
|
@ -1118,7 +1118,6 @@ END(paranoid_exit)
|
|||
|
||||
/*
|
||||
* Save all registers in pt_regs, and switch gs if needed.
|
||||
* Return: EBX=0: came from user mode; EBX=1: otherwise
|
||||
*/
|
||||
ENTRY(error_entry)
|
||||
cld
|
||||
|
|
@ -1131,7 +1130,6 @@ ENTRY(error_entry)
|
|||
* the kernel CR3 here.
|
||||
*/
|
||||
SWITCH_KERNEL_CR3
|
||||
xorl %ebx, %ebx
|
||||
testb $3, CS+8(%rsp)
|
||||
jz .Lerror_kernelspace
|
||||
|
||||
|
|
@ -1165,7 +1163,6 @@ ENTRY(error_entry)
|
|||
* for these here too.
|
||||
*/
|
||||
.Lerror_kernelspace:
|
||||
incl %ebx
|
||||
leaq native_irq_return_iret(%rip), %rcx
|
||||
cmpq %rcx, RIP+8(%rsp)
|
||||
je .Lerror_bad_iret
|
||||
|
|
@ -1196,28 +1193,19 @@ ENTRY(error_entry)
|
|||
|
||||
/*
|
||||
* Pretend that the exception came from user mode: set up pt_regs
|
||||
* as if we faulted immediately after IRET and clear EBX so that
|
||||
* error_exit knows that we will be returning to user mode.
|
||||
* as if we faulted immediately after IRET.
|
||||
*/
|
||||
mov %rsp, %rdi
|
||||
call fixup_bad_iret
|
||||
mov %rax, %rsp
|
||||
decl %ebx
|
||||
jmp .Lerror_entry_from_usermode_after_swapgs
|
||||
END(error_entry)
|
||||
|
||||
|
||||
/*
|
||||
* On entry, EBS is a "return to kernel mode" flag:
|
||||
* 1: already in kernel mode, don't need SWAPGS
|
||||
* 0: user gsbase is loaded, we need SWAPGS and standard preparation for return to usermode
|
||||
*/
|
||||
ENTRY(error_exit)
|
||||
movl %ebx, %eax
|
||||
DISABLE_INTERRUPTS(CLBR_NONE)
|
||||
TRACE_IRQS_OFF
|
||||
testl %eax, %eax
|
||||
jnz retint_kernel
|
||||
testb $3, CS(%rsp)
|
||||
jz retint_kernel
|
||||
jmp retint_user
|
||||
END(error_exit)
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#define _ASM_ADD __ASM_SIZE(add)
|
||||
#define _ASM_SUB __ASM_SIZE(sub)
|
||||
#define _ASM_XADD __ASM_SIZE(xadd)
|
||||
#define _ASM_MUL __ASM_SIZE(mul)
|
||||
|
||||
#define _ASM_AX __ASM_REG(ax)
|
||||
#define _ASM_BX __ASM_REG(bx)
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ static const struct acpi_device_id forbidden_id_list[] = {
|
|||
{"PNP0200", 0}, /* AT DMA Controller */
|
||||
{"ACPI0009", 0}, /* IOxAPIC */
|
||||
{"ACPI000A", 0}, /* IOAPIC */
|
||||
{"SMB0001", 0}, /* ACPI SMBUS virtual device */
|
||||
{"", 0},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1184,6 +1184,11 @@ static struct attribute_group zram_disk_attr_group = {
|
|||
.attrs = zram_disk_attrs,
|
||||
};
|
||||
|
||||
static const struct attribute_group *zram_disk_attr_groups[] = {
|
||||
&zram_disk_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/*
|
||||
* Allocate and initialize new zram device. the function returns
|
||||
* '>= 0' device_id upon success, and negative value otherwise.
|
||||
|
|
@ -1264,15 +1269,9 @@ static int zram_add(void)
|
|||
zram->disk->queue->limits.discard_zeroes_data = 0;
|
||||
queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, zram->disk->queue);
|
||||
|
||||
disk_to_dev(zram->disk)->groups = zram_disk_attr_groups;
|
||||
add_disk(zram->disk);
|
||||
|
||||
ret = sysfs_create_group(&disk_to_dev(zram->disk)->kobj,
|
||||
&zram_disk_attr_group);
|
||||
if (ret < 0) {
|
||||
pr_err("Error creating sysfs group for device %d\n",
|
||||
device_id);
|
||||
goto out_free_disk;
|
||||
}
|
||||
strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor));
|
||||
zram->meta = NULL;
|
||||
zram->max_comp_streams = 1;
|
||||
|
|
@ -1280,9 +1279,6 @@ static int zram_add(void)
|
|||
pr_info("Added device: %s\n", zram->disk->disk_name);
|
||||
return device_id;
|
||||
|
||||
out_free_disk:
|
||||
del_gendisk(zram->disk);
|
||||
put_disk(zram->disk);
|
||||
out_free_queue:
|
||||
blk_cleanup_queue(queue);
|
||||
out_free_idr:
|
||||
|
|
@ -1310,16 +1306,6 @@ static int zram_remove(struct zram *zram)
|
|||
zram->claim = true;
|
||||
mutex_unlock(&bdev->bd_mutex);
|
||||
|
||||
/*
|
||||
* Remove sysfs first, so no one will perform a disksize
|
||||
* store while we destroy the devices. This also helps during
|
||||
* hot_remove -- zram_reset_device() is the last holder of
|
||||
* ->init_lock, no later/concurrent disksize_store() or any
|
||||
* other sysfs handlers are possible.
|
||||
*/
|
||||
sysfs_remove_group(&disk_to_dev(zram->disk)->kobj,
|
||||
&zram_disk_attr_group);
|
||||
|
||||
/* Make sure all the pending I/O are finished */
|
||||
fsync_bdev(bdev);
|
||||
zram_reset_device(zram);
|
||||
|
|
|
|||
|
|
@ -125,7 +125,6 @@ config BT_HCIUART_LL
|
|||
config BT_HCIUART_3WIRE
|
||||
bool "Three-wire UART (H5) protocol support"
|
||||
depends on BT_HCIUART
|
||||
depends on BT_HCIUART_SERDEV
|
||||
help
|
||||
The HCI Three-wire UART Transport Layer makes it possible to
|
||||
user the Bluetooth HCI over a serial port interface. The HCI
|
||||
|
|
|
|||
|
|
@ -273,6 +273,7 @@ static const struct samsung_clk_reg_dump exynos5420_set_clksrc[] = {
|
|||
{ .offset = GATE_BUS_TOP, .value = 0xffffffff, },
|
||||
{ .offset = GATE_BUS_DISP1, .value = 0xffffffff, },
|
||||
{ .offset = GATE_IP_PERIC, .value = 0xffffffff, },
|
||||
{ .offset = GATE_IP_PERIS, .value = 0xffffffff, },
|
||||
};
|
||||
|
||||
static int exynos5420_clk_suspend(void)
|
||||
|
|
|
|||
|
|
@ -130,8 +130,13 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
|
|||
/* Ensure the arm clock divider is what we expect */
|
||||
ret = clk_set_rate(arm_clk, new_freq * 1000);
|
||||
if (ret) {
|
||||
int ret1;
|
||||
|
||||
dev_err(cpu_dev, "failed to set clock rate: %d\n", ret);
|
||||
regulator_set_voltage_tol(arm_reg, volt_old, 0);
|
||||
ret1 = regulator_set_voltage_tol(arm_reg, volt_old, 0);
|
||||
if (ret1)
|
||||
dev_warn(cpu_dev,
|
||||
"failed to restore vddarm voltage: %d\n", ret1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2 \
|
|||
-fPIC -fno-strict-aliasing -mno-red-zone \
|
||||
-mno-mmx -mno-sse
|
||||
|
||||
cflags-$(CONFIG_ARM64) := $(subst -pg,,$(KBUILD_CFLAGS))
|
||||
cflags-$(CONFIG_ARM64) := $(subst -pg,,$(KBUILD_CFLAGS)) -fpie
|
||||
cflags-$(CONFIG_ARM) := $(subst -pg,,$(KBUILD_CFLAGS)) \
|
||||
-fno-builtin -fpic -mno-single-pic-base
|
||||
|
||||
|
|
|
|||
|
|
@ -9,9 +9,17 @@
|
|||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* To prevent the compiler from emitting GOT-indirected (and thus absolute)
|
||||
* references to the section markers, override their visibility as 'hidden'
|
||||
*/
|
||||
#pragma GCC visibility push(hidden)
|
||||
#include <asm/sections.h>
|
||||
#pragma GCC visibility pop
|
||||
|
||||
#include <linux/efi.h>
|
||||
#include <asm/efi.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
#include "efistub.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -60,8 +60,29 @@ static const struct pci_device_id pciidlist[] = {
|
|||
|
||||
MODULE_DEVICE_TABLE(pci, pciidlist);
|
||||
|
||||
static void ast_kick_out_firmware_fb(struct pci_dev *pdev)
|
||||
{
|
||||
struct apertures_struct *ap;
|
||||
bool primary = false;
|
||||
|
||||
ap = alloc_apertures(1);
|
||||
if (!ap)
|
||||
return;
|
||||
|
||||
ap->ranges[0].base = pci_resource_start(pdev, 0);
|
||||
ap->ranges[0].size = pci_resource_len(pdev, 0);
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
|
||||
#endif
|
||||
remove_conflicting_framebuffers(ap, "astdrmfb", primary);
|
||||
kfree(ap);
|
||||
}
|
||||
|
||||
static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
ast_kick_out_firmware_fb(pdev);
|
||||
|
||||
return drm_get_pci_dev(pdev, ent, &driver);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -552,6 +552,7 @@ static int ast_crtc_do_set_base(struct drm_crtc *crtc,
|
|||
}
|
||||
ast_bo_unreserve(bo);
|
||||
|
||||
ast_set_offset_reg(crtc);
|
||||
ast_set_start_address_crt1(crtc, (u32)gpu_addr);
|
||||
|
||||
return 0;
|
||||
|
|
@ -1249,7 +1250,7 @@ static int ast_cursor_move(struct drm_crtc *crtc,
|
|||
ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xc7, ((y >> 8) & 0x07));
|
||||
|
||||
/* dummy write to fire HWC */
|
||||
ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xCB, 0xFF, 0x00);
|
||||
ast_show_cursor(crtc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/cred.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/hid.h>
|
||||
|
|
@ -24,6 +25,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/uhid.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#define UHID_NAME "uhid"
|
||||
#define UHID_BUFSIZE 32
|
||||
|
|
@ -721,6 +723,17 @@ static ssize_t uhid_char_write(struct file *file, const char __user *buffer,
|
|||
|
||||
switch (uhid->input_buf.type) {
|
||||
case UHID_CREATE:
|
||||
/*
|
||||
* 'struct uhid_create_req' contains a __user pointer which is
|
||||
* copied from, so it's unsafe to allow this with elevated
|
||||
* privileges (e.g. from a setuid binary) or via kernel_write().
|
||||
*/
|
||||
if (file->f_cred != current_cred() || uaccess_kernel()) {
|
||||
pr_err_once("UHID_CREATE from different security context by process %d (%s), this is not allowed.\n",
|
||||
task_tgid_vnr(current), current->comm);
|
||||
ret = -EACCES;
|
||||
goto unlock;
|
||||
}
|
||||
ret = uhid_dev_create(uhid, &uhid->input_buf);
|
||||
break;
|
||||
case UHID_CREATE2:
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ static ssize_t show_label(struct device *dev, struct device_attribute *devattr,
|
|||
return sprintf(buf, "%s\n", sdata->label);
|
||||
}
|
||||
|
||||
static int __init get_logical_cpu(int hwcpu)
|
||||
static int get_logical_cpu(int hwcpu)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
|
|
@ -125,9 +125,8 @@ static int __init get_logical_cpu(int hwcpu)
|
|||
return -ENOENT;
|
||||
}
|
||||
|
||||
static void __init make_sensor_label(struct device_node *np,
|
||||
struct sensor_data *sdata,
|
||||
const char *label)
|
||||
static void make_sensor_label(struct device_node *np,
|
||||
struct sensor_data *sdata, const char *label)
|
||||
{
|
||||
u32 id;
|
||||
size_t n;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -197,6 +197,22 @@ int v4l2_event_pending(struct v4l2_fh *fh)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(v4l2_event_pending);
|
||||
|
||||
static void __v4l2_event_unsubscribe(struct v4l2_subscribed_event *sev)
|
||||
{
|
||||
struct v4l2_fh *fh = sev->fh;
|
||||
unsigned int i;
|
||||
|
||||
lockdep_assert_held(&fh->subscribe_lock);
|
||||
assert_spin_locked(&fh->vdev->fh_lock);
|
||||
|
||||
/* Remove any pending events for this subscription */
|
||||
for (i = 0; i < sev->in_use; i++) {
|
||||
list_del(&sev->events[sev_pos(sev, i)].list);
|
||||
fh->navailable--;
|
||||
}
|
||||
list_del(&sev->list);
|
||||
}
|
||||
|
||||
int v4l2_event_subscribe(struct v4l2_fh *fh,
|
||||
const struct v4l2_event_subscription *sub, unsigned elems,
|
||||
const struct v4l2_subscribed_event_ops *ops)
|
||||
|
|
@ -228,27 +244,23 @@ int v4l2_event_subscribe(struct v4l2_fh *fh,
|
|||
|
||||
spin_lock_irqsave(&fh->vdev->fh_lock, flags);
|
||||
found_ev = v4l2_event_subscribed(fh, sub->type, sub->id);
|
||||
if (!found_ev)
|
||||
list_add(&sev->list, &fh->subscribed);
|
||||
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
||||
|
||||
if (found_ev) {
|
||||
/* Already listening */
|
||||
kfree(sev);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (sev->ops && sev->ops->add) {
|
||||
} else if (sev->ops && sev->ops->add) {
|
||||
ret = sev->ops->add(sev, elems);
|
||||
if (ret) {
|
||||
spin_lock_irqsave(&fh->vdev->fh_lock, flags);
|
||||
__v4l2_event_unsubscribe(sev);
|
||||
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
||||
kfree(sev);
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&fh->vdev->fh_lock, flags);
|
||||
list_add(&sev->list, &fh->subscribed);
|
||||
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&fh->subscribe_lock);
|
||||
|
||||
return ret;
|
||||
|
|
@ -283,7 +295,6 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
|
|||
{
|
||||
struct v4l2_subscribed_event *sev;
|
||||
unsigned long flags;
|
||||
int i;
|
||||
|
||||
if (sub->type == V4L2_EVENT_ALL) {
|
||||
v4l2_event_unsubscribe_all(fh);
|
||||
|
|
@ -295,14 +306,8 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh,
|
|||
spin_lock_irqsave(&fh->vdev->fh_lock, flags);
|
||||
|
||||
sev = v4l2_event_subscribed(fh, sub->type, sub->id);
|
||||
if (sev != NULL) {
|
||||
/* Remove any pending events for this subscription */
|
||||
for (i = 0; i < sev->in_use; i++) {
|
||||
list_del(&sev->events[sev_pos(sev, i)].list);
|
||||
fh->navailable--;
|
||||
}
|
||||
list_del(&sev->list);
|
||||
}
|
||||
if (sev != NULL)
|
||||
__v4l2_event_unsubscribe(sev);
|
||||
|
||||
spin_unlock_irqrestore(&fh->vdev->fh_lock, flags);
|
||||
|
||||
|
|
|
|||
|
|
@ -870,12 +870,9 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
|||
dprintk(4, "done processing on buffer %d, state: %d\n",
|
||||
vb->index, state);
|
||||
|
||||
if (state != VB2_BUF_STATE_QUEUED &&
|
||||
state != VB2_BUF_STATE_REQUEUEING) {
|
||||
/* sync buffers */
|
||||
for (plane = 0; plane < vb->num_planes; ++plane)
|
||||
call_void_memop(vb, finish, vb->planes[plane].mem_priv);
|
||||
}
|
||||
/* sync buffers */
|
||||
for (plane = 0; plane < vb->num_planes; ++plane)
|
||||
call_void_memop(vb, finish, vb->planes[plane].mem_priv);
|
||||
|
||||
spin_lock_irqsave(&q->done_lock, flags);
|
||||
if (state == VB2_BUF_STATE_QUEUED ||
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ static const struct of_device_id atmel_ssc_dt_ids[] = {
|
|||
MODULE_DEVICE_TABLE(of, atmel_ssc_dt_ids);
|
||||
#endif
|
||||
|
||||
static inline const struct atmel_ssc_platform_data * __init
|
||||
static inline const struct atmel_ssc_platform_data *
|
||||
atmel_ssc_get_driver_data(struct platform_device *pdev)
|
||||
{
|
||||
if (pdev->dev.of_node) {
|
||||
|
|
|
|||
|
|
@ -27,6 +27,9 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <asm/uv/uv_hub.h>
|
||||
|
||||
#include <linux/nospec.h>
|
||||
|
||||
#include "gru.h"
|
||||
#include "grutables.h"
|
||||
#include "gruhandles.h"
|
||||
|
|
@ -196,6 +199,7 @@ int gru_dump_chiplet_request(unsigned long arg)
|
|||
/* Currently, only dump by gid is implemented */
|
||||
if (req.gid >= gru_max_gids)
|
||||
return -EINVAL;
|
||||
req.gid = array_index_nospec(req.gid, gru_max_gids);
|
||||
|
||||
gru = GID_TO_GRU(req.gid);
|
||||
ubuf = req.buf;
|
||||
|
|
|
|||
|
|
@ -423,6 +423,34 @@ void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(can_put_echo_skb);
|
||||
|
||||
struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
struct sk_buff *skb = priv->echo_skb[idx];
|
||||
struct canfd_frame *cf;
|
||||
|
||||
if (idx >= priv->echo_skb_max) {
|
||||
netdev_err(dev, "%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n",
|
||||
__func__, idx, priv->echo_skb_max);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!skb) {
|
||||
netdev_err(dev, "%s: BUG! Trying to echo non existing skb: can_priv::echo_skb[%u]\n",
|
||||
__func__, idx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Using "struct canfd_frame::len" for the frame
|
||||
* length is supported on both CAN and CANFD frames.
|
||||
*/
|
||||
cf = (struct canfd_frame *)skb->data;
|
||||
*len_ptr = cf->len;
|
||||
priv->echo_skb[idx] = NULL;
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the skb from the stack and loop it back locally
|
||||
*
|
||||
|
|
@ -432,22 +460,16 @@ EXPORT_SYMBOL_GPL(can_put_echo_skb);
|
|||
*/
|
||||
unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx)
|
||||
{
|
||||
struct can_priv *priv = netdev_priv(dev);
|
||||
struct sk_buff *skb;
|
||||
u8 len;
|
||||
|
||||
BUG_ON(idx >= priv->echo_skb_max);
|
||||
skb = __can_get_echo_skb(dev, idx, &len);
|
||||
if (!skb)
|
||||
return 0;
|
||||
|
||||
if (priv->echo_skb[idx]) {
|
||||
struct sk_buff *skb = priv->echo_skb[idx];
|
||||
struct can_frame *cf = (struct can_frame *)skb->data;
|
||||
u8 dlc = cf->can_dlc;
|
||||
netif_rx(skb);
|
||||
|
||||
netif_rx(priv->echo_skb[idx]);
|
||||
priv->echo_skb[idx] = NULL;
|
||||
|
||||
return dlc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return len;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(can_get_echo_skb);
|
||||
|
||||
|
|
|
|||
|
|
@ -491,7 +491,7 @@ static int bcmgenet_mii_of_init(struct bcmgenet_priv *priv)
|
|||
if (!compat)
|
||||
return -ENOMEM;
|
||||
|
||||
priv->mdio_dn = of_find_compatible_node(dn, NULL, compat);
|
||||
priv->mdio_dn = of_get_compatible_child(dn, compat);
|
||||
kfree(compat);
|
||||
if (!priv->mdio_dn) {
|
||||
dev_err(kdev, "unable to find MDIO bus node\n");
|
||||
|
|
|
|||
|
|
@ -12379,6 +12379,7 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
|
|||
{
|
||||
struct tg3 *tp = netdev_priv(dev);
|
||||
int i, irq_sync = 0, err = 0;
|
||||
bool reset_phy = false;
|
||||
|
||||
if ((ering->rx_pending > tp->rx_std_ring_mask) ||
|
||||
(ering->rx_jumbo_pending > tp->rx_jmb_ring_mask) ||
|
||||
|
|
@ -12410,7 +12411,13 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
|
|||
|
||||
if (netif_running(dev)) {
|
||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
||||
err = tg3_restart_hw(tp, false);
|
||||
/* Reset PHY to avoid PHY lock up */
|
||||
if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
|
||||
tg3_asic_rev(tp) == ASIC_REV_5719 ||
|
||||
tg3_asic_rev(tp) == ASIC_REV_5720)
|
||||
reset_phy = true;
|
||||
|
||||
err = tg3_restart_hw(tp, reset_phy);
|
||||
if (!err)
|
||||
tg3_netif_start(tp);
|
||||
}
|
||||
|
|
@ -12444,6 +12451,7 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
|||
{
|
||||
struct tg3 *tp = netdev_priv(dev);
|
||||
int err = 0;
|
||||
bool reset_phy = false;
|
||||
|
||||
if (tp->link_config.autoneg == AUTONEG_ENABLE)
|
||||
tg3_warn_mgmt_link_flap(tp);
|
||||
|
|
@ -12534,7 +12542,13 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
|||
|
||||
if (netif_running(dev)) {
|
||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
||||
err = tg3_restart_hw(tp, false);
|
||||
/* Reset PHY to avoid PHY lock up */
|
||||
if (tg3_asic_rev(tp) == ASIC_REV_5717 ||
|
||||
tg3_asic_rev(tp) == ASIC_REV_5719 ||
|
||||
tg3_asic_rev(tp) == ASIC_REV_5720)
|
||||
reset_phy = true;
|
||||
|
||||
err = tg3_restart_hw(tp, reset_phy);
|
||||
if (!err)
|
||||
tg3_netif_start(tp);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4470,7 +4470,9 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
|
|||
}
|
||||
|
||||
ar->free_vdev_map &= ~(1LL << arvif->vdev_id);
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
list_add(&arvif->list, &ar->arvifs);
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
|
||||
/* It makes no sense to have firmware do keepalives. mac80211 already
|
||||
* takes care of this with idle connection polling.
|
||||
|
|
@ -4603,7 +4605,9 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
|
|||
err_vdev_delete:
|
||||
ath10k_wmi_vdev_delete(ar, arvif->vdev_id);
|
||||
ar->free_vdev_map |= 1LL << arvif->vdev_id;
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
list_del(&arvif->list);
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
|
||||
err:
|
||||
if (arvif->beacon_buf) {
|
||||
|
|
@ -4647,7 +4651,9 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
|
|||
arvif->vdev_id, ret);
|
||||
|
||||
ar->free_vdev_map |= 1LL << arvif->vdev_id;
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
list_del(&arvif->list);
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
|
||||
if (arvif->vdev_type == WMI_VDEV_TYPE_AP ||
|
||||
arvif->vdev_type == WMI_VDEV_TYPE_IBSS) {
|
||||
|
|
|
|||
|
|
@ -1805,16 +1805,18 @@ static int wsm_buf_reserve(struct wsm_buf *buf, size_t extra_size)
|
|||
{
|
||||
size_t pos = buf->data - buf->begin;
|
||||
size_t size = pos + extra_size;
|
||||
u8 *tmp;
|
||||
|
||||
size = round_up(size, FWLOAD_BLOCK_SIZE);
|
||||
|
||||
buf->begin = krealloc(buf->begin, size, GFP_KERNEL | GFP_DMA);
|
||||
if (buf->begin) {
|
||||
buf->data = &buf->begin[pos];
|
||||
buf->end = &buf->begin[size];
|
||||
return 0;
|
||||
} else {
|
||||
buf->end = buf->data = buf->begin;
|
||||
tmp = krealloc(buf->begin, size, GFP_KERNEL | GFP_DMA);
|
||||
if (!tmp) {
|
||||
wsm_buf_deinit(buf);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
buf->begin = tmp;
|
||||
buf->data = &buf->begin[pos];
|
||||
buf->end = &buf->begin[size];
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -322,8 +322,12 @@ struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (changed)
|
||||
*changed = (resp->status == MCC_RESP_NEW_CHAN_PROFILE);
|
||||
if (changed) {
|
||||
u32 status = le32_to_cpu(resp->status);
|
||||
|
||||
*changed = (status == MCC_RESP_NEW_CHAN_PROFILE ||
|
||||
status == MCC_RESP_ILLEGAL);
|
||||
}
|
||||
|
||||
regd = iwl_parse_nvm_mcc_info(mvm->trans->dev, mvm->cfg,
|
||||
__le32_to_cpu(resp->n_channels),
|
||||
|
|
@ -4050,10 +4054,6 @@ static void iwl_mvm_mac_sta_statistics(struct ieee80211_hw *hw,
|
|||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
||||
|
||||
if (!fw_has_capa(&mvm->fw->ucode_capa,
|
||||
IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS))
|
||||
return;
|
||||
|
||||
/* if beacon filtering isn't on mac80211 does it anyway */
|
||||
if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -667,9 +667,8 @@ iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
|
|||
|
||||
n_channels = __le32_to_cpu(mcc_resp->n_channels);
|
||||
IWL_DEBUG_LAR(mvm,
|
||||
"MCC response status: 0x%x. new MCC: 0x%x ('%c%c') change: %d n_chans: %d\n",
|
||||
status, mcc, mcc >> 8, mcc & 0xff,
|
||||
!!(status == MCC_RESP_NEW_CHAN_PROFILE), n_channels);
|
||||
"MCC response status: 0x%x. new MCC: 0x%x ('%c%c') n_chans: %d\n",
|
||||
status, mcc, mcc >> 8, mcc & 0xff, n_channels);
|
||||
|
||||
resp_len = sizeof(*mcc_resp) + n_channels * sizeof(__le32);
|
||||
resp_cp = kmemdup(mcc_resp, resp_len, GFP_KERNEL);
|
||||
|
|
|
|||
|
|
@ -1150,6 +1150,12 @@ mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
|||
priv->adapter->curr_iface_comb.p2p_intf--;
|
||||
priv->adapter->curr_iface_comb.sta_intf++;
|
||||
dev->ieee80211_ptr->iftype = type;
|
||||
if (mwifiex_deinit_priv_params(priv))
|
||||
return -1;
|
||||
if (mwifiex_init_new_priv_params(priv, dev, type))
|
||||
return -1;
|
||||
if (mwifiex_sta_init_cmd(priv, false, false))
|
||||
return -1;
|
||||
break;
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
if (mwifiex_cfg80211_deinit_p2p(priv))
|
||||
|
|
@ -2839,8 +2845,10 @@ int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
|
|||
|
||||
mwifiex_stop_net_dev_queue(priv->netdev, adapter);
|
||||
|
||||
skb_queue_walk_safe(&priv->bypass_txq, skb, tmp)
|
||||
skb_queue_walk_safe(&priv->bypass_txq, skb, tmp) {
|
||||
skb_unlink(skb, &priv->bypass_txq);
|
||||
mwifiex_write_data_complete(priv->adapter, skb, 0, -1);
|
||||
}
|
||||
|
||||
if (netif_carrier_ok(priv->netdev))
|
||||
netif_carrier_off(priv->netdev);
|
||||
|
|
|
|||
|
|
@ -501,8 +501,10 @@ mwifiex_wmm_del_pkts_in_ralist_node(struct mwifiex_private *priv,
|
|||
struct mwifiex_adapter *adapter = priv->adapter;
|
||||
struct sk_buff *skb, *tmp;
|
||||
|
||||
skb_queue_walk_safe(&ra_list->skb_head, skb, tmp)
|
||||
skb_queue_walk_safe(&ra_list->skb_head, skb, tmp) {
|
||||
skb_unlink(skb, &ra_list->skb_head);
|
||||
mwifiex_write_data_complete(adapter, skb, 0, -1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -598,11 +600,15 @@ mwifiex_clean_txrx(struct mwifiex_private *priv)
|
|||
priv->adapter->if_ops.clean_pcie_ring(priv->adapter);
|
||||
spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
|
||||
|
||||
skb_queue_walk_safe(&priv->tdls_txq, skb, tmp)
|
||||
skb_queue_walk_safe(&priv->tdls_txq, skb, tmp) {
|
||||
skb_unlink(skb, &priv->tdls_txq);
|
||||
mwifiex_write_data_complete(priv->adapter, skb, 0, -1);
|
||||
}
|
||||
|
||||
skb_queue_walk_safe(&priv->bypass_txq, skb, tmp)
|
||||
skb_queue_walk_safe(&priv->bypass_txq, skb, tmp) {
|
||||
skb_unlink(skb, &priv->bypass_txq);
|
||||
mwifiex_write_data_complete(priv->adapter, skb, 0, -1);
|
||||
}
|
||||
atomic_set(&priv->adapter->bypass_tx_pending, 0);
|
||||
|
||||
idr_for_each(&priv->ack_status_frames, mwifiex_free_ack_frame, NULL);
|
||||
|
|
|
|||
|
|
@ -73,10 +73,9 @@ static int nfcmrvl_uart_parse_dt(struct device_node *node,
|
|||
struct device_node *matched_node;
|
||||
int ret;
|
||||
|
||||
matched_node = of_find_compatible_node(node, NULL, "marvell,nfc-uart");
|
||||
matched_node = of_get_compatible_child(node, "marvell,nfc-uart");
|
||||
if (!matched_node) {
|
||||
matched_node = of_find_compatible_node(node, NULL,
|
||||
"mrvl,nfc-uart");
|
||||
matched_node = of_get_compatible_child(node, "mrvl,nfc-uart");
|
||||
if (!matched_node)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -712,6 +712,31 @@ struct device_node *of_get_next_available_child(const struct device_node *node,
|
|||
}
|
||||
EXPORT_SYMBOL(of_get_next_available_child);
|
||||
|
||||
/**
|
||||
* of_get_compatible_child - Find compatible child node
|
||||
* @parent: parent node
|
||||
* @compatible: compatible string
|
||||
*
|
||||
* Lookup child node whose compatible property contains the given compatible
|
||||
* string.
|
||||
*
|
||||
* Returns a node pointer with refcount incremented, use of_node_put() on it
|
||||
* when done; or NULL if not found.
|
||||
*/
|
||||
struct device_node *of_get_compatible_child(const struct device_node *parent,
|
||||
const char *compatible)
|
||||
{
|
||||
struct device_node *child;
|
||||
|
||||
for_each_child_of_node(parent, child) {
|
||||
if (of_device_is_compatible(child, compatible))
|
||||
break;
|
||||
}
|
||||
|
||||
return child;
|
||||
}
|
||||
EXPORT_SYMBOL(of_get_compatible_child);
|
||||
|
||||
/**
|
||||
* of_get_child_by_name - Find the child node by name for a given parent
|
||||
* @node: parent node
|
||||
|
|
|
|||
|
|
@ -233,6 +233,7 @@ static const struct bios_settings bios_tbl[] = {
|
|||
{"Gateway", "LT31", "v1.3201", 0x55, 0x58, {0x9e, 0x00}, 0},
|
||||
{"Gateway", "LT31", "v1.3302", 0x55, 0x58, {0x9e, 0x00}, 0},
|
||||
{"Gateway", "LT31", "v1.3303t", 0x55, 0x58, {0x9e, 0x00}, 0},
|
||||
{"Gateway", "LT31", "v1.3307", 0x55, 0x58, {0x9e, 0x00}, 0},
|
||||
/* Packard Bell */
|
||||
{"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00}, 0},
|
||||
{"Packard Bell", "DOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00}, 0},
|
||||
|
|
|
|||
|
|
@ -685,6 +685,11 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
|
|||
srb_t *sp;
|
||||
int rval;
|
||||
|
||||
if (unlikely(test_bit(UNLOADING, &base_vha->dpc_flags))) {
|
||||
cmd->result = DID_NO_CONNECT << 16;
|
||||
goto qc24_fail_command;
|
||||
}
|
||||
|
||||
if (ha->flags.eeh_busy) {
|
||||
if (ha->flags.pci_channel_io_perm_failure) {
|
||||
ql_dbg(ql_dbg_aer, vha, 0x9010,
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
#define QUERY_DESC_MIN_SIZE 2
|
||||
#define QUERY_OSF_SIZE (GENERAL_UPIU_REQUEST_SIZE - \
|
||||
(sizeof(struct utp_upiu_header)))
|
||||
#define RESPONSE_UPIU_SENSE_DATA_LENGTH 18
|
||||
|
||||
#define UPIU_HEADER_DWORD(byte3, byte2, byte1, byte0)\
|
||||
cpu_to_be32((byte3 << 24) | (byte2 << 16) |\
|
||||
|
|
@ -383,7 +384,7 @@ struct utp_cmd_rsp {
|
|||
__be32 residual_transfer_count;
|
||||
__be32 reserved[4];
|
||||
__be16 sense_data_len;
|
||||
u8 sense_data[18];
|
||||
u8 sense_data[RESPONSE_UPIU_SENSE_DATA_LENGTH];
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ static void ufshcd_pci_remove(struct pci_dev *pdev)
|
|||
pm_runtime_forbid(&pdev->dev);
|
||||
pm_runtime_get_noresume(&pdev->dev);
|
||||
ufshcd_remove(hba);
|
||||
ufshcd_dealloc_host(hba);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -147,6 +148,7 @@ ufshcd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
err = ufshcd_init(hba, mmio_base, pdev->irq);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Initialization failed\n");
|
||||
ufshcd_dealloc_host(hba);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ static int ufshcd_populate_vreg(struct device *dev, const char *name,
|
|||
if (ret) {
|
||||
dev_err(dev, "%s: unable to find %s err %d\n",
|
||||
__func__, prop_name, ret);
|
||||
goto out_free;
|
||||
goto out;
|
||||
}
|
||||
|
||||
vreg->min_uA = 0;
|
||||
|
|
@ -183,9 +183,6 @@ static int ufshcd_populate_vreg(struct device *dev, const char *name,
|
|||
|
||||
goto out;
|
||||
|
||||
out_free:
|
||||
devm_kfree(dev, vreg);
|
||||
vreg = NULL;
|
||||
out:
|
||||
if (!ret)
|
||||
*out_vreg = vreg;
|
||||
|
|
|
|||
|
|
@ -585,6 +585,21 @@ int ufshcd_hold(struct ufs_hba *hba, bool async)
|
|||
start:
|
||||
switch (hba->clk_gating.state) {
|
||||
case CLKS_ON:
|
||||
/*
|
||||
* Wait for the ungate work to complete if in progress.
|
||||
* Though the clocks may be in ON state, the link could
|
||||
* still be in hibner8 state if hibern8 is allowed
|
||||
* during clock gating.
|
||||
* Make sure we exit hibern8 state also in addition to
|
||||
* clocks being ON.
|
||||
*/
|
||||
if (ufshcd_can_hibern8_during_gating(hba) &&
|
||||
ufshcd_is_link_hibern8(hba)) {
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
flush_work(&hba->clk_gating.ungate_work);
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
goto start;
|
||||
}
|
||||
break;
|
||||
case REQ_CLKS_OFF:
|
||||
if (cancel_delayed_work(&hba->clk_gating.gate_work)) {
|
||||
|
|
@ -813,10 +828,14 @@ static inline void ufshcd_copy_sense_data(struct ufshcd_lrb *lrbp)
|
|||
int len;
|
||||
if (lrbp->sense_buffer &&
|
||||
ufshcd_get_rsp_upiu_data_seg_len(lrbp->ucd_rsp_ptr)) {
|
||||
int len_to_copy;
|
||||
|
||||
len = be16_to_cpu(lrbp->ucd_rsp_ptr->sr.sense_data_len);
|
||||
len_to_copy = min_t(int, RESPONSE_UPIU_SENSE_DATA_LENGTH, len);
|
||||
|
||||
memcpy(lrbp->sense_buffer,
|
||||
lrbp->ucd_rsp_ptr->sr.sense_data,
|
||||
min_t(int, len, SCSI_SENSE_BUFFERSIZE));
|
||||
min_t(int, len_to_copy, SCSI_SENSE_BUFFERSIZE));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -5251,7 +5270,10 @@ EXPORT_SYMBOL(ufshcd_system_suspend);
|
|||
|
||||
int ufshcd_system_resume(struct ufs_hba *hba)
|
||||
{
|
||||
if (!hba || !hba->is_powered || pm_runtime_suspended(hba->dev))
|
||||
if (!hba)
|
||||
return -EINVAL;
|
||||
|
||||
if (!hba->is_powered || pm_runtime_suspended(hba->dev))
|
||||
/*
|
||||
* Let the runtime resume take care of resuming
|
||||
* if runtime suspended.
|
||||
|
|
@ -5272,7 +5294,10 @@ EXPORT_SYMBOL(ufshcd_system_resume);
|
|||
*/
|
||||
int ufshcd_runtime_suspend(struct ufs_hba *hba)
|
||||
{
|
||||
if (!hba || !hba->is_powered)
|
||||
if (!hba)
|
||||
return -EINVAL;
|
||||
|
||||
if (!hba->is_powered)
|
||||
return 0;
|
||||
|
||||
return ufshcd_suspend(hba, UFS_RUNTIME_PM);
|
||||
|
|
@ -5302,10 +5327,13 @@ EXPORT_SYMBOL(ufshcd_runtime_suspend);
|
|||
*/
|
||||
int ufshcd_runtime_resume(struct ufs_hba *hba)
|
||||
{
|
||||
if (!hba || !hba->is_powered)
|
||||
if (!hba)
|
||||
return -EINVAL;
|
||||
|
||||
if (!hba->is_powered)
|
||||
return 0;
|
||||
else
|
||||
return ufshcd_resume(hba, UFS_RUNTIME_PM);
|
||||
|
||||
return ufshcd_resume(hba, UFS_RUNTIME_PM);
|
||||
}
|
||||
EXPORT_SYMBOL(ufshcd_runtime_resume);
|
||||
|
||||
|
|
@ -5357,8 +5385,6 @@ void ufshcd_remove(struct ufs_hba *hba)
|
|||
ufshcd_disable_intr(hba, hba->intr_mask);
|
||||
ufshcd_hba_stop(hba);
|
||||
|
||||
scsi_host_put(hba->host);
|
||||
|
||||
ufshcd_exit_clk_gating(hba);
|
||||
if (ufshcd_is_clkscaling_enabled(hba))
|
||||
devfreq_remove_device(hba->devfreq);
|
||||
|
|
@ -5483,15 +5509,47 @@ static int ufshcd_devfreq_target(struct device *dev,
|
|||
{
|
||||
int err = 0;
|
||||
struct ufs_hba *hba = dev_get_drvdata(dev);
|
||||
bool release_clk_hold = false;
|
||||
unsigned long irq_flags;
|
||||
|
||||
if (!ufshcd_is_clkscaling_enabled(hba))
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(hba->host->host_lock, irq_flags);
|
||||
if (ufshcd_eh_in_progress(hba)) {
|
||||
spin_unlock_irqrestore(hba->host->host_lock, irq_flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ufshcd_is_clkgating_allowed(hba) &&
|
||||
(hba->clk_gating.state != CLKS_ON)) {
|
||||
if (cancel_delayed_work(&hba->clk_gating.gate_work)) {
|
||||
/* hold the vote until the scaling work is completed */
|
||||
hba->clk_gating.active_reqs++;
|
||||
release_clk_hold = true;
|
||||
hba->clk_gating.state = CLKS_ON;
|
||||
} else {
|
||||
/*
|
||||
* Clock gating work seems to be running in parallel
|
||||
* hence skip scaling work to avoid deadlock between
|
||||
* current scaling work and gating work.
|
||||
*/
|
||||
spin_unlock_irqrestore(hba->host->host_lock, irq_flags);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(hba->host->host_lock, irq_flags);
|
||||
|
||||
if (*freq == UINT_MAX)
|
||||
err = ufshcd_scale_clks(hba, true);
|
||||
else if (*freq == 0)
|
||||
err = ufshcd_scale_clks(hba, false);
|
||||
|
||||
spin_lock_irqsave(hba->host->host_lock, irq_flags);
|
||||
if (release_clk_hold)
|
||||
__ufshcd_release(hba);
|
||||
spin_unlock_irqrestore(hba->host->host_lock, irq_flags);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -5673,7 +5731,6 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
|||
ufshcd_exit_clk_gating(hba);
|
||||
out_disable:
|
||||
hba->is_irq_enabled = false;
|
||||
scsi_host_put(host);
|
||||
ufshcd_hba_exit(hba);
|
||||
out_error:
|
||||
return err;
|
||||
|
|
|
|||
|
|
@ -165,15 +165,29 @@ static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
|
|||
return put_user(x, ptr);
|
||||
}
|
||||
|
||||
/* If we are not echoing the data, perhaps this is a secret so erase it */
|
||||
static inline void zero_buffer(struct tty_struct *tty, u8 *buffer, int size)
|
||||
{
|
||||
bool icanon = !!L_ICANON(tty);
|
||||
bool no_echo = !L_ECHO(tty);
|
||||
|
||||
if (icanon && no_echo)
|
||||
memset(buffer, 0x00, size);
|
||||
}
|
||||
|
||||
static inline int tty_copy_to_user(struct tty_struct *tty,
|
||||
void __user *to,
|
||||
const void *from,
|
||||
void *from,
|
||||
unsigned long n)
|
||||
{
|
||||
struct n_tty_data *ldata = tty->disc_data;
|
||||
int retval;
|
||||
|
||||
tty_audit_add_data(tty, from, n, ldata->icanon);
|
||||
return copy_to_user(to, from, n);
|
||||
retval = copy_to_user(to, from, n);
|
||||
if (!retval)
|
||||
zero_buffer(tty, from, n);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2005,6 +2019,7 @@ static int copy_from_read_buf(struct tty_struct *tty,
|
|||
is_eof = n == 1 && read_buf(ldata, tail) == EOF_CHAR(tty);
|
||||
tty_audit_add_data(tty, read_buf_addr(ldata, tail), n,
|
||||
ldata->icanon);
|
||||
zero_buffer(tty, read_buf_addr(ldata, tail), n);
|
||||
smp_store_release(&ldata->read_tail, ldata->read_tail + n);
|
||||
/* Turn single EOF into zero-length read */
|
||||
if (L_EXTPROC(tty) && ldata->icanon && is_eof &&
|
||||
|
|
|
|||
|
|
@ -454,6 +454,8 @@ receive_buf(struct tty_struct *tty, struct tty_buffer *head, int count)
|
|||
if (count && disc->ops->receive_buf)
|
||||
disc->ops->receive_buf(tty, p, f, count);
|
||||
}
|
||||
if (count > 0)
|
||||
memset(p, 0, count);
|
||||
return count;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -842,6 +842,8 @@ int __uio_register_device(struct module *owner,
|
|||
if (ret)
|
||||
goto err_uio_dev_add_attributes;
|
||||
|
||||
info->uio_dev = idev;
|
||||
|
||||
if (info->irq && (info->irq != UIO_IRQ_CUSTOM)) {
|
||||
/*
|
||||
* Note that we deliberately don't use devm_request_irq
|
||||
|
|
@ -853,11 +855,12 @@ int __uio_register_device(struct module *owner,
|
|||
*/
|
||||
ret = request_irq(info->irq, uio_interrupt,
|
||||
info->irq_flags, info->name, idev);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
info->uio_dev = NULL;
|
||||
goto err_request_irq;
|
||||
}
|
||||
}
|
||||
|
||||
info->uio_dev = idev;
|
||||
return 0;
|
||||
|
||||
err_request_irq:
|
||||
|
|
|
|||
|
|
@ -1716,6 +1716,9 @@ static const struct usb_device_id acm_ids[] = {
|
|||
{ USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */
|
||||
.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
|
||||
},
|
||||
{ USB_DEVICE(0x0572, 0x1349), /* Hiro (Conexant) USB MODEM H50228 */
|
||||
.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
|
||||
},
|
||||
{ USB_DEVICE(0x20df, 0x0001), /* Simtec Electronics Entropy Key */
|
||||
.driver_info = QUIRK_CONTROL_LINE_STATE, },
|
||||
{ USB_DEVICE(0x2184, 0x001c) }, /* GW Instek AFG-2225 */
|
||||
|
|
|
|||
|
|
@ -2757,7 +2757,9 @@ static int hub_port_reset(struct usb_hub *hub, int port1,
|
|||
USB_PORT_FEAT_C_BH_PORT_RESET);
|
||||
usb_clear_port_feature(hub->hdev, port1,
|
||||
USB_PORT_FEAT_C_PORT_LINK_STATE);
|
||||
usb_clear_port_feature(hub->hdev, port1,
|
||||
|
||||
if (udev)
|
||||
usb_clear_port_feature(hub->hdev, port1,
|
||||
USB_PORT_FEAT_C_CONNECTION);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -243,6 +243,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
{ USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT |
|
||||
USB_QUIRK_DELAY_CTRL_MSG },
|
||||
|
||||
/* Corsair K70 LUX RGB */
|
||||
{ USB_DEVICE(0x1b1c, 0x1b33), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
/* Corsair K70 LUX */
|
||||
{ USB_DEVICE(0x1b1c, 0x1b36), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
|
||||
|
|
@ -263,6 +266,11 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
{ USB_DEVICE(0x2040, 0x7200), .driver_info =
|
||||
USB_QUIRK_CONFIG_INTF_STRINGS },
|
||||
|
||||
/* Raydium Touchscreen */
|
||||
{ USB_DEVICE(0x2386, 0x3114), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
{ USB_DEVICE(0x2386, 0x3119), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
/* DJI CineSSD */
|
||||
{ USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
|
|
|
|||
|
|
@ -348,7 +348,7 @@ int xhci_find_slot_id_by_port(struct usb_hcd *hcd, struct xhci_hcd *xhci,
|
|||
|
||||
slot_id = 0;
|
||||
for (i = 0; i < MAX_HC_SLOTS; i++) {
|
||||
if (!xhci->devs[i])
|
||||
if (!xhci->devs[i] || !xhci->devs[i]->udev)
|
||||
continue;
|
||||
speed = xhci->devs[i]->udev->speed;
|
||||
if (((speed >= USB_SPEED_SUPER) == (hcd->speed >= HCD_USB3))
|
||||
|
|
@ -744,7 +744,7 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd,
|
|||
status |= USB_PORT_STAT_SUSPEND;
|
||||
}
|
||||
if ((raw_port_status & PORT_PLS_MASK) == XDEV_RESUME &&
|
||||
!DEV_SUPERSPEED_ANY(raw_port_status)) {
|
||||
!DEV_SUPERSPEED_ANY(raw_port_status) && hcd->speed < HCD_USB3) {
|
||||
if ((raw_port_status & PORT_RESET) ||
|
||||
!(raw_port_status & PORT_PE))
|
||||
return 0xffffffff;
|
||||
|
|
@ -790,7 +790,7 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd,
|
|||
time_left = wait_for_completion_timeout(
|
||||
&bus_state->rexit_done[wIndex],
|
||||
msecs_to_jiffies(
|
||||
XHCI_MAX_REXIT_TIMEOUT));
|
||||
XHCI_MAX_REXIT_TIMEOUT_MS));
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
|
||||
if (time_left) {
|
||||
|
|
@ -804,7 +804,7 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd,
|
|||
} else {
|
||||
int port_status = readl(port_array[wIndex]);
|
||||
xhci_warn(xhci, "Port resume took longer than %i msec, port status = 0x%x\n",
|
||||
XHCI_MAX_REXIT_TIMEOUT,
|
||||
XHCI_MAX_REXIT_TIMEOUT_MS,
|
||||
port_status);
|
||||
status |= USB_PORT_STAT_SUSPEND;
|
||||
clear_bit(wIndex, &bus_state->rexit_ports);
|
||||
|
|
@ -1298,13 +1298,16 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
|
|||
__le32 __iomem **port_array;
|
||||
struct xhci_bus_state *bus_state;
|
||||
unsigned long flags;
|
||||
u32 portsc_buf[USB_MAXCHILDREN];
|
||||
bool wake_enabled;
|
||||
|
||||
max_ports = xhci_get_ports(hcd, &port_array);
|
||||
bus_state = &xhci->bus_state[hcd_index(hcd)];
|
||||
wake_enabled = hcd->self.root_hub->do_remote_wakeup;
|
||||
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
|
||||
if (hcd->self.root_hub->do_remote_wakeup) {
|
||||
if (wake_enabled) {
|
||||
if (bus_state->resuming_ports || /* USB2 */
|
||||
bus_state->port_remote_wakeup) { /* USB3 */
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
|
|
@ -1312,26 +1315,36 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
|
|||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
|
||||
port_index = max_ports;
|
||||
/*
|
||||
* Prepare ports for suspend, but don't write anything before all ports
|
||||
* are checked and we know bus suspend can proceed
|
||||
*/
|
||||
bus_state->bus_suspended = 0;
|
||||
port_index = max_ports;
|
||||
while (port_index--) {
|
||||
/* suspend the port if the port is not suspended */
|
||||
u32 t1, t2;
|
||||
int slot_id;
|
||||
|
||||
t1 = readl(port_array[port_index]);
|
||||
t2 = xhci_port_state_to_neutral(t1);
|
||||
portsc_buf[port_index] = 0;
|
||||
|
||||
if ((t1 & PORT_PE) && !(t1 & PORT_PLS_MASK)) {
|
||||
xhci_dbg(xhci, "port %d not suspended\n", port_index);
|
||||
slot_id = xhci_find_slot_id_by_port(hcd, xhci,
|
||||
port_index + 1);
|
||||
if (slot_id) {
|
||||
/* Bail out if a USB3 port has a new device in link training */
|
||||
if ((t1 & PORT_PLS_MASK) == XDEV_POLLING) {
|
||||
bus_state->bus_suspended = 0;
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
xhci_dbg(xhci, "Bus suspend bailout, port in polling\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/* suspend ports in U0, or bail out for new connect changes */
|
||||
if ((t1 & PORT_PE) && (t1 & PORT_PLS_MASK) == XDEV_U0) {
|
||||
if ((t1 & PORT_CSC) && wake_enabled) {
|
||||
bus_state->bus_suspended = 0;
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
xhci_stop_device(xhci, slot_id, 1);
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
xhci_dbg(xhci, "Bus suspend bailout, port connect change\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
xhci_dbg(xhci, "port %d not suspended\n", port_index);
|
||||
t2 &= ~PORT_PLS_MASK;
|
||||
t2 |= PORT_LINK_STROBE | XDEV_U3;
|
||||
set_bit(port_index, &bus_state->bus_suspended);
|
||||
|
|
@ -1340,7 +1353,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
|
|||
* including the USB 3.0 roothub, but only if CONFIG_PM
|
||||
* is enabled, so also enable remote wake here.
|
||||
*/
|
||||
if (hcd->self.root_hub->do_remote_wakeup) {
|
||||
if (wake_enabled) {
|
||||
if (t1 & PORT_CONNECT) {
|
||||
t2 |= PORT_WKOC_E | PORT_WKDISC_E;
|
||||
t2 &= ~PORT_WKCONN_E;
|
||||
|
|
@ -1353,7 +1366,26 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
|
|||
|
||||
t1 = xhci_port_state_to_neutral(t1);
|
||||
if (t1 != t2)
|
||||
writel(t2, port_array[port_index]);
|
||||
portsc_buf[port_index] = t2;
|
||||
}
|
||||
|
||||
/* write port settings, stopping and suspending ports if needed */
|
||||
port_index = max_ports;
|
||||
while (port_index--) {
|
||||
if (!portsc_buf[port_index])
|
||||
continue;
|
||||
if (test_bit(port_index, &bus_state->bus_suspended)) {
|
||||
int slot_id;
|
||||
|
||||
slot_id = xhci_find_slot_id_by_port(hcd, xhci,
|
||||
port_index + 1);
|
||||
if (slot_id) {
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
xhci_stop_device(xhci, slot_id, 1);
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
}
|
||||
}
|
||||
writel(portsc_buf[port_index], port_array[port_index]);
|
||||
}
|
||||
hcd->state = HC_STATE_SUSPENDED;
|
||||
bus_state->next_statechange = jiffies + msecs_to_jiffies(10);
|
||||
|
|
|
|||
|
|
@ -1673,7 +1673,7 @@ static void handle_port_status(struct xhci_hcd *xhci,
|
|||
* RExit to a disconnect state). If so, let the the driver know it's
|
||||
* out of the RExit state.
|
||||
*/
|
||||
if (!DEV_SUPERSPEED_ANY(temp) &&
|
||||
if (!DEV_SUPERSPEED_ANY(temp) && hcd->speed < HCD_USB3 &&
|
||||
test_and_clear_bit(faked_port_index,
|
||||
&bus_state->rexit_ports)) {
|
||||
complete(&bus_state->rexit_done[faked_port_index]);
|
||||
|
|
|
|||
|
|
@ -1490,7 +1490,7 @@ struct xhci_bus_state {
|
|||
* It can take up to 20 ms to transition from RExit to U0 on the
|
||||
* Intel Lynx Point LP xHCI host.
|
||||
*/
|
||||
#define XHCI_MAX_REXIT_TIMEOUT (20 * 1000)
|
||||
#define XHCI_MAX_REXIT_TIMEOUT_MS 20
|
||||
|
||||
static inline unsigned int hcd_index(struct usb_hcd *hcd)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ static const struct usb_device_id appledisplay_table[] = {
|
|||
{ APPLEDISPLAY_DEVICE(0x9219) },
|
||||
{ APPLEDISPLAY_DEVICE(0x921c) },
|
||||
{ APPLEDISPLAY_DEVICE(0x921d) },
|
||||
{ APPLEDISPLAY_DEVICE(0x9222) },
|
||||
{ APPLEDISPLAY_DEVICE(0x9236) },
|
||||
|
||||
/* Terminating entry */
|
||||
|
|
|
|||
|
|
@ -76,15 +76,6 @@ static inline int dt_type(struct p9_wstat *mistat)
|
|||
return rettype;
|
||||
}
|
||||
|
||||
static void p9stat_init(struct p9_wstat *stbuf)
|
||||
{
|
||||
stbuf->name = NULL;
|
||||
stbuf->uid = NULL;
|
||||
stbuf->gid = NULL;
|
||||
stbuf->muid = NULL;
|
||||
stbuf->extension = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* v9fs_alloc_rdir_buf - Allocate buffer used for read and readdir
|
||||
* @filp: opened file structure
|
||||
|
|
@ -145,12 +136,10 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
|
|||
rdir->tail = n;
|
||||
}
|
||||
while (rdir->head < rdir->tail) {
|
||||
p9stat_init(&st);
|
||||
err = p9stat_read(fid->clnt, rdir->buf + rdir->head,
|
||||
rdir->tail - rdir->head, &st);
|
||||
if (err) {
|
||||
p9_debug(P9_DEBUG_VFS, "returned %d\n", err);
|
||||
p9stat_free(&st);
|
||||
return -EIO;
|
||||
}
|
||||
reclen = st.size+2;
|
||||
|
|
|
|||
|
|
@ -350,7 +350,8 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent)
|
|||
|
||||
s->s_magic = BFS_MAGIC;
|
||||
|
||||
if (le32_to_cpu(bfs_sb->s_start) > le32_to_cpu(bfs_sb->s_end)) {
|
||||
if (le32_to_cpu(bfs_sb->s_start) > le32_to_cpu(bfs_sb->s_end) ||
|
||||
le32_to_cpu(bfs_sb->s_start) < BFS_BSIZE) {
|
||||
printf("Superblock is corrupted\n");
|
||||
goto out1;
|
||||
}
|
||||
|
|
@ -359,9 +360,11 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent)
|
|||
sizeof(struct bfs_inode)
|
||||
+ BFS_ROOT_INO - 1;
|
||||
imap_len = (info->si_lasti / 8) + 1;
|
||||
info->si_imap = kzalloc(imap_len, GFP_KERNEL);
|
||||
if (!info->si_imap)
|
||||
info->si_imap = kzalloc(imap_len, GFP_KERNEL | __GFP_NOWARN);
|
||||
if (!info->si_imap) {
|
||||
printf("Cannot allocate %u bytes\n", imap_len);
|
||||
goto out1;
|
||||
}
|
||||
for (i = 0; i < BFS_ROOT_INO; i++)
|
||||
set_bit(i, info->si_imap);
|
||||
|
||||
|
|
|
|||
|
|
@ -4333,6 +4333,7 @@ static int btrfs_destroy_marked_extents(struct btrfs_root *root,
|
|||
static int btrfs_destroy_pinned_extent(struct btrfs_root *root,
|
||||
struct extent_io_tree *pinned_extents)
|
||||
{
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
struct extent_io_tree *unpin;
|
||||
u64 start;
|
||||
u64 end;
|
||||
|
|
@ -4342,21 +4343,31 @@ static int btrfs_destroy_pinned_extent(struct btrfs_root *root,
|
|||
unpin = pinned_extents;
|
||||
again:
|
||||
while (1) {
|
||||
/*
|
||||
* The btrfs_finish_extent_commit() may get the same range as
|
||||
* ours between find_first_extent_bit and clear_extent_dirty.
|
||||
* Hence, hold the unused_bg_unpin_mutex to avoid double unpin
|
||||
* the same extent range.
|
||||
*/
|
||||
mutex_lock(&fs_info->unused_bg_unpin_mutex);
|
||||
ret = find_first_extent_bit(unpin, 0, &start, &end,
|
||||
EXTENT_DIRTY, NULL);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
mutex_unlock(&fs_info->unused_bg_unpin_mutex);
|
||||
break;
|
||||
}
|
||||
|
||||
clear_extent_dirty(unpin, start, end, GFP_NOFS);
|
||||
btrfs_error_unpin_extent_range(root, start, end);
|
||||
mutex_unlock(&fs_info->unused_bg_unpin_mutex);
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
if (loop) {
|
||||
if (unpin == &root->fs_info->freed_extents[0])
|
||||
unpin = &root->fs_info->freed_extents[1];
|
||||
if (unpin == &fs_info->freed_extents[0])
|
||||
unpin = &fs_info->freed_extents[1];
|
||||
else
|
||||
unpin = &root->fs_info->freed_extents[0];
|
||||
unpin = &fs_info->freed_extents[0];
|
||||
loop = false;
|
||||
goto again;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10708,17 +10708,9 @@ int btrfs_trim_fs(struct btrfs_root *root, struct fstrim_range *range)
|
|||
u64 start;
|
||||
u64 end;
|
||||
u64 trimmed = 0;
|
||||
u64 total_bytes = btrfs_super_total_bytes(fs_info->super_copy);
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* try to trim all FS space, our block group may start from non-zero.
|
||||
*/
|
||||
if (range->len == total_bytes)
|
||||
cache = btrfs_lookup_first_block_group(fs_info, range->start);
|
||||
else
|
||||
cache = btrfs_lookup_block_group(fs_info, range->start);
|
||||
|
||||
cache = btrfs_lookup_first_block_group(fs_info, range->start);
|
||||
while (cache) {
|
||||
if (cache->key.objectid >= (range->start + range->len)) {
|
||||
btrfs_put_block_group(cache);
|
||||
|
|
|
|||
|
|
@ -378,7 +378,6 @@ static noinline int btrfs_ioctl_fitrim(struct file *file, void __user *arg)
|
|||
struct fstrim_range range;
|
||||
u64 minlen = ULLONG_MAX;
|
||||
u64 num_devices = 0;
|
||||
u64 total_bytes = btrfs_super_total_bytes(fs_info->super_copy);
|
||||
int ret;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
|
|
@ -402,11 +401,15 @@ static noinline int btrfs_ioctl_fitrim(struct file *file, void __user *arg)
|
|||
return -EOPNOTSUPP;
|
||||
if (copy_from_user(&range, arg, sizeof(range)))
|
||||
return -EFAULT;
|
||||
if (range.start > total_bytes ||
|
||||
range.len < fs_info->sb->s_blocksize)
|
||||
|
||||
/*
|
||||
* NOTE: Don't truncate the range using super->total_bytes. Bytenr of
|
||||
* block group is in the logical address space, which can be any
|
||||
* sectorsize aligned bytenr in the range [0, U64_MAX].
|
||||
*/
|
||||
if (range.len < fs_info->sb->s_blocksize)
|
||||
return -EINVAL;
|
||||
|
||||
range.len = min(range.len, total_bytes - range.start);
|
||||
range.minlen = max(range.minlen, minlen);
|
||||
ret = btrfs_trim_fs(fs_info->tree_root, &range);
|
||||
if (ret < 0)
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ static int parse_options(char *options, struct exofs_mountopt *opts)
|
|||
token = match_token(p, tokens, args);
|
||||
switch (token) {
|
||||
case Opt_name:
|
||||
kfree(opts->dev_name);
|
||||
opts->dev_name = match_strdup(&args[0]);
|
||||
if (unlikely(!opts->dev_name)) {
|
||||
EXOFS_ERR("Error allocating dev_name");
|
||||
|
|
@ -868,8 +869,10 @@ static struct dentry *exofs_mount(struct file_system_type *type,
|
|||
int ret;
|
||||
|
||||
ret = parse_options(data, &opts);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
kfree(opts.dev_name);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
if (!opts.dev_name)
|
||||
opts.dev_name = dev_name;
|
||||
|
|
|
|||
|
|
@ -71,13 +71,13 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
|
|||
if (!sdp)
|
||||
return NULL;
|
||||
|
||||
sb->s_fs_info = sdp;
|
||||
sdp->sd_vfs = sb;
|
||||
sdp->sd_lkstats = alloc_percpu(struct gfs2_pcpu_lkstats);
|
||||
if (!sdp->sd_lkstats) {
|
||||
kfree(sdp);
|
||||
return NULL;
|
||||
}
|
||||
sb->s_fs_info = sdp;
|
||||
|
||||
set_bit(SDF_NOJOURNALID, &sdp->sd_flags);
|
||||
gfs2_tune_init(&sdp->sd_tune);
|
||||
|
|
|
|||
|
|
@ -732,6 +732,7 @@ void gfs2_clear_rgrpd(struct gfs2_sbd *sdp)
|
|||
spin_lock(&gl->gl_lockref.lock);
|
||||
gl->gl_object = NULL;
|
||||
spin_unlock(&gl->gl_lockref.lock);
|
||||
gfs2_rgrp_brelse(rgd);
|
||||
gfs2_glock_add_to_lru(gl);
|
||||
gfs2_glock_put(gl);
|
||||
}
|
||||
|
|
@ -1139,7 +1140,7 @@ static u32 count_unlinked(struct gfs2_rgrpd *rgd)
|
|||
* @rgd: the struct gfs2_rgrpd describing the RG to read in
|
||||
*
|
||||
* Read in all of a Resource Group's header and bitmap blocks.
|
||||
* Caller must eventually call gfs2_rgrp_relse() to free the bitmaps.
|
||||
* Caller must eventually call gfs2_rgrp_brelse() to free the bitmaps.
|
||||
*
|
||||
* Returns: errno
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -424,6 +424,10 @@ static int hfs_brec_update_parent(struct hfs_find_data *fd)
|
|||
if (new_node) {
|
||||
__be32 cnid;
|
||||
|
||||
if (!new_node->parent) {
|
||||
hfs_btree_inc_height(tree);
|
||||
new_node->parent = tree->root;
|
||||
}
|
||||
fd->bnode = hfs_bnode_find(tree, new_node->parent);
|
||||
/* create index key and entry */
|
||||
hfs_bnode_read_key(new_node, fd->search_key, 14);
|
||||
|
|
|
|||
|
|
@ -427,6 +427,10 @@ static int hfs_brec_update_parent(struct hfs_find_data *fd)
|
|||
if (new_node) {
|
||||
__be32 cnid;
|
||||
|
||||
if (!new_node->parent) {
|
||||
hfs_btree_inc_height(tree);
|
||||
new_node->parent = tree->root;
|
||||
}
|
||||
fd->bnode = hfs_bnode_find(tree, new_node->parent);
|
||||
/* create index key and entry */
|
||||
hfs_bnode_read_key(new_node, fd->search_key, 14);
|
||||
|
|
|
|||
53
fs/namei.c
53
fs/namei.c
|
|
@ -869,6 +869,8 @@ static inline void put_link(struct nameidata *nd)
|
|||
|
||||
int sysctl_protected_symlinks __read_mostly = 0;
|
||||
int sysctl_protected_hardlinks __read_mostly = 0;
|
||||
int sysctl_protected_fifos __read_mostly;
|
||||
int sysctl_protected_regular __read_mostly;
|
||||
|
||||
/**
|
||||
* may_follow_link - Check symlink following for unsafe situations
|
||||
|
|
@ -982,6 +984,45 @@ static int may_linkat(struct path *link)
|
|||
return -EPERM;
|
||||
}
|
||||
|
||||
/**
|
||||
* may_create_in_sticky - Check whether an O_CREAT open in a sticky directory
|
||||
* should be allowed, or not, on files that already
|
||||
* exist.
|
||||
* @dir: the sticky parent directory
|
||||
* @inode: the inode of the file to open
|
||||
*
|
||||
* Block an O_CREAT open of a FIFO (or a regular file) when:
|
||||
* - sysctl_protected_fifos (or sysctl_protected_regular) is enabled
|
||||
* - the file already exists
|
||||
* - we are in a sticky directory
|
||||
* - we don't own the file
|
||||
* - the owner of the directory doesn't own the file
|
||||
* - the directory is world writable
|
||||
* If the sysctl_protected_fifos (or sysctl_protected_regular) is set to 2
|
||||
* the directory doesn't have to be world writable: being group writable will
|
||||
* be enough.
|
||||
*
|
||||
* Returns 0 if the open is allowed, -ve on error.
|
||||
*/
|
||||
static int may_create_in_sticky(struct dentry * const dir,
|
||||
struct inode * const inode)
|
||||
{
|
||||
if ((!sysctl_protected_fifos && S_ISFIFO(inode->i_mode)) ||
|
||||
(!sysctl_protected_regular && S_ISREG(inode->i_mode)) ||
|
||||
likely(!(dir->d_inode->i_mode & S_ISVTX)) ||
|
||||
uid_eq(inode->i_uid, dir->d_inode->i_uid) ||
|
||||
uid_eq(current_fsuid(), inode->i_uid))
|
||||
return 0;
|
||||
|
||||
if (likely(dir->d_inode->i_mode & 0002) ||
|
||||
(dir->d_inode->i_mode & 0020 &&
|
||||
((sysctl_protected_fifos >= 2 && S_ISFIFO(inode->i_mode)) ||
|
||||
(sysctl_protected_regular >= 2 && S_ISREG(inode->i_mode))))) {
|
||||
return -EACCES;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __always_inline
|
||||
const char *get_link(struct nameidata *nd)
|
||||
{
|
||||
|
|
@ -3166,9 +3207,15 @@ static int do_last(struct nameidata *nd,
|
|||
error = -ELOOP;
|
||||
goto out;
|
||||
}
|
||||
error = -EISDIR;
|
||||
if ((open_flag & O_CREAT) && d_is_dir(nd->path.dentry))
|
||||
goto out;
|
||||
if (open_flag & O_CREAT) {
|
||||
error = -EISDIR;
|
||||
if (d_is_dir(nd->path.dentry))
|
||||
goto out;
|
||||
error = may_create_in_sticky(dir,
|
||||
d_backing_inode(nd->path.dentry));
|
||||
if (unlikely(error))
|
||||
goto out;
|
||||
}
|
||||
error = -ENOTDIR;
|
||||
if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry))
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -184,6 +184,7 @@ struct reiserfs_dentry_buf {
|
|||
struct dir_context ctx;
|
||||
struct dentry *xadir;
|
||||
int count;
|
||||
int err;
|
||||
struct dentry *dentries[8];
|
||||
};
|
||||
|
||||
|
|
@ -206,6 +207,7 @@ fill_with_dentries(struct dir_context *ctx, const char *name, int namelen,
|
|||
|
||||
dentry = lookup_one_len(name, dbuf->xadir, namelen);
|
||||
if (IS_ERR(dentry)) {
|
||||
dbuf->err = PTR_ERR(dentry);
|
||||
return PTR_ERR(dentry);
|
||||
} else if (d_really_is_negative(dentry)) {
|
||||
/* A directory entry exists, but no file? */
|
||||
|
|
@ -214,6 +216,7 @@ fill_with_dentries(struct dir_context *ctx, const char *name, int namelen,
|
|||
"not found for file %pd.\n",
|
||||
dentry, dbuf->xadir);
|
||||
dput(dentry);
|
||||
dbuf->err = -EIO;
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
|
@ -261,6 +264,10 @@ static int reiserfs_for_each_xattr(struct inode *inode,
|
|||
err = reiserfs_readdir_inode(d_inode(dir), &buf.ctx);
|
||||
if (err)
|
||||
break;
|
||||
if (buf.err) {
|
||||
err = buf.err;
|
||||
break;
|
||||
}
|
||||
if (!buf.count)
|
||||
break;
|
||||
for (i = 0; !err && i < buf.count && buf.dentries[i]; i++) {
|
||||
|
|
|
|||
|
|
@ -154,6 +154,7 @@ void can_change_state(struct net_device *dev, struct can_frame *cf,
|
|||
|
||||
void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
|
||||
unsigned int idx);
|
||||
struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr);
|
||||
unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx);
|
||||
void can_free_echo_skb(struct net_device *dev, unsigned int idx);
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,8 @@ extern struct inodes_stat_t inodes_stat;
|
|||
extern int leases_enable, lease_break_time;
|
||||
extern int sysctl_protected_symlinks;
|
||||
extern int sysctl_protected_hardlinks;
|
||||
extern int sysctl_protected_fifos;
|
||||
extern int sysctl_protected_regular;
|
||||
|
||||
struct buffer_head;
|
||||
typedef int (get_block_t)(struct inode *inode, sector_t iblock,
|
||||
|
|
|
|||
|
|
@ -2,14 +2,14 @@
|
|||
#define __LINUX_KBUILD_H
|
||||
|
||||
#define DEFINE(sym, val) \
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
|
||||
asm volatile("\n.ascii \"->" #sym " %0 " #val "\"" : : "i" (val))
|
||||
|
||||
#define BLANK() asm volatile("\n->" : : )
|
||||
#define BLANK() asm volatile("\n.ascii \"->\"" : : )
|
||||
|
||||
#define OFFSET(sym, str, mem) \
|
||||
DEFINE(sym, offsetof(struct str, mem))
|
||||
|
||||
#define COMMENT(x) \
|
||||
asm volatile("\n->#" x)
|
||||
asm volatile("\n.ascii \"->#" x "\"")
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -125,13 +125,13 @@ extern void cleanup_module(void);
|
|||
|
||||
/* Each module must use one module_init(). */
|
||||
#define module_init(initfn) \
|
||||
static inline initcall_t __inittest(void) \
|
||||
static inline initcall_t __maybe_unused __inittest(void) \
|
||||
{ return initfn; } \
|
||||
int init_module(void) __attribute__((alias(#initfn)));
|
||||
|
||||
/* This is only required if you want to be unloadable. */
|
||||
#define module_exit(exitfn) \
|
||||
static inline exitcall_t __exittest(void) \
|
||||
static inline exitcall_t __maybe_unused __exittest(void) \
|
||||
{ return exitfn; } \
|
||||
void cleanup_module(void) __attribute__((alias(#exitfn)));
|
||||
|
||||
|
|
|
|||
|
|
@ -41,11 +41,11 @@ ip_set_init_comment(struct ip_set_comment *comment,
|
|||
rcu_assign_pointer(comment->c, c);
|
||||
}
|
||||
|
||||
/* Used only when dumping a set, protected by rcu_read_lock_bh() */
|
||||
/* Used only when dumping a set, protected by rcu_read_lock() */
|
||||
static inline int
|
||||
ip_set_put_comment(struct sk_buff *skb, struct ip_set_comment *comment)
|
||||
{
|
||||
struct ip_set_comment_rcu *c = rcu_dereference_bh(comment->c);
|
||||
struct ip_set_comment_rcu *c = rcu_dereference(comment->c);
|
||||
|
||||
if (!c)
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -265,6 +265,8 @@ extern struct device_node *of_get_next_child(const struct device_node *node,
|
|||
extern struct device_node *of_get_next_available_child(
|
||||
const struct device_node *node, struct device_node *prev);
|
||||
|
||||
extern struct device_node *of_get_compatible_child(const struct device_node *parent,
|
||||
const char *compatible);
|
||||
extern struct device_node *of_get_child_by_name(const struct device_node *node,
|
||||
const char *name);
|
||||
|
||||
|
|
@ -462,6 +464,12 @@ static inline bool of_have_populated_dt(void)
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline struct device_node *of_get_compatible_child(const struct device_node *parent,
|
||||
const char *compatible)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct device_node *of_get_child_by_name(
|
||||
const struct device_node *node,
|
||||
const char *name)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
#define __LINUX_UACCESS_H__
|
||||
|
||||
#include <linux/sched.h>
|
||||
|
||||
#define uaccess_kernel() segment_eq(get_fs(), KERNEL_DS)
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
static __always_inline void pagefault_disabled_inc(void)
|
||||
|
|
|
|||
|
|
@ -215,7 +215,7 @@ static char *kdb_read(char *buffer, size_t bufsize)
|
|||
int count;
|
||||
int i;
|
||||
int diag, dtab_count;
|
||||
int key;
|
||||
int key, buf_size, ret;
|
||||
|
||||
|
||||
diag = kdbgetintenv("DTABCOUNT", &dtab_count);
|
||||
|
|
@ -335,9 +335,8 @@ static char *kdb_read(char *buffer, size_t bufsize)
|
|||
else
|
||||
p_tmp = tmpbuffer;
|
||||
len = strlen(p_tmp);
|
||||
count = kallsyms_symbol_complete(p_tmp,
|
||||
sizeof(tmpbuffer) -
|
||||
(p_tmp - tmpbuffer));
|
||||
buf_size = sizeof(tmpbuffer) - (p_tmp - tmpbuffer);
|
||||
count = kallsyms_symbol_complete(p_tmp, buf_size);
|
||||
if (tab == 2 && count > 0) {
|
||||
kdb_printf("\n%d symbols are found.", count);
|
||||
if (count > dtab_count) {
|
||||
|
|
@ -349,9 +348,13 @@ static char *kdb_read(char *buffer, size_t bufsize)
|
|||
}
|
||||
kdb_printf("\n");
|
||||
for (i = 0; i < count; i++) {
|
||||
if (WARN_ON(!kallsyms_symbol_next(p_tmp, i)))
|
||||
ret = kallsyms_symbol_next(p_tmp, i, buf_size);
|
||||
if (WARN_ON(!ret))
|
||||
break;
|
||||
kdb_printf("%s ", p_tmp);
|
||||
if (ret != -E2BIG)
|
||||
kdb_printf("%s ", p_tmp);
|
||||
else
|
||||
kdb_printf("%s... ", p_tmp);
|
||||
*(p_tmp + len) = '\0';
|
||||
}
|
||||
if (i >= dtab_count)
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ typedef struct __ksymtab {
|
|||
unsigned long sym_start;
|
||||
unsigned long sym_end;
|
||||
} kdb_symtab_t;
|
||||
extern int kallsyms_symbol_next(char *prefix_name, int flag);
|
||||
extern int kallsyms_symbol_next(char *prefix_name, int flag, int buf_size);
|
||||
extern int kallsyms_symbol_complete(char *prefix_name, int max_len);
|
||||
|
||||
/* Exported Symbols for kernel loadable modules to use. */
|
||||
|
|
|
|||
|
|
@ -221,11 +221,13 @@ int kallsyms_symbol_complete(char *prefix_name, int max_len)
|
|||
* Parameters:
|
||||
* prefix_name prefix of a symbol name to lookup
|
||||
* flag 0 means search from the head, 1 means continue search.
|
||||
* buf_size maximum length that can be written to prefix_name
|
||||
* buffer
|
||||
* Returns:
|
||||
* 1 if a symbol matches the given prefix.
|
||||
* 0 if no string found
|
||||
*/
|
||||
int kallsyms_symbol_next(char *prefix_name, int flag)
|
||||
int kallsyms_symbol_next(char *prefix_name, int flag, int buf_size)
|
||||
{
|
||||
int prefix_len = strlen(prefix_name);
|
||||
static loff_t pos;
|
||||
|
|
@ -235,10 +237,8 @@ int kallsyms_symbol_next(char *prefix_name, int flag)
|
|||
pos = 0;
|
||||
|
||||
while ((name = kdb_walk_kallsyms(&pos))) {
|
||||
if (strncmp(name, prefix_name, prefix_len) == 0) {
|
||||
strncpy(prefix_name, name, strlen(name)+1);
|
||||
return 1;
|
||||
}
|
||||
if (!strncmp(name, prefix_name, prefix_len))
|
||||
return strscpy(prefix_name, name, buf_size);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3822,8 +3822,8 @@ static int __sched_setscheduler(struct task_struct *p,
|
|||
struct rq *rq;
|
||||
int reset_on_fork;
|
||||
|
||||
/* may grab non-irq protected spin_locks */
|
||||
BUG_ON(in_interrupt());
|
||||
/* The pi code expects interrupts enabled */
|
||||
BUG_ON(pi && in_interrupt());
|
||||
recheck:
|
||||
/* double check policy once rq lock held */
|
||||
if (policy < 0) {
|
||||
|
|
|
|||
|
|
@ -1715,6 +1715,24 @@ static struct ctl_table fs_table[] = {
|
|||
.extra1 = &zero,
|
||||
.extra2 = &one,
|
||||
},
|
||||
{
|
||||
.procname = "protected_fifos",
|
||||
.data = &sysctl_protected_fifos,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0600,
|
||||
.proc_handler = proc_dointvec_minmax,
|
||||
.extra1 = &zero,
|
||||
.extra2 = &two,
|
||||
},
|
||||
{
|
||||
.procname = "protected_regular",
|
||||
.data = &sysctl_protected_regular,
|
||||
.maxlen = sizeof(int),
|
||||
.mode = 0600,
|
||||
.proc_handler = proc_dointvec_minmax,
|
||||
.extra1 = &zero,
|
||||
.extra2 = &two,
|
||||
},
|
||||
{
|
||||
.procname = "suid_dumpable",
|
||||
.data = &suid_dumpable,
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ ifeq ($(ARCH),arm)
|
|||
CFLAGS += -I../../../arch/arm/include -mfpu=neon
|
||||
HAS_NEON = yes
|
||||
endif
|
||||
ifeq ($(ARCH),arm64)
|
||||
ifeq ($(ARCH),aarch64)
|
||||
CFLAGS += -I../../../arch/arm64/include
|
||||
HAS_NEON = yes
|
||||
endif
|
||||
|
|
@ -37,7 +37,7 @@ ifeq ($(IS_X86),yes)
|
|||
gcc -c -x assembler - >&/dev/null && \
|
||||
rm ./-.o && echo -DCONFIG_AS_AVX2=1)
|
||||
else ifeq ($(HAS_NEON),yes)
|
||||
OBJS += neon.o neon1.o neon2.o neon4.o neon8.o
|
||||
OBJS += neon.o neon1.o neon2.o neon4.o neon8.o recov_neon.o recov_neon_inner.o
|
||||
CFLAGS += -DCONFIG_KERNEL_MODE_NEON=1
|
||||
else
|
||||
HAS_ALTIVEC := $(shell printf '\#include <altivec.h>\nvector int a;\n' |\
|
||||
|
|
|
|||
|
|
@ -1818,9 +1818,7 @@ static loff_t shmem_file_llseek(struct file *file, loff_t offset, int whence)
|
|||
mutex_lock(&inode->i_mutex);
|
||||
/* We're holding i_mutex so we can access i_size directly */
|
||||
|
||||
if (offset < 0)
|
||||
offset = -EINVAL;
|
||||
else if (offset >= inode->i_size)
|
||||
if (offset < 0 || offset >= inode->i_size)
|
||||
offset = -ENXIO;
|
||||
else {
|
||||
start = offset >> PAGE_CACHE_SHIFT;
|
||||
|
|
|
|||
|
|
@ -4481,6 +4481,10 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb)
|
|||
skb->vlan_tci = 0;
|
||||
skb->dev = napi->dev;
|
||||
skb->skb_iif = 0;
|
||||
|
||||
/* eth_type_trans() assumes pkt_type is PACKET_HOST */
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
|
||||
skb->encapsulation = 0;
|
||||
skb_shinfo(skb)->gso_type = 0;
|
||||
skb->truesize = SKB_TRUESIZE(skb_end_offset(skb));
|
||||
|
|
|
|||
|
|
@ -480,8 +480,8 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
|
|||
break;
|
||||
}
|
||||
|
||||
if (dissector_uses_key(flow_dissector,
|
||||
FLOW_DISSECTOR_KEY_PORTS)) {
|
||||
if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS) &&
|
||||
!(key_control->flags & FLOW_DIS_IS_FRAGMENT)) {
|
||||
key_ports = skb_flow_dissector_target(flow_dissector,
|
||||
FLOW_DISSECTOR_KEY_PORTS,
|
||||
target_container);
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ int iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
|
|||
|
||||
iph->version = 4;
|
||||
iph->ihl = sizeof(struct iphdr) >> 2;
|
||||
iph->frag_off = df;
|
||||
iph->frag_off = ip_mtu_locked(&rt->dst) ? 0 : df;
|
||||
iph->protocol = proto;
|
||||
iph->tos = tos;
|
||||
iph->daddr = dst;
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user