mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 21:07:02 +09:00
Merge 4.19.177 into android-4.19-stable
Changes in 4.19.177 tracing: Do not count ftrace events in top level enable output tracing: Check length before giving out the filter buffer arm/xen: Don't probe xenbus as part of an early initcall arm64: dts: rockchip: Fix PCIe DT properties on rk3399 platform/x86: hp-wmi: Disable tablet-mode reporting by default ovl: perform vfs_getxattr() with mounter creds cap: fix conversions on getxattr ovl: skip getxattr of security labels drm/amd/display: Fix dc_sink kref count in emulated_link_detect drm/amd/display: Free atomic state after drm_atomic_commit riscv: virt_addr_valid must check the address belongs to linear mapping bfq-iosched: Revert "bfq: Fix computation of shallow depth" ARM: dts: lpc32xx: Revert set default clock rate of HCLK PLL ARM: ensure the signal page contains defined contents ARM: kexec: fix oops after TLB are invalidated mt76: dma: fix a possible memory leak in mt76_add_fragment() bpf: Check for integer overflow when using roundup_pow_of_two() netfilter: xt_recent: Fix attempt to update deleted entry netfilter: flowtable: fix tcp and udp header checksum update xen/netback: avoid race in xenvif_rx_ring_slots_available() net: stmmac: set TxQ mode back to DCB after disabling CBS netfilter: conntrack: skip identical origin tuple in same zone only net: hns3: add a check for queue_id in hclge_reset_vf_queue() firmware_loader: align .builtin_fw to 8 i2c: stm32f7: fix configuration of the digital filter h8300: fix PREEMPTION build, TI_PRE_COUNT undefined usb: dwc3: ulpi: fix checkpatch warning usb: dwc3: ulpi: Replace CPU-based busyloop with Protocol-based one net: fix iteration for sctp transport seq_files net/vmw_vsock: improve locking in vsock_connect_timeout() net: watchdog: hold device global xmit lock during tx disable vsock/virtio: update credit only if socket is not closed vsock: fix locking in vsock_shutdown() net/rds: restrict iovecs length for RDS_CMSG_RDMA_ARGS net/qrtr: restrict user-controlled length in qrtr_tun_write_iter() ovl: expand warning in ovl_d_real() x86/build: Disable CET instrumentation in the kernel for 32-bit too KVM: SEV: fix double locking due to incorrect backport net: qrtr: Fix port ID for control messages Xen/x86: don't bail early from clear_foreign_p2m_mapping() Xen/x86: also check kernel mapping in set_foreign_p2m_mapping() Xen/gntdev: correct dev_bus_addr handling in gntdev_map_grant_pages() Xen/gntdev: correct error checking in gntdev_map_grant_pages() xen/arm: don't ignore return errors from set_phys_to_machine xen-blkback: don't "handle" error by BUG() xen-netback: don't "handle" error by BUG() xen-scsiback: don't "handle" error by BUG() xen-blkback: fix error handling in xen_blkbk_map() scsi: qla2xxx: Fix crash during driver load on big endian machines kvm: check tlbs_dirty directly Linux 4.19.177 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I5bef9024912d4568ab7ee3869072c0c4350513f5
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 176
|
||||
SUBLEVEL = 177
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
||||
@@ -323,9 +323,6 @@
|
||||
|
||||
clocks = <&xtal_32k>, <&xtal>;
|
||||
clock-names = "xtal_32k", "xtal";
|
||||
|
||||
assigned-clocks = <&clk LPC32XX_CLK_HCLK_PLL>;
|
||||
assigned-clock-rates = <208000000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
12
arch/arm/include/asm/kexec-internal.h
Normal file
12
arch/arm/include/asm/kexec-internal.h
Normal file
@@ -0,0 +1,12 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ARM_KEXEC_INTERNAL_H
|
||||
#define _ARM_KEXEC_INTERNAL_H
|
||||
|
||||
struct kexec_relocate_data {
|
||||
unsigned long kexec_start_address;
|
||||
unsigned long kexec_indirection_page;
|
||||
unsigned long kexec_mach_type;
|
||||
unsigned long kexec_r2;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <linux/kvm_host.h>
|
||||
#endif
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/kexec-internal.h>
|
||||
#include <asm/glue-df.h>
|
||||
#include <asm/glue-pf.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@@ -189,5 +190,9 @@ int main(void)
|
||||
DEFINE(MPU_RGN_PRBAR, offsetof(struct mpu_rgn, prbar));
|
||||
DEFINE(MPU_RGN_PRLAR, offsetof(struct mpu_rgn, prlar));
|
||||
#endif
|
||||
DEFINE(KEXEC_START_ADDR, offsetof(struct kexec_relocate_data, kexec_start_address));
|
||||
DEFINE(KEXEC_INDIR_PAGE, offsetof(struct kexec_relocate_data, kexec_indirection_page));
|
||||
DEFINE(KEXEC_MACH_TYPE, offsetof(struct kexec_relocate_data, kexec_mach_type));
|
||||
DEFINE(KEXEC_R2, offsetof(struct kexec_relocate_data, kexec_r2));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/kexec-internal.h>
|
||||
#include <asm/fncpy.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/smp_plat.h>
|
||||
@@ -24,11 +25,6 @@
|
||||
extern void relocate_new_kernel(void);
|
||||
extern const unsigned int relocate_new_kernel_size;
|
||||
|
||||
extern unsigned long kexec_start_address;
|
||||
extern unsigned long kexec_indirection_page;
|
||||
extern unsigned long kexec_mach_type;
|
||||
extern unsigned long kexec_boot_atags;
|
||||
|
||||
static atomic_t waiting_for_crash_ipi;
|
||||
|
||||
/*
|
||||
@@ -161,6 +157,7 @@ void (*kexec_reinit)(void);
|
||||
void machine_kexec(struct kimage *image)
|
||||
{
|
||||
unsigned long page_list, reboot_entry_phys;
|
||||
struct kexec_relocate_data *data;
|
||||
void (*reboot_entry)(void);
|
||||
void *reboot_code_buffer;
|
||||
|
||||
@@ -176,18 +173,17 @@ void machine_kexec(struct kimage *image)
|
||||
|
||||
reboot_code_buffer = page_address(image->control_code_page);
|
||||
|
||||
/* Prepare parameters for reboot_code_buffer*/
|
||||
set_kernel_text_rw();
|
||||
kexec_start_address = image->start;
|
||||
kexec_indirection_page = page_list;
|
||||
kexec_mach_type = machine_arch_type;
|
||||
kexec_boot_atags = image->arch.kernel_r2;
|
||||
|
||||
/* copy our kernel relocation code to the control code page */
|
||||
reboot_entry = fncpy(reboot_code_buffer,
|
||||
&relocate_new_kernel,
|
||||
relocate_new_kernel_size);
|
||||
|
||||
data = reboot_code_buffer + relocate_new_kernel_size;
|
||||
data->kexec_start_address = image->start;
|
||||
data->kexec_indirection_page = page_list;
|
||||
data->kexec_mach_type = machine_arch_type;
|
||||
data->kexec_r2 = image->arch.kernel_r2;
|
||||
|
||||
/* get the identity mapping physical address for the reboot code */
|
||||
reboot_entry_phys = virt_to_idmap(reboot_entry);
|
||||
|
||||
|
||||
@@ -5,14 +5,16 @@
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/kexec.h>
|
||||
|
||||
.align 3 /* not needed for this code, but keeps fncpy() happy */
|
||||
|
||||
ENTRY(relocate_new_kernel)
|
||||
|
||||
ldr r0,kexec_indirection_page
|
||||
ldr r1,kexec_start_address
|
||||
adr r7, relocate_new_kernel_end
|
||||
ldr r0, [r7, #KEXEC_INDIR_PAGE]
|
||||
ldr r1, [r7, #KEXEC_START_ADDR]
|
||||
|
||||
/*
|
||||
* If there is no indirection page (we are doing crashdumps)
|
||||
@@ -57,34 +59,16 @@ ENTRY(relocate_new_kernel)
|
||||
|
||||
2:
|
||||
/* Jump to relocated kernel */
|
||||
mov lr,r1
|
||||
mov r0,#0
|
||||
ldr r1,kexec_mach_type
|
||||
ldr r2,kexec_boot_atags
|
||||
ARM( ret lr )
|
||||
THUMB( bx lr )
|
||||
|
||||
.align
|
||||
|
||||
.globl kexec_start_address
|
||||
kexec_start_address:
|
||||
.long 0x0
|
||||
|
||||
.globl kexec_indirection_page
|
||||
kexec_indirection_page:
|
||||
.long 0x0
|
||||
|
||||
.globl kexec_mach_type
|
||||
kexec_mach_type:
|
||||
.long 0x0
|
||||
|
||||
/* phy addr of the atags for the new kernel */
|
||||
.globl kexec_boot_atags
|
||||
kexec_boot_atags:
|
||||
.long 0x0
|
||||
mov lr, r1
|
||||
mov r0, #0
|
||||
ldr r1, [r7, #KEXEC_MACH_TYPE]
|
||||
ldr r2, [r7, #KEXEC_R2]
|
||||
ARM( ret lr )
|
||||
THUMB( bx lr )
|
||||
|
||||
ENDPROC(relocate_new_kernel)
|
||||
|
||||
.align 3
|
||||
relocate_new_kernel_end:
|
||||
|
||||
.globl relocate_new_kernel_size
|
||||
|
||||
@@ -697,18 +697,20 @@ struct page *get_signal_page(void)
|
||||
|
||||
addr = page_address(page);
|
||||
|
||||
/* Poison the entire page */
|
||||
memset32(addr, __opcode_to_mem_arm(0xe7fddef1),
|
||||
PAGE_SIZE / sizeof(u32));
|
||||
|
||||
/* Give the signal return code some randomness */
|
||||
offset = 0x200 + (get_random_int() & 0x7fc);
|
||||
signal_return_offset = offset;
|
||||
|
||||
/*
|
||||
* Copy signal return handlers into the vector page, and
|
||||
* set sigreturn to be a pointer to these.
|
||||
*/
|
||||
/* Copy signal return handlers into the page */
|
||||
memcpy(addr + offset, sigreturn_codes, sizeof(sigreturn_codes));
|
||||
|
||||
ptr = (unsigned long)addr + offset;
|
||||
flush_icache_range(ptr, ptr + sizeof(sigreturn_codes));
|
||||
/* Flush out all instructions in this page */
|
||||
ptr = (unsigned long)addr;
|
||||
flush_icache_range(ptr, ptr + PAGE_SIZE);
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
@@ -404,8 +404,6 @@ static int __init xen_guest_init(void)
|
||||
return -ENOMEM;
|
||||
}
|
||||
gnttab_init();
|
||||
if (!xen_initial_domain())
|
||||
xenbus_probe();
|
||||
|
||||
/*
|
||||
* Making sure board specific code will not set up ops for
|
||||
|
||||
@@ -93,8 +93,10 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
|
||||
for (i = 0; i < count; i++) {
|
||||
if (map_ops[i].status)
|
||||
continue;
|
||||
set_phys_to_machine(map_ops[i].host_addr >> XEN_PAGE_SHIFT,
|
||||
map_ops[i].dev_bus_addr >> XEN_PAGE_SHIFT);
|
||||
if (unlikely(!set_phys_to_machine(map_ops[i].host_addr >> XEN_PAGE_SHIFT,
|
||||
map_ops[i].dev_bus_addr >> XEN_PAGE_SHIFT))) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -198,6 +198,7 @@
|
||||
reg = <0x0 0xf8000000 0x0 0x2000000>,
|
||||
<0x0 0xfd000000 0x0 0x1000000>;
|
||||
reg-names = "axi-base", "apb-base";
|
||||
device_type = "pci";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
@@ -216,7 +217,6 @@
|
||||
<0 0 0 2 &pcie0_intc 1>,
|
||||
<0 0 0 3 &pcie0_intc 2>,
|
||||
<0 0 0 4 &pcie0_intc 3>;
|
||||
linux,pci-domain = <0>;
|
||||
max-link-speed = <1>;
|
||||
msi-map = <0x0 &its 0x0 0x1000>;
|
||||
phys = <&pcie_phy 0>, <&pcie_phy 1>,
|
||||
|
||||
@@ -63,6 +63,9 @@ int main(void)
|
||||
OFFSET(TI_FLAGS, thread_info, flags);
|
||||
OFFSET(TI_CPU, thread_info, cpu);
|
||||
OFFSET(TI_PRE, thread_info, preempt_count);
|
||||
#ifdef CONFIG_PREEMPTION
|
||||
DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count));
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -115,7 +115,10 @@ extern unsigned long min_low_pfn;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#define virt_addr_valid(vaddr) (pfn_valid(virt_to_pfn(vaddr)))
|
||||
#define virt_addr_valid(vaddr) ({ \
|
||||
unsigned long _addr = (unsigned long)vaddr; \
|
||||
(unsigned long)(_addr) >= PAGE_OFFSET && pfn_valid(virt_to_pfn(_addr)); \
|
||||
})
|
||||
|
||||
#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | \
|
||||
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
|
||||
|
||||
@@ -61,6 +61,9 @@ endif
|
||||
KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
|
||||
KBUILD_CFLAGS += $(call cc-option,-mno-avx,)
|
||||
|
||||
# Intel CET isn't enabled in the kernel
|
||||
KBUILD_CFLAGS += $(call cc-option,-fcf-protection=none)
|
||||
|
||||
ifeq ($(CONFIG_X86_32),y)
|
||||
BITS := 32
|
||||
UTS_MACHINE := i386
|
||||
@@ -132,9 +135,6 @@ else
|
||||
KBUILD_CFLAGS += -mno-red-zone
|
||||
KBUILD_CFLAGS += -mcmodel=kernel
|
||||
|
||||
# Intel CET isn't enabled in the kernel
|
||||
KBUILD_CFLAGS += $(call cc-option,-fcf-protection=none)
|
||||
|
||||
# -funit-at-a-time shrinks the kernel .text considerably
|
||||
# unfortunately it makes reading oopses harder.
|
||||
KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time)
|
||||
|
||||
@@ -7097,7 +7097,6 @@ static int svm_register_enc_region(struct kvm *kvm,
|
||||
region->uaddr = range->addr;
|
||||
region->size = range->size;
|
||||
|
||||
mutex_lock(&kvm->lock);
|
||||
list_add_tail(®ion->list, &sev->regions_list);
|
||||
mutex_unlock(&kvm->lock);
|
||||
|
||||
|
||||
@@ -708,7 +708,8 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
|
||||
unsigned long mfn, pfn;
|
||||
|
||||
/* Do not add to override if the map failed. */
|
||||
if (map_ops[i].status)
|
||||
if (map_ops[i].status != GNTST_okay ||
|
||||
(kmap_ops && kmap_ops[i].status != GNTST_okay))
|
||||
continue;
|
||||
|
||||
if (map_ops[i].flags & GNTMAP_contains_pte) {
|
||||
@@ -746,17 +747,15 @@ int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,
|
||||
unsigned long mfn = __pfn_to_mfn(page_to_pfn(pages[i]));
|
||||
unsigned long pfn = page_to_pfn(pages[i]);
|
||||
|
||||
if (mfn == INVALID_P2M_ENTRY || !(mfn & FOREIGN_FRAME_BIT)) {
|
||||
if (mfn != INVALID_P2M_ENTRY && (mfn & FOREIGN_FRAME_BIT))
|
||||
set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
|
||||
}
|
||||
if (kunmap_ops)
|
||||
ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
|
||||
kunmap_ops, count);
|
||||
out:
|
||||
kunmap_ops, count) ?: ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clear_foreign_p2m_mapping);
|
||||
|
||||
@@ -5280,13 +5280,13 @@ static unsigned int bfq_update_depths(struct bfq_data *bfqd,
|
||||
* limit 'something'.
|
||||
*/
|
||||
/* no more than 50% of tags for async I/O */
|
||||
bfqd->word_depths[0][0] = max(bt->sb.depth >> 1, 1U);
|
||||
bfqd->word_depths[0][0] = max((1U << bt->sb.shift) >> 1, 1U);
|
||||
/*
|
||||
* no more than 75% of tags for sync writes (25% extra tags
|
||||
* w.r.t. async I/O, to prevent async I/O from starving sync
|
||||
* writes)
|
||||
*/
|
||||
bfqd->word_depths[0][1] = max((bt->sb.depth * 3) >> 2, 1U);
|
||||
bfqd->word_depths[0][1] = max(((1U << bt->sb.shift) * 3) >> 2, 1U);
|
||||
|
||||
/*
|
||||
* In-word depths in case some bfq_queue is being weight-
|
||||
@@ -5296,9 +5296,9 @@ static unsigned int bfq_update_depths(struct bfq_data *bfqd,
|
||||
* shortage.
|
||||
*/
|
||||
/* no more than ~18% of tags for async I/O */
|
||||
bfqd->word_depths[1][0] = max((bt->sb.depth * 3) >> 4, 1U);
|
||||
bfqd->word_depths[1][0] = max(((1U << bt->sb.shift) * 3) >> 4, 1U);
|
||||
/* no more than ~37% of tags for sync writes (~20% extra tags) */
|
||||
bfqd->word_depths[1][1] = max((bt->sb.depth * 6) >> 4, 1U);
|
||||
bfqd->word_depths[1][1] = max(((1U << bt->sb.shift) * 6) >> 4, 1U);
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
for (j = 0; j < 2; j++)
|
||||
|
||||
@@ -850,8 +850,11 @@ again:
|
||||
pages[i]->page = persistent_gnt->page;
|
||||
pages[i]->persistent_gnt = persistent_gnt;
|
||||
} else {
|
||||
if (get_free_page(ring, &pages[i]->page))
|
||||
goto out_of_memory;
|
||||
if (get_free_page(ring, &pages[i]->page)) {
|
||||
put_free_pages(ring, pages_to_gnt, segs_to_map);
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
addr = vaddr(pages[i]->page);
|
||||
pages_to_gnt[segs_to_map] = pages[i]->page;
|
||||
pages[i]->persistent_gnt = NULL;
|
||||
@@ -867,10 +870,8 @@ again:
|
||||
break;
|
||||
}
|
||||
|
||||
if (segs_to_map) {
|
||||
if (segs_to_map)
|
||||
ret = gnttab_map_refs(map, NULL, pages_to_gnt, segs_to_map);
|
||||
BUG_ON(ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now swizzle the MFN in our domain with the MFN from the other domain
|
||||
@@ -885,7 +886,7 @@ again:
|
||||
pr_debug("invalid buffer -- could not remap it\n");
|
||||
put_free_pages(ring, &pages[seg_idx]->page, 1);
|
||||
pages[seg_idx]->handle = BLKBACK_INVALID_HANDLE;
|
||||
ret |= 1;
|
||||
ret |= !ret;
|
||||
goto next;
|
||||
}
|
||||
pages[seg_idx]->handle = map[new_map_idx].handle;
|
||||
@@ -937,17 +938,18 @@ next:
|
||||
}
|
||||
segs_to_map = 0;
|
||||
last_map = map_until;
|
||||
if (map_until != num)
|
||||
if (!ret && map_until != num)
|
||||
goto again;
|
||||
|
||||
return ret;
|
||||
|
||||
out_of_memory:
|
||||
pr_alert("%s: out of memory\n", __func__);
|
||||
put_free_pages(ring, pages_to_gnt, segs_to_map);
|
||||
for (i = last_map; i < num; i++)
|
||||
out:
|
||||
for (i = last_map; i < num; i++) {
|
||||
/* Don't zap current batch's valid persistent grants. */
|
||||
if(i >= last_map + segs_to_map)
|
||||
pages[i]->persistent_gnt = NULL;
|
||||
pages[i]->handle = BLKBACK_INVALID_HANDLE;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int xen_blkbk_map_seg(struct pending_req *pending_req)
|
||||
|
||||
@@ -668,8 +668,8 @@ static void emulated_link_detect(struct dc_link *link)
|
||||
link->type = dc_connection_none;
|
||||
prev_sink = link->local_sink;
|
||||
|
||||
if (prev_sink != NULL)
|
||||
dc_sink_retain(prev_sink);
|
||||
if (prev_sink)
|
||||
dc_sink_release(prev_sink);
|
||||
|
||||
switch (link->connector_signal) {
|
||||
case SIGNAL_TYPE_HDMI_TYPE_A: {
|
||||
@@ -4732,14 +4732,14 @@ static int dm_force_atomic_commit(struct drm_connector *connector)
|
||||
|
||||
ret = PTR_ERR_OR_ZERO(conn_state);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto out;
|
||||
|
||||
/* Attach crtc to drm_atomic_state*/
|
||||
crtc_state = drm_atomic_get_crtc_state(state, &disconnected_acrtc->base);
|
||||
|
||||
ret = PTR_ERR_OR_ZERO(crtc_state);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto out;
|
||||
|
||||
/* force a restore */
|
||||
crtc_state->mode_changed = true;
|
||||
@@ -4749,17 +4749,15 @@ static int dm_force_atomic_commit(struct drm_connector *connector)
|
||||
|
||||
ret = PTR_ERR_OR_ZERO(plane_state);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
goto out;
|
||||
|
||||
/* Call commit internally with the state we just constructed */
|
||||
ret = drm_atomic_commit(state);
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
err:
|
||||
DRM_ERROR("Restoring old state failed with %i\n", ret);
|
||||
out:
|
||||
drm_atomic_state_put(state);
|
||||
if (ret)
|
||||
DRM_ERROR("Restoring old state failed with %i\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -49,6 +49,8 @@
|
||||
#define STM32F7_I2C_CR1_RXDMAEN BIT(15)
|
||||
#define STM32F7_I2C_CR1_TXDMAEN BIT(14)
|
||||
#define STM32F7_I2C_CR1_ANFOFF BIT(12)
|
||||
#define STM32F7_I2C_CR1_DNF_MASK GENMASK(11, 8)
|
||||
#define STM32F7_I2C_CR1_DNF(n) (((n) & 0xf) << 8)
|
||||
#define STM32F7_I2C_CR1_ERRIE BIT(7)
|
||||
#define STM32F7_I2C_CR1_TCIE BIT(6)
|
||||
#define STM32F7_I2C_CR1_STOPIE BIT(5)
|
||||
@@ -147,7 +149,7 @@
|
||||
#define STM32F7_I2C_MAX_SLAVE 0x2
|
||||
|
||||
#define STM32F7_I2C_DNF_DEFAULT 0
|
||||
#define STM32F7_I2C_DNF_MAX 16
|
||||
#define STM32F7_I2C_DNF_MAX 15
|
||||
|
||||
#define STM32F7_I2C_ANALOG_FILTER_ENABLE 1
|
||||
#define STM32F7_I2C_ANALOG_FILTER_DELAY_MIN 50 /* ns */
|
||||
@@ -645,6 +647,13 @@ static void stm32f7_i2c_hw_config(struct stm32f7_i2c_dev *i2c_dev)
|
||||
else
|
||||
stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
|
||||
STM32F7_I2C_CR1_ANFOFF);
|
||||
|
||||
/* Program the Digital Filter */
|
||||
stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1,
|
||||
STM32F7_I2C_CR1_DNF_MASK);
|
||||
stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
|
||||
STM32F7_I2C_CR1_DNF(i2c_dev->setup.dnf));
|
||||
|
||||
stm32f7_i2c_set_bits(i2c_dev->base + STM32F7_I2C_CR1,
|
||||
STM32F7_I2C_CR1_PE);
|
||||
}
|
||||
|
||||
@@ -5182,12 +5182,19 @@ void hclge_reset_tqp(struct hnae3_handle *handle, u16 queue_id)
|
||||
|
||||
void hclge_reset_vf_queue(struct hclge_vport *vport, u16 queue_id)
|
||||
{
|
||||
struct hnae3_handle *handle = &vport->nic;
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
int reset_try_times = 0;
|
||||
int reset_status;
|
||||
u16 queue_gid;
|
||||
int ret;
|
||||
|
||||
if (queue_id >= handle->kinfo.num_tqps) {
|
||||
dev_warn(&hdev->pdev->dev, "Invalid vf queue id(%u)\n",
|
||||
queue_id);
|
||||
return;
|
||||
}
|
||||
|
||||
queue_gid = hclge_covert_handle_qid_global(&vport->nic, queue_id);
|
||||
|
||||
ret = hclge_send_reset_tqp_cmd(hdev, queue_gid, true);
|
||||
|
||||
@@ -314,7 +314,12 @@ static int tc_setup_cbs(struct stmmac_priv *priv,
|
||||
|
||||
priv->plat->tx_queues_cfg[queue].mode_to_use = MTL_QUEUE_AVB;
|
||||
} else if (!qopt->enable) {
|
||||
return stmmac_dma_qmode(priv, priv->ioaddr, queue, MTL_QUEUE_DCB);
|
||||
ret = stmmac_dma_qmode(priv, priv->ioaddr, queue,
|
||||
MTL_QUEUE_DCB);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv->plat->tx_queues_cfg[queue].mode_to_use = MTL_QUEUE_DCB;
|
||||
}
|
||||
|
||||
/* Port Transmit Rate and Speed Divider */
|
||||
|
||||
@@ -393,15 +393,17 @@ static void
|
||||
mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data,
|
||||
int len, bool more)
|
||||
{
|
||||
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);
|
||||
|
||||
if (shinfo->nr_frags < ARRAY_SIZE(shinfo->frags)) {
|
||||
offset += q->buf_offset;
|
||||
struct page *page = virt_to_head_page(data);
|
||||
int offset = data - page_address(page) + q->buf_offset;
|
||||
|
||||
skb_add_rx_frag(skb, shinfo->nr_frags, page, offset, len,
|
||||
q->buf_size);
|
||||
} else {
|
||||
skb_free_frag(data);
|
||||
}
|
||||
|
||||
if (more)
|
||||
|
||||
@@ -1326,13 +1326,11 @@ int xenvif_tx_action(struct xenvif_queue *queue, int budget)
|
||||
return 0;
|
||||
|
||||
gnttab_batch_copy(queue->tx_copy_ops, nr_cops);
|
||||
if (nr_mops != 0) {
|
||||
if (nr_mops != 0)
|
||||
ret = gnttab_map_refs(queue->tx_map_ops,
|
||||
NULL,
|
||||
queue->pages_to_map,
|
||||
nr_mops);
|
||||
BUG_ON(ret);
|
||||
}
|
||||
|
||||
work_done = xenvif_tx_submit(queue);
|
||||
|
||||
|
||||
@@ -38,10 +38,15 @@ static bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue)
|
||||
RING_IDX prod, cons;
|
||||
struct sk_buff *skb;
|
||||
int needed;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&queue->rx_queue.lock, flags);
|
||||
|
||||
skb = skb_peek(&queue->rx_queue);
|
||||
if (!skb)
|
||||
if (!skb) {
|
||||
spin_unlock_irqrestore(&queue->rx_queue.lock, flags);
|
||||
return false;
|
||||
}
|
||||
|
||||
needed = DIV_ROUND_UP(skb->len, XEN_PAGE_SIZE);
|
||||
if (skb_is_gso(skb))
|
||||
@@ -49,6 +54,8 @@ static bool xenvif_rx_ring_slots_available(struct xenvif_queue *queue)
|
||||
if (skb->sw_hash)
|
||||
needed++;
|
||||
|
||||
spin_unlock_irqrestore(&queue->rx_queue.lock, flags);
|
||||
|
||||
do {
|
||||
prod = queue->rx.sring->req_prod;
|
||||
cons = queue->rx.req_cons;
|
||||
|
||||
@@ -45,6 +45,10 @@ MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("wmi:95F24279-4D7B-4334-9387-ACCDC67EF61C");
|
||||
MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
|
||||
|
||||
static int enable_tablet_mode_sw = -1;
|
||||
module_param(enable_tablet_mode_sw, int, 0444);
|
||||
MODULE_PARM_DESC(enable_tablet_mode_sw, "Enable SW_TABLET_MODE reporting (-1=auto, 0=no, 1=yes)");
|
||||
|
||||
#define HPWMI_EVENT_GUID "95F24279-4D7B-4334-9387-ACCDC67EF61C"
|
||||
#define HPWMI_BIOS_GUID "5FB7F034-2C63-45e9-BE91-3D44E2C707E4"
|
||||
|
||||
@@ -656,10 +660,12 @@ static int __init hp_wmi_input_setup(void)
|
||||
}
|
||||
|
||||
/* Tablet mode */
|
||||
val = hp_wmi_hw_state(HPWMI_TABLET_MASK);
|
||||
if (!(val < 0)) {
|
||||
__set_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit);
|
||||
input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE, val);
|
||||
if (enable_tablet_mode_sw > 0) {
|
||||
val = hp_wmi_hw_state(HPWMI_TABLET_MASK);
|
||||
if (val >= 0) {
|
||||
__set_bit(SW_TABLET_MODE, hp_wmi_input_dev->swbit);
|
||||
input_report_switch(hp_wmi_input_dev, SW_TABLET_MODE, val);
|
||||
}
|
||||
}
|
||||
|
||||
err = sparse_keymap_setup(hp_wmi_input_dev, hp_wmi_keymap, NULL);
|
||||
|
||||
@@ -940,7 +940,8 @@ qla27xx_template_checksum(void *p, ulong size)
|
||||
static inline int
|
||||
qla27xx_verify_template_checksum(struct qla27xx_fwdt_template *tmp)
|
||||
{
|
||||
return qla27xx_template_checksum(tmp, tmp->template_size) == 0;
|
||||
return qla27xx_template_checksum(tmp,
|
||||
le32_to_cpu(tmp->template_size)) == 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
@@ -956,7 +957,7 @@ qla27xx_execute_fwdt_template(struct scsi_qla_host *vha)
|
||||
ulong len;
|
||||
|
||||
if (qla27xx_fwdt_template_valid(tmp)) {
|
||||
len = tmp->template_size;
|
||||
len = le32_to_cpu(tmp->template_size);
|
||||
tmp = memcpy(vha->hw->fw_dump, tmp, len);
|
||||
ql27xx_edit_template(vha, tmp);
|
||||
qla27xx_walk_template(vha, tmp, tmp, &len);
|
||||
@@ -972,7 +973,7 @@ qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *vha)
|
||||
ulong len = 0;
|
||||
|
||||
if (qla27xx_fwdt_template_valid(tmp)) {
|
||||
len = tmp->template_size;
|
||||
len = le32_to_cpu(tmp->template_size);
|
||||
qla27xx_walk_template(vha, tmp, NULL, &len);
|
||||
}
|
||||
|
||||
@@ -984,7 +985,7 @@ qla27xx_fwdt_template_size(void *p)
|
||||
{
|
||||
struct qla27xx_fwdt_template *tmp = p;
|
||||
|
||||
return tmp->template_size;
|
||||
return le32_to_cpu(tmp->template_size);
|
||||
}
|
||||
|
||||
ulong
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
struct __packed qla27xx_fwdt_template {
|
||||
uint32_t template_type;
|
||||
uint32_t entry_offset;
|
||||
uint32_t template_size;
|
||||
__le32 template_size;
|
||||
uint32_t reserved_1;
|
||||
|
||||
uint32_t entry_count;
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
* Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/time64.h>
|
||||
#include <linux/ulpi/regs.h>
|
||||
|
||||
#include "core.h"
|
||||
@@ -17,12 +19,22 @@
|
||||
DWC3_GUSB2PHYACC_ADDR(ULPI_ACCESS_EXTENDED) | \
|
||||
DWC3_GUSB2PHYACC_EXTEND_ADDR(a) : DWC3_GUSB2PHYACC_ADDR(a))
|
||||
|
||||
static int dwc3_ulpi_busyloop(struct dwc3 *dwc)
|
||||
#define DWC3_ULPI_BASE_DELAY DIV_ROUND_UP(NSEC_PER_SEC, 60000000L)
|
||||
|
||||
static int dwc3_ulpi_busyloop(struct dwc3 *dwc, u8 addr, bool read)
|
||||
{
|
||||
unsigned count = 1000;
|
||||
unsigned long ns = 5L * DWC3_ULPI_BASE_DELAY;
|
||||
unsigned int count = 1000;
|
||||
u32 reg;
|
||||
|
||||
if (addr >= ULPI_EXT_VENDOR_SPECIFIC)
|
||||
ns += DWC3_ULPI_BASE_DELAY;
|
||||
|
||||
if (read)
|
||||
ns += DWC3_ULPI_BASE_DELAY;
|
||||
|
||||
while (count--) {
|
||||
ndelay(ns);
|
||||
reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYACC(0));
|
||||
if (reg & DWC3_GUSB2PHYACC_DONE)
|
||||
return 0;
|
||||
@@ -47,7 +59,7 @@ static int dwc3_ulpi_read(struct device *dev, u8 addr)
|
||||
reg = DWC3_GUSB2PHYACC_NEWREGREQ | DWC3_ULPI_ADDR(addr);
|
||||
dwc3_writel(dwc->regs, DWC3_GUSB2PHYACC(0), reg);
|
||||
|
||||
ret = dwc3_ulpi_busyloop(dwc);
|
||||
ret = dwc3_ulpi_busyloop(dwc, addr, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -71,7 +83,7 @@ static int dwc3_ulpi_write(struct device *dev, u8 addr, u8 val)
|
||||
reg |= DWC3_GUSB2PHYACC_WRITE | val;
|
||||
dwc3_writel(dwc->regs, DWC3_GUSB2PHYACC(0), reg);
|
||||
|
||||
return dwc3_ulpi_busyloop(dwc);
|
||||
return dwc3_ulpi_busyloop(dwc, addr, false);
|
||||
}
|
||||
|
||||
static const struct ulpi_ops dwc3_ulpi_ops = {
|
||||
|
||||
@@ -323,44 +323,47 @@ int gntdev_map_grant_pages(struct gntdev_grant_map *map)
|
||||
* to the kernel linear addresses of the struct pages.
|
||||
* These ptes are completely different from the user ptes dealt
|
||||
* with find_grant_ptes.
|
||||
* Note that GNTMAP_device_map isn't needed here: The
|
||||
* dev_bus_addr output field gets consumed only from ->map_ops,
|
||||
* and by not requesting it when mapping we also avoid needing
|
||||
* to mirror dev_bus_addr into ->unmap_ops (and holding an extra
|
||||
* reference to the page in the hypervisor).
|
||||
*/
|
||||
unsigned int flags = (map->flags & ~GNTMAP_device_map) |
|
||||
GNTMAP_host_map;
|
||||
|
||||
for (i = 0; i < map->count; i++) {
|
||||
unsigned long address = (unsigned long)
|
||||
pfn_to_kaddr(page_to_pfn(map->pages[i]));
|
||||
BUG_ON(PageHighMem(map->pages[i]));
|
||||
|
||||
gnttab_set_map_op(&map->kmap_ops[i], address,
|
||||
map->flags | GNTMAP_host_map,
|
||||
gnttab_set_map_op(&map->kmap_ops[i], address, flags,
|
||||
map->grants[i].ref,
|
||||
map->grants[i].domid);
|
||||
gnttab_set_unmap_op(&map->kunmap_ops[i], address,
|
||||
map->flags | GNTMAP_host_map, -1);
|
||||
flags, -1);
|
||||
}
|
||||
}
|
||||
|
||||
pr_debug("map %d+%d\n", map->index, map->count);
|
||||
err = gnttab_map_refs(map->map_ops, use_ptemod ? map->kmap_ops : NULL,
|
||||
map->pages, map->count);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
for (i = 0; i < map->count; i++) {
|
||||
if (map->map_ops[i].status) {
|
||||
if (map->map_ops[i].status == GNTST_okay)
|
||||
map->unmap_ops[i].handle = map->map_ops[i].handle;
|
||||
else if (!err)
|
||||
err = -EINVAL;
|
||||
continue;
|
||||
}
|
||||
|
||||
map->unmap_ops[i].handle = map->map_ops[i].handle;
|
||||
if (use_ptemod)
|
||||
map->kunmap_ops[i].handle = map->kmap_ops[i].handle;
|
||||
#ifdef CONFIG_XEN_GRANT_DMA_ALLOC
|
||||
else if (map->dma_vaddr) {
|
||||
unsigned long bfn;
|
||||
if (map->flags & GNTMAP_device_map)
|
||||
map->unmap_ops[i].dev_bus_addr = map->map_ops[i].dev_bus_addr;
|
||||
|
||||
bfn = pfn_to_bfn(page_to_pfn(map->pages[i]));
|
||||
map->unmap_ops[i].dev_bus_addr = __pfn_to_phys(bfn);
|
||||
if (use_ptemod) {
|
||||
if (map->kmap_ops[i].status == GNTST_okay)
|
||||
map->kunmap_ops[i].handle = map->kmap_ops[i].handle;
|
||||
else if (!err)
|
||||
err = -EINVAL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -422,12 +422,12 @@ static int scsiback_gnttab_data_map_batch(struct gnttab_map_grant_ref *map,
|
||||
return 0;
|
||||
|
||||
err = gnttab_map_refs(map, NULL, pg, cnt);
|
||||
BUG_ON(err);
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (unlikely(map[i].status != GNTST_okay)) {
|
||||
pr_err("invalid buffer -- could not remap it\n");
|
||||
map[i].handle = SCSIBACK_INVALID_HANDLE;
|
||||
err = -ENOMEM;
|
||||
if (!err)
|
||||
err = -ENOMEM;
|
||||
} else {
|
||||
get_page(pg[i]);
|
||||
}
|
||||
|
||||
@@ -115,7 +115,6 @@ int xenbus_probe_node(struct xen_bus_type *bus,
|
||||
const char *type,
|
||||
const char *nodename);
|
||||
int xenbus_probe_devices(struct xen_bus_type *bus);
|
||||
void xenbus_probe(void);
|
||||
|
||||
void xenbus_dev_changed(const char *node, struct xen_bus_type *bus);
|
||||
|
||||
|
||||
@@ -683,7 +683,7 @@ void unregister_xenstore_notifier(struct notifier_block *nb)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unregister_xenstore_notifier);
|
||||
|
||||
void xenbus_probe(void)
|
||||
static void xenbus_probe(void)
|
||||
{
|
||||
xenstored_ready = 1;
|
||||
|
||||
|
||||
@@ -79,6 +79,14 @@ int ovl_copy_xattr(struct dentry *old, struct dentry *new)
|
||||
|
||||
if (ovl_is_private_xattr(name))
|
||||
continue;
|
||||
|
||||
error = security_inode_copy_up_xattr(name);
|
||||
if (error < 0 && error != -EOPNOTSUPP)
|
||||
break;
|
||||
if (error == 1) {
|
||||
error = 0;
|
||||
continue; /* Discard */
|
||||
}
|
||||
retry:
|
||||
size = vfs_getxattr(old, name, value, value_size);
|
||||
if (size == -ERANGE)
|
||||
@@ -102,13 +110,6 @@ retry:
|
||||
goto retry;
|
||||
}
|
||||
|
||||
error = security_inode_copy_up_xattr(name);
|
||||
if (error < 0 && error != -EOPNOTSUPP)
|
||||
break;
|
||||
if (error == 1) {
|
||||
error = 0;
|
||||
continue; /* Discard */
|
||||
}
|
||||
error = vfs_setxattr(new, name, value, size, 0);
|
||||
if (error)
|
||||
break;
|
||||
|
||||
@@ -340,7 +340,9 @@ int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name,
|
||||
goto out;
|
||||
|
||||
if (!value && !upperdentry) {
|
||||
old_cred = ovl_override_creds(dentry->d_sb);
|
||||
err = vfs_getxattr(realdentry, name, NULL, 0);
|
||||
revert_creds(old_cred);
|
||||
if (err < 0)
|
||||
goto out_drop_write;
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ static void ovl_dentry_release(struct dentry *dentry)
|
||||
static struct dentry *ovl_d_real(struct dentry *dentry,
|
||||
const struct inode *inode)
|
||||
{
|
||||
struct dentry *real;
|
||||
struct dentry *real = NULL, *lower;
|
||||
|
||||
/* It's an overlay file */
|
||||
if (inode && d_inode(dentry) == inode)
|
||||
@@ -106,9 +106,10 @@ static struct dentry *ovl_d_real(struct dentry *dentry,
|
||||
if (real && !inode && ovl_has_upperdata(d_inode(dentry)))
|
||||
return real;
|
||||
|
||||
real = ovl_dentry_lowerdata(dentry);
|
||||
if (!real)
|
||||
lower = ovl_dentry_lowerdata(dentry);
|
||||
if (!lower)
|
||||
goto bug;
|
||||
real = lower;
|
||||
|
||||
/* Handle recursion */
|
||||
real = d_real(real, inode);
|
||||
@@ -116,8 +117,10 @@ static struct dentry *ovl_d_real(struct dentry *dentry,
|
||||
if (!inode || inode == d_inode(real))
|
||||
return real;
|
||||
bug:
|
||||
WARN(1, "ovl_d_real(%pd4, %s:%lu): real dentry not found\n", dentry,
|
||||
inode ? inode->i_sb->s_id : "NULL", inode ? inode->i_ino : 0);
|
||||
WARN(1, "%s(%pd4, %s:%lu): real dentry (%p/%lu) not found\n",
|
||||
__func__, dentry, inode ? inode->i_sb->s_id : "NULL",
|
||||
inode ? inode->i_ino : 0, real,
|
||||
real && d_inode(real) ? d_inode(real)->i_ino : 0);
|
||||
return dentry;
|
||||
}
|
||||
|
||||
|
||||
@@ -365,7 +365,7 @@
|
||||
} \
|
||||
\
|
||||
/* Built-in firmware blobs */ \
|
||||
.builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) { \
|
||||
.builtin_fw : AT(ADDR(.builtin_fw) - LOAD_OFFSET) ALIGN(8) { \
|
||||
__start_builtin_fw = .; \
|
||||
KEEP(*(.builtin_fw)) \
|
||||
__end_builtin_fw = .; \
|
||||
|
||||
@@ -4023,6 +4023,7 @@ static inline void netif_tx_disable(struct net_device *dev)
|
||||
|
||||
local_bh_disable();
|
||||
cpu = smp_processor_id();
|
||||
spin_lock(&dev->tx_global_lock);
|
||||
for (i = 0; i < dev->num_tx_queues; i++) {
|
||||
struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
|
||||
|
||||
@@ -4030,6 +4031,7 @@ static inline void netif_tx_disable(struct net_device *dev)
|
||||
netif_tx_stop_queue(txq);
|
||||
__netif_tx_unlock(txq);
|
||||
}
|
||||
spin_unlock(&dev->tx_global_lock);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
|
||||
@@ -157,6 +157,7 @@ gnttab_set_map_op(struct gnttab_map_grant_ref *map, phys_addr_t addr,
|
||||
map->flags = flags;
|
||||
map->ref = ref;
|
||||
map->dom = domid;
|
||||
map->status = 1; /* arbitrary positive value */
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
||||
@@ -187,8 +187,6 @@ void xs_suspend_cancel(void);
|
||||
|
||||
struct work_struct;
|
||||
|
||||
void xenbus_probe(void);
|
||||
|
||||
#define XENBUS_IS_ERR_READ(str) ({ \
|
||||
if (!IS_ERR(str) && strlen(str) == 0) { \
|
||||
kfree(str); \
|
||||
|
||||
@@ -114,6 +114,8 @@ static struct bpf_map *stack_map_alloc(union bpf_attr *attr)
|
||||
|
||||
/* hash table size must be power of 2 */
|
||||
n_buckets = roundup_pow_of_two(attr->max_entries);
|
||||
if (!n_buckets)
|
||||
return ERR_PTR(-E2BIG);
|
||||
|
||||
cost = n_buckets * sizeof(struct stack_map_bucket *) + sizeof(*smap);
|
||||
if (cost >= U32_MAX - PAGE_SIZE)
|
||||
|
||||
@@ -2292,7 +2292,7 @@ trace_event_buffer_lock_reserve(struct ring_buffer **current_rb,
|
||||
(entry = this_cpu_read(trace_buffered_event))) {
|
||||
/* Try to use the per cpu buffer first */
|
||||
val = this_cpu_inc_return(trace_buffered_event_cnt);
|
||||
if (val == 1) {
|
||||
if ((len < (PAGE_SIZE - sizeof(*entry))) && val == 1) {
|
||||
trace_event_setup(entry, type, flags, pc);
|
||||
entry->array[0] = len;
|
||||
return entry;
|
||||
|
||||
@@ -1113,7 +1113,8 @@ system_enable_read(struct file *filp, char __user *ubuf, size_t cnt,
|
||||
mutex_lock(&event_mutex);
|
||||
list_for_each_entry(file, &tr->events, list) {
|
||||
call = file->event_call;
|
||||
if (!trace_event_name(call) || !call->class || !call->class->reg)
|
||||
if ((call->flags & TRACE_EVENT_FL_IGNORE_ENABLE) ||
|
||||
!trace_event_name(call) || !call->class || !call->class->reg)
|
||||
continue;
|
||||
|
||||
if (system && strcmp(call->class->system, system->name) != 0)
|
||||
|
||||
@@ -1063,7 +1063,8 @@ nf_conntrack_tuple_taken(const struct nf_conntrack_tuple *tuple,
|
||||
* Let nf_ct_resolve_clash() deal with this later.
|
||||
*/
|
||||
if (nf_ct_tuple_equal(&ignored_conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
|
||||
&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple))
|
||||
&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple) &&
|
||||
nf_ct_zone_equal(ct, zone, IP_CT_DIR_ORIGINAL))
|
||||
continue;
|
||||
|
||||
NF_CT_STAT_INC_ATOMIC(net, found);
|
||||
|
||||
@@ -360,7 +360,7 @@ static int nf_flow_nat_port_tcp(struct sk_buff *skb, unsigned int thoff,
|
||||
return -1;
|
||||
|
||||
tcph = (void *)(skb_network_header(skb) + thoff);
|
||||
inet_proto_csum_replace2(&tcph->check, skb, port, new_port, true);
|
||||
inet_proto_csum_replace2(&tcph->check, skb, port, new_port, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -377,7 +377,7 @@ static int nf_flow_nat_port_udp(struct sk_buff *skb, unsigned int thoff,
|
||||
udph = (void *)(skb_network_header(skb) + thoff);
|
||||
if (udph->check || skb->ip_summed == CHECKSUM_PARTIAL) {
|
||||
inet_proto_csum_replace2(&udph->check, skb, port,
|
||||
new_port, true);
|
||||
new_port, false);
|
||||
if (!udph->check)
|
||||
udph->check = CSUM_MANGLED_0;
|
||||
}
|
||||
|
||||
@@ -155,7 +155,8 @@ static void recent_entry_remove(struct recent_table *t, struct recent_entry *e)
|
||||
/*
|
||||
* Drop entries with timestamps older then 'time'.
|
||||
*/
|
||||
static void recent_entry_reap(struct recent_table *t, unsigned long time)
|
||||
static void recent_entry_reap(struct recent_table *t, unsigned long time,
|
||||
struct recent_entry *working, bool update)
|
||||
{
|
||||
struct recent_entry *e;
|
||||
|
||||
@@ -164,6 +165,12 @@ static void recent_entry_reap(struct recent_table *t, unsigned long time)
|
||||
*/
|
||||
e = list_entry(t->lru_list.next, struct recent_entry, lru_list);
|
||||
|
||||
/*
|
||||
* Do not reap the entry which are going to be updated.
|
||||
*/
|
||||
if (e == working && update)
|
||||
return;
|
||||
|
||||
/*
|
||||
* The last time stamp is the most recent.
|
||||
*/
|
||||
@@ -306,7 +313,8 @@ recent_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
|
||||
/* info->seconds must be non-zero */
|
||||
if (info->check_set & XT_RECENT_REAP)
|
||||
recent_entry_reap(t, time);
|
||||
recent_entry_reap(t, time, e,
|
||||
info->check_set & XT_RECENT_UPDATE && ret);
|
||||
}
|
||||
|
||||
if (info->check_set & XT_RECENT_SET ||
|
||||
|
||||
@@ -194,7 +194,7 @@ static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb,
|
||||
hdr->src_port_id = cpu_to_le32(from->sq_port);
|
||||
if (to->sq_port == QRTR_PORT_CTRL) {
|
||||
hdr->dst_node_id = cpu_to_le32(node->nid);
|
||||
hdr->dst_port_id = cpu_to_le32(QRTR_NODE_BCAST);
|
||||
hdr->dst_port_id = cpu_to_le32(QRTR_PORT_CTRL);
|
||||
} else {
|
||||
hdr->dst_node_id = cpu_to_le32(to->sq_node);
|
||||
hdr->dst_port_id = cpu_to_le32(to->sq_port);
|
||||
|
||||
@@ -80,6 +80,12 @@ static ssize_t qrtr_tun_write_iter(struct kiocb *iocb, struct iov_iter *from)
|
||||
ssize_t ret;
|
||||
void *kbuf;
|
||||
|
||||
if (!len)
|
||||
return -EINVAL;
|
||||
|
||||
if (len > KMALLOC_MAX_SIZE)
|
||||
return -ENOMEM;
|
||||
|
||||
kbuf = kzalloc(len, GFP_KERNEL);
|
||||
if (!kbuf)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -531,6 +531,9 @@ int rds_rdma_extra_size(struct rds_rdma_args *args,
|
||||
if (args->nr_local == 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (args->nr_local > UIO_MAXIOV)
|
||||
return -EMSGSIZE;
|
||||
|
||||
iov->iov = kcalloc(args->nr_local,
|
||||
sizeof(struct rds_iovec),
|
||||
GFP_KERNEL);
|
||||
|
||||
@@ -230,6 +230,12 @@ static void sctp_transport_seq_stop(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct sctp_ht_iter *iter = seq->private;
|
||||
|
||||
if (v && v != SEQ_START_TOKEN) {
|
||||
struct sctp_transport *transport = v;
|
||||
|
||||
sctp_transport_put(transport);
|
||||
}
|
||||
|
||||
sctp_transport_walk_stop(&iter->hti);
|
||||
}
|
||||
|
||||
@@ -237,6 +243,12 @@ static void *sctp_transport_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
{
|
||||
struct sctp_ht_iter *iter = seq->private;
|
||||
|
||||
if (v && v != SEQ_START_TOKEN) {
|
||||
struct sctp_transport *transport = v;
|
||||
|
||||
sctp_transport_put(transport);
|
||||
}
|
||||
|
||||
++*pos;
|
||||
|
||||
return sctp_transport_get_next(seq_file_net(seq), &iter->hti);
|
||||
@@ -292,8 +304,6 @@ static int sctp_assocs_seq_show(struct seq_file *seq, void *v)
|
||||
sk->sk_rcvbuf);
|
||||
seq_printf(seq, "\n");
|
||||
|
||||
sctp_transport_put(transport);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -369,8 +379,6 @@ static int sctp_remaddr_seq_show(struct seq_file *seq, void *v)
|
||||
seq_printf(seq, "\n");
|
||||
}
|
||||
|
||||
sctp_transport_put(transport);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -816,10 +816,12 @@ static int vsock_shutdown(struct socket *sock, int mode)
|
||||
*/
|
||||
|
||||
sk = sock->sk;
|
||||
|
||||
lock_sock(sk);
|
||||
if (sock->state == SS_UNCONNECTED) {
|
||||
err = -ENOTCONN;
|
||||
if (sk->sk_type == SOCK_STREAM)
|
||||
return err;
|
||||
goto out;
|
||||
} else {
|
||||
sock->state = SS_DISCONNECTING;
|
||||
err = 0;
|
||||
@@ -828,10 +830,8 @@ static int vsock_shutdown(struct socket *sock, int mode)
|
||||
/* Receive and send shutdowns are treated alike. */
|
||||
mode = mode & (RCV_SHUTDOWN | SEND_SHUTDOWN);
|
||||
if (mode) {
|
||||
lock_sock(sk);
|
||||
sk->sk_shutdown |= mode;
|
||||
sk->sk_state_change(sk);
|
||||
release_sock(sk);
|
||||
|
||||
if (sk->sk_type == SOCK_STREAM) {
|
||||
sock_reset_flag(sk, SOCK_DONE);
|
||||
@@ -839,6 +839,8 @@ static int vsock_shutdown(struct socket *sock, int mode)
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
release_sock(sk);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -1107,7 +1109,6 @@ static void vsock_connect_timeout(struct work_struct *work)
|
||||
{
|
||||
struct sock *sk;
|
||||
struct vsock_sock *vsk;
|
||||
int cancel = 0;
|
||||
|
||||
vsk = container_of(work, struct vsock_sock, connect_work.work);
|
||||
sk = sk_vsock(vsk);
|
||||
@@ -1118,11 +1119,9 @@ static void vsock_connect_timeout(struct work_struct *work)
|
||||
sk->sk_state = TCP_CLOSE;
|
||||
sk->sk_err = ETIMEDOUT;
|
||||
sk->sk_error_report(sk);
|
||||
cancel = 1;
|
||||
vsock_transport_cancel_pkt(vsk);
|
||||
}
|
||||
release_sock(sk);
|
||||
if (cancel)
|
||||
vsock_transport_cancel_pkt(vsk);
|
||||
|
||||
sock_put(sk);
|
||||
}
|
||||
|
||||
@@ -443,14 +443,10 @@ static void hvs_shutdown_lock_held(struct hvsock *hvs, int mode)
|
||||
|
||||
static int hvs_shutdown(struct vsock_sock *vsk, int mode)
|
||||
{
|
||||
struct sock *sk = sk_vsock(vsk);
|
||||
|
||||
if (!(mode & SEND_SHUTDOWN))
|
||||
return 0;
|
||||
|
||||
lock_sock(sk);
|
||||
hvs_shutdown_lock_held(vsk->trans, mode);
|
||||
release_sock(sk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1033,10 +1033,10 @@ void virtio_transport_recv_pkt(struct virtio_transport *t,
|
||||
|
||||
vsk = vsock_sk(sk);
|
||||
|
||||
space_available = virtio_transport_space_update(sk, pkt);
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
space_available = virtio_transport_space_update(sk, pkt);
|
||||
|
||||
/* Update CID in case it has changed after a transport reset event */
|
||||
vsk->local_addr.svm_cid = dst.svm_cid;
|
||||
|
||||
|
||||
@@ -377,10 +377,11 @@ int cap_inode_getsecurity(struct inode *inode, const char *name, void **buffer,
|
||||
{
|
||||
int size, ret;
|
||||
kuid_t kroot;
|
||||
u32 nsmagic, magic;
|
||||
uid_t root, mappedroot;
|
||||
char *tmpbuf = NULL;
|
||||
struct vfs_cap_data *cap;
|
||||
struct vfs_ns_cap_data *nscap;
|
||||
struct vfs_ns_cap_data *nscap = NULL;
|
||||
struct dentry *dentry;
|
||||
struct user_namespace *fs_ns;
|
||||
|
||||
@@ -402,46 +403,61 @@ int cap_inode_getsecurity(struct inode *inode, const char *name, void **buffer,
|
||||
fs_ns = inode->i_sb->s_user_ns;
|
||||
cap = (struct vfs_cap_data *) tmpbuf;
|
||||
if (is_v2header((size_t) ret, cap)) {
|
||||
/* If this is sizeof(vfs_cap_data) then we're ok with the
|
||||
* on-disk value, so return that. */
|
||||
if (alloc)
|
||||
*buffer = tmpbuf;
|
||||
else
|
||||
kfree(tmpbuf);
|
||||
return ret;
|
||||
} else if (!is_v3header((size_t) ret, cap)) {
|
||||
kfree(tmpbuf);
|
||||
return -EINVAL;
|
||||
root = 0;
|
||||
} else if (is_v3header((size_t) ret, cap)) {
|
||||
nscap = (struct vfs_ns_cap_data *) tmpbuf;
|
||||
root = le32_to_cpu(nscap->rootid);
|
||||
} else {
|
||||
size = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
nscap = (struct vfs_ns_cap_data *) tmpbuf;
|
||||
root = le32_to_cpu(nscap->rootid);
|
||||
kroot = make_kuid(fs_ns, root);
|
||||
|
||||
/* If the root kuid maps to a valid uid in current ns, then return
|
||||
* this as a nscap. */
|
||||
mappedroot = from_kuid(current_user_ns(), kroot);
|
||||
if (mappedroot != (uid_t)-1 && mappedroot != (uid_t)0) {
|
||||
size = sizeof(struct vfs_ns_cap_data);
|
||||
if (alloc) {
|
||||
*buffer = tmpbuf;
|
||||
if (!nscap) {
|
||||
/* v2 -> v3 conversion */
|
||||
nscap = kzalloc(size, GFP_ATOMIC);
|
||||
if (!nscap) {
|
||||
size = -ENOMEM;
|
||||
goto out_free;
|
||||
}
|
||||
nsmagic = VFS_CAP_REVISION_3;
|
||||
magic = le32_to_cpu(cap->magic_etc);
|
||||
if (magic & VFS_CAP_FLAGS_EFFECTIVE)
|
||||
nsmagic |= VFS_CAP_FLAGS_EFFECTIVE;
|
||||
memcpy(&nscap->data, &cap->data, sizeof(__le32) * 2 * VFS_CAP_U32);
|
||||
nscap->magic_etc = cpu_to_le32(nsmagic);
|
||||
} else {
|
||||
/* use allocated v3 buffer */
|
||||
tmpbuf = NULL;
|
||||
}
|
||||
nscap->rootid = cpu_to_le32(mappedroot);
|
||||
} else
|
||||
kfree(tmpbuf);
|
||||
return size;
|
||||
*buffer = nscap;
|
||||
}
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
if (!rootid_owns_currentns(kroot)) {
|
||||
kfree(tmpbuf);
|
||||
return -EOPNOTSUPP;
|
||||
size = -EOVERFLOW;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
/* This comes from a parent namespace. Return as a v2 capability */
|
||||
size = sizeof(struct vfs_cap_data);
|
||||
if (alloc) {
|
||||
*buffer = kmalloc(size, GFP_ATOMIC);
|
||||
if (*buffer) {
|
||||
struct vfs_cap_data *cap = *buffer;
|
||||
__le32 nsmagic, magic;
|
||||
if (nscap) {
|
||||
/* v3 -> v2 conversion */
|
||||
cap = kzalloc(size, GFP_ATOMIC);
|
||||
if (!cap) {
|
||||
size = -ENOMEM;
|
||||
goto out_free;
|
||||
}
|
||||
magic = VFS_CAP_REVISION_2;
|
||||
nsmagic = le32_to_cpu(nscap->magic_etc);
|
||||
if (nsmagic & VFS_CAP_FLAGS_EFFECTIVE)
|
||||
@@ -449,9 +465,12 @@ int cap_inode_getsecurity(struct inode *inode, const char *name, void **buffer,
|
||||
memcpy(&cap->data, &nscap->data, sizeof(__le32) * 2 * VFS_CAP_U32);
|
||||
cap->magic_etc = cpu_to_le32(magic);
|
||||
} else {
|
||||
size = -ENOMEM;
|
||||
/* use unconverted v2 */
|
||||
tmpbuf = NULL;
|
||||
}
|
||||
*buffer = cap;
|
||||
}
|
||||
out_free:
|
||||
kfree(tmpbuf);
|
||||
return size;
|
||||
}
|
||||
|
||||
@@ -412,9 +412,8 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn,
|
||||
*/
|
||||
kvm->mmu_notifier_count++;
|
||||
need_tlb_flush = kvm_unmap_hva_range(kvm, start, end, blockable);
|
||||
need_tlb_flush |= kvm->tlbs_dirty;
|
||||
/* we've to flush the tlb before the pages can be freed */
|
||||
if (need_tlb_flush)
|
||||
if (need_tlb_flush || kvm->tlbs_dirty)
|
||||
kvm_flush_remote_tlbs(kvm);
|
||||
|
||||
spin_unlock(&kvm->mmu_lock);
|
||||
|
||||
Reference in New Issue
Block a user