Merge android-4.19.111 (bfe2901
) into msm-4.19
* refs/heads/tmp-bfe2901: Linux 4.19.111 batman-adv: Avoid free/alloc race when handling OGM2 buffer efi: Add a sanity check to efivar_store_raw() net/smc: cancel event worker during device removal net/smc: check for valid ib_client_data ipv6: restrict IPV6_ADDRFORM operation i2c: acpi: put device when verifying client fails iommu/vt-d: Ignore devices with out-of-spec domain number iommu/vt-d: Fix the wrong printing in RHSA parsing netfilter: nft_tunnel: add missing attribute validation for tunnels netfilter: nft_payload: add missing attribute validation for payload csum flags netfilter: cthelper: add missing attribute validation for cthelper perf bench futex-wake: Restore thread count default to online CPU count nl80211: add missing attribute validation for channel switch nl80211: add missing attribute validation for beacon report scanning nl80211: add missing attribute validation for critical protocol indication i2c: gpio: suppress error on probe defer drm/i915/gvt: Fix unnecessary schedule timer when no vGPU exits pinctrl: core: Remove extra kref_get which blocks hogs being freed pinctrl: meson-gxl: fix GPIOX sdio pins batman-adv: Don't schedule OGM for disabled interface iommu/vt-d: Fix a bug in intel_iommu_iova_to_phys() for huge page iommu/vt-d: dmar: replace WARN_TAINT with pr_warn + add_taint iommu/dma: Fix MSI reservation allocation x86/mce: Fix logic and comments around MSR_PPIN_CTL mt76: fix array overflow on receiving too many fragments for a packet efi: Make efi_rts_work accessible to efi page fault handler efi: Fix a race and a buffer overflow while reading efivars via sysfs macintosh: windfarm: fix MODINFO regression ARC: define __ALIGN_STR and __ALIGN symbols for ARC KVM: x86: clear stale x86_emulate_ctxt->intercept value gfs2_atomic_open(): fix O_EXCL|O_CREAT handling on cold dcache cifs_atomic_open(): fix double-put on late allocation failure ktest: Add timeout for ssh sync testing drm/amd/display: remove duplicated assignment to grph_obj_type workqueue: don't use wq_select_unbound_cpu() for bound works netfilter: x_tables: xt_mttg_seq_next should increase position index netfilter: xt_recent: recent_seq_next should increase position index netfilter: synproxy: synproxy_cpu_seq_next should increase position index netfilter: nf_conntrack: ct_cpu_seq_next should increase position index iommu/vt-d: quirk_ioat_snb_local_iommu: replace WARN_TAINT with pr_warn + add_taint virtio-blk: fix hw_queue stopped on arbitrary error iwlwifi: mvm: Do not require PHY_SKU NVM section for 3168 devices cgroup: Iterate tasks that did not finish do_exit() cgroup: cgroup_procs_next should increase position index macvlan: add cond_resched() during multicast processing net: fec: validate the new settings in fec_enet_set_coalesce() slip: make slhc_compress() more robust against malicious packets bonding/alb: make sure arp header is pulled before accessing it devlink: validate length of region addr/len tipc: add missing attribute validation for MTU property net/ipv6: remove the old peer route if change it to a new one net/ipv6: need update peer route when modify metric selftests/net/fib_tests: update addr_metric_test for peer route testing net: phy: fix MDIO bus PM PHY resuming nfc: add missing attribute validation for vendor subcommand nfc: add missing attribute validation for deactivate target nfc: add missing attribute validation for SE API team: add missing attribute validation for array index team: add missing attribute validation for port ifindex net: fq: add missing attribute validation for orphan mask macsec: add missing attribute validation for port can: add missing attribute validation for termination nl802154: add missing attribute validation for dev_type nl802154: add missing attribute validation fib: add missing attribute validation for tun_id devlink: validate length of param values net: memcg: fix lockdep splat in inet_csk_accept() net: memcg: late association of sock to memcg cgroup: memcg: net: do not associate sock with unrelated cgroup bnxt_en: reinitialize IRQs when MTU is modified sfc: detach from cb_page in efx_copy_channel() r8152: check disconnect status after long sleep net: systemport: fix index check to avoid an array out of bounds access net: stmmac: dwmac1000: Disable ACS if enhanced descs are not used net/packet: tpacket_rcv: do not increment ring index on drop net: nfc: fix bounds checking bugs on "pipe" net: macsec: update SCI upon MAC address change. netlink: Use netlink header as base to calculate bad attribute offset net/ipv6: use configured metric when add peer route ipvlan: don't deref eth hdr before checking it's set ipvlan: do not use cond_resched_rcu() in ipvlan_process_multicast() ipvlan: do not add hardware address of master to its unicast filter list ipvlan: add cond_resched_rcu() while processing muticast backlog ipv6/addrconf: call ipv6_mc_up() for non-Ethernet interface inet_diag: return classid for all socket types gre: fix uninit-value in __iptunnel_pull_header cgroup, netclassid: periodically release file_lock on classid updating net: phy: Avoid multiple suspends phy: Revert toggling reset changes. ANDROID: kbuild: fix module linker script flags for LTO ANDROID: kbuild: avoid excessively long argument lists UPSTREAM: cgroup: Iterate tasks that did not finish do_exit() ANDROID: update the ABI xml representation Revert "ANDROID: gki_defconfig: Temporarily disable CFI" ANDROID: GKI: dma-buf: Add support for XXX_cpu_access_umapped ops ANDROID: GKI: dma-buf: Add support to set a destructor on a dma-buf ANDROID: GKI: dma-buf: use spinlock to protect set/get name operation ANDROID: GKI: dma-buf: Add support to get flags associated with a buffer ANDROID: GKI: dma-buf: Add support for mapping buffers with DMA attributes ANDROID: GKI: dma-buf: Add support for partial cache maintenance ANDROID: GKI: arm64: mm: Support setting removed_dma_ops in arch_setup_dma_ops ANDROID: GKI: drivers: Add dma removed ops ANDROID: GKI: add dma_map_ops remap/unremap operations ANDROID: Add build.config files for ARM 32-bit ANDROID: GKI: update abi due to CONFIG_JUMP_LABEL being enabled ANDROID: GKI: enable CONFIG_JUMP_LABEL ANDROID: Add build.config.gki-debug.x86_64 ANDROID: Add build.config.gki-debug.aarch64 Conflicts: arch/arm64/mm/dma-mapping.c drivers/dma-buf/dma-buf.c include/linux/dma-buf.h include/linux/dma-mapping.h kernel/dma/removed.c Change-Id: Ib51bde74d4edba43447c670e9a8d5f9fd3691db2 Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
This commit is contained in:
commit
bf97791c2c
93 changed files with 73327 additions and 74115 deletions
|
@ -627,3 +627,10 @@ in your dentry operations instead.
|
|||
DCACHE_RCUACCESS is gone; having an RCU delay on dentry freeing is the
|
||||
default. DCACHE_NORCU opts out, and only d_alloc_pseudo() has any
|
||||
business doing so.
|
||||
--
|
||||
[mandatory]
|
||||
|
||||
[should've been added in 2016] stale comment in finish_open()
|
||||
nonwithstanding, failure exits in ->atomic_open() instances should
|
||||
*NOT* fput() the file, no matter what. Everything is handled by the
|
||||
caller.
|
||||
|
|
4
Makefile
4
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 110
|
||||
SUBLEVEL = 111
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
@ -853,7 +853,7 @@ LD_FLAGS_LTO_CLANG := -mllvm -import-instr-limit=5
|
|||
KBUILD_LDFLAGS += $(LD_FLAGS_LTO_CLANG)
|
||||
KBUILD_LDFLAGS_MODULE += $(LD_FLAGS_LTO_CLANG)
|
||||
|
||||
KBUILD_LDS_MODULE += $(srctree)/scripts/module-lto.lds
|
||||
KBUILD_LDFLAGS_MODULE += -T $(srctree)/scripts/module-lto.lds
|
||||
|
||||
# allow disabling only clang LTO where needed
|
||||
DISABLE_LTO_CLANG := -fno-lto
|
||||
|
|
146495
abi_gki_aarch64.xml
146495
abi_gki_aarch64.xml
File diff suppressed because it is too large
Load diff
|
@ -14,6 +14,8 @@
|
|||
#ifdef __ASSEMBLY__
|
||||
|
||||
#define ASM_NL ` /* use '`' to mark new line in macro */
|
||||
#define __ALIGN .align 4
|
||||
#define __ALIGN_STR __stringify(__ALIGN)
|
||||
|
||||
/* annotation for data we want in DCCM - if enabled in .config */
|
||||
.macro ARCFP_DATA nm
|
||||
|
|
|
@ -77,7 +77,9 @@ CONFIG_ARM_SCPI_PROTOCOL=y
|
|||
CONFIG_ARM64_CRYPTO=y
|
||||
CONFIG_CRYPTO_SHA2_ARM64_CE=y
|
||||
CONFIG_CRYPTO_AES_ARM64_CE_BLK=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_LTO_CLANG=y
|
||||
CONFIG_CFI_CLANG=y
|
||||
CONFIG_SHADOW_CALL_STACK=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
|
|
|
@ -49,6 +49,7 @@ CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
|||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
CONFIG_PCI_MSI=y
|
||||
CONFIG_IA32_EMULATION=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_LTO_CLANG=y
|
||||
CONFIG_CFI_CLANG=y
|
||||
CONFIG_MODULES=y
|
||||
|
|
|
@ -489,17 +489,18 @@ static void intel_ppin_init(struct cpuinfo_x86 *c)
|
|||
return;
|
||||
|
||||
if ((val & 3UL) == 1UL) {
|
||||
/* PPIN available but disabled: */
|
||||
/* PPIN locked in disabled mode */
|
||||
return;
|
||||
}
|
||||
|
||||
/* If PPIN is disabled, but not locked, try to enable: */
|
||||
if (!(val & 3UL)) {
|
||||
/* If PPIN is disabled, try to enable */
|
||||
if (!(val & 2UL)) {
|
||||
wrmsrl_safe(MSR_PPIN_CTL, val | 2UL);
|
||||
rdmsrl_safe(MSR_PPIN_CTL, &val);
|
||||
}
|
||||
|
||||
if ((val & 3UL) == 2UL)
|
||||
/* Is the enable bit set? */
|
||||
if (val & 2UL)
|
||||
set_cpu_cap(c, X86_FEATURE_INTEL_PPIN);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5112,6 +5112,7 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
|
|||
ctxt->fetch.ptr = ctxt->fetch.data;
|
||||
ctxt->fetch.end = ctxt->fetch.data + insn_len;
|
||||
ctxt->opcode_len = 1;
|
||||
ctxt->intercept = x86_intercept_none;
|
||||
if (insn_len > 0)
|
||||
memcpy(ctxt->fetch.data, insn, insn_len);
|
||||
else {
|
||||
|
|
4
build.config.allmodconfig.arm
Normal file
4
build.config.allmodconfig.arm
Normal file
|
@ -0,0 +1,4 @@
|
|||
. ${ROOT_DIR}/common/build.config.common
|
||||
. ${ROOT_DIR}/common/build.config.arm
|
||||
. ${ROOT_DIR}/common/build.config.allmodconfig
|
||||
|
12
build.config.arm
Normal file
12
build.config.arm
Normal file
|
@ -0,0 +1,12 @@
|
|||
ARCH=arm
|
||||
|
||||
CLANG_TRIPLE=arm-linux-gnueabi-
|
||||
CROSS_COMPILE=arm-linux-androidkernel-
|
||||
LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin
|
||||
|
||||
FILES="
|
||||
arch/arm/boot/Image.gz
|
||||
arch/arm/boot/Image
|
||||
vmlinux
|
||||
System.map
|
||||
"
|
2
build.config.gki-debug.aarch64
Normal file
2
build.config.gki-debug.aarch64
Normal file
|
@ -0,0 +1,2 @@
|
|||
. ${ROOT_DIR}/common/build.config.gki.aarch64
|
||||
TRIM_NONLISTED_KMI=""
|
2
build.config.gki-debug.x86_64
Normal file
2
build.config.gki-debug.x86_64
Normal file
|
@ -0,0 +1,2 @@
|
|||
. ${ROOT_DIR}/common/build.config.gki.x86_64
|
||||
TRIM_NONLISTED_KMI=""
|
|
@ -271,10 +271,12 @@ static blk_status_t virtio_queue_rq(struct blk_mq_hw_ctx *hctx,
|
|||
err = virtblk_add_req(vblk->vqs[qid].vq, vbr, vbr->sg, num);
|
||||
if (err) {
|
||||
virtqueue_kick(vblk->vqs[qid].vq);
|
||||
blk_mq_stop_hw_queue(hctx);
|
||||
/* Don't stop the queue if -ENOMEM: we may have failed to
|
||||
* bounce the buffer due to global resource outage.
|
||||
*/
|
||||
if (err == -ENOSPC)
|
||||
blk_mq_stop_hw_queue(hctx);
|
||||
spin_unlock_irqrestore(&vblk->vqs[qid].lock, flags);
|
||||
/* Out of mem doesn't actually happen, since we fall back
|
||||
* to direct descriptors */
|
||||
if (err == -ENOMEM || err == -ENOSPC)
|
||||
return BLK_STS_DEV_RESOURCE;
|
||||
return BLK_STS_IOERR;
|
||||
|
|
|
@ -396,21 +396,28 @@ static long dma_buf_set_name(struct dma_buf *dmabuf, const char __user *buf)
|
|||
return PTR_ERR(name);
|
||||
|
||||
mutex_lock(&dmabuf->lock);
|
||||
spin_lock(&dmabuf->name_lock);
|
||||
if (!list_empty(&dmabuf->attachments)) {
|
||||
ret = -EBUSY;
|
||||
kfree(name);
|
||||
goto out_unlock;
|
||||
}
|
||||
spin_lock(&dmabuf->name_lock);
|
||||
kfree(dmabuf->name);
|
||||
dmabuf->name = name;
|
||||
spin_unlock(&dmabuf->name_lock);
|
||||
|
||||
out_unlock:
|
||||
spin_unlock(&dmabuf->name_lock);
|
||||
mutex_unlock(&dmabuf->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int dma_buf_begin_cpu_access_umapped(struct dma_buf *dmabuf,
|
||||
enum dma_data_direction direction);
|
||||
|
||||
|
||||
static int dma_buf_end_cpu_access_umapped(struct dma_buf *dmabuf,
|
||||
enum dma_data_direction direction);
|
||||
|
||||
static long dma_buf_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
|
@ -621,7 +628,6 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
|
|||
dmabuf->size = exp_info->size;
|
||||
dmabuf->exp_name = exp_info->exp_name;
|
||||
dmabuf->owner = exp_info->owner;
|
||||
spin_lock_init(&dmabuf->name_lock);
|
||||
init_waitqueue_head(&dmabuf->poll);
|
||||
dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll;
|
||||
dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0;
|
||||
|
@ -646,6 +652,7 @@ struct dma_buf *dma_buf_export(const struct dma_buf_export_info *exp_info)
|
|||
dmabuf->file = file;
|
||||
|
||||
mutex_init(&dmabuf->lock);
|
||||
spin_lock_init(&dmabuf->name_lock);
|
||||
INIT_LIST_HEAD(&dmabuf->attachments);
|
||||
|
||||
dma_buf_ref_init(dmabuf);
|
||||
|
@ -1049,6 +1056,7 @@ static int dma_buf_begin_cpu_access_umapped(struct dma_buf *dmabuf,
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int dma_buf_begin_cpu_access_partial(struct dma_buf *dmabuf,
|
||||
enum dma_data_direction direction,
|
||||
unsigned int offset, unsigned int len)
|
||||
|
@ -1071,7 +1079,7 @@ int dma_buf_begin_cpu_access_partial(struct dma_buf *dmabuf,
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_buf_begin_cpu_access_partial);
|
||||
EXPORT_SYMBOL_GPL(dma_buf_begin_cpu_access_partial);
|
||||
|
||||
/**
|
||||
* dma_buf_end_cpu_access - Must be called after accessing a dma_buf from the
|
||||
|
@ -1099,7 +1107,7 @@ int dma_buf_end_cpu_access(struct dma_buf *dmabuf,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(dma_buf_end_cpu_access);
|
||||
|
||||
int dma_buf_end_cpu_access_umapped(struct dma_buf *dmabuf,
|
||||
static int dma_buf_end_cpu_access_umapped(struct dma_buf *dmabuf,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
int ret = 0;
|
||||
|
@ -1126,7 +1134,7 @@ int dma_buf_end_cpu_access_partial(struct dma_buf *dmabuf,
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_buf_end_cpu_access_partial);
|
||||
EXPORT_SYMBOL_GPL(dma_buf_end_cpu_access_partial);
|
||||
|
||||
/**
|
||||
* dma_buf_kmap - Map a page of the buffer object into kernel address space. The
|
||||
|
@ -1293,7 +1301,7 @@ int dma_buf_get_flags(struct dma_buf *dmabuf, unsigned long *flags)
|
|||
{
|
||||
int ret = 0;
|
||||
|
||||
if (WARN_ON(!dmabuf))
|
||||
if (WARN_ON(!dmabuf) || !flags)
|
||||
return -EINVAL;
|
||||
|
||||
if (dmabuf->ops->get_flags)
|
||||
|
@ -1301,7 +1309,7 @@ int dma_buf_get_flags(struct dma_buf *dmabuf, unsigned long *flags)
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_buf_get_flags);
|
||||
EXPORT_SYMBOL_GPL(dma_buf_get_flags);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static int dma_buf_debug_show(struct seq_file *s, void *unused)
|
||||
|
|
|
@ -139,13 +139,16 @@ static ssize_t
|
|||
efivar_attr_read(struct efivar_entry *entry, char *buf)
|
||||
{
|
||||
struct efi_variable *var = &entry->var;
|
||||
unsigned long size = sizeof(var->Data);
|
||||
char *str = buf;
|
||||
int ret;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
var->DataSize = 1024;
|
||||
if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data))
|
||||
ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data);
|
||||
var->DataSize = size;
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
if (var->Attributes & EFI_VARIABLE_NON_VOLATILE)
|
||||
|
@ -172,13 +175,16 @@ static ssize_t
|
|||
efivar_size_read(struct efivar_entry *entry, char *buf)
|
||||
{
|
||||
struct efi_variable *var = &entry->var;
|
||||
unsigned long size = sizeof(var->Data);
|
||||
char *str = buf;
|
||||
int ret;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
var->DataSize = 1024;
|
||||
if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data))
|
||||
ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data);
|
||||
var->DataSize = size;
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
str += sprintf(str, "0x%lx\n", var->DataSize);
|
||||
|
@ -189,12 +195,15 @@ static ssize_t
|
|||
efivar_data_read(struct efivar_entry *entry, char *buf)
|
||||
{
|
||||
struct efi_variable *var = &entry->var;
|
||||
unsigned long size = sizeof(var->Data);
|
||||
int ret;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
var->DataSize = 1024;
|
||||
if (efivar_entry_get(entry, &var->Attributes, &var->DataSize, var->Data))
|
||||
ret = efivar_entry_get(entry, &var->Attributes, &size, var->Data);
|
||||
var->DataSize = size;
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
memcpy(buf, var->Data, var->DataSize);
|
||||
|
@ -263,6 +272,9 @@ efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count)
|
|||
u8 *data;
|
||||
int err;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
if (is_compat()) {
|
||||
struct compat_efi_variable *compat;
|
||||
|
||||
|
@ -314,14 +326,16 @@ efivar_show_raw(struct efivar_entry *entry, char *buf)
|
|||
{
|
||||
struct efi_variable *var = &entry->var;
|
||||
struct compat_efi_variable *compat;
|
||||
unsigned long datasize = sizeof(var->Data);
|
||||
size_t size;
|
||||
int ret;
|
||||
|
||||
if (!entry || !buf)
|
||||
return 0;
|
||||
|
||||
var->DataSize = 1024;
|
||||
if (efivar_entry_get(entry, &entry->var.Attributes,
|
||||
&entry->var.DataSize, entry->var.Data))
|
||||
ret = efivar_entry_get(entry, &var->Attributes, &datasize, var->Data);
|
||||
var->DataSize = datasize;
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
||||
if (is_compat()) {
|
||||
|
|
|
@ -45,39 +45,7 @@
|
|||
#define __efi_call_virt(f, args...) \
|
||||
__efi_call_virt_pointer(efi.systab->runtime, f, args)
|
||||
|
||||
/* efi_runtime_service() function identifiers */
|
||||
enum efi_rts_ids {
|
||||
GET_TIME,
|
||||
SET_TIME,
|
||||
GET_WAKEUP_TIME,
|
||||
SET_WAKEUP_TIME,
|
||||
GET_VARIABLE,
|
||||
GET_NEXT_VARIABLE,
|
||||
SET_VARIABLE,
|
||||
QUERY_VARIABLE_INFO,
|
||||
GET_NEXT_HIGH_MONO_COUNT,
|
||||
UPDATE_CAPSULE,
|
||||
QUERY_CAPSULE_CAPS,
|
||||
};
|
||||
|
||||
/*
|
||||
* efi_runtime_work: Details of EFI Runtime Service work
|
||||
* @arg<1-5>: EFI Runtime Service function arguments
|
||||
* @status: Status of executing EFI Runtime Service
|
||||
* @efi_rts_id: EFI Runtime Service function identifier
|
||||
* @efi_rts_comp: Struct used for handling completions
|
||||
*/
|
||||
struct efi_runtime_work {
|
||||
void *arg1;
|
||||
void *arg2;
|
||||
void *arg3;
|
||||
void *arg4;
|
||||
void *arg5;
|
||||
efi_status_t status;
|
||||
struct work_struct work;
|
||||
enum efi_rts_ids efi_rts_id;
|
||||
struct completion efi_rts_comp;
|
||||
};
|
||||
struct efi_runtime_work efi_rts_work;
|
||||
|
||||
/*
|
||||
* efi_queue_work: Queue efi_runtime_service() and wait until it's done
|
||||
|
@ -91,7 +59,6 @@ struct efi_runtime_work {
|
|||
*/
|
||||
#define efi_queue_work(_rts, _arg1, _arg2, _arg3, _arg4, _arg5) \
|
||||
({ \
|
||||
struct efi_runtime_work efi_rts_work; \
|
||||
efi_rts_work.status = EFI_ABORTED; \
|
||||
\
|
||||
init_completion(&efi_rts_work.efi_rts_comp); \
|
||||
|
@ -191,18 +158,16 @@ extern struct semaphore __efi_uv_runtime_lock __alias(efi_runtime_lock);
|
|||
*/
|
||||
static void efi_call_rts(struct work_struct *work)
|
||||
{
|
||||
struct efi_runtime_work *efi_rts_work;
|
||||
void *arg1, *arg2, *arg3, *arg4, *arg5;
|
||||
efi_status_t status = EFI_NOT_FOUND;
|
||||
|
||||
efi_rts_work = container_of(work, struct efi_runtime_work, work);
|
||||
arg1 = efi_rts_work->arg1;
|
||||
arg2 = efi_rts_work->arg2;
|
||||
arg3 = efi_rts_work->arg3;
|
||||
arg4 = efi_rts_work->arg4;
|
||||
arg5 = efi_rts_work->arg5;
|
||||
arg1 = efi_rts_work.arg1;
|
||||
arg2 = efi_rts_work.arg2;
|
||||
arg3 = efi_rts_work.arg3;
|
||||
arg4 = efi_rts_work.arg4;
|
||||
arg5 = efi_rts_work.arg5;
|
||||
|
||||
switch (efi_rts_work->efi_rts_id) {
|
||||
switch (efi_rts_work.efi_rts_id) {
|
||||
case GET_TIME:
|
||||
status = efi_call_virt(get_time, (efi_time_t *)arg1,
|
||||
(efi_time_cap_t *)arg2);
|
||||
|
@ -260,8 +225,8 @@ static void efi_call_rts(struct work_struct *work)
|
|||
*/
|
||||
pr_err("Requested executing invalid EFI Runtime Service.\n");
|
||||
}
|
||||
efi_rts_work->status = status;
|
||||
complete(&efi_rts_work->efi_rts_comp);
|
||||
efi_rts_work.status = status;
|
||||
complete(&efi_rts_work.efi_rts_comp);
|
||||
}
|
||||
|
||||
static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
|
||||
|
|
|
@ -364,8 +364,7 @@ bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *
|
|||
router.ddc_valid = false;
|
||||
router.cd_valid = false;
|
||||
for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) {
|
||||
uint8_t grph_obj_type=
|
||||
grph_obj_type =
|
||||
uint8_t grph_obj_type =
|
||||
(le16_to_cpu(path->usGraphicObjIds[j]) &
|
||||
OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
|
||||
|
||||
|
|
|
@ -272,10 +272,17 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu)
|
|||
{
|
||||
struct intel_gvt *gvt = vgpu->gvt;
|
||||
|
||||
mutex_lock(&vgpu->vgpu_lock);
|
||||
|
||||
WARN(vgpu->active, "vGPU is still active!\n");
|
||||
|
||||
/*
|
||||
* remove idr first so later clean can judge if need to stop
|
||||
* service if no active vgpu.
|
||||
*/
|
||||
mutex_lock(&gvt->lock);
|
||||
idr_remove(&gvt->vgpu_idr, vgpu->id);
|
||||
mutex_unlock(&gvt->lock);
|
||||
|
||||
mutex_lock(&vgpu->vgpu_lock);
|
||||
intel_gvt_debugfs_remove_vgpu(vgpu);
|
||||
intel_vgpu_clean_sched_policy(vgpu);
|
||||
intel_vgpu_clean_submission(vgpu);
|
||||
|
@ -290,7 +297,6 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu)
|
|||
mutex_unlock(&vgpu->vgpu_lock);
|
||||
|
||||
mutex_lock(&gvt->lock);
|
||||
idr_remove(&gvt->vgpu_idr, vgpu->id);
|
||||
if (idr_is_empty(&gvt->vgpu_idr))
|
||||
intel_gvt_clean_irq(gvt);
|
||||
intel_gvt_update_vgpu_types(gvt);
|
||||
|
|
|
@ -248,7 +248,7 @@ static struct gpio_desc *i2c_gpio_get_desc(struct device *dev,
|
|||
if (ret == -ENOENT)
|
||||
retdesc = ERR_PTR(-EPROBE_DEFER);
|
||||
|
||||
if (ret != -EPROBE_DEFER)
|
||||
if (PTR_ERR(retdesc) != -EPROBE_DEFER)
|
||||
dev_err(dev, "error trying to get descriptor: %d\n", ret);
|
||||
|
||||
return retdesc;
|
||||
|
|
|
@ -352,10 +352,18 @@ static struct i2c_adapter *i2c_acpi_find_adapter_by_handle(acpi_handle handle)
|
|||
static struct i2c_client *i2c_acpi_find_client_by_adev(struct acpi_device *adev)
|
||||
{
|
||||
struct device *dev;
|
||||
struct i2c_client *client;
|
||||
|
||||
dev = bus_find_device(&i2c_bus_type, NULL, adev,
|
||||
i2c_acpi_find_match_device);
|
||||
return dev ? i2c_verify_client(dev) : NULL;
|
||||
if (!dev)
|
||||
return NULL;
|
||||
|
||||
client = i2c_verify_client(dev);
|
||||
if (!client)
|
||||
put_device(dev);
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
static int i2c_acpi_notify(struct notifier_block *nb, unsigned long value,
|
||||
|
|
|
@ -190,15 +190,15 @@ static int cookie_init_hw_msi_region(struct iommu_dma_cookie *cookie,
|
|||
start -= iova_offset(iovad, start);
|
||||
num_pages = iova_align(iovad, end - start) >> iova_shift(iovad);
|
||||
|
||||
msi_page = kcalloc(num_pages, sizeof(*msi_page), GFP_KERNEL);
|
||||
if (!msi_page)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < num_pages; i++) {
|
||||
msi_page[i].phys = start;
|
||||
msi_page[i].iova = start;
|
||||
INIT_LIST_HEAD(&msi_page[i].list);
|
||||
list_add(&msi_page[i].list, &cookie->msi_page_list);
|
||||
msi_page = kmalloc(sizeof(*msi_page), GFP_KERNEL);
|
||||
if (!msi_page)
|
||||
return -ENOMEM;
|
||||
|
||||
msi_page->phys = start;
|
||||
msi_page->iova = start;
|
||||
INIT_LIST_HEAD(&msi_page->list);
|
||||
list_add(&msi_page->list, &cookie->msi_page_list);
|
||||
start += iovad->granule;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include <linux/dmi.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/iommu.h>
|
||||
#include <linux/limits.h>
|
||||
#include <asm/irq_remapping.h>
|
||||
#include <asm/iommu_table.h>
|
||||
|
||||
|
@ -139,6 +140,13 @@ dmar_alloc_pci_notify_info(struct pci_dev *dev, unsigned long event)
|
|||
|
||||
BUG_ON(dev->is_virtfn);
|
||||
|
||||
/*
|
||||
* Ignore devices that have a domain number higher than what can
|
||||
* be looked up in DMAR, e.g. VMD subdevices with domain 0x10000
|
||||
*/
|
||||
if (pci_domain_nr(dev->bus) > U16_MAX)
|
||||
return NULL;
|
||||
|
||||
/* Only generate path[] for device addition event */
|
||||
if (event == BUS_NOTIFY_ADD_DEVICE)
|
||||
for (tmp = dev; tmp; tmp = tmp->bus->self)
|
||||
|
@ -451,12 +459,13 @@ static int __init dmar_parse_one_andd(struct acpi_dmar_header *header,
|
|||
|
||||
/* Check for NUL termination within the designated length */
|
||||
if (strnlen(andd->device_name, header->length - 8) == header->length - 8) {
|
||||
WARN_TAINT(1, TAINT_FIRMWARE_WORKAROUND,
|
||||
pr_warn(FW_BUG
|
||||
"Your BIOS is broken; ANDD object name is not NUL-terminated\n"
|
||||
"BIOS vendor: %s; Ver: %s; Product Version: %s\n",
|
||||
dmi_get_system_info(DMI_BIOS_VENDOR),
|
||||
dmi_get_system_info(DMI_BIOS_VERSION),
|
||||
dmi_get_system_info(DMI_PRODUCT_VERSION));
|
||||
add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
|
||||
return -EINVAL;
|
||||
}
|
||||
pr_info("ANDD device: %x name: %s\n", andd->device_number,
|
||||
|
@ -482,14 +491,14 @@ static int dmar_parse_one_rhsa(struct acpi_dmar_header *header, void *arg)
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
WARN_TAINT(
|
||||
1, TAINT_FIRMWARE_WORKAROUND,
|
||||
pr_warn(FW_BUG
|
||||
"Your BIOS is broken; RHSA refers to non-existent DMAR unit at %llx\n"
|
||||
"BIOS vendor: %s; Ver: %s; Product Version: %s\n",
|
||||
drhd->reg_base_addr,
|
||||
rhsa->base_address,
|
||||
dmi_get_system_info(DMI_BIOS_VENDOR),
|
||||
dmi_get_system_info(DMI_BIOS_VERSION),
|
||||
dmi_get_system_info(DMI_PRODUCT_VERSION));
|
||||
add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -838,14 +847,14 @@ int __init dmar_table_init(void)
|
|||
|
||||
static void warn_invalid_dmar(u64 addr, const char *message)
|
||||
{
|
||||
WARN_TAINT_ONCE(
|
||||
1, TAINT_FIRMWARE_WORKAROUND,
|
||||
pr_warn_once(FW_BUG
|
||||
"Your BIOS is broken; DMAR reported at address %llx%s!\n"
|
||||
"BIOS vendor: %s; Ver: %s; Product Version: %s\n",
|
||||
addr, message,
|
||||
dmi_get_system_info(DMI_BIOS_VENDOR),
|
||||
dmi_get_system_info(DMI_BIOS_VERSION),
|
||||
dmi_get_system_info(DMI_PRODUCT_VERSION));
|
||||
add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
|
||||
}
|
||||
|
||||
static int __ref
|
||||
|
|
|
@ -3998,10 +3998,11 @@ static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev)
|
|||
|
||||
/* we know that the this iommu should be at offset 0xa000 from vtbar */
|
||||
drhd = dmar_find_matched_drhd_unit(pdev);
|
||||
if (WARN_TAINT_ONCE(!drhd || drhd->reg_base_addr - vtbar != 0xa000,
|
||||
TAINT_FIRMWARE_WORKAROUND,
|
||||
"BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n"))
|
||||
if (!drhd || drhd->reg_base_addr - vtbar != 0xa000) {
|
||||
pr_warn_once(FW_BUG "BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n");
|
||||
add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
|
||||
pdev->dev.archdata.iommu = DUMMY_DEVICE_DOMAIN_INFO;
|
||||
}
|
||||
}
|
||||
DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB, quirk_ioat_snb_local_iommu);
|
||||
|
||||
|
@ -5143,8 +5144,10 @@ static phys_addr_t intel_iommu_iova_to_phys(struct iommu_domain *domain,
|
|||
u64 phys = 0;
|
||||
|
||||
pte = pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level);
|
||||
if (pte)
|
||||
phys = dma_pte_addr(pte);
|
||||
if (pte && dma_pte_present(pte))
|
||||
phys = dma_pte_addr(pte) +
|
||||
(iova & (BIT_MASK(level_to_offset_bits(level) +
|
||||
VTD_PAGE_SHIFT) - 1));
|
||||
|
||||
return phys;
|
||||
}
|
||||
|
|
|
@ -313,9 +313,16 @@ static const struct i2c_device_id wf_ad7417_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(i2c, wf_ad7417_id);
|
||||
|
||||
static const struct of_device_id wf_ad7417_of_id[] = {
|
||||
{ .compatible = "ad7417", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, wf_ad7417_of_id);
|
||||
|
||||
static struct i2c_driver wf_ad7417_driver = {
|
||||
.driver = {
|
||||
.name = "wf_ad7417",
|
||||
.of_match_table = wf_ad7417_of_id,
|
||||
},
|
||||
.probe = wf_ad7417_probe,
|
||||
.remove = wf_ad7417_remove,
|
||||
|
|
|
@ -583,9 +583,16 @@ static const struct i2c_device_id wf_fcu_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(i2c, wf_fcu_id);
|
||||
|
||||
static const struct of_device_id wf_fcu_of_id[] = {
|
||||
{ .compatible = "fcu", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, wf_fcu_of_id);
|
||||
|
||||
static struct i2c_driver wf_fcu_driver = {
|
||||
.driver = {
|
||||
.name = "wf_fcu",
|
||||
.of_match_table = wf_fcu_of_id,
|
||||
},
|
||||
.probe = wf_fcu_probe,
|
||||
.remove = wf_fcu_remove,
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -92,9 +93,14 @@ static int wf_lm75_probe(struct i2c_client *client,
|
|||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct wf_lm75_sensor *lm;
|
||||
int rc, ds1775 = id->driver_data;
|
||||
int rc, ds1775;
|
||||
const char *name, *loc;
|
||||
|
||||
if (id)
|
||||
ds1775 = id->driver_data;
|
||||
else
|
||||
ds1775 = !!of_device_get_match_data(&client->dev);
|
||||
|
||||
DBG("wf_lm75: creating %s device at address 0x%02x\n",
|
||||
ds1775 ? "ds1775" : "lm75", client->addr);
|
||||
|
||||
|
@ -165,9 +171,17 @@ static const struct i2c_device_id wf_lm75_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(i2c, wf_lm75_id);
|
||||
|
||||
static const struct of_device_id wf_lm75_of_id[] = {
|
||||
{ .compatible = "lm75", .data = (void *)0},
|
||||
{ .compatible = "ds1775", .data = (void *)1 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, wf_lm75_of_id);
|
||||
|
||||
static struct i2c_driver wf_lm75_driver = {
|
||||
.driver = {
|
||||
.name = "wf_lm75",
|
||||
.of_match_table = wf_lm75_of_id,
|
||||
},
|
||||
.probe = wf_lm75_probe,
|
||||
.remove = wf_lm75_remove,
|
||||
|
|
|
@ -168,9 +168,16 @@ static const struct i2c_device_id wf_lm87_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(i2c, wf_lm87_id);
|
||||
|
||||
static const struct of_device_id wf_lm87_of_id[] = {
|
||||
{ .compatible = "lm87cimt", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, wf_lm87_of_id);
|
||||
|
||||
static struct i2c_driver wf_lm87_driver = {
|
||||
.driver = {
|
||||
.name = "wf_lm87",
|
||||
.of_match_table = wf_lm87_of_id,
|
||||
},
|
||||
.probe = wf_lm87_probe,
|
||||
.remove = wf_lm87_remove,
|
||||
|
|
|
@ -121,9 +121,16 @@ static const struct i2c_device_id wf_max6690_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(i2c, wf_max6690_id);
|
||||
|
||||
static const struct of_device_id wf_max6690_of_id[] = {
|
||||
{ .compatible = "max6690", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, wf_max6690_of_id);
|
||||
|
||||
static struct i2c_driver wf_max6690_driver = {
|
||||
.driver = {
|
||||
.name = "wf_max6690",
|
||||
.of_match_table = wf_max6690_of_id,
|
||||
},
|
||||
.probe = wf_max6690_probe,
|
||||
.remove = wf_max6690_remove,
|
||||
|
|
|
@ -343,9 +343,16 @@ static const struct i2c_device_id wf_sat_id[] = {
|
|||
};
|
||||
MODULE_DEVICE_TABLE(i2c, wf_sat_id);
|
||||
|
||||
static const struct of_device_id wf_sat_of_id[] = {
|
||||
{ .compatible = "smu-sat", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, wf_sat_of_id);
|
||||
|
||||
static struct i2c_driver wf_sat_driver = {
|
||||
.driver = {
|
||||
.name = "wf_smu_sat",
|
||||
.of_match_table = wf_sat_of_id,
|
||||
},
|
||||
.probe = wf_sat_probe,
|
||||
.remove = wf_sat_remove,
|
||||
|
|
|
@ -66,11 +66,6 @@ struct arp_pkt {
|
|||
};
|
||||
#pragma pack()
|
||||
|
||||
static inline struct arp_pkt *arp_pkt(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct arp_pkt *)skb_network_header(skb);
|
||||
}
|
||||
|
||||
/* Forward declaration */
|
||||
static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[],
|
||||
bool strict_match);
|
||||
|
@ -568,10 +563,11 @@ static void rlb_req_update_subnet_clients(struct bonding *bond, __be32 src_ip)
|
|||
spin_unlock(&bond->mode_lock);
|
||||
}
|
||||
|
||||
static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bond)
|
||||
static struct slave *rlb_choose_channel(struct sk_buff *skb,
|
||||
struct bonding *bond,
|
||||
const struct arp_pkt *arp)
|
||||
{
|
||||
struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
|
||||
struct arp_pkt *arp = arp_pkt(skb);
|
||||
struct slave *assigned_slave, *curr_active_slave;
|
||||
struct rlb_client_info *client_info;
|
||||
u32 hash_index = 0;
|
||||
|
@ -668,8 +664,12 @@ static struct slave *rlb_choose_channel(struct sk_buff *skb, struct bonding *bon
|
|||
*/
|
||||
static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond)
|
||||
{
|
||||
struct arp_pkt *arp = arp_pkt(skb);
|
||||
struct slave *tx_slave = NULL;
|
||||
struct arp_pkt *arp;
|
||||
|
||||
if (!pskb_network_may_pull(skb, sizeof(*arp)))
|
||||
return NULL;
|
||||
arp = (struct arp_pkt *)skb_network_header(skb);
|
||||
|
||||
/* Don't modify or load balance ARPs that do not originate locally
|
||||
* (e.g.,arrive via a bridge).
|
||||
|
@ -679,7 +679,7 @@ static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond)
|
|||
|
||||
if (arp->op_code == htons(ARPOP_REPLY)) {
|
||||
/* the arp must be sent on the selected rx channel */
|
||||
tx_slave = rlb_choose_channel(skb, bond);
|
||||
tx_slave = rlb_choose_channel(skb, bond, arp);
|
||||
if (tx_slave)
|
||||
bond_hw_addr_copy(arp->mac_src, tx_slave->dev->dev_addr,
|
||||
tx_slave->dev->addr_len);
|
||||
|
@ -690,7 +690,7 @@ static struct slave *rlb_arp_xmit(struct sk_buff *skb, struct bonding *bond)
|
|||
* When the arp reply is received the entry will be updated
|
||||
* with the correct unicast address of the client.
|
||||
*/
|
||||
rlb_choose_channel(skb, bond);
|
||||
rlb_choose_channel(skb, bond, arp);
|
||||
|
||||
/* The ARP reply packets must be delayed so that
|
||||
* they can cancel out the influence of the ARP request.
|
||||
|
|
|
@ -892,6 +892,7 @@ static const struct nla_policy can_policy[IFLA_CAN_MAX + 1] = {
|
|||
= { .len = sizeof(struct can_bittiming) },
|
||||
[IFLA_CAN_DATA_BITTIMING_CONST]
|
||||
= { .len = sizeof(struct can_bittiming_const) },
|
||||
[IFLA_CAN_TERMINATION] = { .type = NLA_U16 },
|
||||
};
|
||||
|
||||
static int can_validate(struct nlattr *tb[], struct nlattr *data[],
|
||||
|
|
|
@ -2168,7 +2168,7 @@ static int bcm_sysport_rule_set(struct bcm_sysport_priv *priv,
|
|||
return -ENOSPC;
|
||||
|
||||
index = find_first_zero_bit(priv->filters, RXCHK_BRCM_TAG_MAX);
|
||||
if (index > RXCHK_BRCM_TAG_MAX)
|
||||
if (index >= RXCHK_BRCM_TAG_MAX)
|
||||
return -ENOSPC;
|
||||
|
||||
/* Location is the classification ID, and index is the position
|
||||
|
|
|
@ -8097,13 +8097,13 @@ static int bnxt_change_mtu(struct net_device *dev, int new_mtu)
|
|||
struct bnxt *bp = netdev_priv(dev);
|
||||
|
||||
if (netif_running(dev))
|
||||
bnxt_close_nic(bp, false, false);
|
||||
bnxt_close_nic(bp, true, false);
|
||||
|
||||
dev->mtu = new_mtu;
|
||||
bnxt_set_ring_params(bp);
|
||||
|
||||
if (netif_running(dev))
|
||||
return bnxt_open_nic(bp, false, false);
|
||||
return bnxt_open_nic(bp, true, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -2476,15 +2476,15 @@ fec_enet_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *ec)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
cycle = fec_enet_us_to_itr_clock(ndev, fep->rx_time_itr);
|
||||
cycle = fec_enet_us_to_itr_clock(ndev, ec->rx_coalesce_usecs);
|
||||
if (cycle > 0xFFFF) {
|
||||
pr_err("Rx coalesced usec exceed hardware limitation\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
cycle = fec_enet_us_to_itr_clock(ndev, fep->tx_time_itr);
|
||||
cycle = fec_enet_us_to_itr_clock(ndev, ec->tx_coalesce_usecs);
|
||||
if (cycle > 0xFFFF) {
|
||||
pr_err("Rx coalesced usec exceed hardware limitation\n");
|
||||
pr_err("Tx coalesced usec exceed hardware limitation\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
@ -522,6 +522,7 @@ efx_copy_channel(const struct efx_channel *old_channel)
|
|||
if (tx_queue->channel)
|
||||
tx_queue->channel = channel;
|
||||
tx_queue->buffer = NULL;
|
||||
tx_queue->cb_page = NULL;
|
||||
memset(&tx_queue->txd, 0, sizeof(tx_queue->txd));
|
||||
}
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
static void dwmac1000_core_init(struct mac_device_info *hw,
|
||||
struct net_device *dev)
|
||||
{
|
||||
struct stmmac_priv *priv = netdev_priv(dev);
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
u32 value = readl(ioaddr + GMAC_CONTROL);
|
||||
int mtu = dev->mtu;
|
||||
|
@ -45,7 +46,7 @@ static void dwmac1000_core_init(struct mac_device_info *hw,
|
|||
* Broadcom tags can look like invalid LLC/SNAP packets and cause the
|
||||
* hardware to truncate packets on reception.
|
||||
*/
|
||||
if (netdev_uses_dsa(dev))
|
||||
if (netdev_uses_dsa(dev) || !priv->plat->enh_desc)
|
||||
value &= ~GMAC_CONTROL_ACS;
|
||||
|
||||
if (mtu > 1500)
|
||||
|
|
|
@ -298,6 +298,7 @@ void ipvlan_process_multicast(struct work_struct *work)
|
|||
}
|
||||
if (dev)
|
||||
dev_put(dev);
|
||||
cond_resched();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -504,19 +505,21 @@ static int ipvlan_process_outbound(struct sk_buff *skb)
|
|||
struct ethhdr *ethh = eth_hdr(skb);
|
||||
int ret = NET_XMIT_DROP;
|
||||
|
||||
/* In this mode we dont care about multicast and broadcast traffic */
|
||||
if (is_multicast_ether_addr(ethh->h_dest)) {
|
||||
pr_debug_ratelimited("Dropped {multi|broad}cast of type=[%x]\n",
|
||||
ntohs(skb->protocol));
|
||||
kfree_skb(skb);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* The ipvlan is a pseudo-L2 device, so the packets that we receive
|
||||
* will have L2; which need to discarded and processed further
|
||||
* in the net-ns of the main-device.
|
||||
*/
|
||||
if (skb_mac_header_was_set(skb)) {
|
||||
/* In this mode we dont care about
|
||||
* multicast and broadcast traffic */
|
||||
if (is_multicast_ether_addr(ethh->h_dest)) {
|
||||
pr_debug_ratelimited(
|
||||
"Dropped {multi|broad}cast of type=[%x]\n",
|
||||
ntohs(skb->protocol));
|
||||
kfree_skb(skb);
|
||||
goto out;
|
||||
}
|
||||
|
||||
skb_pull(skb, sizeof(*ethh));
|
||||
skb->mac_header = (typeof(skb->mac_header))~0U;
|
||||
skb_reset_network_header(skb);
|
||||
|
|
|
@ -236,7 +236,6 @@ static void ipvlan_uninit(struct net_device *dev)
|
|||
static int ipvlan_open(struct net_device *dev)
|
||||
{
|
||||
struct ipvl_dev *ipvlan = netdev_priv(dev);
|
||||
struct net_device *phy_dev = ipvlan->phy_dev;
|
||||
struct ipvl_addr *addr;
|
||||
|
||||
if (ipvlan->port->mode == IPVLAN_MODE_L3 ||
|
||||
|
@ -250,7 +249,7 @@ static int ipvlan_open(struct net_device *dev)
|
|||
ipvlan_ht_addr_add(ipvlan, addr);
|
||||
rcu_read_unlock();
|
||||
|
||||
return dev_uc_add(phy_dev, phy_dev->dev_addr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ipvlan_stop(struct net_device *dev)
|
||||
|
@ -262,8 +261,6 @@ static int ipvlan_stop(struct net_device *dev)
|
|||
dev_uc_unsync(phy_dev, dev);
|
||||
dev_mc_unsync(phy_dev, dev);
|
||||
|
||||
dev_uc_del(phy_dev, phy_dev->dev_addr);
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(addr, &ipvlan->addrs, anode)
|
||||
ipvlan_ht_addr_del(addr);
|
||||
|
|
|
@ -2886,6 +2886,11 @@ static void macsec_dev_set_rx_mode(struct net_device *dev)
|
|||
dev_uc_sync(real_dev, dev);
|
||||
}
|
||||
|
||||
static sci_t dev_to_sci(struct net_device *dev, __be16 port)
|
||||
{
|
||||
return make_sci(dev->dev_addr, port);
|
||||
}
|
||||
|
||||
static int macsec_set_mac_address(struct net_device *dev, void *p)
|
||||
{
|
||||
struct macsec_dev *macsec = macsec_priv(dev);
|
||||
|
@ -2907,6 +2912,7 @@ static int macsec_set_mac_address(struct net_device *dev, void *p)
|
|||
|
||||
out:
|
||||
ether_addr_copy(dev->dev_addr, addr->sa_data);
|
||||
macsec->secy.sci = dev_to_sci(dev, MACSEC_PORT_ES);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2989,6 +2995,7 @@ static const struct device_type macsec_type = {
|
|||
|
||||
static const struct nla_policy macsec_rtnl_policy[IFLA_MACSEC_MAX + 1] = {
|
||||
[IFLA_MACSEC_SCI] = { .type = NLA_U64 },
|
||||
[IFLA_MACSEC_PORT] = { .type = NLA_U16 },
|
||||
[IFLA_MACSEC_ICV_LEN] = { .type = NLA_U8 },
|
||||
[IFLA_MACSEC_CIPHER_SUITE] = { .type = NLA_U64 },
|
||||
[IFLA_MACSEC_WINDOW] = { .type = NLA_U32 },
|
||||
|
@ -3188,11 +3195,6 @@ static bool sci_exists(struct net_device *dev, sci_t sci)
|
|||
return false;
|
||||
}
|
||||
|
||||
static sci_t dev_to_sci(struct net_device *dev, __be16 port)
|
||||
{
|
||||
return make_sci(dev->dev_addr, port);
|
||||
}
|
||||
|
||||
static int macsec_add_dev(struct net_device *dev, sci_t sci, u8 icv_len)
|
||||
{
|
||||
struct macsec_dev *macsec = macsec_priv(dev);
|
||||
|
|
|
@ -338,6 +338,8 @@ static void macvlan_process_broadcast(struct work_struct *w)
|
|||
if (src)
|
||||
dev_put(src->dev);
|
||||
kfree_skb(skb);
|
||||
|
||||
cond_resched();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@ static LIST_HEAD(phy_fixup_list);
|
|||
static DEFINE_MUTEX(phy_fixup_lock);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static bool mdio_bus_phy_may_suspend(struct phy_device *phydev, bool suspend)
|
||||
static bool mdio_bus_phy_may_suspend(struct phy_device *phydev)
|
||||
{
|
||||
struct device_driver *drv = phydev->mdio.dev.driver;
|
||||
struct phy_driver *phydrv = to_phy_driver(drv);
|
||||
|
@ -88,11 +88,10 @@ static bool mdio_bus_phy_may_suspend(struct phy_device *phydev, bool suspend)
|
|||
/* PHY not attached? May suspend if the PHY has not already been
|
||||
* suspended as part of a prior call to phy_disconnect() ->
|
||||
* phy_detach() -> phy_suspend() because the parent netdev might be the
|
||||
* MDIO bus driver and clock gated at this point. Also may resume if
|
||||
* PHY is not attached.
|
||||
* MDIO bus driver and clock gated at this point.
|
||||
*/
|
||||
if (!netdev)
|
||||
return suspend ? !phydev->suspended : phydev->suspended;
|
||||
goto out;
|
||||
|
||||
if (netdev->wol_enabled)
|
||||
return false;
|
||||
|
@ -112,7 +111,8 @@ static bool mdio_bus_phy_may_suspend(struct phy_device *phydev, bool suspend)
|
|||
if (device_may_wakeup(&netdev->dev))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
out:
|
||||
return !phydev->suspended;
|
||||
}
|
||||
|
||||
static int mdio_bus_phy_suspend(struct device *dev)
|
||||
|
@ -127,9 +127,11 @@ static int mdio_bus_phy_suspend(struct device *dev)
|
|||
if (phydev->attached_dev && phydev->adjust_link)
|
||||
phy_stop_machine(phydev);
|
||||
|
||||
if (!mdio_bus_phy_may_suspend(phydev, true))
|
||||
if (!mdio_bus_phy_may_suspend(phydev))
|
||||
return 0;
|
||||
|
||||
phydev->suspended_by_mdio_bus = 1;
|
||||
|
||||
return phy_suspend(phydev);
|
||||
}
|
||||
|
||||
|
@ -138,9 +140,11 @@ static int mdio_bus_phy_resume(struct device *dev)
|
|||
struct phy_device *phydev = to_phy_device(dev);
|
||||
int ret;
|
||||
|
||||
if (!mdio_bus_phy_may_suspend(phydev, false))
|
||||
if (!phydev->suspended_by_mdio_bus)
|
||||
goto no_resume;
|
||||
|
||||
phydev->suspended_by_mdio_bus = 0;
|
||||
|
||||
ret = phy_resume(phydev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
@ -232,7 +232,7 @@ slhc_compress(struct slcompress *comp, unsigned char *icp, int isize,
|
|||
register struct cstate *cs = lcs->next;
|
||||
register unsigned long deltaS, deltaA;
|
||||
register short changes = 0;
|
||||
int hlen;
|
||||
int nlen, hlen;
|
||||
unsigned char new_seq[16];
|
||||
register unsigned char *cp = new_seq;
|
||||
struct iphdr *ip;
|
||||
|
@ -248,6 +248,8 @@ slhc_compress(struct slcompress *comp, unsigned char *icp, int isize,
|
|||
return isize;
|
||||
|
||||
ip = (struct iphdr *) icp;
|
||||
if (ip->version != 4 || ip->ihl < 5)
|
||||
return isize;
|
||||
|
||||
/* Bail if this packet isn't TCP, or is an IP fragment */
|
||||
if (ip->protocol != IPPROTO_TCP || (ntohs(ip->frag_off) & 0x3fff)) {
|
||||
|
@ -258,10 +260,14 @@ slhc_compress(struct slcompress *comp, unsigned char *icp, int isize,
|
|||
comp->sls_o_tcp++;
|
||||
return isize;
|
||||
}
|
||||
/* Extract TCP header */
|
||||
nlen = ip->ihl * 4;
|
||||
if (isize < nlen + sizeof(*th))
|
||||
return isize;
|
||||
|
||||
th = (struct tcphdr *)(((unsigned char *)ip) + ip->ihl*4);
|
||||
hlen = ip->ihl*4 + th->doff*4;
|
||||
th = (struct tcphdr *)(icp + nlen);
|
||||
if (th->doff < sizeof(struct tcphdr) / 4)
|
||||
return isize;
|
||||
hlen = nlen + th->doff * 4;
|
||||
|
||||
/* Bail if the TCP packet isn't `compressible' (i.e., ACK isn't set or
|
||||
* some other control bit is set). Also uncompressible if
|
||||
|
|
|
@ -2215,6 +2215,8 @@ team_nl_option_policy[TEAM_ATTR_OPTION_MAX + 1] = {
|
|||
[TEAM_ATTR_OPTION_CHANGED] = { .type = NLA_FLAG },
|
||||
[TEAM_ATTR_OPTION_TYPE] = { .type = NLA_U8 },
|
||||
[TEAM_ATTR_OPTION_DATA] = { .type = NLA_BINARY },
|
||||
[TEAM_ATTR_OPTION_PORT_IFINDEX] = { .type = NLA_U32 },
|
||||
[TEAM_ATTR_OPTION_ARRAY_INDEX] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
static int team_nl_cmd_noop(struct sk_buff *skb, struct genl_info *info)
|
||||
|
|
|
@ -2701,6 +2701,8 @@ static u16 r8153_phy_status(struct r8152 *tp, u16 desired)
|
|||
}
|
||||
|
||||
msleep(20);
|
||||
if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
|
@ -4062,7 +4064,10 @@ static void r8153_init(struct r8152 *tp)
|
|||
if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
|
||||
AUTOLOAD_DONE)
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
break;
|
||||
}
|
||||
|
||||
data = r8153_phy_status(tp, 0);
|
||||
|
@ -4180,7 +4185,10 @@ static void r8153b_init(struct r8152 *tp)
|
|||
if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
|
||||
AUTOLOAD_DONE)
|
||||
break;
|
||||
|
||||
msleep(20);
|
||||
if (test_bit(RTL8152_UNPLUG, &tp->flags))
|
||||
break;
|
||||
}
|
||||
|
||||
data = r8153_phy_status(tp, 0);
|
||||
|
|
|
@ -314,7 +314,8 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)
|
|||
}
|
||||
|
||||
/* PHY_SKU section is mandatory in B0 */
|
||||
if (!mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) {
|
||||
if (mvm->trans->cfg->nvm_type == IWL_NVM_EXT &&
|
||||
!mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) {
|
||||
IWL_ERR(mvm,
|
||||
"Can't parse phy_sku in B0, empty sections\n");
|
||||
return NULL;
|
||||
|
|
|
@ -396,10 +396,13 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data,
|
|||
struct page *page = virt_to_head_page(data);
|
||||
int offset = data - page_address(page);
|
||||
struct sk_buff *skb = q->rx_head;
|
||||
struct skb_shared_info *shinfo = skb_shinfo(skb);
|
||||
|
||||
offset += q->buf_offset;
|
||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, offset, len,
|
||||
q->buf_size);
|
||||
if (shinfo->nr_frags < ARRAY_SIZE(shinfo->frags)) {
|
||||
offset += q->buf_offset;
|
||||
skb_add_rx_frag(skb, shinfo->nr_frags, page, offset, len,
|
||||
q->buf_size);
|
||||
}
|
||||
|
||||
if (more)
|
||||
return;
|
||||
|
|
|
@ -2008,7 +2008,6 @@ static int pinctrl_claim_hogs(struct pinctrl_dev *pctldev)
|
|||
return PTR_ERR(pctldev->p);
|
||||
}
|
||||
|
||||
kref_get(&pctldev->p->users);
|
||||
pctldev->hog_default =
|
||||
pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT);
|
||||
if (IS_ERR(pctldev->hog_default)) {
|
||||
|
|
|
@ -153,8 +153,8 @@ static const unsigned int sdio_d0_pins[] = { GPIOX_0 };
|
|||
static const unsigned int sdio_d1_pins[] = { GPIOX_1 };
|
||||
static const unsigned int sdio_d2_pins[] = { GPIOX_2 };
|
||||
static const unsigned int sdio_d3_pins[] = { GPIOX_3 };
|
||||
static const unsigned int sdio_cmd_pins[] = { GPIOX_4 };
|
||||
static const unsigned int sdio_clk_pins[] = { GPIOX_5 };
|
||||
static const unsigned int sdio_clk_pins[] = { GPIOX_4 };
|
||||
static const unsigned int sdio_cmd_pins[] = { GPIOX_5 };
|
||||
static const unsigned int sdio_irq_pins[] = { GPIOX_7 };
|
||||
|
||||
static const unsigned int nand_ce0_pins[] = { BOOT_8 };
|
||||
|
|
|
@ -561,7 +561,6 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry,
|
|||
if (server->ops->close)
|
||||
server->ops->close(xid, tcon, &fid);
|
||||
cifs_del_pending_open(&open);
|
||||
fput(file);
|
||||
rc = -ENOMEM;
|
||||
}
|
||||
|
||||
|
|
|
@ -1251,7 +1251,7 @@ static int gfs2_atomic_open(struct inode *dir, struct dentry *dentry,
|
|||
if (!(file->f_mode & FMODE_OPENED))
|
||||
return finish_no_open(file, d);
|
||||
dput(d);
|
||||
return 0;
|
||||
return excl && (flags & O_CREAT) ? -EEXIST : 0;
|
||||
}
|
||||
|
||||
BUG_ON(d != NULL);
|
||||
|
|
|
@ -863,9 +863,6 @@ static int do_dentry_open(struct file *f,
|
|||
* the return value of d_splice_alias(), then the caller needs to perform dput()
|
||||
* on it after finish_open().
|
||||
*
|
||||
* On successful return @file is a fully instantiated open file. After this, if
|
||||
* an error occurs in ->atomic_open(), it needs to clean up with fput().
|
||||
*
|
||||
* Returns zero on success or -errno if the open failed.
|
||||
*/
|
||||
int finish_open(struct file *file, struct dentry *dentry,
|
||||
|
|
|
@ -397,6 +397,7 @@ typedef int (*dma_buf_destructor)(struct dma_buf *dmabuf, void *dtor_data);
|
|||
* @buf_name: unique name for the buffer
|
||||
* @ktime: time (in jiffies) at which the buffer was born
|
||||
* @name: userspace-provided name; useful for accounting and debugging.
|
||||
* @name_lock: lock to protect name.
|
||||
* @owner: pointer to exporter module; used for refcounting when exporter is a
|
||||
* kernel module.
|
||||
* @list_node: node for dma_buf accounting and debugging.
|
||||
|
@ -455,6 +456,8 @@ struct dma_buf {
|
|||
* @dev: device attached to the buffer.
|
||||
* @node: list of dma_buf_attachment.
|
||||
* @priv: exporter specific attachment data.
|
||||
* @dma_map_attrs: DMA attributes to be used when the exporter maps the buffer
|
||||
* through dma_buf_map_attachment.
|
||||
*
|
||||
* This structure holds the attachment information between the dma_buf buffer
|
||||
* and its user device(s). The list contains one attachment struct per device
|
||||
|
|
|
@ -1664,6 +1664,42 @@ struct linux_efi_tpm_eventlog {
|
|||
|
||||
extern int efi_tpm_eventlog_init(void);
|
||||
|
||||
/* efi_runtime_service() function identifiers */
|
||||
enum efi_rts_ids {
|
||||
GET_TIME,
|
||||
SET_TIME,
|
||||
GET_WAKEUP_TIME,
|
||||
SET_WAKEUP_TIME,
|
||||
GET_VARIABLE,
|
||||
GET_NEXT_VARIABLE,
|
||||
SET_VARIABLE,
|
||||
QUERY_VARIABLE_INFO,
|
||||
GET_NEXT_HIGH_MONO_COUNT,
|
||||
UPDATE_CAPSULE,
|
||||
QUERY_CAPSULE_CAPS,
|
||||
};
|
||||
|
||||
/*
|
||||
* efi_runtime_work: Details of EFI Runtime Service work
|
||||
* @arg<1-5>: EFI Runtime Service function arguments
|
||||
* @status: Status of executing EFI Runtime Service
|
||||
* @efi_rts_id: EFI Runtime Service function identifier
|
||||
* @efi_rts_comp: Struct used for handling completions
|
||||
*/
|
||||
struct efi_runtime_work {
|
||||
void *arg1;
|
||||
void *arg2;
|
||||
void *arg3;
|
||||
void *arg4;
|
||||
void *arg5;
|
||||
efi_status_t status;
|
||||
struct work_struct work;
|
||||
enum efi_rts_ids efi_rts_id;
|
||||
struct completion efi_rts_comp;
|
||||
};
|
||||
|
||||
extern struct efi_runtime_work efi_rts_work;
|
||||
|
||||
/* Workqueue to queue EFI Runtime Services */
|
||||
extern struct workqueue_struct *efi_rts_wq;
|
||||
|
||||
|
|
|
@ -2,15 +2,10 @@
|
|||
#ifndef _INET_DIAG_H_
|
||||
#define _INET_DIAG_H_ 1
|
||||
|
||||
#include <net/netlink.h>
|
||||
#include <uapi/linux/inet_diag.h>
|
||||
|
||||
struct net;
|
||||
struct sock;
|
||||
struct inet_hashinfo;
|
||||
struct nlattr;
|
||||
struct nlmsghdr;
|
||||
struct sk_buff;
|
||||
struct netlink_callback;
|
||||
|
||||
struct inet_diag_handler {
|
||||
void (*dump)(struct sk_buff *skb,
|
||||
|
@ -62,6 +57,17 @@ int inet_diag_bc_sk(const struct nlattr *_bc, struct sock *sk);
|
|||
|
||||
void inet_diag_msg_common_fill(struct inet_diag_msg *r, struct sock *sk);
|
||||
|
||||
static inline size_t inet_diag_msg_attrs_size(void)
|
||||
{
|
||||
return nla_total_size(1) /* INET_DIAG_SHUTDOWN */
|
||||
+ nla_total_size(1) /* INET_DIAG_TOS */
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
+ nla_total_size(1) /* INET_DIAG_TCLASS */
|
||||
+ nla_total_size(1) /* INET_DIAG_SKV6ONLY */
|
||||
#endif
|
||||
+ nla_total_size(4) /* INET_DIAG_MARK */
|
||||
+ nla_total_size(4); /* INET_DIAG_CLASS_ID */
|
||||
}
|
||||
int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb,
|
||||
struct inet_diag_msg *r, int ext,
|
||||
struct user_namespace *user_ns, bool net_admin);
|
||||
|
|
|
@ -373,6 +373,7 @@ struct phy_c45_device_ids {
|
|||
* is_pseudo_fixed_link: Set to true if this phy is an Ethernet switch, etc.
|
||||
* has_fixups: Set to true if this phy has fixups/quirks.
|
||||
* suspended: Set to true if this phy has been suspended successfully.
|
||||
* suspended_by_mdio_bus: Set to true if this phy was suspended by MDIO bus.
|
||||
* sysfs_links: Internal boolean tracking sysfs symbolic links setup/removal.
|
||||
* loopback_enabled: Set true if this phy has been loopbacked successfully.
|
||||
* state: state of the PHY for management purposes
|
||||
|
@ -411,6 +412,7 @@ struct phy_device {
|
|||
unsigned is_pseudo_fixed_link:1;
|
||||
unsigned has_fixups:1;
|
||||
unsigned suspended:1;
|
||||
unsigned suspended_by_mdio_bus:1;
|
||||
unsigned sysfs_links:1;
|
||||
unsigned loopback_enabled:1;
|
||||
|
||||
|
|
|
@ -107,6 +107,7 @@ struct fib_rule_notifier_info {
|
|||
[FRA_OIFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 }, \
|
||||
[FRA_PRIORITY] = { .type = NLA_U32 }, \
|
||||
[FRA_FWMARK] = { .type = NLA_U32 }, \
|
||||
[FRA_TUN_ID] = { .type = NLA_U64 }, \
|
||||
[FRA_FWMASK] = { .type = NLA_U32 }, \
|
||||
[FRA_TABLE] = { .type = NLA_U32 }, \
|
||||
[FRA_SUPPRESS_PREFIXLEN] = { .type = NLA_U32 }, \
|
||||
|
|
|
@ -4450,6 +4450,9 @@ static void *cgroup_procs_next(struct seq_file *s, void *v, loff_t *pos)
|
|||
struct kernfs_open_file *of = s->private;
|
||||
struct css_task_iter *it = of->priv;
|
||||
|
||||
if (pos)
|
||||
(*pos)++;
|
||||
|
||||
return css_task_iter_next(it);
|
||||
}
|
||||
|
||||
|
@ -4465,7 +4468,7 @@ static void *__cgroup_procs_start(struct seq_file *s, loff_t *pos,
|
|||
* from position 0, so we can simply keep iterating on !0 *pos.
|
||||
*/
|
||||
if (!it) {
|
||||
if (WARN_ON_ONCE((*pos)++))
|
||||
if (WARN_ON_ONCE((*pos)))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
it = kzalloc(sizeof(*it), GFP_KERNEL);
|
||||
|
@ -4473,10 +4476,11 @@ static void *__cgroup_procs_start(struct seq_file *s, loff_t *pos,
|
|||
return ERR_PTR(-ENOMEM);
|
||||
of->priv = it;
|
||||
css_task_iter_start(&cgrp->self, iter_flags, it);
|
||||
} else if (!(*pos)++) {
|
||||
} else if (!(*pos)) {
|
||||
css_task_iter_end(it);
|
||||
css_task_iter_start(&cgrp->self, iter_flags, it);
|
||||
}
|
||||
} else
|
||||
return it->cur_task;
|
||||
|
||||
return cgroup_procs_next(s, NULL, NULL);
|
||||
}
|
||||
|
@ -6058,6 +6062,10 @@ void cgroup_sk_alloc(struct sock_cgroup_data *skcd)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Don't associate the sock with unrelated interrupted task's cgroup. */
|
||||
if (in_interrupt())
|
||||
return;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
while (true) {
|
||||
|
|
|
@ -1422,14 +1422,16 @@ static void __queue_work(int cpu, struct workqueue_struct *wq,
|
|||
WARN_ON_ONCE(!is_chained_work(wq)))
|
||||
return;
|
||||
retry:
|
||||
if (req_cpu == WORK_CPU_UNBOUND)
|
||||
cpu = wq_select_unbound_cpu(raw_smp_processor_id());
|
||||
|
||||
/* pwq which will be used unless @work is executing elsewhere */
|
||||
if (!(wq->flags & WQ_UNBOUND))
|
||||
pwq = per_cpu_ptr(wq->cpu_pwqs, cpu);
|
||||
else
|
||||
if (wq->flags & WQ_UNBOUND) {
|
||||
if (req_cpu == WORK_CPU_UNBOUND)
|
||||
cpu = wq_select_unbound_cpu(raw_smp_processor_id());
|
||||
pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu));
|
||||
} else {
|
||||
if (req_cpu == WORK_CPU_UNBOUND)
|
||||
cpu = raw_smp_processor_id();
|
||||
pwq = per_cpu_ptr(wq->cpu_pwqs, cpu);
|
||||
}
|
||||
|
||||
/*
|
||||
* If @work was previously on a different pool, it might still be
|
||||
|
|
|
@ -6307,19 +6307,9 @@ void mem_cgroup_sk_alloc(struct sock *sk)
|
|||
if (!mem_cgroup_sockets_enabled)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Socket cloning can throw us here with sk_memcg already
|
||||
* filled. It won't however, necessarily happen from
|
||||
* process context. So the test for root memcg given
|
||||
* the current task's memcg won't help us in this case.
|
||||
*
|
||||
* Respecting the original socket's memcg is a better
|
||||
* decision in this case.
|
||||
*/
|
||||
if (sk->sk_memcg) {
|
||||
css_get(&sk->sk_memcg->css);
|
||||
/* Do not associate the sock with unrelated interrupted task's memcg. */
|
||||
if (in_interrupt())
|
||||
return;
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
memcg = mem_cgroup_from_task(current);
|
||||
|
|
|
@ -970,6 +970,10 @@ static void batadv_iv_ogm_schedule_buff(struct batadv_hard_iface *hard_iface)
|
|||
|
||||
lockdep_assert_held(&hard_iface->bat_iv.ogm_buff_mutex);
|
||||
|
||||
/* interface already disabled by batadv_iv_ogm_iface_disable */
|
||||
if (!*ogm_buff)
|
||||
return;
|
||||
|
||||
/* the interface gets activated here to avoid race conditions between
|
||||
* the moment of activating the interface in
|
||||
* hardif_activate_interface() where the originator mac is set and
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/rculist.h>
|
||||
|
@ -128,14 +130,12 @@ static void batadv_v_ogm_send_to_if(struct sk_buff *skb,
|
|||
}
|
||||
|
||||
/**
|
||||
* batadv_v_ogm_send() - periodic worker broadcasting the own OGM
|
||||
* @work: work queue item
|
||||
* batadv_v_ogm_send_softif() - periodic worker broadcasting the own OGM
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
*/
|
||||
static void batadv_v_ogm_send(struct work_struct *work)
|
||||
static void batadv_v_ogm_send_softif(struct batadv_priv *bat_priv)
|
||||
{
|
||||
struct batadv_hard_iface *hard_iface;
|
||||
struct batadv_priv_bat_v *bat_v;
|
||||
struct batadv_priv *bat_priv;
|
||||
struct batadv_ogm2_packet *ogm_packet;
|
||||
struct sk_buff *skb, *skb_tmp;
|
||||
unsigned char *ogm_buff;
|
||||
|
@ -143,8 +143,7 @@ static void batadv_v_ogm_send(struct work_struct *work)
|
|||
u16 tvlv_len = 0;
|
||||
int ret;
|
||||
|
||||
bat_v = container_of(work, struct batadv_priv_bat_v, ogm_wq.work);
|
||||
bat_priv = container_of(bat_v, struct batadv_priv, bat_v);
|
||||
lockdep_assert_held(&bat_priv->bat_v.ogm_buff_mutex);
|
||||
|
||||
if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
|
||||
goto out;
|
||||
|
@ -235,6 +234,23 @@ static void batadv_v_ogm_send(struct work_struct *work)
|
|||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_v_ogm_send() - periodic worker broadcasting the own OGM
|
||||
* @work: work queue item
|
||||
*/
|
||||
static void batadv_v_ogm_send(struct work_struct *work)
|
||||
{
|
||||
struct batadv_priv_bat_v *bat_v;
|
||||
struct batadv_priv *bat_priv;
|
||||
|
||||
bat_v = container_of(work, struct batadv_priv_bat_v, ogm_wq.work);
|
||||
bat_priv = container_of(bat_v, struct batadv_priv, bat_v);
|
||||
|
||||
mutex_lock(&bat_priv->bat_v.ogm_buff_mutex);
|
||||
batadv_v_ogm_send_softif(bat_priv);
|
||||
mutex_unlock(&bat_priv->bat_v.ogm_buff_mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_v_ogm_iface_enable() - prepare an interface for B.A.T.M.A.N. V
|
||||
* @hard_iface: the interface to prepare
|
||||
|
@ -261,11 +277,15 @@ void batadv_v_ogm_primary_iface_set(struct batadv_hard_iface *primary_iface)
|
|||
struct batadv_priv *bat_priv = netdev_priv(primary_iface->soft_iface);
|
||||
struct batadv_ogm2_packet *ogm_packet;
|
||||
|
||||
mutex_lock(&bat_priv->bat_v.ogm_buff_mutex);
|
||||
if (!bat_priv->bat_v.ogm_buff)
|
||||
return;
|
||||
goto unlock;
|
||||
|
||||
ogm_packet = (struct batadv_ogm2_packet *)bat_priv->bat_v.ogm_buff;
|
||||
ether_addr_copy(ogm_packet->orig, primary_iface->net_dev->dev_addr);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&bat_priv->bat_v.ogm_buff_mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -887,6 +907,8 @@ int batadv_v_ogm_init(struct batadv_priv *bat_priv)
|
|||
atomic_set(&bat_priv->bat_v.ogm_seqno, random_seqno);
|
||||
INIT_DELAYED_WORK(&bat_priv->bat_v.ogm_wq, batadv_v_ogm_send);
|
||||
|
||||
mutex_init(&bat_priv->bat_v.ogm_buff_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -898,7 +920,11 @@ void batadv_v_ogm_free(struct batadv_priv *bat_priv)
|
|||
{
|
||||
cancel_delayed_work_sync(&bat_priv->bat_v.ogm_wq);
|
||||
|
||||
mutex_lock(&bat_priv->bat_v.ogm_buff_mutex);
|
||||
|
||||
kfree(bat_priv->bat_v.ogm_buff);
|
||||
bat_priv->bat_v.ogm_buff = NULL;
|
||||
bat_priv->bat_v.ogm_buff_len = 0;
|
||||
|
||||
mutex_unlock(&bat_priv->bat_v.ogm_buff_mutex);
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <linux/compiler.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/sched.h> /* for linux/wait.h */
|
||||
|
@ -1493,6 +1494,9 @@ struct batadv_priv_bat_v {
|
|||
/** @ogm_seqno: OGM sequence number - used to identify each OGM */
|
||||
atomic_t ogm_seqno;
|
||||
|
||||
/** @ogm_buff_mutex: lock protecting ogm_buff and ogm_buff_len */
|
||||
struct mutex ogm_buff_mutex;
|
||||
|
||||
/** @ogm_wq: workqueue used to schedule OGM transmissions */
|
||||
struct delayed_work ogm_wq;
|
||||
};
|
||||
|
|
|
@ -2995,34 +2995,41 @@ devlink_param_value_get_from_info(const struct devlink_param *param,
|
|||
struct genl_info *info,
|
||||
union devlink_param_value *value)
|
||||
{
|
||||
struct nlattr *param_data;
|
||||
int len;
|
||||
|
||||
if (param->type != DEVLINK_PARAM_TYPE_BOOL &&
|
||||
!info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA])
|
||||
param_data = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA];
|
||||
|
||||
if (param->type != DEVLINK_PARAM_TYPE_BOOL && !param_data)
|
||||
return -EINVAL;
|
||||
|
||||
switch (param->type) {
|
||||
case DEVLINK_PARAM_TYPE_U8:
|
||||
value->vu8 = nla_get_u8(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]);
|
||||
if (nla_len(param_data) != sizeof(u8))
|
||||
return -EINVAL;
|
||||
value->vu8 = nla_get_u8(param_data);
|
||||
break;
|
||||
case DEVLINK_PARAM_TYPE_U16:
|
||||
value->vu16 = nla_get_u16(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]);
|
||||
if (nla_len(param_data) != sizeof(u16))
|
||||
return -EINVAL;
|
||||
value->vu16 = nla_get_u16(param_data);
|
||||
break;
|
||||
case DEVLINK_PARAM_TYPE_U32:
|
||||
value->vu32 = nla_get_u32(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]);
|
||||
if (nla_len(param_data) != sizeof(u32))
|
||||
return -EINVAL;
|
||||
value->vu32 = nla_get_u32(param_data);
|
||||
break;
|
||||
case DEVLINK_PARAM_TYPE_STRING:
|
||||
len = strnlen(nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]),
|
||||
nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]));
|
||||
if (len == nla_len(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]) ||
|
||||
len = strnlen(nla_data(param_data), nla_len(param_data));
|
||||
if (len == nla_len(param_data) ||
|
||||
len >= __DEVLINK_PARAM_MAX_STRING_VALUE)
|
||||
return -EINVAL;
|
||||
strcpy(value->vstr,
|
||||
nla_data(info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA]));
|
||||
strcpy(value->vstr, nla_data(param_data));
|
||||
break;
|
||||
case DEVLINK_PARAM_TYPE_BOOL:
|
||||
value->vbool = info->attrs[DEVLINK_ATTR_PARAM_VALUE_DATA] ?
|
||||
true : false;
|
||||
if (param_data && nla_len(param_data))
|
||||
return -EINVAL;
|
||||
value->vbool = nla_get_flag(param_data);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
|
@ -3600,6 +3607,8 @@ static const struct nla_policy devlink_nl_policy[DEVLINK_ATTR_MAX + 1] = {
|
|||
[DEVLINK_ATTR_PARAM_VALUE_CMODE] = { .type = NLA_U8 },
|
||||
[DEVLINK_ATTR_REGION_NAME] = { .type = NLA_NUL_STRING },
|
||||
[DEVLINK_ATTR_REGION_SNAPSHOT_ID] = { .type = NLA_U32 },
|
||||
[DEVLINK_ATTR_REGION_CHUNK_ADDR] = { .type = NLA_U64 },
|
||||
[DEVLINK_ATTR_REGION_CHUNK_LEN] = { .type = NLA_U64 },
|
||||
};
|
||||
|
||||
static const struct genl_ops devlink_nl_ops[] = {
|
||||
|
|
|
@ -57,30 +57,60 @@ static void cgrp_css_free(struct cgroup_subsys_state *css)
|
|||
kfree(css_cls_state(css));
|
||||
}
|
||||
|
||||
/*
|
||||
* To avoid freezing of sockets creation for tasks with big number of threads
|
||||
* and opened sockets lets release file_lock every 1000 iterated descriptors.
|
||||
* New sockets will already have been created with new classid.
|
||||
*/
|
||||
|
||||
struct update_classid_context {
|
||||
u32 classid;
|
||||
unsigned int batch;
|
||||
};
|
||||
|
||||
#define UPDATE_CLASSID_BATCH 1000
|
||||
|
||||
static int update_classid_sock(const void *v, struct file *file, unsigned n)
|
||||
{
|
||||
int err;
|
||||
struct update_classid_context *ctx = (void *)v;
|
||||
struct socket *sock = sock_from_file(file, &err);
|
||||
|
||||
if (sock) {
|
||||
spin_lock(&cgroup_sk_update_lock);
|
||||
sock_cgroup_set_classid(&sock->sk->sk_cgrp_data,
|
||||
(unsigned long)v);
|
||||
sock_cgroup_set_classid(&sock->sk->sk_cgrp_data, ctx->classid);
|
||||
spin_unlock(&cgroup_sk_update_lock);
|
||||
}
|
||||
if (--ctx->batch == 0) {
|
||||
ctx->batch = UPDATE_CLASSID_BATCH;
|
||||
return n + 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void update_classid_task(struct task_struct *p, u32 classid)
|
||||
{
|
||||
struct update_classid_context ctx = {
|
||||
.classid = classid,
|
||||
.batch = UPDATE_CLASSID_BATCH
|
||||
};
|
||||
unsigned int fd = 0;
|
||||
|
||||
do {
|
||||
task_lock(p);
|
||||
fd = iterate_fd(p->files, fd, update_classid_sock, &ctx);
|
||||
task_unlock(p);
|
||||
cond_resched();
|
||||
} while (fd);
|
||||
}
|
||||
|
||||
static void cgrp_attach(struct cgroup_taskset *tset)
|
||||
{
|
||||
struct cgroup_subsys_state *css;
|
||||
struct task_struct *p;
|
||||
|
||||
cgroup_taskset_for_each(p, css, tset) {
|
||||
task_lock(p);
|
||||
iterate_fd(p->files, 0, update_classid_sock,
|
||||
(void *)(unsigned long)css_cls_state(css)->classid);
|
||||
task_unlock(p);
|
||||
update_classid_task(p, css_cls_state(css)->classid);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -102,10 +132,7 @@ static int write_classid(struct cgroup_subsys_state *css, struct cftype *cft,
|
|||
|
||||
css_task_iter_start(css, 0, &it);
|
||||
while ((p = css_task_iter_next(&it))) {
|
||||
task_lock(p);
|
||||
iterate_fd(p->files, 0, update_classid_sock,
|
||||
(void *)(unsigned long)cs->classid);
|
||||
task_unlock(p);
|
||||
update_classid_task(p, cs->classid);
|
||||
cond_resched();
|
||||
}
|
||||
css_task_iter_end(&it);
|
||||
|
|
|
@ -1689,7 +1689,10 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
|
|||
atomic_set(&newsk->sk_zckey, 0);
|
||||
|
||||
sock_reset_flag(newsk, SOCK_DONE);
|
||||
mem_cgroup_sk_alloc(newsk);
|
||||
|
||||
/* sk->sk_memcg will be populated at accept() time */
|
||||
newsk->sk_memcg = NULL;
|
||||
|
||||
cgroup_sk_alloc(&newsk->sk_cgrp_data);
|
||||
|
||||
rcu_read_lock();
|
||||
|
|
|
@ -30,7 +30,13 @@ const struct nla_policy ieee802154_policy[IEEE802154_ATTR_MAX + 1] = {
|
|||
[IEEE802154_ATTR_HW_ADDR] = { .type = NLA_HW_ADDR, },
|
||||
[IEEE802154_ATTR_PAN_ID] = { .type = NLA_U16, },
|
||||
[IEEE802154_ATTR_CHANNEL] = { .type = NLA_U8, },
|
||||
[IEEE802154_ATTR_BCN_ORD] = { .type = NLA_U8, },
|
||||
[IEEE802154_ATTR_SF_ORD] = { .type = NLA_U8, },
|
||||
[IEEE802154_ATTR_PAN_COORD] = { .type = NLA_U8, },
|
||||
[IEEE802154_ATTR_BAT_EXT] = { .type = NLA_U8, },
|
||||
[IEEE802154_ATTR_COORD_REALIGN] = { .type = NLA_U8, },
|
||||
[IEEE802154_ATTR_PAGE] = { .type = NLA_U8, },
|
||||
[IEEE802154_ATTR_DEV_TYPE] = { .type = NLA_U8, },
|
||||
[IEEE802154_ATTR_COORD_SHORT_ADDR] = { .type = NLA_U16, },
|
||||
[IEEE802154_ATTR_COORD_HW_ADDR] = { .type = NLA_HW_ADDR, },
|
||||
[IEEE802154_ATTR_COORD_PAN_ID] = { .type = NLA_U16, },
|
||||
|
|
|
@ -61,7 +61,9 @@ int gre_del_protocol(const struct gre_protocol *proto, u8 version)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(gre_del_protocol);
|
||||
|
||||
/* Fills in tpi and returns header length to be pulled. */
|
||||
/* Fills in tpi and returns header length to be pulled.
|
||||
* Note that caller must use pskb_may_pull() before pulling GRE header.
|
||||
*/
|
||||
int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
|
||||
bool *csum_err, __be16 proto, int nhs)
|
||||
{
|
||||
|
@ -115,8 +117,14 @@ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
|
|||
* - When dealing with WCCPv2, Skip extra 4 bytes in GRE header
|
||||
*/
|
||||
if (greh->flags == 0 && tpi->proto == htons(ETH_P_WCCP)) {
|
||||
u8 _val, *val;
|
||||
|
||||
val = skb_header_pointer(skb, nhs + hdr_len,
|
||||
sizeof(_val), &_val);
|
||||
if (!val)
|
||||
return -EINVAL;
|
||||
tpi->proto = proto;
|
||||
if ((*(u8 *)options & 0xF0) != 0x40)
|
||||
if ((*val & 0xF0) != 0x40)
|
||||
hdr_len += 4;
|
||||
}
|
||||
tpi->hdr_len = hdr_len;
|
||||
|
|
|
@ -486,8 +486,28 @@ struct sock *inet_csk_accept(struct sock *sk, int flags, int *err, bool kern)
|
|||
}
|
||||
spin_unlock_bh(&queue->fastopenq.lock);
|
||||
}
|
||||
|
||||
out:
|
||||
release_sock(sk);
|
||||
if (newsk && mem_cgroup_sockets_enabled) {
|
||||
int amt;
|
||||
|
||||
/* atomically get the memory usage, set and charge the
|
||||
* newsk->sk_memcg.
|
||||
*/
|
||||
lock_sock(newsk);
|
||||
|
||||
/* The socket has not been accepted yet, no need to look at
|
||||
* newsk->sk_wmem_queued.
|
||||
*/
|
||||
amt = sk_mem_pages(newsk->sk_forward_alloc +
|
||||
atomic_read(&newsk->sk_rmem_alloc));
|
||||
mem_cgroup_sk_alloc(newsk);
|
||||
if (newsk->sk_memcg && amt)
|
||||
mem_cgroup_charge_skmem(newsk->sk_memcg, amt);
|
||||
|
||||
release_sock(newsk);
|
||||
}
|
||||
if (req)
|
||||
reqsk_put(req);
|
||||
return newsk;
|
||||
|
|
|
@ -104,13 +104,9 @@ static size_t inet_sk_attr_size(struct sock *sk,
|
|||
aux = handler->idiag_get_aux_size(sk, net_admin);
|
||||
|
||||
return nla_total_size(sizeof(struct tcp_info))
|
||||
+ nla_total_size(1) /* INET_DIAG_SHUTDOWN */
|
||||
+ nla_total_size(1) /* INET_DIAG_TOS */
|
||||
+ nla_total_size(1) /* INET_DIAG_TCLASS */
|
||||
+ nla_total_size(4) /* INET_DIAG_MARK */
|
||||
+ nla_total_size(4) /* INET_DIAG_CLASS_ID */
|
||||
+ nla_total_size(sizeof(struct inet_diag_meminfo))
|
||||
+ nla_total_size(sizeof(struct inet_diag_msg))
|
||||
+ inet_diag_msg_attrs_size()
|
||||
+ nla_total_size(sizeof(struct inet_diag_meminfo))
|
||||
+ nla_total_size(SK_MEMINFO_VARS * sizeof(u32))
|
||||
+ nla_total_size(TCP_CA_NAME_MAX)
|
||||
+ nla_total_size(sizeof(struct tcpvegas_info))
|
||||
|
@ -151,6 +147,24 @@ int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb,
|
|||
if (net_admin && nla_put_u32(skb, INET_DIAG_MARK, sk->sk_mark))
|
||||
goto errout;
|
||||
|
||||
if (ext & (1 << (INET_DIAG_CLASS_ID - 1)) ||
|
||||
ext & (1 << (INET_DIAG_TCLASS - 1))) {
|
||||
u32 classid = 0;
|
||||
|
||||
#ifdef CONFIG_SOCK_CGROUP_DATA
|
||||
classid = sock_cgroup_classid(&sk->sk_cgrp_data);
|
||||
#endif
|
||||
/* Fallback to socket priority if class id isn't set.
|
||||
* Classful qdiscs use it as direct reference to class.
|
||||
* For cgroup2 classid is always zero.
|
||||
*/
|
||||
if (!classid)
|
||||
classid = sk->sk_priority;
|
||||
|
||||
if (nla_put_u32(skb, INET_DIAG_CLASS_ID, classid))
|
||||
goto errout;
|
||||
}
|
||||
|
||||
r->idiag_uid = from_kuid_munged(user_ns, sock_i_uid(sk));
|
||||
r->idiag_inode = sock_i_ino(sk);
|
||||
|
||||
|
@ -288,24 +302,6 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk,
|
|||
goto errout;
|
||||
}
|
||||
|
||||
if (ext & (1 << (INET_DIAG_CLASS_ID - 1)) ||
|
||||
ext & (1 << (INET_DIAG_TCLASS - 1))) {
|
||||
u32 classid = 0;
|
||||
|
||||
#ifdef CONFIG_SOCK_CGROUP_DATA
|
||||
classid = sock_cgroup_classid(&sk->sk_cgrp_data);
|
||||
#endif
|
||||
/* Fallback to socket priority if class id isn't set.
|
||||
* Classful qdiscs use it as direct reference to class.
|
||||
* For cgroup2 classid is always zero.
|
||||
*/
|
||||
if (!classid)
|
||||
classid = sk->sk_priority;
|
||||
|
||||
if (nla_put_u32(skb, INET_DIAG_CLASS_ID, classid))
|
||||
goto errout;
|
||||
}
|
||||
|
||||
out:
|
||||
nlmsg_end(skb, nlh);
|
||||
return 0;
|
||||
|
|
|
@ -99,8 +99,9 @@ static int raw_diag_dump_one(struct sk_buff *in_skb,
|
|||
if (IS_ERR(sk))
|
||||
return PTR_ERR(sk);
|
||||
|
||||
rep = nlmsg_new(sizeof(struct inet_diag_msg) +
|
||||
sizeof(struct inet_diag_meminfo) + 64,
|
||||
rep = nlmsg_new(nla_total_size(sizeof(struct inet_diag_msg)) +
|
||||
inet_diag_msg_attrs_size() +
|
||||
nla_total_size(sizeof(struct inet_diag_meminfo)) + 64,
|
||||
GFP_KERNEL);
|
||||
if (!rep) {
|
||||
sock_put(sk);
|
||||
|
|
|
@ -67,8 +67,9 @@ static int udp_dump_one(struct udp_table *tbl, struct sk_buff *in_skb,
|
|||
goto out;
|
||||
|
||||
err = -ENOMEM;
|
||||
rep = nlmsg_new(sizeof(struct inet_diag_msg) +
|
||||
sizeof(struct inet_diag_meminfo) + 64,
|
||||
rep = nlmsg_new(nla_total_size(sizeof(struct inet_diag_msg)) +
|
||||
inet_diag_msg_attrs_size() +
|
||||
nla_total_size(sizeof(struct inet_diag_meminfo)) + 64,
|
||||
GFP_KERNEL);
|
||||
if (!rep)
|
||||
goto out;
|
||||
|
|
|
@ -1177,11 +1177,12 @@ check_cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long *expires)
|
|||
}
|
||||
|
||||
static void
|
||||
cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, bool del_rt)
|
||||
cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires,
|
||||
bool del_rt, bool del_peer)
|
||||
{
|
||||
struct fib6_info *f6i;
|
||||
|
||||
f6i = addrconf_get_prefix_route(&ifp->addr,
|
||||
f6i = addrconf_get_prefix_route(del_peer ? &ifp->peer_addr : &ifp->addr,
|
||||
ifp->prefix_len,
|
||||
ifp->idev->dev,
|
||||
0, RTF_GATEWAY | RTF_DEFAULT);
|
||||
|
@ -1246,7 +1247,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
|
|||
|
||||
if (action != CLEANUP_PREFIX_RT_NOP) {
|
||||
cleanup_prefix_route(ifp, expires,
|
||||
action == CLEANUP_PREFIX_RT_DEL);
|
||||
action == CLEANUP_PREFIX_RT_DEL, false);
|
||||
}
|
||||
|
||||
/* clean up prefsrc entries */
|
||||
|
@ -3322,6 +3323,10 @@ static void addrconf_dev_config(struct net_device *dev)
|
|||
(dev->type != ARPHRD_NONE) &&
|
||||
(dev->type != ARPHRD_RAWIP)) {
|
||||
/* Alas, we support only Ethernet autoconfiguration. */
|
||||
idev = __in6_dev_get(dev);
|
||||
if (!IS_ERR_OR_NULL(idev) && dev->flags & IFF_UP &&
|
||||
dev->flags & IFF_MULTICAST)
|
||||
ipv6_mc_up(idev);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4562,12 +4567,13 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
}
|
||||
|
||||
static int modify_prefix_route(struct inet6_ifaddr *ifp,
|
||||
unsigned long expires, u32 flags)
|
||||
unsigned long expires, u32 flags,
|
||||
bool modify_peer)
|
||||
{
|
||||
struct fib6_info *f6i;
|
||||
u32 prio;
|
||||
|
||||
f6i = addrconf_get_prefix_route(&ifp->addr,
|
||||
f6i = addrconf_get_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
|
||||
ifp->prefix_len,
|
||||
ifp->idev->dev,
|
||||
0, RTF_GATEWAY | RTF_DEFAULT);
|
||||
|
@ -4580,7 +4586,8 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp,
|
|||
ip6_del_rt(dev_net(ifp->idev->dev), f6i);
|
||||
|
||||
/* add new one */
|
||||
addrconf_prefix_route(&ifp->addr, ifp->prefix_len,
|
||||
addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
|
||||
ifp->prefix_len,
|
||||
ifp->rt_priority, ifp->idev->dev,
|
||||
expires, flags, GFP_KERNEL);
|
||||
} else {
|
||||
|
@ -4602,6 +4609,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
|||
unsigned long timeout;
|
||||
bool was_managetempaddr;
|
||||
bool had_prefixroute;
|
||||
bool new_peer = false;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
|
@ -4633,6 +4641,13 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
|||
cfg->preferred_lft = timeout;
|
||||
}
|
||||
|
||||
if (cfg->peer_pfx &&
|
||||
memcmp(&ifp->peer_addr, cfg->peer_pfx, sizeof(struct in6_addr))) {
|
||||
if (!ipv6_addr_any(&ifp->peer_addr))
|
||||
cleanup_prefix_route(ifp, expires, true, true);
|
||||
new_peer = true;
|
||||
}
|
||||
|
||||
spin_lock_bh(&ifp->lock);
|
||||
was_managetempaddr = ifp->flags & IFA_F_MANAGETEMPADDR;
|
||||
had_prefixroute = ifp->flags & IFA_F_PERMANENT &&
|
||||
|
@ -4648,6 +4663,9 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
|||
if (cfg->rt_priority && cfg->rt_priority != ifp->rt_priority)
|
||||
ifp->rt_priority = cfg->rt_priority;
|
||||
|
||||
if (new_peer)
|
||||
ifp->peer_addr = *cfg->peer_pfx;
|
||||
|
||||
spin_unlock_bh(&ifp->lock);
|
||||
if (!(ifp->flags&IFA_F_TENTATIVE))
|
||||
ipv6_ifa_notify(0, ifp);
|
||||
|
@ -4656,7 +4674,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
|||
int rc = -ENOENT;
|
||||
|
||||
if (had_prefixroute)
|
||||
rc = modify_prefix_route(ifp, expires, flags);
|
||||
rc = modify_prefix_route(ifp, expires, flags, false);
|
||||
|
||||
/* prefix route could have been deleted; if so restore it */
|
||||
if (rc == -ENOENT) {
|
||||
|
@ -4664,6 +4682,15 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
|||
ifp->rt_priority, ifp->idev->dev,
|
||||
expires, flags, GFP_KERNEL);
|
||||
}
|
||||
|
||||
if (had_prefixroute && !ipv6_addr_any(&ifp->peer_addr))
|
||||
rc = modify_prefix_route(ifp, expires, flags, true);
|
||||
|
||||
if (rc == -ENOENT && !ipv6_addr_any(&ifp->peer_addr)) {
|
||||
addrconf_prefix_route(&ifp->peer_addr, ifp->prefix_len,
|
||||
ifp->rt_priority, ifp->idev->dev,
|
||||
expires, flags, GFP_KERNEL);
|
||||
}
|
||||
} else if (had_prefixroute) {
|
||||
enum cleanup_prefix_rt_t action;
|
||||
unsigned long rt_expires;
|
||||
|
@ -4674,7 +4701,7 @@ static int inet6_addr_modify(struct inet6_ifaddr *ifp, struct ifa6_config *cfg)
|
|||
|
||||
if (action != CLEANUP_PREFIX_RT_NOP) {
|
||||
cleanup_prefix_route(ifp, rt_expires,
|
||||
action == CLEANUP_PREFIX_RT_DEL);
|
||||
action == CLEANUP_PREFIX_RT_DEL, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5734,9 +5761,9 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
|
|||
if (ifp->idev->cnf.forwarding)
|
||||
addrconf_join_anycast(ifp);
|
||||
if (!ipv6_addr_any(&ifp->peer_addr))
|
||||
addrconf_prefix_route(&ifp->peer_addr, 128, 0,
|
||||
ifp->idev->dev, 0, 0,
|
||||
GFP_ATOMIC);
|
||||
addrconf_prefix_route(&ifp->peer_addr, 128,
|
||||
ifp->rt_priority, ifp->idev->dev,
|
||||
0, 0, GFP_ATOMIC);
|
||||
break;
|
||||
case RTM_DELADDR:
|
||||
if (ifp->idev->cnf.forwarding)
|
||||
|
|
|
@ -185,9 +185,15 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|||
retv = -EBUSY;
|
||||
break;
|
||||
}
|
||||
} else if (sk->sk_protocol != IPPROTO_TCP)
|
||||
} else if (sk->sk_protocol == IPPROTO_TCP) {
|
||||
if (sk->sk_prot != &tcpv6_prot) {
|
||||
retv = -EBUSY;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
if (sk->sk_state != TCP_ESTABLISHED) {
|
||||
retv = -ENOTCONN;
|
||||
break;
|
||||
|
|
|
@ -390,7 +390,7 @@ static void *ct_cpu_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|||
*pos = cpu + 1;
|
||||
return per_cpu_ptr(net->ct.stat, cpu);
|
||||
}
|
||||
|
||||
(*pos)++;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -273,7 +273,7 @@ static void *synproxy_cpu_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|||
*pos = cpu + 1;
|
||||
return per_cpu_ptr(snet->stats, cpu);
|
||||
}
|
||||
|
||||
(*pos)++;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -744,6 +744,8 @@ static const struct nla_policy nfnl_cthelper_policy[NFCTH_MAX+1] = {
|
|||
[NFCTH_NAME] = { .type = NLA_NUL_STRING,
|
||||
.len = NF_CT_HELPER_NAME_LEN-1 },
|
||||
[NFCTH_QUEUE_NUM] = { .type = NLA_U32, },
|
||||
[NFCTH_PRIV_DATA_LEN] = { .type = NLA_U32, },
|
||||
[NFCTH_STATUS] = { .type = NLA_U32, },
|
||||
};
|
||||
|
||||
static const struct nfnl_callback nfnl_cthelper_cb[NFNL_MSG_CTHELPER_MAX] = {
|
||||
|
|
|
@ -121,6 +121,7 @@ static const struct nla_policy nft_payload_policy[NFTA_PAYLOAD_MAX + 1] = {
|
|||
[NFTA_PAYLOAD_LEN] = { .type = NLA_U32 },
|
||||
[NFTA_PAYLOAD_CSUM_TYPE] = { .type = NLA_U32 },
|
||||
[NFTA_PAYLOAD_CSUM_OFFSET] = { .type = NLA_U32 },
|
||||
[NFTA_PAYLOAD_CSUM_FLAGS] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
static int nft_payload_init(const struct nft_ctx *ctx,
|
||||
|
|
|
@ -308,6 +308,8 @@ static const struct nla_policy nft_tunnel_key_policy[NFTA_TUNNEL_KEY_MAX + 1] =
|
|||
[NFTA_TUNNEL_KEY_FLAGS] = { .type = NLA_U32, },
|
||||
[NFTA_TUNNEL_KEY_TOS] = { .type = NLA_U8, },
|
||||
[NFTA_TUNNEL_KEY_TTL] = { .type = NLA_U8, },
|
||||
[NFTA_TUNNEL_KEY_SPORT] = { .type = NLA_U16, },
|
||||
[NFTA_TUNNEL_KEY_DPORT] = { .type = NLA_U16, },
|
||||
[NFTA_TUNNEL_KEY_OPTS] = { .type = NLA_NESTED, },
|
||||
};
|
||||
|
||||
|
|
|
@ -1556,6 +1556,9 @@ static void *xt_mttg_seq_next(struct seq_file *seq, void *v, loff_t *ppos,
|
|||
uint8_t nfproto = (unsigned long)PDE_DATA(file_inode(seq->file));
|
||||
struct nf_mttg_trav *trav = seq->private;
|
||||
|
||||
if (ppos != NULL)
|
||||
++(*ppos);
|
||||
|
||||
switch (trav->class) {
|
||||
case MTTG_TRAV_INIT:
|
||||
trav->class = MTTG_TRAV_NFP_UNSPEC;
|
||||
|
@ -1581,9 +1584,6 @@ static void *xt_mttg_seq_next(struct seq_file *seq, void *v, loff_t *ppos,
|
|||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ppos != NULL)
|
||||
++*ppos;
|
||||
return trav;
|
||||
}
|
||||
|
||||
|
|
|
@ -497,12 +497,12 @@ static void *recent_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|||
const struct recent_entry *e = v;
|
||||
const struct list_head *head = e->list.next;
|
||||
|
||||
(*pos)++;
|
||||
while (head == &t->iphash[st->bucket]) {
|
||||
if (++st->bucket >= ip_list_hash_size)
|
||||
return NULL;
|
||||
head = t->iphash[st->bucket].next;
|
||||
}
|
||||
(*pos)++;
|
||||
return list_entry(head, struct recent_entry, list);
|
||||
}
|
||||
|
||||
|
|
|
@ -2411,7 +2411,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err,
|
|||
in_skb->len))
|
||||
WARN_ON(nla_put_u32(skb, NLMSGERR_ATTR_OFFS,
|
||||
(u8 *)extack->bad_attr -
|
||||
in_skb->data));
|
||||
(u8 *)nlh));
|
||||
} else {
|
||||
if (extack->cookie_len)
|
||||
WARN_ON(nla_put(skb, NLMSGERR_ATTR_COOKIE,
|
||||
|
|
|
@ -193,13 +193,20 @@ void nfc_hci_resp_received(struct nfc_hci_dev *hdev, u8 result,
|
|||
void nfc_hci_cmd_received(struct nfc_hci_dev *hdev, u8 pipe, u8 cmd,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
u8 gate = hdev->pipes[pipe].gate;
|
||||
u8 status = NFC_HCI_ANY_OK;
|
||||
struct hci_create_pipe_resp *create_info;
|
||||
struct hci_delete_pipe_noti *delete_info;
|
||||
struct hci_all_pipe_cleared_noti *cleared_info;
|
||||
u8 gate;
|
||||
|
||||
pr_debug("from gate %x pipe %x cmd %x\n", gate, pipe, cmd);
|
||||
pr_debug("from pipe %x cmd %x\n", pipe, cmd);
|
||||
|
||||
if (pipe >= NFC_HCI_MAX_PIPES) {
|
||||
status = NFC_HCI_ANY_E_NOK;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
gate = hdev->pipes[pipe].gate;
|
||||
|
||||
switch (cmd) {
|
||||
case NFC_HCI_ADM_NOTIFY_PIPE_CREATED:
|
||||
|
@ -387,8 +394,14 @@ void nfc_hci_event_received(struct nfc_hci_dev *hdev, u8 pipe, u8 event,
|
|||
struct sk_buff *skb)
|
||||
{
|
||||
int r = 0;
|
||||
u8 gate = hdev->pipes[pipe].gate;
|
||||
u8 gate;
|
||||
|
||||
if (pipe >= NFC_HCI_MAX_PIPES) {
|
||||
pr_err("Discarded event %x to invalid pipe %x\n", event, pipe);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
gate = hdev->pipes[pipe].gate;
|
||||
if (gate == NFC_HCI_INVALID_GATE) {
|
||||
pr_err("Discarded event %x to unopened pipe %x\n", event, pipe);
|
||||
goto exit;
|
||||
|
|
|
@ -44,6 +44,7 @@ static const struct nla_policy nfc_genl_policy[NFC_ATTR_MAX + 1] = {
|
|||
[NFC_ATTR_DEVICE_NAME] = { .type = NLA_STRING,
|
||||
.len = NFC_DEVICE_NAME_MAXSIZE },
|
||||
[NFC_ATTR_PROTOCOLS] = { .type = NLA_U32 },
|
||||
[NFC_ATTR_TARGET_INDEX] = { .type = NLA_U32 },
|
||||
[NFC_ATTR_COMM_MODE] = { .type = NLA_U8 },
|
||||
[NFC_ATTR_RF_MODE] = { .type = NLA_U8 },
|
||||
[NFC_ATTR_DEVICE_POWERED] = { .type = NLA_U8 },
|
||||
|
@ -55,7 +56,10 @@ static const struct nla_policy nfc_genl_policy[NFC_ATTR_MAX + 1] = {
|
|||
[NFC_ATTR_LLC_SDP] = { .type = NLA_NESTED },
|
||||
[NFC_ATTR_FIRMWARE_NAME] = { .type = NLA_STRING,
|
||||
.len = NFC_FIRMWARE_NAME_MAXSIZE },
|
||||
[NFC_ATTR_SE_INDEX] = { .type = NLA_U32 },
|
||||
[NFC_ATTR_SE_APDU] = { .type = NLA_BINARY },
|
||||
[NFC_ATTR_VENDOR_ID] = { .type = NLA_U32 },
|
||||
[NFC_ATTR_VENDOR_SUBCMD] = { .type = NLA_U32 },
|
||||
[NFC_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
|
||||
|
||||
};
|
||||
|
|
|
@ -2260,6 +2260,13 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
TP_STATUS_KERNEL, (macoff+snaplen));
|
||||
if (!h.raw)
|
||||
goto drop_n_account;
|
||||
|
||||
if (do_vnet &&
|
||||
virtio_net_hdr_from_skb(skb, h.raw + macoff -
|
||||
sizeof(struct virtio_net_hdr),
|
||||
vio_le(), true, 0))
|
||||
goto drop_n_account;
|
||||
|
||||
if (po->tp_version <= TPACKET_V2) {
|
||||
packet_increment_rx_head(po, &po->rx_ring);
|
||||
/*
|
||||
|
@ -2272,12 +2279,6 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
|
|||
status |= TP_STATUS_LOSING;
|
||||
}
|
||||
|
||||
if (do_vnet &&
|
||||
virtio_net_hdr_from_skb(skb, h.raw + macoff -
|
||||
sizeof(struct virtio_net_hdr),
|
||||
vio_le(), true, 0))
|
||||
goto drop_n_account;
|
||||
|
||||
po->stats.stats1.tp_packets++;
|
||||
if (copy_skb) {
|
||||
status |= TP_STATUS_COPY;
|
||||
|
|
|
@ -695,6 +695,7 @@ static const struct nla_policy fq_policy[TCA_FQ_MAX + 1] = {
|
|||
[TCA_FQ_FLOW_MAX_RATE] = { .type = NLA_U32 },
|
||||
[TCA_FQ_BUCKETS_LOG] = { .type = NLA_U32 },
|
||||
[TCA_FQ_FLOW_REFILL_DELAY] = { .type = NLA_U32 },
|
||||
[TCA_FQ_ORPHAN_MASK] = { .type = NLA_U32 },
|
||||
[TCA_FQ_LOW_RATE_THRESHOLD] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
|
|
|
@ -252,15 +252,11 @@ static size_t inet_assoc_attr_size(struct sctp_association *asoc)
|
|||
addrcnt++;
|
||||
|
||||
return nla_total_size(sizeof(struct sctp_info))
|
||||
+ nla_total_size(1) /* INET_DIAG_SHUTDOWN */
|
||||
+ nla_total_size(1) /* INET_DIAG_TOS */
|
||||
+ nla_total_size(1) /* INET_DIAG_TCLASS */
|
||||
+ nla_total_size(4) /* INET_DIAG_MARK */
|
||||
+ nla_total_size(4) /* INET_DIAG_CLASS_ID */
|
||||
+ nla_total_size(addrlen * asoc->peer.transport_count)
|
||||
+ nla_total_size(addrlen * addrcnt)
|
||||
+ nla_total_size(sizeof(struct inet_diag_meminfo))
|
||||
+ nla_total_size(sizeof(struct inet_diag_msg))
|
||||
+ inet_diag_msg_attrs_size()
|
||||
+ nla_total_size(sizeof(struct inet_diag_meminfo))
|
||||
+ 64;
|
||||
}
|
||||
|
||||
|
|
|
@ -552,6 +552,8 @@ static void smc_ib_remove_dev(struct ib_device *ibdev, void *client_data)
|
|||
struct smc_ib_device *smcibdev;
|
||||
|
||||
smcibdev = ib_get_client_data(ibdev, &smc_ib_client);
|
||||
if (!smcibdev || smcibdev->ibdev != ibdev)
|
||||
return;
|
||||
ib_set_client_data(ibdev, &smc_ib_client, NULL);
|
||||
spin_lock(&smc_ib_devices.lock);
|
||||
list_del_init(&smcibdev->list); /* remove from smc_ib_devices */
|
||||
|
@ -559,6 +561,7 @@ static void smc_ib_remove_dev(struct ib_device *ibdev, void *client_data)
|
|||
smc_pnet_remove_by_ibdev(smcibdev);
|
||||
smc_ib_cleanup_per_ibdev(smcibdev);
|
||||
ib_unregister_event_handler(&smcibdev->event_handler);
|
||||
cancel_work_sync(&smcibdev->port_event_work);
|
||||
kfree(smcibdev);
|
||||
}
|
||||
|
||||
|
|
|
@ -110,7 +110,8 @@ const struct nla_policy tipc_nl_prop_policy[TIPC_NLA_PROP_MAX + 1] = {
|
|||
[TIPC_NLA_PROP_UNSPEC] = { .type = NLA_UNSPEC },
|
||||
[TIPC_NLA_PROP_PRIO] = { .type = NLA_U32 },
|
||||
[TIPC_NLA_PROP_TOL] = { .type = NLA_U32 },
|
||||
[TIPC_NLA_PROP_WIN] = { .type = NLA_U32 }
|
||||
[TIPC_NLA_PROP_WIN] = { .type = NLA_U32 },
|
||||
[TIPC_NLA_PROP_MTU] = { .type = NLA_U32 }
|
||||
};
|
||||
|
||||
const struct nla_policy tipc_nl_bearer_policy[TIPC_NLA_BEARER_MAX + 1] = {
|
||||
|
|
|
@ -351,6 +351,8 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
|||
[NL80211_ATTR_KEY_DEFAULT_TYPES] = { .type = NLA_NESTED },
|
||||
[NL80211_ATTR_WOWLAN_TRIGGERS] = { .type = NLA_NESTED },
|
||||
[NL80211_ATTR_STA_PLINK_STATE] = { .type = NLA_U8 },
|
||||
[NL80211_ATTR_MEASUREMENT_DURATION] = { .type = NLA_U16 },
|
||||
[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY] = { .type = NLA_FLAG },
|
||||
[NL80211_ATTR_SCHED_SCAN_INTERVAL] = { .type = NLA_U32 },
|
||||
[NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED },
|
||||
[NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED },
|
||||
|
@ -399,6 +401,8 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
|||
[NL80211_ATTR_MDID] = { .type = NLA_U16 },
|
||||
[NL80211_ATTR_IE_RIC] = { .type = NLA_BINARY,
|
||||
.len = IEEE80211_MAX_DATA_LEN },
|
||||
[NL80211_ATTR_CRIT_PROT_ID] = { .type = NLA_U16 },
|
||||
[NL80211_ATTR_MAX_CRIT_PROT_DURATION] = { .type = NLA_U16 },
|
||||
[NL80211_ATTR_PEER_AID] = { .type = NLA_U16 },
|
||||
[NL80211_ATTR_CH_SWITCH_COUNT] = { .type = NLA_U32 },
|
||||
[NL80211_ATTR_CH_SWITCH_BLOCK_TX] = { .type = NLA_FLAG },
|
||||
|
@ -424,6 +428,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
|||
[NL80211_ATTR_USER_PRIO] = { .type = NLA_U8 },
|
||||
[NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 },
|
||||
[NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 },
|
||||
[NL80211_ATTR_OPER_CLASS] = { .type = NLA_U8 },
|
||||
[NL80211_ATTR_MAC_MASK] = { .len = ETH_ALEN },
|
||||
[NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG },
|
||||
[NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 },
|
||||
|
|
|
@ -467,13 +467,12 @@ $(sort $(subdir-obj-y)): $(subdir-ym) ;
|
|||
ifdef CONFIG_LTO_CLANG
|
||||
ifdef CONFIG_MODVERSIONS
|
||||
# combine symversions for later processing
|
||||
update_lto_symversions = \
|
||||
rm -f $@.symversions; \
|
||||
for i in $(filter-out FORCE,$^); do \
|
||||
if [ -f $$i.symversions ]; then \
|
||||
cat $$i.symversions \
|
||||
>> $@.symversions; \
|
||||
fi; \
|
||||
update_lto_symversions = \
|
||||
rm -f $@.symversions; \
|
||||
for i in $(foreach n, \
|
||||
$(filter-out FORCE,$^), \
|
||||
$(if $(wildcard $(n).symversions),$(n))); do \
|
||||
cat $$i.symversions >> $@.symversions; \
|
||||
done;
|
||||
endif
|
||||
# rebuild the symbol table with llvm-ar to include IR files
|
||||
|
|
|
@ -42,7 +42,7 @@ static bool done = false, silent = false, fshared = false;
|
|||
static pthread_mutex_t thread_lock;
|
||||
static pthread_cond_t thread_parent, thread_worker;
|
||||
static struct stats waketime_stats, wakeup_stats;
|
||||
static unsigned int ncpus, threads_starting, nthreads = 0;
|
||||
static unsigned int threads_starting, nthreads = 0;
|
||||
static int futex_flag = 0;
|
||||
|
||||
static const struct option options[] = {
|
||||
|
@ -140,7 +140,7 @@ int bench_futex_wake(int argc, const char **argv)
|
|||
sigaction(SIGINT, &act, NULL);
|
||||
|
||||
if (!nthreads)
|
||||
nthreads = ncpus;
|
||||
nthreads = cpu->nr;
|
||||
|
||||
worker = calloc(nthreads, sizeof(*worker));
|
||||
if (!worker)
|
||||
|
|
|
@ -1372,7 +1372,7 @@ sub reboot {
|
|||
|
||||
} else {
|
||||
# Make sure everything has been written to disk
|
||||
run_ssh("sync");
|
||||
run_ssh("sync", 10);
|
||||
|
||||
if (defined($time)) {
|
||||
start_monitor;
|
||||
|
|
|
@ -979,6 +979,27 @@ ipv6_addr_metric_test()
|
|||
fi
|
||||
log_test $rc 0 "Prefix route with metric on link up"
|
||||
|
||||
# verify peer metric added correctly
|
||||
set -e
|
||||
run_cmd "$IP -6 addr flush dev dummy2"
|
||||
run_cmd "$IP -6 addr add dev dummy2 2001:db8:104::1 peer 2001:db8:104::2 metric 260"
|
||||
set +e
|
||||
|
||||
check_route6 "2001:db8:104::1 dev dummy2 proto kernel metric 260"
|
||||
log_test $? 0 "Set metric with peer route on local side"
|
||||
log_test $? 0 "User specified metric on local address"
|
||||
check_route6 "2001:db8:104::2 dev dummy2 proto kernel metric 260"
|
||||
log_test $? 0 "Set metric with peer route on peer side"
|
||||
|
||||
set -e
|
||||
run_cmd "$IP -6 addr change dev dummy2 2001:db8:104::1 peer 2001:db8:104::3 metric 261"
|
||||
set +e
|
||||
|
||||
check_route6 "2001:db8:104::1 dev dummy2 proto kernel metric 261"
|
||||
log_test $? 0 "Modify metric and peer address on local side"
|
||||
check_route6 "2001:db8:104::3 dev dummy2 proto kernel metric 261"
|
||||
log_test $? 0 "Modify metric and peer address on peer side"
|
||||
|
||||
$IP li del dummy1
|
||||
$IP li del dummy2
|
||||
cleanup
|
||||
|
@ -1320,13 +1341,20 @@ ipv4_addr_metric_test()
|
|||
|
||||
run_cmd "$IP addr flush dev dummy2"
|
||||
run_cmd "$IP addr add dev dummy2 172.16.104.1/32 peer 172.16.104.2 metric 260"
|
||||
run_cmd "$IP addr change dev dummy2 172.16.104.1/32 peer 172.16.104.2 metric 261"
|
||||
rc=$?
|
||||
if [ $rc -eq 0 ]; then
|
||||
check_route "172.16.104.2 dev dummy2 proto kernel scope link src 172.16.104.1 metric 261"
|
||||
check_route "172.16.104.2 dev dummy2 proto kernel scope link src 172.16.104.1 metric 260"
|
||||
rc=$?
|
||||
fi
|
||||
log_test $rc 0 "Modify metric of address with peer route"
|
||||
log_test $rc 0 "Set metric of address with peer route"
|
||||
|
||||
run_cmd "$IP addr change dev dummy2 172.16.104.1/32 peer 172.16.104.3 metric 261"
|
||||
rc=$?
|
||||
if [ $rc -eq 0 ]; then
|
||||
check_route "172.16.104.3 dev dummy2 proto kernel scope link src 172.16.104.1 metric 261"
|
||||
rc=$?
|
||||
fi
|
||||
log_test $rc 0 "Modify metric and peer address for peer route"
|
||||
|
||||
$IP li del dummy1
|
||||
$IP li del dummy2
|
||||
|
|
Loading…
Reference in a new issue