Add upstream patches and re-add Orangepi3 to u-boot
This commit is contained in:
parent
d256411e2d
commit
7f44207062
@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm 5.4.130 Kernel Configuration
|
||||
# Linux/arm 5.4.138 Kernel Configuration
|
||||
#
|
||||
|
||||
#
|
||||
@ -488,7 +488,6 @@ CONFIG_SECCOMP=y
|
||||
# CONFIG_PARAVIRT is not set
|
||||
# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
|
||||
# CONFIG_XEN is not set
|
||||
CONFIG_STACKPROTECTOR_PER_TASK=y
|
||||
# end of Kernel Features
|
||||
|
||||
#
|
||||
@ -711,12 +710,8 @@ CONFIG_REFCOUNT_FULL=y
|
||||
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
|
||||
# end of GCOV-based kernel profiling
|
||||
|
||||
CONFIG_PLUGIN_HOSTCC="g++"
|
||||
CONFIG_PLUGIN_HOSTCC=""
|
||||
CONFIG_HAVE_GCC_PLUGINS=y
|
||||
CONFIG_GCC_PLUGINS=y
|
||||
# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set
|
||||
# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set
|
||||
CONFIG_GCC_PLUGIN_ARM_SSP_PER_TASK=y
|
||||
# end of General architecture-dependent options
|
||||
|
||||
CONFIG_RT_MUTEXES=y
|
||||
@ -2604,7 +2599,6 @@ CONFIG_TOUCHSCREEN_SIS_I2C=m
|
||||
# CONFIG_TOUCHSCREEN_SUR40 is not set
|
||||
CONFIG_TOUCHSCREEN_SURFACE3_SPI=m
|
||||
# CONFIG_TOUCHSCREEN_SX8654 is not set
|
||||
CONFIG_TOUCHSCREEN_SX865X=m
|
||||
# CONFIG_TOUCHSCREEN_TPS6507X is not set
|
||||
# CONFIG_TOUCHSCREEN_ZET6223 is not set
|
||||
# CONFIG_TOUCHSCREEN_ZFORCE is not set
|
||||
@ -3060,6 +3054,7 @@ CONFIG_CHARGER_LT3651=m
|
||||
# CONFIG_CHARGER_SMB347 is not set
|
||||
# CONFIG_CHARGER_TPS65090 is not set
|
||||
# CONFIG_BATTERY_GAUGE_LTC2941 is not set
|
||||
CONFIG_BATTERY_RT5033=m
|
||||
# CONFIG_CHARGER_RT9455 is not set
|
||||
CONFIG_CHARGER_CROS_USBPD=m
|
||||
CONFIG_CHARGER_UCS1002=m
|
||||
@ -4170,28 +4165,6 @@ CONFIG_DRM_ANALOGIX_DP=y
|
||||
# CONFIG_DRM_LEGACY is not set
|
||||
CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y
|
||||
|
||||
#
|
||||
# ARM GPU Configuration
|
||||
#
|
||||
CONFIG_MALI_MIDGARD=y
|
||||
CONFIG_MALI_GATOR_SUPPORT=y
|
||||
# CONFIG_MALI_MIDGARD_ENABLE_TRACE is not set
|
||||
CONFIG_MALI_DEVFREQ=y
|
||||
# CONFIG_MALI_DMA_FENCE is not set
|
||||
CONFIG_MALI_PLATFORM_NAME="devicetree"
|
||||
CONFIG_MALI_EXPERT=y
|
||||
# CONFIG_MALI_CORESTACK is not set
|
||||
# CONFIG_MALI_PRFCNT_SET_SECONDARY is not set
|
||||
# CONFIG_MALI_DEBUG is not set
|
||||
# CONFIG_MALI_FENCE_DEBUG is not set
|
||||
# CONFIG_MALI_NO_MALI is not set
|
||||
# CONFIG_MALI_TRACE_TIMELINE is not set
|
||||
# CONFIG_MALI_SYSTEM_TRACE is not set
|
||||
# CONFIG_MALI_2MB_ALLOC is not set
|
||||
# CONFIG_MALI_PWRSOFT_765 is not set
|
||||
CONFIG_MALI_KUTF=m
|
||||
# end of ARM GPU Configuration
|
||||
|
||||
#
|
||||
# Frame buffer Devices
|
||||
#
|
||||
@ -6503,9 +6476,6 @@ CONFIG_LSM="lockdown,yama,integrity,apparmor"
|
||||
# Memory initialization
|
||||
#
|
||||
CONFIG_INIT_STACK_NONE=y
|
||||
# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set
|
||||
# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set
|
||||
# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set
|
||||
CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
|
||||
# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
|
||||
# end of Memory initialization
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm 5.10.52 Kernel Configuration
|
||||
# Linux/arm 5.10.56 Kernel Configuration
|
||||
#
|
||||
CONFIG_CC_VERSION_TEXT="arm-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) 8.3.0"
|
||||
CONFIG_CC_IS_GCC=y
|
||||
@ -524,6 +524,7 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
|
||||
CONFIG_CPUFREQ_DT=m
|
||||
CONFIG_CPUFREQ_DT_PLATDEV=y
|
||||
CONFIG_ARM_ALLWINNER_SUN50I_CPUFREQ_NVMEM=m
|
||||
CONFIG_ARM_SCMI_CPUFREQ=m
|
||||
# end of CPU Frequency scaling
|
||||
|
||||
#
|
||||
@ -541,6 +542,7 @@ CONFIG_DT_IDLE_STATES=y
|
||||
#
|
||||
CONFIG_ARM_CPUIDLE=y
|
||||
CONFIG_ARM_PSCI_CPUIDLE=y
|
||||
CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y
|
||||
# CONFIG_ARM_HIGHBANK_CPUIDLE is not set
|
||||
# end of ARM CPU Idle Drivers
|
||||
# end of CPU Idle
|
||||
@ -574,7 +576,10 @@ CONFIG_PM=y
|
||||
# CONFIG_PM_DEBUG is not set
|
||||
# CONFIG_APM_EMULATION is not set
|
||||
CONFIG_PM_CLK=y
|
||||
CONFIG_PM_GENERIC_DOMAINS=y
|
||||
# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set
|
||||
CONFIG_PM_GENERIC_DOMAINS_SLEEP=y
|
||||
CONFIG_PM_GENERIC_DOMAINS_OF=y
|
||||
CONFIG_CPU_PM=y
|
||||
# CONFIG_ENERGY_MODEL is not set
|
||||
CONFIG_ARCH_SUSPEND_POSSIBLE=y
|
||||
@ -585,6 +590,8 @@ CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
#
|
||||
# Firmware Drivers
|
||||
#
|
||||
CONFIG_ARM_SCMI_PROTOCOL=m
|
||||
CONFIG_ARM_SCMI_POWER_DOMAIN=m
|
||||
# CONFIG_FIRMWARE_MEMMAP is not set
|
||||
CONFIG_FW_CFG_SYSFS=m
|
||||
# CONFIG_FW_CFG_SYSFS_CMDLINE is not set
|
||||
@ -3400,6 +3407,7 @@ CONFIG_SENSORS_ADT7475=m
|
||||
CONFIG_SENSORS_AS370=m
|
||||
CONFIG_SENSORS_ASC7621=m
|
||||
CONFIG_SENSORS_AXI_FAN_CONTROL=m
|
||||
CONFIG_SENSORS_ARM_SCMI=m
|
||||
# CONFIG_SENSORS_ASPEED is not set
|
||||
CONFIG_SENSORS_ATXP1=m
|
||||
# CONFIG_SENSORS_CORSAIR_CPRO is not set
|
||||
@ -6072,6 +6080,7 @@ CONFIG_CLKDEV_LOOKUP=y
|
||||
CONFIG_HAVE_CLK_PREPARE=y
|
||||
CONFIG_COMMON_CLK=y
|
||||
CONFIG_COMMON_CLK_MAX9485=m
|
||||
CONFIG_COMMON_CLK_SCMI=m
|
||||
# CONFIG_COMMON_CLK_SI5341 is not set
|
||||
# CONFIG_COMMON_CLK_SI5351 is not set
|
||||
# CONFIG_COMMON_CLK_SI514 is not set
|
||||
@ -6737,6 +6746,7 @@ CONFIG_MADERA_IRQ=m
|
||||
# CONFIG_IPACK_BUS is not set
|
||||
CONFIG_ARCH_HAS_RESET_CONTROLLER=y
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
CONFIG_RESET_SCMI=m
|
||||
CONFIG_RESET_SIMPLE=y
|
||||
CONFIG_RESET_SUNXI=y
|
||||
# CONFIG_RESET_TI_SYSCON is not set
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm64 5.10.48 Kernel Configuration
|
||||
# Linux/arm64 5.10.56 Kernel Configuration
|
||||
#
|
||||
CONFIG_CC_VERSION_TEXT="aarch64-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) 8.3.0"
|
||||
CONFIG_CC_IS_GCC=y
|
||||
@ -677,9 +677,6 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
|
||||
# end of GCOV-based kernel profiling
|
||||
|
||||
CONFIG_HAVE_GCC_PLUGINS=y
|
||||
CONFIG_GCC_PLUGINS=y
|
||||
# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set
|
||||
# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set
|
||||
# end of General architecture-dependent options
|
||||
|
||||
CONFIG_RT_MUTEXES=y
|
||||
@ -3374,6 +3371,7 @@ CONFIG_CHARGER_MAX77650=m
|
||||
# CONFIG_CHARGER_BQ25980 is not set
|
||||
# CONFIG_CHARGER_SMB347 is not set
|
||||
# CONFIG_BATTERY_GAUGE_LTC2941 is not set
|
||||
CONFIG_BATTERY_RT5033=m
|
||||
# CONFIG_CHARGER_RT9455 is not set
|
||||
CONFIG_CHARGER_UCS1002=m
|
||||
# CONFIG_CHARGER_BD99954 is not set
|
||||
@ -6578,8 +6576,6 @@ CONFIG_PARTITION_PERCPU=y
|
||||
# CONFIG_IPACK_BUS is not set
|
||||
CONFIG_ARCH_HAS_RESET_CONTROLLER=y
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
# CONFIG_RESET_BRCMSTB_RESCAL is not set
|
||||
# CONFIG_RESET_INTEL_GW is not set
|
||||
CONFIG_RESET_SCMI=y
|
||||
CONFIG_RESET_SIMPLE=y
|
||||
CONFIG_RESET_SUNXI=y
|
||||
@ -6894,7 +6890,6 @@ CONFIG_PSTORE_COMPRESS_DEFAULT="deflate"
|
||||
# CONFIG_PSTORE_CONSOLE is not set
|
||||
# CONFIG_PSTORE_PMSG is not set
|
||||
CONFIG_PSTORE_RAM=m
|
||||
# CONFIG_PSTORE_BLK is not set
|
||||
CONFIG_SYSV_FS=m
|
||||
CONFIG_UFS_FS=m
|
||||
# CONFIG_UFS_FS_WRITE is not set
|
||||
@ -7152,10 +7147,6 @@ CONFIG_LSM="lockdown,yama,integrity,apparmor"
|
||||
# Memory initialization
|
||||
#
|
||||
CONFIG_INIT_STACK_NONE=y
|
||||
# CONFIG_GCC_PLUGIN_STRUCTLEAK_USER is not set
|
||||
# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF is not set
|
||||
# CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL is not set
|
||||
# CONFIG_GCC_PLUGIN_STACKLEAK is not set
|
||||
# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set
|
||||
# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set
|
||||
# end of Memory initialization
|
||||
|
||||
692
patch/kernel/archive/odroidxu4-5.4/patch-5.4.136-137.patch
Normal file
692
patch/kernel/archive/odroidxu4-5.4/patch-5.4.136-137.patch
Normal file
@ -0,0 +1,692 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 1c565572bfb24..7cd8862d854ed 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
-SUBLEVEL = 136
|
||||
+SUBLEVEL = 137
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
diff --git a/arch/arm/boot/dts/versatile-ab.dts b/arch/arm/boot/dts/versatile-ab.dts
|
||||
index 37bd41ff8dffa..151c0220047dd 100644
|
||||
--- a/arch/arm/boot/dts/versatile-ab.dts
|
||||
+++ b/arch/arm/boot/dts/versatile-ab.dts
|
||||
@@ -195,16 +195,15 @@
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
- vic: intc@10140000 {
|
||||
+ vic: interrupt-controller@10140000 {
|
||||
compatible = "arm,versatile-vic";
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
reg = <0x10140000 0x1000>;
|
||||
- clear-mask = <0xffffffff>;
|
||||
valid-mask = <0xffffffff>;
|
||||
};
|
||||
|
||||
- sic: intc@10003000 {
|
||||
+ sic: interrupt-controller@10003000 {
|
||||
compatible = "arm,versatile-sic";
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
diff --git a/arch/arm/boot/dts/versatile-pb.dts b/arch/arm/boot/dts/versatile-pb.dts
|
||||
index 06a0fdf24026c..e7e751a858d81 100644
|
||||
--- a/arch/arm/boot/dts/versatile-pb.dts
|
||||
+++ b/arch/arm/boot/dts/versatile-pb.dts
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
amba {
|
||||
/* The Versatile PB is using more SIC IRQ lines than the AB */
|
||||
- sic: intc@10003000 {
|
||||
+ sic: interrupt-controller@10003000 {
|
||||
clear-mask = <0xffffffff>;
|
||||
/*
|
||||
* Valid interrupt lines mask according to
|
||||
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
||||
index 377157656a8b6..5d35b9656b67d 100644
|
||||
--- a/arch/x86/kvm/x86.c
|
||||
+++ b/arch/x86/kvm/x86.c
|
||||
@@ -475,8 +475,6 @@ static void kvm_multiple_exception(struct kvm_vcpu *vcpu,
|
||||
|
||||
if (!vcpu->arch.exception.pending && !vcpu->arch.exception.injected) {
|
||||
queue:
|
||||
- if (has_error && !is_protmode(vcpu))
|
||||
- has_error = false;
|
||||
if (reinject) {
|
||||
/*
|
||||
* On vmentry, vcpu->arch.exception.pending is only
|
||||
@@ -7592,6 +7590,13 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu)
|
||||
kvm_x86_ops->update_cr8_intercept(vcpu, tpr, max_irr);
|
||||
}
|
||||
|
||||
+static void kvm_inject_exception(struct kvm_vcpu *vcpu)
|
||||
+{
|
||||
+ if (vcpu->arch.exception.error_code && !is_protmode(vcpu))
|
||||
+ vcpu->arch.exception.error_code = false;
|
||||
+ kvm_x86_ops->queue_exception(vcpu);
|
||||
+}
|
||||
+
|
||||
static int inject_pending_event(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
int r;
|
||||
@@ -7599,7 +7604,7 @@ static int inject_pending_event(struct kvm_vcpu *vcpu)
|
||||
/* try to reinject previous events if any */
|
||||
|
||||
if (vcpu->arch.exception.injected)
|
||||
- kvm_x86_ops->queue_exception(vcpu);
|
||||
+ kvm_inject_exception(vcpu);
|
||||
/*
|
||||
* Do not inject an NMI or interrupt if there is a pending
|
||||
* exception. Exceptions and interrupts are recognized at
|
||||
@@ -7665,7 +7670,7 @@ static int inject_pending_event(struct kvm_vcpu *vcpu)
|
||||
}
|
||||
}
|
||||
|
||||
- kvm_x86_ops->queue_exception(vcpu);
|
||||
+ kvm_inject_exception(vcpu);
|
||||
}
|
||||
|
||||
/* Don't consider new event if we re-injected an event */
|
||||
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
|
||||
index 7b6903bad4085..48e6e2b489241 100644
|
||||
--- a/drivers/firmware/arm_scmi/driver.c
|
||||
+++ b/drivers/firmware/arm_scmi/driver.c
|
||||
@@ -54,7 +54,6 @@ enum scmi_error_codes {
|
||||
SCMI_ERR_GENERIC = -8, /* Generic Error */
|
||||
SCMI_ERR_HARDWARE = -9, /* Hardware Error */
|
||||
SCMI_ERR_PROTOCOL = -10,/* Protocol Error */
|
||||
- SCMI_ERR_MAX
|
||||
};
|
||||
|
||||
/* List of all SCMI devices active in system */
|
||||
@@ -176,8 +175,10 @@ static const int scmi_linux_errmap[] = {
|
||||
|
||||
static inline int scmi_to_linux_errno(int errno)
|
||||
{
|
||||
- if (errno < SCMI_SUCCESS && errno > SCMI_ERR_MAX)
|
||||
- return scmi_linux_errmap[-errno];
|
||||
+ int err_idx = -errno;
|
||||
+
|
||||
+ if (err_idx >= SCMI_SUCCESS && err_idx < ARRAY_SIZE(scmi_linux_errmap))
|
||||
+ return scmi_linux_errmap[err_idx];
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -693,8 +694,9 @@ static int scmi_xfer_info_init(struct scmi_info *sinfo)
|
||||
struct scmi_xfers_info *info = &sinfo->tx_minfo;
|
||||
|
||||
/* Pre-allocated messages, no more than what hdr.seq can support */
|
||||
- if (WARN_ON(desc->max_msg >= MSG_TOKEN_MAX)) {
|
||||
- dev_err(dev, "Maximum message of %d exceeds supported %ld\n",
|
||||
+ if (WARN_ON(!desc->max_msg || desc->max_msg > MSG_TOKEN_MAX)) {
|
||||
+ dev_err(dev,
|
||||
+ "Invalid maximum messages %d, not in range [1 - %lu]\n",
|
||||
desc->max_msg, MSG_TOKEN_MAX);
|
||||
return -EINVAL;
|
||||
}
|
||||
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
|
||||
index bf6b4f71dc58f..defee1d208d22 100644
|
||||
--- a/fs/cifs/smb2ops.c
|
||||
+++ b/fs/cifs/smb2ops.c
|
||||
@@ -498,8 +498,8 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf,
|
||||
p = buf;
|
||||
while (bytes_left >= sizeof(*p)) {
|
||||
info->speed = le64_to_cpu(p->LinkSpeed);
|
||||
- info->rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE);
|
||||
- info->rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE);
|
||||
+ info->rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE) ? 1 : 0;
|
||||
+ info->rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE) ? 1 : 0;
|
||||
|
||||
cifs_dbg(FYI, "%s: adding iface %zu\n", __func__, *iface_count);
|
||||
cifs_dbg(FYI, "%s: speed %zu bps\n", __func__, info->speed);
|
||||
diff --git a/fs/hfs/bfind.c b/fs/hfs/bfind.c
|
||||
index 4af318fbda774..ef9498a6e88ac 100644
|
||||
--- a/fs/hfs/bfind.c
|
||||
+++ b/fs/hfs/bfind.c
|
||||
@@ -25,7 +25,19 @@ int hfs_find_init(struct hfs_btree *tree, struct hfs_find_data *fd)
|
||||
fd->key = ptr + tree->max_key_len + 2;
|
||||
hfs_dbg(BNODE_REFS, "find_init: %d (%p)\n",
|
||||
tree->cnid, __builtin_return_address(0));
|
||||
- mutex_lock(&tree->tree_lock);
|
||||
+ switch (tree->cnid) {
|
||||
+ case HFS_CAT_CNID:
|
||||
+ mutex_lock_nested(&tree->tree_lock, CATALOG_BTREE_MUTEX);
|
||||
+ break;
|
||||
+ case HFS_EXT_CNID:
|
||||
+ mutex_lock_nested(&tree->tree_lock, EXTENTS_BTREE_MUTEX);
|
||||
+ break;
|
||||
+ case HFS_ATTR_CNID:
|
||||
+ mutex_lock_nested(&tree->tree_lock, ATTR_BTREE_MUTEX);
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/fs/hfs/bnode.c b/fs/hfs/bnode.c
|
||||
index b63a4df7327b6..c0a73a6ffb28b 100644
|
||||
--- a/fs/hfs/bnode.c
|
||||
+++ b/fs/hfs/bnode.c
|
||||
@@ -15,16 +15,31 @@
|
||||
|
||||
#include "btree.h"
|
||||
|
||||
-void hfs_bnode_read(struct hfs_bnode *node, void *buf,
|
||||
- int off, int len)
|
||||
+void hfs_bnode_read(struct hfs_bnode *node, void *buf, int off, int len)
|
||||
{
|
||||
struct page *page;
|
||||
+ int pagenum;
|
||||
+ int bytes_read;
|
||||
+ int bytes_to_read;
|
||||
+ void *vaddr;
|
||||
|
||||
off += node->page_offset;
|
||||
- page = node->page[0];
|
||||
+ pagenum = off >> PAGE_SHIFT;
|
||||
+ off &= ~PAGE_MASK; /* compute page offset for the first page */
|
||||
|
||||
- memcpy(buf, kmap(page) + off, len);
|
||||
- kunmap(page);
|
||||
+ for (bytes_read = 0; bytes_read < len; bytes_read += bytes_to_read) {
|
||||
+ if (pagenum >= node->tree->pages_per_bnode)
|
||||
+ break;
|
||||
+ page = node->page[pagenum];
|
||||
+ bytes_to_read = min_t(int, len - bytes_read, PAGE_SIZE - off);
|
||||
+
|
||||
+ vaddr = kmap_atomic(page);
|
||||
+ memcpy(buf + bytes_read, vaddr + off, bytes_to_read);
|
||||
+ kunmap_atomic(vaddr);
|
||||
+
|
||||
+ pagenum++;
|
||||
+ off = 0; /* page offset only applies to the first page */
|
||||
+ }
|
||||
}
|
||||
|
||||
u16 hfs_bnode_read_u16(struct hfs_bnode *node, int off)
|
||||
diff --git a/fs/hfs/btree.h b/fs/hfs/btree.h
|
||||
index dcc2aab1b2c43..25ac9a8bb57a7 100644
|
||||
--- a/fs/hfs/btree.h
|
||||
+++ b/fs/hfs/btree.h
|
||||
@@ -13,6 +13,13 @@ typedef int (*btree_keycmp)(const btree_key *, const btree_key *);
|
||||
|
||||
#define NODE_HASH_SIZE 256
|
||||
|
||||
+/* B-tree mutex nested subclasses */
|
||||
+enum hfs_btree_mutex_classes {
|
||||
+ CATALOG_BTREE_MUTEX,
|
||||
+ EXTENTS_BTREE_MUTEX,
|
||||
+ ATTR_BTREE_MUTEX,
|
||||
+};
|
||||
+
|
||||
/* A HFS BTree held in memory */
|
||||
struct hfs_btree {
|
||||
struct super_block *sb;
|
||||
diff --git a/fs/hfs/super.c b/fs/hfs/super.c
|
||||
index c33324686d89e..bcf820ce0e02e 100644
|
||||
--- a/fs/hfs/super.c
|
||||
+++ b/fs/hfs/super.c
|
||||
@@ -421,14 +421,12 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
if (!res) {
|
||||
if (fd.entrylength > sizeof(rec) || fd.entrylength < 0) {
|
||||
res = -EIO;
|
||||
- goto bail;
|
||||
+ goto bail_hfs_find;
|
||||
}
|
||||
hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength);
|
||||
}
|
||||
- if (res) {
|
||||
- hfs_find_exit(&fd);
|
||||
- goto bail_no_root;
|
||||
- }
|
||||
+ if (res)
|
||||
+ goto bail_hfs_find;
|
||||
res = -EINVAL;
|
||||
root_inode = hfs_iget(sb, &fd.search_key->cat, &rec);
|
||||
hfs_find_exit(&fd);
|
||||
@@ -444,6 +442,8 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
/* everything's okay */
|
||||
return 0;
|
||||
|
||||
+bail_hfs_find:
|
||||
+ hfs_find_exit(&fd);
|
||||
bail_no_root:
|
||||
pr_err("get root inode failed\n");
|
||||
bail:
|
||||
diff --git a/fs/internal.h b/fs/internal.h
|
||||
index 7651e8b8ef136..61aed95f83d1e 100644
|
||||
--- a/fs/internal.h
|
||||
+++ b/fs/internal.h
|
||||
@@ -52,7 +52,6 @@ extern void __init chrdev_init(void);
|
||||
*/
|
||||
extern const struct fs_context_operations legacy_fs_context_ops;
|
||||
extern int parse_monolithic_mount_data(struct fs_context *, void *);
|
||||
-extern void fc_drop_locked(struct fs_context *);
|
||||
extern void vfs_clean_context(struct fs_context *fc);
|
||||
extern int finish_clean_context(struct fs_context *fc);
|
||||
|
||||
diff --git a/fs/iomap/seek.c b/fs/iomap/seek.c
|
||||
index c04bad4b2b43f..10c4c1e80124f 100644
|
||||
--- a/fs/iomap/seek.c
|
||||
+++ b/fs/iomap/seek.c
|
||||
@@ -140,23 +140,20 @@ loff_t
|
||||
iomap_seek_hole(struct inode *inode, loff_t offset, const struct iomap_ops *ops)
|
||||
{
|
||||
loff_t size = i_size_read(inode);
|
||||
- loff_t length = size - offset;
|
||||
loff_t ret;
|
||||
|
||||
/* Nothing to be found before or beyond the end of the file. */
|
||||
if (offset < 0 || offset >= size)
|
||||
return -ENXIO;
|
||||
|
||||
- while (length > 0) {
|
||||
- ret = iomap_apply(inode, offset, length, IOMAP_REPORT, ops,
|
||||
- &offset, iomap_seek_hole_actor);
|
||||
+ while (offset < size) {
|
||||
+ ret = iomap_apply(inode, offset, size - offset, IOMAP_REPORT,
|
||||
+ ops, &offset, iomap_seek_hole_actor);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret == 0)
|
||||
break;
|
||||
-
|
||||
offset += ret;
|
||||
- length -= ret;
|
||||
}
|
||||
|
||||
return offset;
|
||||
@@ -186,27 +183,23 @@ loff_t
|
||||
iomap_seek_data(struct inode *inode, loff_t offset, const struct iomap_ops *ops)
|
||||
{
|
||||
loff_t size = i_size_read(inode);
|
||||
- loff_t length = size - offset;
|
||||
loff_t ret;
|
||||
|
||||
/* Nothing to be found before or beyond the end of the file. */
|
||||
if (offset < 0 || offset >= size)
|
||||
return -ENXIO;
|
||||
|
||||
- while (length > 0) {
|
||||
- ret = iomap_apply(inode, offset, length, IOMAP_REPORT, ops,
|
||||
- &offset, iomap_seek_data_actor);
|
||||
+ while (offset < size) {
|
||||
+ ret = iomap_apply(inode, offset, size - offset, IOMAP_REPORT,
|
||||
+ ops, &offset, iomap_seek_data_actor);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret == 0)
|
||||
- break;
|
||||
-
|
||||
+ return offset;
|
||||
offset += ret;
|
||||
- length -= ret;
|
||||
}
|
||||
|
||||
- if (length <= 0)
|
||||
- return -ENXIO;
|
||||
- return offset;
|
||||
+ /* We've reached the end of the file without finding data */
|
||||
+ return -ENXIO;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iomap_seek_data);
|
||||
diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h
|
||||
index e5c14e2c53d35..ba8a58754340d 100644
|
||||
--- a/include/linux/fs_context.h
|
||||
+++ b/include/linux/fs_context.h
|
||||
@@ -134,6 +134,7 @@ extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
|
||||
extern int generic_parse_monolithic(struct fs_context *fc, void *data);
|
||||
extern int vfs_get_tree(struct fs_context *fc);
|
||||
extern void put_fs_context(struct fs_context *fc);
|
||||
+extern void fc_drop_locked(struct fs_context *fc);
|
||||
|
||||
/*
|
||||
* sget() wrappers to be called from the ->get_tree() op.
|
||||
diff --git a/include/net/busy_poll.h b/include/net/busy_poll.h
|
||||
index 86e028388badc..9899b9af7f22f 100644
|
||||
--- a/include/net/busy_poll.h
|
||||
+++ b/include/net/busy_poll.h
|
||||
@@ -36,7 +36,7 @@ static inline bool net_busy_loop_on(void)
|
||||
|
||||
static inline bool sk_can_busy_loop(const struct sock *sk)
|
||||
{
|
||||
- return sk->sk_ll_usec && !signal_pending(current);
|
||||
+ return READ_ONCE(sk->sk_ll_usec) && !signal_pending(current);
|
||||
}
|
||||
|
||||
bool sk_busy_loop_end(void *p, unsigned long start_time);
|
||||
diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h
|
||||
index 06e1deeef4640..8c6b04f9f6cbe 100644
|
||||
--- a/include/net/sctp/constants.h
|
||||
+++ b/include/net/sctp/constants.h
|
||||
@@ -328,8 +328,7 @@ enum {
|
||||
#define SCTP_SCOPE_POLICY_MAX SCTP_SCOPE_POLICY_LINK
|
||||
|
||||
/* Based on IPv4 scoping <draft-stewart-tsvwg-sctp-ipv4-00.txt>,
|
||||
- * SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 198.18.0.0/24,
|
||||
- * 192.88.99.0/24.
|
||||
+ * SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 192.88.99.0/24.
|
||||
* Also, RFC 8.4, non-unicast addresses are not considered valid SCTP
|
||||
* addresses.
|
||||
*/
|
||||
@@ -337,7 +336,6 @@ enum {
|
||||
((htonl(INADDR_BROADCAST) == a) || \
|
||||
ipv4_is_multicast(a) || \
|
||||
ipv4_is_zeronet(a) || \
|
||||
- ipv4_is_test_198(a) || \
|
||||
ipv4_is_anycast_6to4(a))
|
||||
|
||||
/* Flags used for the bind address copy functions. */
|
||||
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
|
||||
index 9329f725d22b6..2d0ef613ca070 100644
|
||||
--- a/kernel/cgroup/cgroup-v1.c
|
||||
+++ b/kernel/cgroup/cgroup-v1.c
|
||||
@@ -1228,9 +1228,7 @@ int cgroup1_get_tree(struct fs_context *fc)
|
||||
ret = cgroup_do_get_tree(fc);
|
||||
|
||||
if (!ret && percpu_ref_is_dying(&ctx->root->cgrp.self.refcnt)) {
|
||||
- struct super_block *sb = fc->root->d_sb;
|
||||
- dput(fc->root);
|
||||
- deactivate_locked_super(sb);
|
||||
+ fc_drop_locked(fc);
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
|
||||
index 8f41499d8257d..6aeb53b4e19f8 100644
|
||||
--- a/kernel/workqueue.c
|
||||
+++ b/kernel/workqueue.c
|
||||
@@ -3660,15 +3660,21 @@ static void pwq_unbound_release_workfn(struct work_struct *work)
|
||||
unbound_release_work);
|
||||
struct workqueue_struct *wq = pwq->wq;
|
||||
struct worker_pool *pool = pwq->pool;
|
||||
- bool is_last;
|
||||
+ bool is_last = false;
|
||||
|
||||
- if (WARN_ON_ONCE(!(wq->flags & WQ_UNBOUND)))
|
||||
- return;
|
||||
+ /*
|
||||
+ * when @pwq is not linked, it doesn't hold any reference to the
|
||||
+ * @wq, and @wq is invalid to access.
|
||||
+ */
|
||||
+ if (!list_empty(&pwq->pwqs_node)) {
|
||||
+ if (WARN_ON_ONCE(!(wq->flags & WQ_UNBOUND)))
|
||||
+ return;
|
||||
|
||||
- mutex_lock(&wq->mutex);
|
||||
- list_del_rcu(&pwq->pwqs_node);
|
||||
- is_last = list_empty(&wq->pwqs);
|
||||
- mutex_unlock(&wq->mutex);
|
||||
+ mutex_lock(&wq->mutex);
|
||||
+ list_del_rcu(&pwq->pwqs_node);
|
||||
+ is_last = list_empty(&wq->pwqs);
|
||||
+ mutex_unlock(&wq->mutex);
|
||||
+ }
|
||||
|
||||
mutex_lock(&wq_pool_mutex);
|
||||
put_unbound_pool(pool);
|
||||
diff --git a/net/802/garp.c b/net/802/garp.c
|
||||
index 400bd857e5f57..f6012f8e59f00 100644
|
||||
--- a/net/802/garp.c
|
||||
+++ b/net/802/garp.c
|
||||
@@ -203,6 +203,19 @@ static void garp_attr_destroy(struct garp_applicant *app, struct garp_attr *attr
|
||||
kfree(attr);
|
||||
}
|
||||
|
||||
+static void garp_attr_destroy_all(struct garp_applicant *app)
|
||||
+{
|
||||
+ struct rb_node *node, *next;
|
||||
+ struct garp_attr *attr;
|
||||
+
|
||||
+ for (node = rb_first(&app->gid);
|
||||
+ next = node ? rb_next(node) : NULL, node != NULL;
|
||||
+ node = next) {
|
||||
+ attr = rb_entry(node, struct garp_attr, node);
|
||||
+ garp_attr_destroy(app, attr);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int garp_pdu_init(struct garp_applicant *app)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
@@ -609,6 +622,7 @@ void garp_uninit_applicant(struct net_device *dev, struct garp_application *appl
|
||||
|
||||
spin_lock_bh(&app->lock);
|
||||
garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU);
|
||||
+ garp_attr_destroy_all(app);
|
||||
garp_pdu_queue(app);
|
||||
spin_unlock_bh(&app->lock);
|
||||
|
||||
diff --git a/net/802/mrp.c b/net/802/mrp.c
|
||||
index 2cfdfbfbb2edb..5b804dbe2d08f 100644
|
||||
--- a/net/802/mrp.c
|
||||
+++ b/net/802/mrp.c
|
||||
@@ -292,6 +292,19 @@ static void mrp_attr_destroy(struct mrp_applicant *app, struct mrp_attr *attr)
|
||||
kfree(attr);
|
||||
}
|
||||
|
||||
+static void mrp_attr_destroy_all(struct mrp_applicant *app)
|
||||
+{
|
||||
+ struct rb_node *node, *next;
|
||||
+ struct mrp_attr *attr;
|
||||
+
|
||||
+ for (node = rb_first(&app->mad);
|
||||
+ next = node ? rb_next(node) : NULL, node != NULL;
|
||||
+ node = next) {
|
||||
+ attr = rb_entry(node, struct mrp_attr, node);
|
||||
+ mrp_attr_destroy(app, attr);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int mrp_pdu_init(struct mrp_applicant *app)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
@@ -895,6 +908,7 @@ void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *appl)
|
||||
|
||||
spin_lock_bh(&app->lock);
|
||||
mrp_mad_event(app, MRP_EVENT_TX);
|
||||
+ mrp_attr_destroy_all(app);
|
||||
mrp_pdu_queue(app);
|
||||
spin_unlock_bh(&app->lock);
|
||||
|
||||
diff --git a/net/core/sock.c b/net/core/sock.c
|
||||
index 68f84fac63e0b..452883b28abab 100644
|
||||
--- a/net/core/sock.c
|
||||
+++ b/net/core/sock.c
|
||||
@@ -1098,7 +1098,7 @@ set_rcvbuf:
|
||||
if (val < 0)
|
||||
ret = -EINVAL;
|
||||
else
|
||||
- sk->sk_ll_usec = val;
|
||||
+ WRITE_ONCE(sk->sk_ll_usec, val);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
|
||||
index 33444d9856819..fc913f09606db 100644
|
||||
--- a/net/ipv6/ip6_output.c
|
||||
+++ b/net/ipv6/ip6_output.c
|
||||
@@ -59,10 +59,38 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct net_device *dev = dst->dev;
|
||||
+ unsigned int hh_len = LL_RESERVED_SPACE(dev);
|
||||
+ int delta = hh_len - skb_headroom(skb);
|
||||
const struct in6_addr *nexthop;
|
||||
struct neighbour *neigh;
|
||||
int ret;
|
||||
|
||||
+ /* Be paranoid, rather than too clever. */
|
||||
+ if (unlikely(delta > 0) && dev->header_ops) {
|
||||
+ /* pskb_expand_head() might crash, if skb is shared */
|
||||
+ if (skb_shared(skb)) {
|
||||
+ struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC);
|
||||
+
|
||||
+ if (likely(nskb)) {
|
||||
+ if (skb->sk)
|
||||
+ skb_set_owner_w(nskb, skb->sk);
|
||||
+ consume_skb(skb);
|
||||
+ } else {
|
||||
+ kfree_skb(skb);
|
||||
+ }
|
||||
+ skb = nskb;
|
||||
+ }
|
||||
+ if (skb &&
|
||||
+ pskb_expand_head(skb, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) {
|
||||
+ kfree_skb(skb);
|
||||
+ skb = NULL;
|
||||
+ }
|
||||
+ if (!skb) {
|
||||
+ IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTDISCARDS);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) {
|
||||
struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
|
||||
|
||||
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
|
||||
index 7f8702abc7bfe..bb370a7948f42 100644
|
||||
--- a/net/sctp/protocol.c
|
||||
+++ b/net/sctp/protocol.c
|
||||
@@ -397,7 +397,8 @@ static enum sctp_scope sctp_v4_scope(union sctp_addr *addr)
|
||||
retval = SCTP_SCOPE_LINK;
|
||||
} else if (ipv4_is_private_10(addr->v4.sin_addr.s_addr) ||
|
||||
ipv4_is_private_172(addr->v4.sin_addr.s_addr) ||
|
||||
- ipv4_is_private_192(addr->v4.sin_addr.s_addr)) {
|
||||
+ ipv4_is_private_192(addr->v4.sin_addr.s_addr) ||
|
||||
+ ipv4_is_test_198(addr->v4.sin_addr.s_addr)) {
|
||||
retval = SCTP_SCOPE_PRIVATE;
|
||||
} else {
|
||||
retval = SCTP_SCOPE_GLOBAL;
|
||||
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
||||
index 9f96826eb3ba0..52ee3a9bb7093 100644
|
||||
--- a/net/unix/af_unix.c
|
||||
+++ b/net/unix/af_unix.c
|
||||
@@ -1512,6 +1512,53 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
+static void unix_peek_fds(struct scm_cookie *scm, struct sk_buff *skb)
|
||||
+{
|
||||
+ scm->fp = scm_fp_dup(UNIXCB(skb).fp);
|
||||
+
|
||||
+ /*
|
||||
+ * Garbage collection of unix sockets starts by selecting a set of
|
||||
+ * candidate sockets which have reference only from being in flight
|
||||
+ * (total_refs == inflight_refs). This condition is checked once during
|
||||
+ * the candidate collection phase, and candidates are marked as such, so
|
||||
+ * that non-candidates can later be ignored. While inflight_refs is
|
||||
+ * protected by unix_gc_lock, total_refs (file count) is not, hence this
|
||||
+ * is an instantaneous decision.
|
||||
+ *
|
||||
+ * Once a candidate, however, the socket must not be reinstalled into a
|
||||
+ * file descriptor while the garbage collection is in progress.
|
||||
+ *
|
||||
+ * If the above conditions are met, then the directed graph of
|
||||
+ * candidates (*) does not change while unix_gc_lock is held.
|
||||
+ *
|
||||
+ * Any operations that changes the file count through file descriptors
|
||||
+ * (dup, close, sendmsg) does not change the graph since candidates are
|
||||
+ * not installed in fds.
|
||||
+ *
|
||||
+ * Dequeing a candidate via recvmsg would install it into an fd, but
|
||||
+ * that takes unix_gc_lock to decrement the inflight count, so it's
|
||||
+ * serialized with garbage collection.
|
||||
+ *
|
||||
+ * MSG_PEEK is special in that it does not change the inflight count,
|
||||
+ * yet does install the socket into an fd. The following lock/unlock
|
||||
+ * pair is to ensure serialization with garbage collection. It must be
|
||||
+ * done between incrementing the file count and installing the file into
|
||||
+ * an fd.
|
||||
+ *
|
||||
+ * If garbage collection starts after the barrier provided by the
|
||||
+ * lock/unlock, then it will see the elevated refcount and not mark this
|
||||
+ * as a candidate. If a garbage collection is already in progress
|
||||
+ * before the file count was incremented, then the lock/unlock pair will
|
||||
+ * ensure that garbage collection is finished before progressing to
|
||||
+ * installing the fd.
|
||||
+ *
|
||||
+ * (*) A -> B where B is on the queue of A or B is on the queue of C
|
||||
+ * which is on the queue of listening socket A.
|
||||
+ */
|
||||
+ spin_lock(&unix_gc_lock);
|
||||
+ spin_unlock(&unix_gc_lock);
|
||||
+}
|
||||
+
|
||||
static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds)
|
||||
{
|
||||
int err = 0;
|
||||
@@ -2137,7 +2184,7 @@ static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
sk_peek_offset_fwd(sk, size);
|
||||
|
||||
if (UNIXCB(skb).fp)
|
||||
- scm.fp = scm_fp_dup(UNIXCB(skb).fp);
|
||||
+ unix_peek_fds(&scm, skb);
|
||||
}
|
||||
err = (flags & MSG_TRUNC) ? skb->len - skip : size;
|
||||
|
||||
@@ -2378,7 +2425,7 @@ unlock:
|
||||
/* It is questionable, see note in unix_dgram_recvmsg.
|
||||
*/
|
||||
if (UNIXCB(skb).fp)
|
||||
- scm.fp = scm_fp_dup(UNIXCB(skb).fp);
|
||||
+ unix_peek_fds(&scm, skb);
|
||||
|
||||
sk_peek_offset_fwd(sk, chunk);
|
||||
|
||||
diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include
|
||||
index 812fc97bb1a97..add0ef37ba967 100644
|
||||
--- a/tools/scripts/Makefile.include
|
||||
+++ b/tools/scripts/Makefile.include
|
||||
@@ -39,8 +39,6 @@ EXTRA_WARNINGS += -Wundef
|
||||
EXTRA_WARNINGS += -Wwrite-strings
|
||||
EXTRA_WARNINGS += -Wformat
|
||||
|
||||
-CC_NO_CLANG := $(shell $(CC) -dM -E -x c /dev/null | grep -Fq "__clang__"; echo $$?)
|
||||
-
|
||||
# Makefiles suck: This macro sets a default value of $(2) for the
|
||||
# variable named by $(1), unless the variable has been set by
|
||||
# environment or command line. This is necessary for CC and AR
|
||||
@@ -52,12 +50,22 @@ define allow-override
|
||||
$(eval $(1) = $(2)))
|
||||
endef
|
||||
|
||||
+ifneq ($(LLVM),)
|
||||
+$(call allow-override,CC,clang)
|
||||
+$(call allow-override,AR,llvm-ar)
|
||||
+$(call allow-override,LD,ld.lld)
|
||||
+$(call allow-override,CXX,clang++)
|
||||
+$(call allow-override,STRIP,llvm-strip)
|
||||
+else
|
||||
# Allow setting various cross-compile vars or setting CROSS_COMPILE as a prefix.
|
||||
$(call allow-override,CC,$(CROSS_COMPILE)gcc)
|
||||
$(call allow-override,AR,$(CROSS_COMPILE)ar)
|
||||
$(call allow-override,LD,$(CROSS_COMPILE)ld)
|
||||
$(call allow-override,CXX,$(CROSS_COMPILE)g++)
|
||||
$(call allow-override,STRIP,$(CROSS_COMPILE)strip)
|
||||
+endif
|
||||
+
|
||||
+CC_NO_CLANG := $(shell $(CC) -dM -E -x c /dev/null | grep -Fq "__clang__"; echo $$?)
|
||||
|
||||
ifneq ($(LLVM),)
|
||||
HOSTAR ?= llvm-ar
|
||||
diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c
|
||||
index 17ac167823a6d..9ba7feffe344b 100644
|
||||
--- a/tools/testing/selftests/vm/userfaultfd.c
|
||||
+++ b/tools/testing/selftests/vm/userfaultfd.c
|
||||
@@ -141,7 +141,7 @@ static void anon_allocate_area(void **alloc_area)
|
||||
{
|
||||
*alloc_area = mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||
- if (*alloc_area == MAP_FAILED)
|
||||
+ if (*alloc_area == MAP_FAILED) {
|
||||
fprintf(stderr, "mmap of anonymous memory failed");
|
||||
*alloc_area = NULL;
|
||||
}
|
||||
1400
patch/kernel/archive/odroidxu4-5.4/patch-5.4.137-138.patch
Normal file
1400
patch/kernel/archive/odroidxu4-5.4/patch-5.4.137-138.patch
Normal file
File diff suppressed because it is too large
Load Diff
730
patch/kernel/archive/sunxi-5.10/patch-5.10.54-55.patch
Normal file
730
patch/kernel/archive/sunxi-5.10/patch-5.10.54-55.patch
Normal file
@ -0,0 +1,730 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index eb01d3028b020..7fb6405f3b60f 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 10
|
||||
-SUBLEVEL = 54
|
||||
+SUBLEVEL = 55
|
||||
EXTRAVERSION =
|
||||
NAME = Dare mighty things
|
||||
|
||||
diff --git a/arch/arm/boot/dts/versatile-ab.dts b/arch/arm/boot/dts/versatile-ab.dts
|
||||
index 37bd41ff8dffa..151c0220047dd 100644
|
||||
--- a/arch/arm/boot/dts/versatile-ab.dts
|
||||
+++ b/arch/arm/boot/dts/versatile-ab.dts
|
||||
@@ -195,16 +195,15 @@
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
- vic: intc@10140000 {
|
||||
+ vic: interrupt-controller@10140000 {
|
||||
compatible = "arm,versatile-vic";
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
reg = <0x10140000 0x1000>;
|
||||
- clear-mask = <0xffffffff>;
|
||||
valid-mask = <0xffffffff>;
|
||||
};
|
||||
|
||||
- sic: intc@10003000 {
|
||||
+ sic: interrupt-controller@10003000 {
|
||||
compatible = "arm,versatile-sic";
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
diff --git a/arch/arm/boot/dts/versatile-pb.dts b/arch/arm/boot/dts/versatile-pb.dts
|
||||
index 06a0fdf24026c..e7e751a858d81 100644
|
||||
--- a/arch/arm/boot/dts/versatile-pb.dts
|
||||
+++ b/arch/arm/boot/dts/versatile-pb.dts
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
amba {
|
||||
/* The Versatile PB is using more SIC IRQ lines than the AB */
|
||||
- sic: intc@10003000 {
|
||||
+ sic: interrupt-controller@10003000 {
|
||||
clear-mask = <0xffffffff>;
|
||||
/*
|
||||
* Valid interrupt lines mask according to
|
||||
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
||||
index 800914e9e12b9..3ad6f77ea1c45 100644
|
||||
--- a/arch/x86/kvm/x86.c
|
||||
+++ b/arch/x86/kvm/x86.c
|
||||
@@ -541,8 +541,6 @@ static void kvm_multiple_exception(struct kvm_vcpu *vcpu,
|
||||
|
||||
if (!vcpu->arch.exception.pending && !vcpu->arch.exception.injected) {
|
||||
queue:
|
||||
- if (has_error && !is_protmode(vcpu))
|
||||
- has_error = false;
|
||||
if (reinject) {
|
||||
/*
|
||||
* On vmentry, vcpu->arch.exception.pending is only
|
||||
@@ -8265,6 +8263,13 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu)
|
||||
kvm_x86_ops.update_cr8_intercept(vcpu, tpr, max_irr);
|
||||
}
|
||||
|
||||
+static void kvm_inject_exception(struct kvm_vcpu *vcpu)
|
||||
+{
|
||||
+ if (vcpu->arch.exception.error_code && !is_protmode(vcpu))
|
||||
+ vcpu->arch.exception.error_code = false;
|
||||
+ kvm_x86_ops.queue_exception(vcpu);
|
||||
+}
|
||||
+
|
||||
static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit)
|
||||
{
|
||||
int r;
|
||||
@@ -8273,7 +8278,7 @@ static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit
|
||||
/* try to reinject previous events if any */
|
||||
|
||||
if (vcpu->arch.exception.injected) {
|
||||
- kvm_x86_ops.queue_exception(vcpu);
|
||||
+ kvm_inject_exception(vcpu);
|
||||
can_inject = false;
|
||||
}
|
||||
/*
|
||||
@@ -8336,7 +8341,7 @@ static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit
|
||||
}
|
||||
}
|
||||
|
||||
- kvm_x86_ops.queue_exception(vcpu);
|
||||
+ kvm_inject_exception(vcpu);
|
||||
can_inject = false;
|
||||
}
|
||||
|
||||
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
|
||||
index af4560dab6b40..8c9663258d5d4 100644
|
||||
--- a/drivers/firmware/arm_scmi/driver.c
|
||||
+++ b/drivers/firmware/arm_scmi/driver.c
|
||||
@@ -43,7 +43,6 @@ enum scmi_error_codes {
|
||||
SCMI_ERR_GENERIC = -8, /* Generic Error */
|
||||
SCMI_ERR_HARDWARE = -9, /* Hardware Error */
|
||||
SCMI_ERR_PROTOCOL = -10,/* Protocol Error */
|
||||
- SCMI_ERR_MAX
|
||||
};
|
||||
|
||||
/* List of all SCMI devices active in system */
|
||||
@@ -118,8 +117,10 @@ static const int scmi_linux_errmap[] = {
|
||||
|
||||
static inline int scmi_to_linux_errno(int errno)
|
||||
{
|
||||
- if (errno < SCMI_SUCCESS && errno > SCMI_ERR_MAX)
|
||||
- return scmi_linux_errmap[-errno];
|
||||
+ int err_idx = -errno;
|
||||
+
|
||||
+ if (err_idx >= SCMI_SUCCESS && err_idx < ARRAY_SIZE(scmi_linux_errmap))
|
||||
+ return scmi_linux_errmap[err_idx];
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -614,8 +615,9 @@ static int __scmi_xfer_info_init(struct scmi_info *sinfo,
|
||||
const struct scmi_desc *desc = sinfo->desc;
|
||||
|
||||
/* Pre-allocated messages, no more than what hdr.seq can support */
|
||||
- if (WARN_ON(desc->max_msg >= MSG_TOKEN_MAX)) {
|
||||
- dev_err(dev, "Maximum message of %d exceeds supported %ld\n",
|
||||
+ if (WARN_ON(!desc->max_msg || desc->max_msg > MSG_TOKEN_MAX)) {
|
||||
+ dev_err(dev,
|
||||
+ "Invalid maximum messages %d, not in range [1 - %lu]\n",
|
||||
desc->max_msg, MSG_TOKEN_MAX);
|
||||
return -EINVAL;
|
||||
}
|
||||
diff --git a/drivers/gpu/drm/ttm/ttm_range_manager.c b/drivers/gpu/drm/ttm/ttm_range_manager.c
|
||||
index 1da0e277c5111..ce9d127edbb5d 100644
|
||||
--- a/drivers/gpu/drm/ttm/ttm_range_manager.c
|
||||
+++ b/drivers/gpu/drm/ttm/ttm_range_manager.c
|
||||
@@ -147,6 +147,9 @@ int ttm_range_man_fini(struct ttm_bo_device *bdev,
|
||||
struct drm_mm *mm = &rman->mm;
|
||||
int ret;
|
||||
|
||||
+ if (!man)
|
||||
+ return 0;
|
||||
+
|
||||
ttm_resource_manager_set_used(man, false);
|
||||
|
||||
ret = ttm_resource_manager_force_list_clean(bdev, man);
|
||||
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
|
||||
index b0b06eb86edfb..81e0877237770 100644
|
||||
--- a/fs/cifs/smb2ops.c
|
||||
+++ b/fs/cifs/smb2ops.c
|
||||
@@ -497,8 +497,8 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf,
|
||||
p = buf;
|
||||
while (bytes_left >= sizeof(*p)) {
|
||||
info->speed = le64_to_cpu(p->LinkSpeed);
|
||||
- info->rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE);
|
||||
- info->rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE);
|
||||
+ info->rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE) ? 1 : 0;
|
||||
+ info->rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE) ? 1 : 0;
|
||||
|
||||
cifs_dbg(FYI, "%s: adding iface %zu\n", __func__, *iface_count);
|
||||
cifs_dbg(FYI, "%s: speed %zu bps\n", __func__, info->speed);
|
||||
diff --git a/fs/hfs/bfind.c b/fs/hfs/bfind.c
|
||||
index 4af318fbda774..ef9498a6e88ac 100644
|
||||
--- a/fs/hfs/bfind.c
|
||||
+++ b/fs/hfs/bfind.c
|
||||
@@ -25,7 +25,19 @@ int hfs_find_init(struct hfs_btree *tree, struct hfs_find_data *fd)
|
||||
fd->key = ptr + tree->max_key_len + 2;
|
||||
hfs_dbg(BNODE_REFS, "find_init: %d (%p)\n",
|
||||
tree->cnid, __builtin_return_address(0));
|
||||
- mutex_lock(&tree->tree_lock);
|
||||
+ switch (tree->cnid) {
|
||||
+ case HFS_CAT_CNID:
|
||||
+ mutex_lock_nested(&tree->tree_lock, CATALOG_BTREE_MUTEX);
|
||||
+ break;
|
||||
+ case HFS_EXT_CNID:
|
||||
+ mutex_lock_nested(&tree->tree_lock, EXTENTS_BTREE_MUTEX);
|
||||
+ break;
|
||||
+ case HFS_ATTR_CNID:
|
||||
+ mutex_lock_nested(&tree->tree_lock, ATTR_BTREE_MUTEX);
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/fs/hfs/bnode.c b/fs/hfs/bnode.c
|
||||
index b63a4df7327b6..c0a73a6ffb28b 100644
|
||||
--- a/fs/hfs/bnode.c
|
||||
+++ b/fs/hfs/bnode.c
|
||||
@@ -15,16 +15,31 @@
|
||||
|
||||
#include "btree.h"
|
||||
|
||||
-void hfs_bnode_read(struct hfs_bnode *node, void *buf,
|
||||
- int off, int len)
|
||||
+void hfs_bnode_read(struct hfs_bnode *node, void *buf, int off, int len)
|
||||
{
|
||||
struct page *page;
|
||||
+ int pagenum;
|
||||
+ int bytes_read;
|
||||
+ int bytes_to_read;
|
||||
+ void *vaddr;
|
||||
|
||||
off += node->page_offset;
|
||||
- page = node->page[0];
|
||||
+ pagenum = off >> PAGE_SHIFT;
|
||||
+ off &= ~PAGE_MASK; /* compute page offset for the first page */
|
||||
|
||||
- memcpy(buf, kmap(page) + off, len);
|
||||
- kunmap(page);
|
||||
+ for (bytes_read = 0; bytes_read < len; bytes_read += bytes_to_read) {
|
||||
+ if (pagenum >= node->tree->pages_per_bnode)
|
||||
+ break;
|
||||
+ page = node->page[pagenum];
|
||||
+ bytes_to_read = min_t(int, len - bytes_read, PAGE_SIZE - off);
|
||||
+
|
||||
+ vaddr = kmap_atomic(page);
|
||||
+ memcpy(buf + bytes_read, vaddr + off, bytes_to_read);
|
||||
+ kunmap_atomic(vaddr);
|
||||
+
|
||||
+ pagenum++;
|
||||
+ off = 0; /* page offset only applies to the first page */
|
||||
+ }
|
||||
}
|
||||
|
||||
u16 hfs_bnode_read_u16(struct hfs_bnode *node, int off)
|
||||
diff --git a/fs/hfs/btree.h b/fs/hfs/btree.h
|
||||
index 4ba45caf59392..0e6baee932453 100644
|
||||
--- a/fs/hfs/btree.h
|
||||
+++ b/fs/hfs/btree.h
|
||||
@@ -13,6 +13,13 @@ typedef int (*btree_keycmp)(const btree_key *, const btree_key *);
|
||||
|
||||
#define NODE_HASH_SIZE 256
|
||||
|
||||
+/* B-tree mutex nested subclasses */
|
||||
+enum hfs_btree_mutex_classes {
|
||||
+ CATALOG_BTREE_MUTEX,
|
||||
+ EXTENTS_BTREE_MUTEX,
|
||||
+ ATTR_BTREE_MUTEX,
|
||||
+};
|
||||
+
|
||||
/* A HFS BTree held in memory */
|
||||
struct hfs_btree {
|
||||
struct super_block *sb;
|
||||
diff --git a/fs/hfs/super.c b/fs/hfs/super.c
|
||||
index 44d07c9e3a7f0..12d9bae393631 100644
|
||||
--- a/fs/hfs/super.c
|
||||
+++ b/fs/hfs/super.c
|
||||
@@ -420,14 +420,12 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
if (!res) {
|
||||
if (fd.entrylength > sizeof(rec) || fd.entrylength < 0) {
|
||||
res = -EIO;
|
||||
- goto bail;
|
||||
+ goto bail_hfs_find;
|
||||
}
|
||||
hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength);
|
||||
}
|
||||
- if (res) {
|
||||
- hfs_find_exit(&fd);
|
||||
- goto bail_no_root;
|
||||
- }
|
||||
+ if (res)
|
||||
+ goto bail_hfs_find;
|
||||
res = -EINVAL;
|
||||
root_inode = hfs_iget(sb, &fd.search_key->cat, &rec);
|
||||
hfs_find_exit(&fd);
|
||||
@@ -443,6 +441,8 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
/* everything's okay */
|
||||
return 0;
|
||||
|
||||
+bail_hfs_find:
|
||||
+ hfs_find_exit(&fd);
|
||||
bail_no_root:
|
||||
pr_err("get root inode failed\n");
|
||||
bail:
|
||||
diff --git a/fs/internal.h b/fs/internal.h
|
||||
index a7cd0f64faa4a..5155f6ce95c79 100644
|
||||
--- a/fs/internal.h
|
||||
+++ b/fs/internal.h
|
||||
@@ -64,7 +64,6 @@ extern void __init chrdev_init(void);
|
||||
*/
|
||||
extern const struct fs_context_operations legacy_fs_context_ops;
|
||||
extern int parse_monolithic_mount_data(struct fs_context *, void *);
|
||||
-extern void fc_drop_locked(struct fs_context *);
|
||||
extern void vfs_clean_context(struct fs_context *fc);
|
||||
extern int finish_clean_context(struct fs_context *fc);
|
||||
|
||||
diff --git a/fs/io_uring.c b/fs/io_uring.c
|
||||
index 07f08c424d17b..525b44140d7a3 100644
|
||||
--- a/fs/io_uring.c
|
||||
+++ b/fs/io_uring.c
|
||||
@@ -6266,7 +6266,6 @@ static enum hrtimer_restart io_link_timeout_fn(struct hrtimer *timer)
|
||||
if (prev) {
|
||||
io_async_find_and_cancel(ctx, req, prev->user_data, -ETIME);
|
||||
io_put_req_deferred(prev, 1);
|
||||
- io_put_req_deferred(req, 1);
|
||||
} else {
|
||||
io_cqring_add_event(req, -ETIME, 0);
|
||||
io_put_req_deferred(req, 1);
|
||||
diff --git a/fs/iomap/seek.c b/fs/iomap/seek.c
|
||||
index 107ee80c35683..220c306167f79 100644
|
||||
--- a/fs/iomap/seek.c
|
||||
+++ b/fs/iomap/seek.c
|
||||
@@ -140,23 +140,20 @@ loff_t
|
||||
iomap_seek_hole(struct inode *inode, loff_t offset, const struct iomap_ops *ops)
|
||||
{
|
||||
loff_t size = i_size_read(inode);
|
||||
- loff_t length = size - offset;
|
||||
loff_t ret;
|
||||
|
||||
/* Nothing to be found before or beyond the end of the file. */
|
||||
if (offset < 0 || offset >= size)
|
||||
return -ENXIO;
|
||||
|
||||
- while (length > 0) {
|
||||
- ret = iomap_apply(inode, offset, length, IOMAP_REPORT, ops,
|
||||
- &offset, iomap_seek_hole_actor);
|
||||
+ while (offset < size) {
|
||||
+ ret = iomap_apply(inode, offset, size - offset, IOMAP_REPORT,
|
||||
+ ops, &offset, iomap_seek_hole_actor);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret == 0)
|
||||
break;
|
||||
-
|
||||
offset += ret;
|
||||
- length -= ret;
|
||||
}
|
||||
|
||||
return offset;
|
||||
@@ -186,27 +183,23 @@ loff_t
|
||||
iomap_seek_data(struct inode *inode, loff_t offset, const struct iomap_ops *ops)
|
||||
{
|
||||
loff_t size = i_size_read(inode);
|
||||
- loff_t length = size - offset;
|
||||
loff_t ret;
|
||||
|
||||
/* Nothing to be found before or beyond the end of the file. */
|
||||
if (offset < 0 || offset >= size)
|
||||
return -ENXIO;
|
||||
|
||||
- while (length > 0) {
|
||||
- ret = iomap_apply(inode, offset, length, IOMAP_REPORT, ops,
|
||||
- &offset, iomap_seek_data_actor);
|
||||
+ while (offset < size) {
|
||||
+ ret = iomap_apply(inode, offset, size - offset, IOMAP_REPORT,
|
||||
+ ops, &offset, iomap_seek_data_actor);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret == 0)
|
||||
- break;
|
||||
-
|
||||
+ return offset;
|
||||
offset += ret;
|
||||
- length -= ret;
|
||||
}
|
||||
|
||||
- if (length <= 0)
|
||||
- return -ENXIO;
|
||||
- return offset;
|
||||
+ /* We've reached the end of the file without finding data */
|
||||
+ return -ENXIO;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iomap_seek_data);
|
||||
diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h
|
||||
index 37e1e8f7f08da..5b44b0195a28a 100644
|
||||
--- a/include/linux/fs_context.h
|
||||
+++ b/include/linux/fs_context.h
|
||||
@@ -139,6 +139,7 @@ extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
|
||||
extern int generic_parse_monolithic(struct fs_context *fc, void *data);
|
||||
extern int vfs_get_tree(struct fs_context *fc);
|
||||
extern void put_fs_context(struct fs_context *fc);
|
||||
+extern void fc_drop_locked(struct fs_context *fc);
|
||||
|
||||
/*
|
||||
* sget() wrappers to be called from the ->get_tree() op.
|
||||
diff --git a/include/net/busy_poll.h b/include/net/busy_poll.h
|
||||
index b001fa91c14ea..716b7c5f6fdd9 100644
|
||||
--- a/include/net/busy_poll.h
|
||||
+++ b/include/net/busy_poll.h
|
||||
@@ -36,7 +36,7 @@ static inline bool net_busy_loop_on(void)
|
||||
|
||||
static inline bool sk_can_busy_loop(const struct sock *sk)
|
||||
{
|
||||
- return sk->sk_ll_usec && !signal_pending(current);
|
||||
+ return READ_ONCE(sk->sk_ll_usec) && !signal_pending(current);
|
||||
}
|
||||
|
||||
bool sk_busy_loop_end(void *p, unsigned long start_time);
|
||||
diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h
|
||||
index 122d9e2d8dfde..1ad049ac2add4 100644
|
||||
--- a/include/net/sctp/constants.h
|
||||
+++ b/include/net/sctp/constants.h
|
||||
@@ -340,8 +340,7 @@ enum {
|
||||
#define SCTP_SCOPE_POLICY_MAX SCTP_SCOPE_POLICY_LINK
|
||||
|
||||
/* Based on IPv4 scoping <draft-stewart-tsvwg-sctp-ipv4-00.txt>,
|
||||
- * SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 198.18.0.0/24,
|
||||
- * 192.88.99.0/24.
|
||||
+ * SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 192.88.99.0/24.
|
||||
* Also, RFC 8.4, non-unicast addresses are not considered valid SCTP
|
||||
* addresses.
|
||||
*/
|
||||
@@ -349,7 +348,6 @@ enum {
|
||||
((htonl(INADDR_BROADCAST) == a) || \
|
||||
ipv4_is_multicast(a) || \
|
||||
ipv4_is_zeronet(a) || \
|
||||
- ipv4_is_test_198(a) || \
|
||||
ipv4_is_anycast_6to4(a))
|
||||
|
||||
/* Flags used for the bind address copy functions. */
|
||||
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
|
||||
index 04eb28f7735fb..7f71b54c06c5f 100644
|
||||
--- a/kernel/cgroup/cgroup-v1.c
|
||||
+++ b/kernel/cgroup/cgroup-v1.c
|
||||
@@ -1225,9 +1225,7 @@ int cgroup1_get_tree(struct fs_context *fc)
|
||||
ret = cgroup_do_get_tree(fc);
|
||||
|
||||
if (!ret && percpu_ref_is_dying(&ctx->root->cgrp.self.refcnt)) {
|
||||
- struct super_block *sb = fc->root->d_sb;
|
||||
- dput(fc->root);
|
||||
- deactivate_locked_super(sb);
|
||||
+ fc_drop_locked(fc);
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
|
||||
index 73bbe792fe1e8..b338f514ee5aa 100644
|
||||
--- a/kernel/rcu/tasks.h
|
||||
+++ b/kernel/rcu/tasks.h
|
||||
@@ -879,10 +879,9 @@ static bool trc_inspect_reader(struct task_struct *t, void *arg)
|
||||
in_qs = likely(!t->trc_reader_nesting);
|
||||
}
|
||||
|
||||
- // Mark as checked. Because this is called from the grace-period
|
||||
- // kthread, also remove the task from the holdout list.
|
||||
+ // Mark as checked so that the grace-period kthread will
|
||||
+ // remove it from the holdout list.
|
||||
t->trc_reader_checked = true;
|
||||
- trc_del_holdout(t);
|
||||
|
||||
if (in_qs)
|
||||
return true; // Already in quiescent state, done!!!
|
||||
@@ -909,7 +908,6 @@ static void trc_wait_for_one_reader(struct task_struct *t,
|
||||
// The current task had better be in a quiescent state.
|
||||
if (t == current) {
|
||||
t->trc_reader_checked = true;
|
||||
- trc_del_holdout(t);
|
||||
WARN_ON_ONCE(t->trc_reader_nesting);
|
||||
return;
|
||||
}
|
||||
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
|
||||
index b23f7d1044be7..51d19fc71e616 100644
|
||||
--- a/kernel/workqueue.c
|
||||
+++ b/kernel/workqueue.c
|
||||
@@ -3670,15 +3670,21 @@ static void pwq_unbound_release_workfn(struct work_struct *work)
|
||||
unbound_release_work);
|
||||
struct workqueue_struct *wq = pwq->wq;
|
||||
struct worker_pool *pool = pwq->pool;
|
||||
- bool is_last;
|
||||
+ bool is_last = false;
|
||||
|
||||
- if (WARN_ON_ONCE(!(wq->flags & WQ_UNBOUND)))
|
||||
- return;
|
||||
+ /*
|
||||
+ * when @pwq is not linked, it doesn't hold any reference to the
|
||||
+ * @wq, and @wq is invalid to access.
|
||||
+ */
|
||||
+ if (!list_empty(&pwq->pwqs_node)) {
|
||||
+ if (WARN_ON_ONCE(!(wq->flags & WQ_UNBOUND)))
|
||||
+ return;
|
||||
|
||||
- mutex_lock(&wq->mutex);
|
||||
- list_del_rcu(&pwq->pwqs_node);
|
||||
- is_last = list_empty(&wq->pwqs);
|
||||
- mutex_unlock(&wq->mutex);
|
||||
+ mutex_lock(&wq->mutex);
|
||||
+ list_del_rcu(&pwq->pwqs_node);
|
||||
+ is_last = list_empty(&wq->pwqs);
|
||||
+ mutex_unlock(&wq->mutex);
|
||||
+ }
|
||||
|
||||
mutex_lock(&wq_pool_mutex);
|
||||
put_unbound_pool(pool);
|
||||
diff --git a/net/802/garp.c b/net/802/garp.c
|
||||
index 400bd857e5f57..f6012f8e59f00 100644
|
||||
--- a/net/802/garp.c
|
||||
+++ b/net/802/garp.c
|
||||
@@ -203,6 +203,19 @@ static void garp_attr_destroy(struct garp_applicant *app, struct garp_attr *attr
|
||||
kfree(attr);
|
||||
}
|
||||
|
||||
+static void garp_attr_destroy_all(struct garp_applicant *app)
|
||||
+{
|
||||
+ struct rb_node *node, *next;
|
||||
+ struct garp_attr *attr;
|
||||
+
|
||||
+ for (node = rb_first(&app->gid);
|
||||
+ next = node ? rb_next(node) : NULL, node != NULL;
|
||||
+ node = next) {
|
||||
+ attr = rb_entry(node, struct garp_attr, node);
|
||||
+ garp_attr_destroy(app, attr);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int garp_pdu_init(struct garp_applicant *app)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
@@ -609,6 +622,7 @@ void garp_uninit_applicant(struct net_device *dev, struct garp_application *appl
|
||||
|
||||
spin_lock_bh(&app->lock);
|
||||
garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU);
|
||||
+ garp_attr_destroy_all(app);
|
||||
garp_pdu_queue(app);
|
||||
spin_unlock_bh(&app->lock);
|
||||
|
||||
diff --git a/net/802/mrp.c b/net/802/mrp.c
|
||||
index bea6e43d45a0d..35e04cc5390c4 100644
|
||||
--- a/net/802/mrp.c
|
||||
+++ b/net/802/mrp.c
|
||||
@@ -292,6 +292,19 @@ static void mrp_attr_destroy(struct mrp_applicant *app, struct mrp_attr *attr)
|
||||
kfree(attr);
|
||||
}
|
||||
|
||||
+static void mrp_attr_destroy_all(struct mrp_applicant *app)
|
||||
+{
|
||||
+ struct rb_node *node, *next;
|
||||
+ struct mrp_attr *attr;
|
||||
+
|
||||
+ for (node = rb_first(&app->mad);
|
||||
+ next = node ? rb_next(node) : NULL, node != NULL;
|
||||
+ node = next) {
|
||||
+ attr = rb_entry(node, struct mrp_attr, node);
|
||||
+ mrp_attr_destroy(app, attr);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int mrp_pdu_init(struct mrp_applicant *app)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
@@ -895,6 +908,7 @@ void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *appl)
|
||||
|
||||
spin_lock_bh(&app->lock);
|
||||
mrp_mad_event(app, MRP_EVENT_TX);
|
||||
+ mrp_attr_destroy_all(app);
|
||||
mrp_pdu_queue(app);
|
||||
spin_unlock_bh(&app->lock);
|
||||
|
||||
diff --git a/net/core/sock.c b/net/core/sock.c
|
||||
index 7de51ea15cdfc..d638c5361ed29 100644
|
||||
--- a/net/core/sock.c
|
||||
+++ b/net/core/sock.c
|
||||
@@ -1164,7 +1164,7 @@ set_sndbuf:
|
||||
if (val < 0)
|
||||
ret = -EINVAL;
|
||||
else
|
||||
- sk->sk_ll_usec = val;
|
||||
+ WRITE_ONCE(sk->sk_ll_usec, val);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
|
||||
index 341d0c7acc8bf..72a673a43a754 100644
|
||||
--- a/net/ipv6/ip6_output.c
|
||||
+++ b/net/ipv6/ip6_output.c
|
||||
@@ -60,10 +60,38 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct net_device *dev = dst->dev;
|
||||
+ unsigned int hh_len = LL_RESERVED_SPACE(dev);
|
||||
+ int delta = hh_len - skb_headroom(skb);
|
||||
const struct in6_addr *nexthop;
|
||||
struct neighbour *neigh;
|
||||
int ret;
|
||||
|
||||
+ /* Be paranoid, rather than too clever. */
|
||||
+ if (unlikely(delta > 0) && dev->header_ops) {
|
||||
+ /* pskb_expand_head() might crash, if skb is shared */
|
||||
+ if (skb_shared(skb)) {
|
||||
+ struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC);
|
||||
+
|
||||
+ if (likely(nskb)) {
|
||||
+ if (skb->sk)
|
||||
+ skb_set_owner_w(nskb, skb->sk);
|
||||
+ consume_skb(skb);
|
||||
+ } else {
|
||||
+ kfree_skb(skb);
|
||||
+ }
|
||||
+ skb = nskb;
|
||||
+ }
|
||||
+ if (skb &&
|
||||
+ pskb_expand_head(skb, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) {
|
||||
+ kfree_skb(skb);
|
||||
+ skb = NULL;
|
||||
+ }
|
||||
+ if (!skb) {
|
||||
+ IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTDISCARDS);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) {
|
||||
struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
|
||||
|
||||
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
|
||||
index 47fb87ce489fc..940f1e257a90a 100644
|
||||
--- a/net/sctp/protocol.c
|
||||
+++ b/net/sctp/protocol.c
|
||||
@@ -397,7 +397,8 @@ static enum sctp_scope sctp_v4_scope(union sctp_addr *addr)
|
||||
retval = SCTP_SCOPE_LINK;
|
||||
} else if (ipv4_is_private_10(addr->v4.sin_addr.s_addr) ||
|
||||
ipv4_is_private_172(addr->v4.sin_addr.s_addr) ||
|
||||
- ipv4_is_private_192(addr->v4.sin_addr.s_addr)) {
|
||||
+ ipv4_is_private_192(addr->v4.sin_addr.s_addr) ||
|
||||
+ ipv4_is_test_198(addr->v4.sin_addr.s_addr)) {
|
||||
retval = SCTP_SCOPE_PRIVATE;
|
||||
} else {
|
||||
retval = SCTP_SCOPE_GLOBAL;
|
||||
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
||||
index 39be4b52329b5..37ffa7725cee2 100644
|
||||
--- a/net/unix/af_unix.c
|
||||
+++ b/net/unix/af_unix.c
|
||||
@@ -1521,6 +1521,53 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
+static void unix_peek_fds(struct scm_cookie *scm, struct sk_buff *skb)
|
||||
+{
|
||||
+ scm->fp = scm_fp_dup(UNIXCB(skb).fp);
|
||||
+
|
||||
+ /*
|
||||
+ * Garbage collection of unix sockets starts by selecting a set of
|
||||
+ * candidate sockets which have reference only from being in flight
|
||||
+ * (total_refs == inflight_refs). This condition is checked once during
|
||||
+ * the candidate collection phase, and candidates are marked as such, so
|
||||
+ * that non-candidates can later be ignored. While inflight_refs is
|
||||
+ * protected by unix_gc_lock, total_refs (file count) is not, hence this
|
||||
+ * is an instantaneous decision.
|
||||
+ *
|
||||
+ * Once a candidate, however, the socket must not be reinstalled into a
|
||||
+ * file descriptor while the garbage collection is in progress.
|
||||
+ *
|
||||
+ * If the above conditions are met, then the directed graph of
|
||||
+ * candidates (*) does not change while unix_gc_lock is held.
|
||||
+ *
|
||||
+ * Any operations that changes the file count through file descriptors
|
||||
+ * (dup, close, sendmsg) does not change the graph since candidates are
|
||||
+ * not installed in fds.
|
||||
+ *
|
||||
+ * Dequeing a candidate via recvmsg would install it into an fd, but
|
||||
+ * that takes unix_gc_lock to decrement the inflight count, so it's
|
||||
+ * serialized with garbage collection.
|
||||
+ *
|
||||
+ * MSG_PEEK is special in that it does not change the inflight count,
|
||||
+ * yet does install the socket into an fd. The following lock/unlock
|
||||
+ * pair is to ensure serialization with garbage collection. It must be
|
||||
+ * done between incrementing the file count and installing the file into
|
||||
+ * an fd.
|
||||
+ *
|
||||
+ * If garbage collection starts after the barrier provided by the
|
||||
+ * lock/unlock, then it will see the elevated refcount and not mark this
|
||||
+ * as a candidate. If a garbage collection is already in progress
|
||||
+ * before the file count was incremented, then the lock/unlock pair will
|
||||
+ * ensure that garbage collection is finished before progressing to
|
||||
+ * installing the fd.
|
||||
+ *
|
||||
+ * (*) A -> B where B is on the queue of A or B is on the queue of C
|
||||
+ * which is on the queue of listening socket A.
|
||||
+ */
|
||||
+ spin_lock(&unix_gc_lock);
|
||||
+ spin_unlock(&unix_gc_lock);
|
||||
+}
|
||||
+
|
||||
static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds)
|
||||
{
|
||||
int err = 0;
|
||||
@@ -2170,7 +2217,7 @@ static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
sk_peek_offset_fwd(sk, size);
|
||||
|
||||
if (UNIXCB(skb).fp)
|
||||
- scm.fp = scm_fp_dup(UNIXCB(skb).fp);
|
||||
+ unix_peek_fds(&scm, skb);
|
||||
}
|
||||
err = (flags & MSG_TRUNC) ? skb->len - skip : size;
|
||||
|
||||
@@ -2413,7 +2460,7 @@ unlock:
|
||||
/* It is questionable, see note in unix_dgram_recvmsg.
|
||||
*/
|
||||
if (UNIXCB(skb).fp)
|
||||
- scm.fp = scm_fp_dup(UNIXCB(skb).fp);
|
||||
+ unix_peek_fds(&scm, skb);
|
||||
|
||||
sk_peek_offset_fwd(sk, chunk);
|
||||
|
||||
diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include
|
||||
index 1358e89cdf7d6..a3f99ef6b11ba 100644
|
||||
--- a/tools/scripts/Makefile.include
|
||||
+++ b/tools/scripts/Makefile.include
|
||||
@@ -39,8 +39,6 @@ EXTRA_WARNINGS += -Wundef
|
||||
EXTRA_WARNINGS += -Wwrite-strings
|
||||
EXTRA_WARNINGS += -Wformat
|
||||
|
||||
-CC_NO_CLANG := $(shell $(CC) -dM -E -x c /dev/null | grep -Fq "__clang__"; echo $$?)
|
||||
-
|
||||
# Makefiles suck: This macro sets a default value of $(2) for the
|
||||
# variable named by $(1), unless the variable has been set by
|
||||
# environment or command line. This is necessary for CC and AR
|
||||
@@ -52,12 +50,22 @@ define allow-override
|
||||
$(eval $(1) = $(2)))
|
||||
endef
|
||||
|
||||
+ifneq ($(LLVM),)
|
||||
+$(call allow-override,CC,clang)
|
||||
+$(call allow-override,AR,llvm-ar)
|
||||
+$(call allow-override,LD,ld.lld)
|
||||
+$(call allow-override,CXX,clang++)
|
||||
+$(call allow-override,STRIP,llvm-strip)
|
||||
+else
|
||||
# Allow setting various cross-compile vars or setting CROSS_COMPILE as a prefix.
|
||||
$(call allow-override,CC,$(CROSS_COMPILE)gcc)
|
||||
$(call allow-override,AR,$(CROSS_COMPILE)ar)
|
||||
$(call allow-override,LD,$(CROSS_COMPILE)ld)
|
||||
$(call allow-override,CXX,$(CROSS_COMPILE)g++)
|
||||
$(call allow-override,STRIP,$(CROSS_COMPILE)strip)
|
||||
+endif
|
||||
+
|
||||
+CC_NO_CLANG := $(shell $(CC) -dM -E -x c /dev/null | grep -Fq "__clang__"; echo $$?)
|
||||
|
||||
ifneq ($(LLVM),)
|
||||
HOSTAR ?= llvm-ar
|
||||
2796
patch/kernel/archive/sunxi-5.10/patch-5.10.55-56.patch
Normal file
2796
patch/kernel/archive/sunxi-5.10/patch-5.10.55-56.patch
Normal file
File diff suppressed because it is too large
Load Diff
781
patch/kernel/archive/sunxi-5.13/patch-5.13.6-7.patch
Normal file
781
patch/kernel/archive/sunxi-5.13/patch-5.13.6-7.patch
Normal file
@ -0,0 +1,781 @@
|
||||
diff --git a/Makefile b/Makefile
|
||||
index 96967f8951933..614327400aea2 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 13
|
||||
-SUBLEVEL = 6
|
||||
+SUBLEVEL = 7
|
||||
EXTRAVERSION =
|
||||
NAME = Opossums on Parade
|
||||
|
||||
diff --git a/arch/arm/boot/dts/versatile-ab.dts b/arch/arm/boot/dts/versatile-ab.dts
|
||||
index 37bd41ff8dffa..151c0220047dd 100644
|
||||
--- a/arch/arm/boot/dts/versatile-ab.dts
|
||||
+++ b/arch/arm/boot/dts/versatile-ab.dts
|
||||
@@ -195,16 +195,15 @@
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
- vic: intc@10140000 {
|
||||
+ vic: interrupt-controller@10140000 {
|
||||
compatible = "arm,versatile-vic";
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
reg = <0x10140000 0x1000>;
|
||||
- clear-mask = <0xffffffff>;
|
||||
valid-mask = <0xffffffff>;
|
||||
};
|
||||
|
||||
- sic: intc@10003000 {
|
||||
+ sic: interrupt-controller@10003000 {
|
||||
compatible = "arm,versatile-sic";
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
diff --git a/arch/arm/boot/dts/versatile-pb.dts b/arch/arm/boot/dts/versatile-pb.dts
|
||||
index 06a0fdf24026c..e7e751a858d81 100644
|
||||
--- a/arch/arm/boot/dts/versatile-pb.dts
|
||||
+++ b/arch/arm/boot/dts/versatile-pb.dts
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
amba {
|
||||
/* The Versatile PB is using more SIC IRQ lines than the AB */
|
||||
- sic: intc@10003000 {
|
||||
+ sic: interrupt-controller@10003000 {
|
||||
clear-mask = <0xffffffff>;
|
||||
/*
|
||||
* Valid interrupt lines mask according to
|
||||
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
|
||||
index 74986bf96656f..c9fda6261c6b0 100644
|
||||
--- a/drivers/firmware/arm_scmi/driver.c
|
||||
+++ b/drivers/firmware/arm_scmi/driver.c
|
||||
@@ -47,7 +47,6 @@ enum scmi_error_codes {
|
||||
SCMI_ERR_GENERIC = -8, /* Generic Error */
|
||||
SCMI_ERR_HARDWARE = -9, /* Hardware Error */
|
||||
SCMI_ERR_PROTOCOL = -10,/* Protocol Error */
|
||||
- SCMI_ERR_MAX
|
||||
};
|
||||
|
||||
/* List of all SCMI devices active in system */
|
||||
@@ -166,8 +165,10 @@ static const int scmi_linux_errmap[] = {
|
||||
|
||||
static inline int scmi_to_linux_errno(int errno)
|
||||
{
|
||||
- if (errno < SCMI_SUCCESS && errno > SCMI_ERR_MAX)
|
||||
- return scmi_linux_errmap[-errno];
|
||||
+ int err_idx = -errno;
|
||||
+
|
||||
+ if (err_idx >= SCMI_SUCCESS && err_idx < ARRAY_SIZE(scmi_linux_errmap))
|
||||
+ return scmi_linux_errmap[err_idx];
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -1029,8 +1030,9 @@ static int __scmi_xfer_info_init(struct scmi_info *sinfo,
|
||||
const struct scmi_desc *desc = sinfo->desc;
|
||||
|
||||
/* Pre-allocated messages, no more than what hdr.seq can support */
|
||||
- if (WARN_ON(desc->max_msg >= MSG_TOKEN_MAX)) {
|
||||
- dev_err(dev, "Maximum message of %d exceeds supported %ld\n",
|
||||
+ if (WARN_ON(!desc->max_msg || desc->max_msg > MSG_TOKEN_MAX)) {
|
||||
+ dev_err(dev,
|
||||
+ "Invalid maximum messages %d, not in range [1 - %lu]\n",
|
||||
desc->max_msg, MSG_TOKEN_MAX);
|
||||
return -EINVAL;
|
||||
}
|
||||
diff --git a/drivers/gpu/drm/ttm/ttm_range_manager.c b/drivers/gpu/drm/ttm/ttm_range_manager.c
|
||||
index 707e5c1528967..ed053fd15c90b 100644
|
||||
--- a/drivers/gpu/drm/ttm/ttm_range_manager.c
|
||||
+++ b/drivers/gpu/drm/ttm/ttm_range_manager.c
|
||||
@@ -146,6 +146,9 @@ int ttm_range_man_fini(struct ttm_device *bdev,
|
||||
struct drm_mm *mm = &rman->mm;
|
||||
int ret;
|
||||
|
||||
+ if (!man)
|
||||
+ return 0;
|
||||
+
|
||||
ttm_resource_manager_set_used(man, false);
|
||||
|
||||
ret = ttm_resource_manager_evict_all(bdev, man);
|
||||
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
|
||||
index fb1c5ae0da39d..d963f25fc7aed 100644
|
||||
--- a/drivers/nvme/host/pci.c
|
||||
+++ b/drivers/nvme/host/pci.c
|
||||
@@ -1562,6 +1562,28 @@ static void nvme_init_queue(struct nvme_queue *nvmeq, u16 qid)
|
||||
wmb(); /* ensure the first interrupt sees the initialization */
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Try getting shutdown_lock while setting up IO queues.
|
||||
+ */
|
||||
+static int nvme_setup_io_queues_trylock(struct nvme_dev *dev)
|
||||
+{
|
||||
+ /*
|
||||
+ * Give up if the lock is being held by nvme_dev_disable.
|
||||
+ */
|
||||
+ if (!mutex_trylock(&dev->shutdown_lock))
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ /*
|
||||
+ * Controller is in wrong state, fail early.
|
||||
+ */
|
||||
+ if (dev->ctrl.state != NVME_CTRL_CONNECTING) {
|
||||
+ mutex_unlock(&dev->shutdown_lock);
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int nvme_create_queue(struct nvme_queue *nvmeq, int qid, bool polled)
|
||||
{
|
||||
struct nvme_dev *dev = nvmeq->dev;
|
||||
@@ -1590,8 +1612,11 @@ static int nvme_create_queue(struct nvme_queue *nvmeq, int qid, bool polled)
|
||||
goto release_cq;
|
||||
|
||||
nvmeq->cq_vector = vector;
|
||||
- nvme_init_queue(nvmeq, qid);
|
||||
|
||||
+ result = nvme_setup_io_queues_trylock(dev);
|
||||
+ if (result)
|
||||
+ return result;
|
||||
+ nvme_init_queue(nvmeq, qid);
|
||||
if (!polled) {
|
||||
result = queue_request_irq(nvmeq);
|
||||
if (result < 0)
|
||||
@@ -1599,10 +1624,12 @@ static int nvme_create_queue(struct nvme_queue *nvmeq, int qid, bool polled)
|
||||
}
|
||||
|
||||
set_bit(NVMEQ_ENABLED, &nvmeq->flags);
|
||||
+ mutex_unlock(&dev->shutdown_lock);
|
||||
return result;
|
||||
|
||||
release_sq:
|
||||
dev->online_queues--;
|
||||
+ mutex_unlock(&dev->shutdown_lock);
|
||||
adapter_delete_sq(dev, qid);
|
||||
release_cq:
|
||||
adapter_delete_cq(dev, qid);
|
||||
@@ -2176,7 +2203,18 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
|
||||
if (nr_io_queues == 0)
|
||||
return 0;
|
||||
|
||||
- clear_bit(NVMEQ_ENABLED, &adminq->flags);
|
||||
+ /*
|
||||
+ * Free IRQ resources as soon as NVMEQ_ENABLED bit transitions
|
||||
+ * from set to unset. If there is a window to it is truely freed,
|
||||
+ * pci_free_irq_vectors() jumping into this window will crash.
|
||||
+ * And take lock to avoid racing with pci_free_irq_vectors() in
|
||||
+ * nvme_dev_disable() path.
|
||||
+ */
|
||||
+ result = nvme_setup_io_queues_trylock(dev);
|
||||
+ if (result)
|
||||
+ return result;
|
||||
+ if (test_and_clear_bit(NVMEQ_ENABLED, &adminq->flags))
|
||||
+ pci_free_irq(pdev, 0, adminq);
|
||||
|
||||
if (dev->cmb_use_sqes) {
|
||||
result = nvme_cmb_qdepth(dev, nr_io_queues,
|
||||
@@ -2192,14 +2230,17 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
|
||||
result = nvme_remap_bar(dev, size);
|
||||
if (!result)
|
||||
break;
|
||||
- if (!--nr_io_queues)
|
||||
- return -ENOMEM;
|
||||
+ if (!--nr_io_queues) {
|
||||
+ result = -ENOMEM;
|
||||
+ goto out_unlock;
|
||||
+ }
|
||||
} while (1);
|
||||
adminq->q_db = dev->dbs;
|
||||
|
||||
retry:
|
||||
/* Deregister the admin queue's interrupt */
|
||||
- pci_free_irq(pdev, 0, adminq);
|
||||
+ if (test_and_clear_bit(NVMEQ_ENABLED, &adminq->flags))
|
||||
+ pci_free_irq(pdev, 0, adminq);
|
||||
|
||||
/*
|
||||
* If we enable msix early due to not intx, disable it again before
|
||||
@@ -2208,8 +2249,10 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
|
||||
pci_free_irq_vectors(pdev);
|
||||
|
||||
result = nvme_setup_irqs(dev, nr_io_queues);
|
||||
- if (result <= 0)
|
||||
- return -EIO;
|
||||
+ if (result <= 0) {
|
||||
+ result = -EIO;
|
||||
+ goto out_unlock;
|
||||
+ }
|
||||
|
||||
dev->num_vecs = result;
|
||||
result = max(result - 1, 1);
|
||||
@@ -2223,8 +2266,9 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
|
||||
*/
|
||||
result = queue_request_irq(adminq);
|
||||
if (result)
|
||||
- return result;
|
||||
+ goto out_unlock;
|
||||
set_bit(NVMEQ_ENABLED, &adminq->flags);
|
||||
+ mutex_unlock(&dev->shutdown_lock);
|
||||
|
||||
result = nvme_create_io_queues(dev);
|
||||
if (result || dev->online_queues < 2)
|
||||
@@ -2233,6 +2277,9 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
|
||||
if (dev->online_queues - 1 < dev->max_qid) {
|
||||
nr_io_queues = dev->online_queues - 1;
|
||||
nvme_disable_io_queues(dev);
|
||||
+ result = nvme_setup_io_queues_trylock(dev);
|
||||
+ if (result)
|
||||
+ return result;
|
||||
nvme_suspend_io_queues(dev);
|
||||
goto retry;
|
||||
}
|
||||
@@ -2241,6 +2288,9 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
|
||||
dev->io_queues[HCTX_TYPE_READ],
|
||||
dev->io_queues[HCTX_TYPE_POLL]);
|
||||
return 0;
|
||||
+out_unlock:
|
||||
+ mutex_unlock(&dev->shutdown_lock);
|
||||
+ return result;
|
||||
}
|
||||
|
||||
static void nvme_del_queue_end(struct request *req, blk_status_t error)
|
||||
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
|
||||
index 64cad843ce723..398c941e38974 100644
|
||||
--- a/fs/cifs/smb2ops.c
|
||||
+++ b/fs/cifs/smb2ops.c
|
||||
@@ -555,8 +555,8 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf,
|
||||
p = buf;
|
||||
while (bytes_left >= sizeof(*p)) {
|
||||
info->speed = le64_to_cpu(p->LinkSpeed);
|
||||
- info->rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE);
|
||||
- info->rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE);
|
||||
+ info->rdma_capable = le32_to_cpu(p->Capability & RDMA_CAPABLE) ? 1 : 0;
|
||||
+ info->rss_capable = le32_to_cpu(p->Capability & RSS_CAPABLE) ? 1 : 0;
|
||||
|
||||
cifs_dbg(FYI, "%s: adding iface %zu\n", __func__, *iface_count);
|
||||
cifs_dbg(FYI, "%s: speed %zu bps\n", __func__, info->speed);
|
||||
diff --git a/fs/hfs/bfind.c b/fs/hfs/bfind.c
|
||||
index 4af318fbda774..ef9498a6e88ac 100644
|
||||
--- a/fs/hfs/bfind.c
|
||||
+++ b/fs/hfs/bfind.c
|
||||
@@ -25,7 +25,19 @@ int hfs_find_init(struct hfs_btree *tree, struct hfs_find_data *fd)
|
||||
fd->key = ptr + tree->max_key_len + 2;
|
||||
hfs_dbg(BNODE_REFS, "find_init: %d (%p)\n",
|
||||
tree->cnid, __builtin_return_address(0));
|
||||
- mutex_lock(&tree->tree_lock);
|
||||
+ switch (tree->cnid) {
|
||||
+ case HFS_CAT_CNID:
|
||||
+ mutex_lock_nested(&tree->tree_lock, CATALOG_BTREE_MUTEX);
|
||||
+ break;
|
||||
+ case HFS_EXT_CNID:
|
||||
+ mutex_lock_nested(&tree->tree_lock, EXTENTS_BTREE_MUTEX);
|
||||
+ break;
|
||||
+ case HFS_ATTR_CNID:
|
||||
+ mutex_lock_nested(&tree->tree_lock, ATTR_BTREE_MUTEX);
|
||||
+ break;
|
||||
+ default:
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/fs/hfs/bnode.c b/fs/hfs/bnode.c
|
||||
index b63a4df7327b6..c0a73a6ffb28b 100644
|
||||
--- a/fs/hfs/bnode.c
|
||||
+++ b/fs/hfs/bnode.c
|
||||
@@ -15,16 +15,31 @@
|
||||
|
||||
#include "btree.h"
|
||||
|
||||
-void hfs_bnode_read(struct hfs_bnode *node, void *buf,
|
||||
- int off, int len)
|
||||
+void hfs_bnode_read(struct hfs_bnode *node, void *buf, int off, int len)
|
||||
{
|
||||
struct page *page;
|
||||
+ int pagenum;
|
||||
+ int bytes_read;
|
||||
+ int bytes_to_read;
|
||||
+ void *vaddr;
|
||||
|
||||
off += node->page_offset;
|
||||
- page = node->page[0];
|
||||
+ pagenum = off >> PAGE_SHIFT;
|
||||
+ off &= ~PAGE_MASK; /* compute page offset for the first page */
|
||||
|
||||
- memcpy(buf, kmap(page) + off, len);
|
||||
- kunmap(page);
|
||||
+ for (bytes_read = 0; bytes_read < len; bytes_read += bytes_to_read) {
|
||||
+ if (pagenum >= node->tree->pages_per_bnode)
|
||||
+ break;
|
||||
+ page = node->page[pagenum];
|
||||
+ bytes_to_read = min_t(int, len - bytes_read, PAGE_SIZE - off);
|
||||
+
|
||||
+ vaddr = kmap_atomic(page);
|
||||
+ memcpy(buf + bytes_read, vaddr + off, bytes_to_read);
|
||||
+ kunmap_atomic(vaddr);
|
||||
+
|
||||
+ pagenum++;
|
||||
+ off = 0; /* page offset only applies to the first page */
|
||||
+ }
|
||||
}
|
||||
|
||||
u16 hfs_bnode_read_u16(struct hfs_bnode *node, int off)
|
||||
diff --git a/fs/hfs/btree.h b/fs/hfs/btree.h
|
||||
index 4ba45caf59392..0e6baee932453 100644
|
||||
--- a/fs/hfs/btree.h
|
||||
+++ b/fs/hfs/btree.h
|
||||
@@ -13,6 +13,13 @@ typedef int (*btree_keycmp)(const btree_key *, const btree_key *);
|
||||
|
||||
#define NODE_HASH_SIZE 256
|
||||
|
||||
+/* B-tree mutex nested subclasses */
|
||||
+enum hfs_btree_mutex_classes {
|
||||
+ CATALOG_BTREE_MUTEX,
|
||||
+ EXTENTS_BTREE_MUTEX,
|
||||
+ ATTR_BTREE_MUTEX,
|
||||
+};
|
||||
+
|
||||
/* A HFS BTree held in memory */
|
||||
struct hfs_btree {
|
||||
struct super_block *sb;
|
||||
diff --git a/fs/hfs/super.c b/fs/hfs/super.c
|
||||
index 44d07c9e3a7f0..12d9bae393631 100644
|
||||
--- a/fs/hfs/super.c
|
||||
+++ b/fs/hfs/super.c
|
||||
@@ -420,14 +420,12 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
if (!res) {
|
||||
if (fd.entrylength > sizeof(rec) || fd.entrylength < 0) {
|
||||
res = -EIO;
|
||||
- goto bail;
|
||||
+ goto bail_hfs_find;
|
||||
}
|
||||
hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength);
|
||||
}
|
||||
- if (res) {
|
||||
- hfs_find_exit(&fd);
|
||||
- goto bail_no_root;
|
||||
- }
|
||||
+ if (res)
|
||||
+ goto bail_hfs_find;
|
||||
res = -EINVAL;
|
||||
root_inode = hfs_iget(sb, &fd.search_key->cat, &rec);
|
||||
hfs_find_exit(&fd);
|
||||
@@ -443,6 +441,8 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
/* everything's okay */
|
||||
return 0;
|
||||
|
||||
+bail_hfs_find:
|
||||
+ hfs_find_exit(&fd);
|
||||
bail_no_root:
|
||||
pr_err("get root inode failed\n");
|
||||
bail:
|
||||
diff --git a/fs/internal.h b/fs/internal.h
|
||||
index 6aeae7ef33803..728f8d70d7f1d 100644
|
||||
--- a/fs/internal.h
|
||||
+++ b/fs/internal.h
|
||||
@@ -61,7 +61,6 @@ extern void __init chrdev_init(void);
|
||||
*/
|
||||
extern const struct fs_context_operations legacy_fs_context_ops;
|
||||
extern int parse_monolithic_mount_data(struct fs_context *, void *);
|
||||
-extern void fc_drop_locked(struct fs_context *);
|
||||
extern void vfs_clean_context(struct fs_context *fc);
|
||||
extern int finish_clean_context(struct fs_context *fc);
|
||||
|
||||
diff --git a/fs/iomap/seek.c b/fs/iomap/seek.c
|
||||
index dab1b02eba5b7..ce6fb810854fe 100644
|
||||
--- a/fs/iomap/seek.c
|
||||
+++ b/fs/iomap/seek.c
|
||||
@@ -35,23 +35,20 @@ loff_t
|
||||
iomap_seek_hole(struct inode *inode, loff_t offset, const struct iomap_ops *ops)
|
||||
{
|
||||
loff_t size = i_size_read(inode);
|
||||
- loff_t length = size - offset;
|
||||
loff_t ret;
|
||||
|
||||
/* Nothing to be found before or beyond the end of the file. */
|
||||
if (offset < 0 || offset >= size)
|
||||
return -ENXIO;
|
||||
|
||||
- while (length > 0) {
|
||||
- ret = iomap_apply(inode, offset, length, IOMAP_REPORT, ops,
|
||||
- &offset, iomap_seek_hole_actor);
|
||||
+ while (offset < size) {
|
||||
+ ret = iomap_apply(inode, offset, size - offset, IOMAP_REPORT,
|
||||
+ ops, &offset, iomap_seek_hole_actor);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret == 0)
|
||||
break;
|
||||
-
|
||||
offset += ret;
|
||||
- length -= ret;
|
||||
}
|
||||
|
||||
return offset;
|
||||
@@ -83,27 +80,23 @@ loff_t
|
||||
iomap_seek_data(struct inode *inode, loff_t offset, const struct iomap_ops *ops)
|
||||
{
|
||||
loff_t size = i_size_read(inode);
|
||||
- loff_t length = size - offset;
|
||||
loff_t ret;
|
||||
|
||||
/* Nothing to be found before or beyond the end of the file. */
|
||||
if (offset < 0 || offset >= size)
|
||||
return -ENXIO;
|
||||
|
||||
- while (length > 0) {
|
||||
- ret = iomap_apply(inode, offset, length, IOMAP_REPORT, ops,
|
||||
- &offset, iomap_seek_data_actor);
|
||||
+ while (offset < size) {
|
||||
+ ret = iomap_apply(inode, offset, size - offset, IOMAP_REPORT,
|
||||
+ ops, &offset, iomap_seek_data_actor);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret == 0)
|
||||
- break;
|
||||
-
|
||||
+ return offset;
|
||||
offset += ret;
|
||||
- length -= ret;
|
||||
}
|
||||
|
||||
- if (length <= 0)
|
||||
- return -ENXIO;
|
||||
- return offset;
|
||||
+ /* We've reached the end of the file without finding data */
|
||||
+ return -ENXIO;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iomap_seek_data);
|
||||
diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h
|
||||
index 37e1e8f7f08da..5b44b0195a28a 100644
|
||||
--- a/include/linux/fs_context.h
|
||||
+++ b/include/linux/fs_context.h
|
||||
@@ -139,6 +139,7 @@ extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
|
||||
extern int generic_parse_monolithic(struct fs_context *fc, void *data);
|
||||
extern int vfs_get_tree(struct fs_context *fc);
|
||||
extern void put_fs_context(struct fs_context *fc);
|
||||
+extern void fc_drop_locked(struct fs_context *fc);
|
||||
|
||||
/*
|
||||
* sget() wrappers to be called from the ->get_tree() op.
|
||||
diff --git a/include/net/busy_poll.h b/include/net/busy_poll.h
|
||||
index 73af4a64a5999..40296ed976a97 100644
|
||||
--- a/include/net/busy_poll.h
|
||||
+++ b/include/net/busy_poll.h
|
||||
@@ -38,7 +38,7 @@ static inline bool net_busy_loop_on(void)
|
||||
|
||||
static inline bool sk_can_busy_loop(const struct sock *sk)
|
||||
{
|
||||
- return sk->sk_ll_usec && !signal_pending(current);
|
||||
+ return READ_ONCE(sk->sk_ll_usec) && !signal_pending(current);
|
||||
}
|
||||
|
||||
bool sk_busy_loop_end(void *p, unsigned long start_time);
|
||||
diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h
|
||||
index 14a0d22c91133..bf23a2ed92da8 100644
|
||||
--- a/include/net/sctp/constants.h
|
||||
+++ b/include/net/sctp/constants.h
|
||||
@@ -342,8 +342,7 @@ enum {
|
||||
#define SCTP_SCOPE_POLICY_MAX SCTP_SCOPE_POLICY_LINK
|
||||
|
||||
/* Based on IPv4 scoping <draft-stewart-tsvwg-sctp-ipv4-00.txt>,
|
||||
- * SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 198.18.0.0/24,
|
||||
- * 192.88.99.0/24.
|
||||
+ * SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 192.88.99.0/24.
|
||||
* Also, RFC 8.4, non-unicast addresses are not considered valid SCTP
|
||||
* addresses.
|
||||
*/
|
||||
@@ -351,7 +350,6 @@ enum {
|
||||
((htonl(INADDR_BROADCAST) == a) || \
|
||||
ipv4_is_multicast(a) || \
|
||||
ipv4_is_zeronet(a) || \
|
||||
- ipv4_is_test_198(a) || \
|
||||
ipv4_is_anycast_6to4(a))
|
||||
|
||||
/* Flags used for the bind address copy functions. */
|
||||
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
|
||||
index d189eff4c92ff..583790d2060ce 100644
|
||||
--- a/kernel/cgroup/cgroup-v1.c
|
||||
+++ b/kernel/cgroup/cgroup-v1.c
|
||||
@@ -1225,9 +1225,7 @@ int cgroup1_get_tree(struct fs_context *fc)
|
||||
ret = cgroup_do_get_tree(fc);
|
||||
|
||||
if (!ret && percpu_ref_is_dying(&ctx->root->cgrp.self.refcnt)) {
|
||||
- struct super_block *sb = fc->root->d_sb;
|
||||
- dput(fc->root);
|
||||
- deactivate_locked_super(sb);
|
||||
+ fc_drop_locked(fc);
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
|
||||
index 350ebf5051f97..fcef5f0c60b8b 100644
|
||||
--- a/kernel/rcu/tasks.h
|
||||
+++ b/kernel/rcu/tasks.h
|
||||
@@ -908,10 +908,9 @@ static bool trc_inspect_reader(struct task_struct *t, void *arg)
|
||||
in_qs = likely(!t->trc_reader_nesting);
|
||||
}
|
||||
|
||||
- // Mark as checked. Because this is called from the grace-period
|
||||
- // kthread, also remove the task from the holdout list.
|
||||
+ // Mark as checked so that the grace-period kthread will
|
||||
+ // remove it from the holdout list.
|
||||
t->trc_reader_checked = true;
|
||||
- trc_del_holdout(t);
|
||||
|
||||
if (in_qs)
|
||||
return true; // Already in quiescent state, done!!!
|
||||
@@ -938,7 +937,6 @@ static void trc_wait_for_one_reader(struct task_struct *t,
|
||||
// The current task had better be in a quiescent state.
|
||||
if (t == current) {
|
||||
t->trc_reader_checked = true;
|
||||
- trc_del_holdout(t);
|
||||
WARN_ON_ONCE(t->trc_reader_nesting);
|
||||
return;
|
||||
}
|
||||
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
|
||||
index 50142fc08902d..f148eacda55a9 100644
|
||||
--- a/kernel/workqueue.c
|
||||
+++ b/kernel/workqueue.c
|
||||
@@ -3676,15 +3676,21 @@ static void pwq_unbound_release_workfn(struct work_struct *work)
|
||||
unbound_release_work);
|
||||
struct workqueue_struct *wq = pwq->wq;
|
||||
struct worker_pool *pool = pwq->pool;
|
||||
- bool is_last;
|
||||
+ bool is_last = false;
|
||||
|
||||
- if (WARN_ON_ONCE(!(wq->flags & WQ_UNBOUND)))
|
||||
- return;
|
||||
+ /*
|
||||
+ * when @pwq is not linked, it doesn't hold any reference to the
|
||||
+ * @wq, and @wq is invalid to access.
|
||||
+ */
|
||||
+ if (!list_empty(&pwq->pwqs_node)) {
|
||||
+ if (WARN_ON_ONCE(!(wq->flags & WQ_UNBOUND)))
|
||||
+ return;
|
||||
|
||||
- mutex_lock(&wq->mutex);
|
||||
- list_del_rcu(&pwq->pwqs_node);
|
||||
- is_last = list_empty(&wq->pwqs);
|
||||
- mutex_unlock(&wq->mutex);
|
||||
+ mutex_lock(&wq->mutex);
|
||||
+ list_del_rcu(&pwq->pwqs_node);
|
||||
+ is_last = list_empty(&wq->pwqs);
|
||||
+ mutex_unlock(&wq->mutex);
|
||||
+ }
|
||||
|
||||
mutex_lock(&wq_pool_mutex);
|
||||
put_unbound_pool(pool);
|
||||
diff --git a/net/802/garp.c b/net/802/garp.c
|
||||
index 400bd857e5f57..f6012f8e59f00 100644
|
||||
--- a/net/802/garp.c
|
||||
+++ b/net/802/garp.c
|
||||
@@ -203,6 +203,19 @@ static void garp_attr_destroy(struct garp_applicant *app, struct garp_attr *attr
|
||||
kfree(attr);
|
||||
}
|
||||
|
||||
+static void garp_attr_destroy_all(struct garp_applicant *app)
|
||||
+{
|
||||
+ struct rb_node *node, *next;
|
||||
+ struct garp_attr *attr;
|
||||
+
|
||||
+ for (node = rb_first(&app->gid);
|
||||
+ next = node ? rb_next(node) : NULL, node != NULL;
|
||||
+ node = next) {
|
||||
+ attr = rb_entry(node, struct garp_attr, node);
|
||||
+ garp_attr_destroy(app, attr);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int garp_pdu_init(struct garp_applicant *app)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
@@ -609,6 +622,7 @@ void garp_uninit_applicant(struct net_device *dev, struct garp_application *appl
|
||||
|
||||
spin_lock_bh(&app->lock);
|
||||
garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU);
|
||||
+ garp_attr_destroy_all(app);
|
||||
garp_pdu_queue(app);
|
||||
spin_unlock_bh(&app->lock);
|
||||
|
||||
diff --git a/net/802/mrp.c b/net/802/mrp.c
|
||||
index bea6e43d45a0d..35e04cc5390c4 100644
|
||||
--- a/net/802/mrp.c
|
||||
+++ b/net/802/mrp.c
|
||||
@@ -292,6 +292,19 @@ static void mrp_attr_destroy(struct mrp_applicant *app, struct mrp_attr *attr)
|
||||
kfree(attr);
|
||||
}
|
||||
|
||||
+static void mrp_attr_destroy_all(struct mrp_applicant *app)
|
||||
+{
|
||||
+ struct rb_node *node, *next;
|
||||
+ struct mrp_attr *attr;
|
||||
+
|
||||
+ for (node = rb_first(&app->mad);
|
||||
+ next = node ? rb_next(node) : NULL, node != NULL;
|
||||
+ node = next) {
|
||||
+ attr = rb_entry(node, struct mrp_attr, node);
|
||||
+ mrp_attr_destroy(app, attr);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int mrp_pdu_init(struct mrp_applicant *app)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
@@ -895,6 +908,7 @@ void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *appl)
|
||||
|
||||
spin_lock_bh(&app->lock);
|
||||
mrp_mad_event(app, MRP_EVENT_TX);
|
||||
+ mrp_attr_destroy_all(app);
|
||||
mrp_pdu_queue(app);
|
||||
spin_unlock_bh(&app->lock);
|
||||
|
||||
diff --git a/net/core/sock.c b/net/core/sock.c
|
||||
index 2003c5ebb4c2e..37d732fe3fcf9 100644
|
||||
--- a/net/core/sock.c
|
||||
+++ b/net/core/sock.c
|
||||
@@ -1172,7 +1172,7 @@ set_sndbuf:
|
||||
if (val < 0)
|
||||
ret = -EINVAL;
|
||||
else
|
||||
- sk->sk_ll_usec = val;
|
||||
+ WRITE_ONCE(sk->sk_ll_usec, val);
|
||||
}
|
||||
break;
|
||||
case SO_PREFER_BUSY_POLL:
|
||||
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
|
||||
index b7ffb4f227a45..6062ad1d5b510 100644
|
||||
--- a/net/ipv6/ip6_output.c
|
||||
+++ b/net/ipv6/ip6_output.c
|
||||
@@ -60,10 +60,38 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *
|
||||
{
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct net_device *dev = dst->dev;
|
||||
+ unsigned int hh_len = LL_RESERVED_SPACE(dev);
|
||||
+ int delta = hh_len - skb_headroom(skb);
|
||||
const struct in6_addr *nexthop;
|
||||
struct neighbour *neigh;
|
||||
int ret;
|
||||
|
||||
+ /* Be paranoid, rather than too clever. */
|
||||
+ if (unlikely(delta > 0) && dev->header_ops) {
|
||||
+ /* pskb_expand_head() might crash, if skb is shared */
|
||||
+ if (skb_shared(skb)) {
|
||||
+ struct sk_buff *nskb = skb_clone(skb, GFP_ATOMIC);
|
||||
+
|
||||
+ if (likely(nskb)) {
|
||||
+ if (skb->sk)
|
||||
+ skb_set_owner_w(nskb, skb->sk);
|
||||
+ consume_skb(skb);
|
||||
+ } else {
|
||||
+ kfree_skb(skb);
|
||||
+ }
|
||||
+ skb = nskb;
|
||||
+ }
|
||||
+ if (skb &&
|
||||
+ pskb_expand_head(skb, SKB_DATA_ALIGN(delta), 0, GFP_ATOMIC)) {
|
||||
+ kfree_skb(skb);
|
||||
+ skb = NULL;
|
||||
+ }
|
||||
+ if (!skb) {
|
||||
+ IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTDISCARDS);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) {
|
||||
struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
|
||||
|
||||
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c
|
||||
index 25192b378e2ec..9b444df5e53ee 100644
|
||||
--- a/net/sctp/protocol.c
|
||||
+++ b/net/sctp/protocol.c
|
||||
@@ -398,7 +398,8 @@ static enum sctp_scope sctp_v4_scope(union sctp_addr *addr)
|
||||
retval = SCTP_SCOPE_LINK;
|
||||
} else if (ipv4_is_private_10(addr->v4.sin_addr.s_addr) ||
|
||||
ipv4_is_private_172(addr->v4.sin_addr.s_addr) ||
|
||||
- ipv4_is_private_192(addr->v4.sin_addr.s_addr)) {
|
||||
+ ipv4_is_private_192(addr->v4.sin_addr.s_addr) ||
|
||||
+ ipv4_is_test_198(addr->v4.sin_addr.s_addr)) {
|
||||
retval = SCTP_SCOPE_PRIVATE;
|
||||
} else {
|
||||
retval = SCTP_SCOPE_GLOBAL;
|
||||
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
|
||||
index 5d1192ceb1397..68a9591d0144c 100644
|
||||
--- a/net/unix/af_unix.c
|
||||
+++ b/net/unix/af_unix.c
|
||||
@@ -1522,6 +1522,53 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
+static void unix_peek_fds(struct scm_cookie *scm, struct sk_buff *skb)
|
||||
+{
|
||||
+ scm->fp = scm_fp_dup(UNIXCB(skb).fp);
|
||||
+
|
||||
+ /*
|
||||
+ * Garbage collection of unix sockets starts by selecting a set of
|
||||
+ * candidate sockets which have reference only from being in flight
|
||||
+ * (total_refs == inflight_refs). This condition is checked once during
|
||||
+ * the candidate collection phase, and candidates are marked as such, so
|
||||
+ * that non-candidates can later be ignored. While inflight_refs is
|
||||
+ * protected by unix_gc_lock, total_refs (file count) is not, hence this
|
||||
+ * is an instantaneous decision.
|
||||
+ *
|
||||
+ * Once a candidate, however, the socket must not be reinstalled into a
|
||||
+ * file descriptor while the garbage collection is in progress.
|
||||
+ *
|
||||
+ * If the above conditions are met, then the directed graph of
|
||||
+ * candidates (*) does not change while unix_gc_lock is held.
|
||||
+ *
|
||||
+ * Any operations that changes the file count through file descriptors
|
||||
+ * (dup, close, sendmsg) does not change the graph since candidates are
|
||||
+ * not installed in fds.
|
||||
+ *
|
||||
+ * Dequeing a candidate via recvmsg would install it into an fd, but
|
||||
+ * that takes unix_gc_lock to decrement the inflight count, so it's
|
||||
+ * serialized with garbage collection.
|
||||
+ *
|
||||
+ * MSG_PEEK is special in that it does not change the inflight count,
|
||||
+ * yet does install the socket into an fd. The following lock/unlock
|
||||
+ * pair is to ensure serialization with garbage collection. It must be
|
||||
+ * done between incrementing the file count and installing the file into
|
||||
+ * an fd.
|
||||
+ *
|
||||
+ * If garbage collection starts after the barrier provided by the
|
||||
+ * lock/unlock, then it will see the elevated refcount and not mark this
|
||||
+ * as a candidate. If a garbage collection is already in progress
|
||||
+ * before the file count was incremented, then the lock/unlock pair will
|
||||
+ * ensure that garbage collection is finished before progressing to
|
||||
+ * installing the fd.
|
||||
+ *
|
||||
+ * (*) A -> B where B is on the queue of A or B is on the queue of C
|
||||
+ * which is on the queue of listening socket A.
|
||||
+ */
|
||||
+ spin_lock(&unix_gc_lock);
|
||||
+ spin_unlock(&unix_gc_lock);
|
||||
+}
|
||||
+
|
||||
static int unix_scm_to_skb(struct scm_cookie *scm, struct sk_buff *skb, bool send_fds)
|
||||
{
|
||||
int err = 0;
|
||||
@@ -2171,7 +2218,7 @@ static int unix_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
sk_peek_offset_fwd(sk, size);
|
||||
|
||||
if (UNIXCB(skb).fp)
|
||||
- scm.fp = scm_fp_dup(UNIXCB(skb).fp);
|
||||
+ unix_peek_fds(&scm, skb);
|
||||
}
|
||||
err = (flags & MSG_TRUNC) ? skb->len - skip : size;
|
||||
|
||||
@@ -2414,7 +2461,7 @@ unlock:
|
||||
/* It is questionable, see note in unix_dgram_recvmsg.
|
||||
*/
|
||||
if (UNIXCB(skb).fp)
|
||||
- scm.fp = scm_fp_dup(UNIXCB(skb).fp);
|
||||
+ unix_peek_fds(&scm, skb);
|
||||
|
||||
sk_peek_offset_fwd(sk, chunk);
|
||||
|
||||
4318
patch/kernel/archive/sunxi-5.13/patch-5.13.7-8.patch
Normal file
4318
patch/kernel/archive/sunxi-5.13/patch-5.13.7-8.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,59 +0,0 @@
|
||||
diff --git a/arch/arm/dts/sun50i-a64-orangepi-win.dts b/arch/arm/dts/sun50i-a64-orangepi-win.dts
|
||||
index b0c64f7..50d921f 100644
|
||||
--- a/arch/arm/dts/sun50i-a64-orangepi-win.dts
|
||||
+++ b/arch/arm/dts/sun50i-a64-orangepi-win.dts
|
||||
@@ -53,6 +53,7 @@
|
||||
|
||||
aliases {
|
||||
ethernet0 = &emac;
|
||||
+ ethernet1 = &brcmf;
|
||||
serial0 = &uart0;
|
||||
serial1 = &uart1;
|
||||
serial2 = &uart2;
|
||||
@@ -151,6 +152,16 @@
|
||||
};
|
||||
};
|
||||
|
||||
+&i2c1 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&i2c1_pins>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&i2c1_pins {
|
||||
+ bias-pull-up;
|
||||
+};
|
||||
+
|
||||
&mmc0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mmc0_pins>;
|
||||
@@ -197,6 +197,16 @@
|
||||
};
|
||||
};
|
||||
|
||||
+&mmc2 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&mmc2_pins>;
|
||||
+ vmmc-supply = <®_dcdc1>;
|
||||
+ bus-width = <8>;
|
||||
+ non-removable;
|
||||
+ cap-mmc-hw-reset;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
&ohci0 {
|
||||
status = "okay";
|
||||
};
|
||||
diff --git a/configs/orangepi_win_defconfig b/configs/orangepi_win_defconfig
|
||||
index 2839503..5b0780d 100644
|
||||
--- a/configs/orangepi_win_defconfig
|
||||
+++ b/configs/orangepi_win_defconfig
|
||||
@@ -1,6 +1,8 @@
|
||||
CONFIG_ARM=y
|
||||
CONFIG_ARCH_SUNXI=y
|
||||
CONFIG_SPL=y
|
||||
+CONFIG_MMC0_CD_PIN="PH13"
|
||||
+CONFIG_MMC_SUNXI_SLOT_EXTRA=2
|
||||
CONFIG_MACH_SUN50I=y
|
||||
CONFIG_RESERVE_ALLWINNER_BOOT0_HEADER=y
|
||||
CONFIG_MACPWR="PD14"
|
||||
222
patch/u-boot/u-boot-sunxi/add-orangepi3.patch
Normal file
222
patch/u-boot/u-boot-sunxi/add-orangepi3.patch
Normal file
@ -0,0 +1,222 @@
|
||||
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
|
||||
index dda4e59..6d3cca2 100644
|
||||
--- a/arch/arm/dts/Makefile
|
||||
+++ b/arch/arm/dts/Makefile
|
||||
@@ -403,7 +403,8 @@ dtb-$(CONFIG_MACH_SUN50I_H5) += \
|
||||
sun50i-h5-orangepi-prime.dtb \
|
||||
sun50i-h5-orangepi-zero-plus2.dtb
|
||||
dtb-$(CONFIG_MACH_SUN50I_H6) += \
|
||||
sun50i-h6-beelink-gs1.dtb \
|
||||
+ sun50i-h6-orangepi-3.dtb \
|
||||
sun50i-h6-orangepi-lite2.dtb \
|
||||
sun50i-h6-orangepi-one-plus.dtb \
|
||||
sun50i-h6-pine-h64.dtb
|
||||
diff --git a/arch/arm/dts/sun50i-h6-orangepi-3.dts b/arch/arm/dts/sun50i-h6-orangepi-3.dts
|
||||
new file mode 100644
|
||||
index 0000000..dffd648
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/dts/sun50i-h6-orangepi-3.dts
|
||||
@@ -0,0 +1,179 @@
|
||||
+// SPDX-License-Identifier: (GPL-2.0+ or MIT)
|
||||
+/*
|
||||
+ * Copyright (C) 2018 Amarula Solutions
|
||||
+ * Author: Jagan Teki <jagan@amarulasolutions.com>
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "sun50i-h6.dtsi"
|
||||
+
|
||||
+#include <dt-bindings/gpio/gpio.h>
|
||||
+
|
||||
+/ {
|
||||
+ model = "OrangePi 3";
|
||||
+ compatible = "xunlong,orangepi-3", "allwinner,sun50i-h6";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ ethernet0 = &emac;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&emac {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&ext_rgmii_pins>;
|
||||
+ phy-mode = "rgmii";
|
||||
+ phy-handle = <&ext_rgmii_phy>;
|
||||
+ phy-supply = <®_aldo2>;
|
||||
+ allwinner,rx-delay-ps = <200>;
|
||||
+ allwinner,tx-delay-ps = <200>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&mdio {
|
||||
+ ext_rgmii_phy: ethernet-phy@1 {
|
||||
+ compatible = "ethernet-phy-ieee802.3-c22";
|
||||
+ reg = <1>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&mmc0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&mmc0_pins>;
|
||||
+ vmmc-supply = <®_cldo1>;
|
||||
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>;
|
||||
+ bus-width = <4>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&mmc2 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&mmc2_pins>;
|
||||
+ vmmc-supply = <®_cldo1>;
|
||||
+ non-removable;
|
||||
+ cap-mmc-hw-reset;
|
||||
+ bus-width = <8>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&r_i2c {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ axp805: pmic@36 {
|
||||
+ compatible = "x-powers,axp805", "x-powers,axp806";
|
||||
+ reg = <0x36>;
|
||||
+ interrupt-parent = <&r_intc>;
|
||||
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ x-powers,self-working-mode;
|
||||
+
|
||||
+ regulators {
|
||||
+ reg_aldo1: aldo1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-pl";
|
||||
+ };
|
||||
+
|
||||
+ reg_aldo2: aldo2 {
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-ac200";
|
||||
+ };
|
||||
+
|
||||
+ reg_aldo3: aldo3 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc25-dram";
|
||||
+ };
|
||||
+
|
||||
+ reg_bldo1: bldo1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "vcc-bias-pll";
|
||||
+ };
|
||||
+
|
||||
+ reg_bldo2: bldo2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "vcc-efuse-pcie-hdmi-io";
|
||||
+ };
|
||||
+
|
||||
+ reg_bldo3: bldo3 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "vcc-dcxoio";
|
||||
+ };
|
||||
+
|
||||
+ bldo4 {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+
|
||||
+ reg_cldo1: cldo1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-3v3";
|
||||
+ };
|
||||
+
|
||||
+ reg_cldo2: cldo2 {
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-wifi-1";
|
||||
+ };
|
||||
+
|
||||
+ reg_cldo3: cldo3 {
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-wifi-2";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdca: dcdca {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <810000>;
|
||||
+ regulator-max-microvolt = <1080000>;
|
||||
+ regulator-name = "vdd-cpu";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdcc: dcdcc {
|
||||
+ regulator-min-microvolt = <810000>;
|
||||
+ regulator-max-microvolt = <1080000>;
|
||||
+ regulator-name = "vdd-gpu";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdcd: dcdcd {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <960000>;
|
||||
+ regulator-max-microvolt = <960000>;
|
||||
+ regulator-name = "vdd-sys";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdce: dcdce {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <1200000>;
|
||||
+ regulator-name = "vcc-dram";
|
||||
+ };
|
||||
+
|
||||
+ sw {
|
||||
+ /* unused */
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&uart0_ph_pins>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
diff --git a/configs/orangepi_3_defconfig b/configs/orangepi_3_defconfig
|
||||
new file mode 100644
|
||||
index 0000000..187818e
|
||||
--- /dev/null
|
||||
+++ b/configs/orangepi_3_defconfig
|
||||
@@ -0,0 +1,18 @@
|
||||
+CONFIG_ARM=y
|
||||
+CONFIG_ARCH_SUNXI=y
|
||||
+CONFIG_MACH_SUN50I_H6=y
|
||||
+CONFIG_SUNXI_DRAM_H6_LPDDR3=y
|
||||
+CONFIG_SUNXI_DRAM_DDR3=n
|
||||
+CONFIG_DRAM_ODT_EN=y
|
||||
+CONFIG_MMC0_CD_PIN="PF6"
|
||||
+CONFIG_MMC_SUNXI_SLOT_EXTRA=2
|
||||
+CONFIG_HDMI_DDC_EN="PH2"
|
||||
+# CONFIG_PSCI_RESET is not set
|
||||
+CONFIG_DEFAULT_DEVICE_TREE="sun50i-h6-orangepi-3"
|
||||
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
|
||||
+CONFIG_SPL=y
|
||||
+# CONFIG_CMD_FLASH is not set
|
||||
+# CONFIG_CMD_FPGA is not set
|
||||
+# CONFIG_SPL_DOS_PARTITION is not set
|
||||
+# CONFIG_SPL_ISO_PARTITION is not set
|
||||
+# CONFIG_SPL_EFI_PARTITION is not set
|
||||
Loading…
Reference in New Issue
Block a user