1429 lines
48 KiB
Diff
1429 lines
48 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index 23b2916ef0ff..c36e64bd9ae7 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 4
|
|
PATCHLEVEL = 14
|
|
-SUBLEVEL = 132
|
|
+SUBLEVEL = 133
|
|
EXTRAVERSION =
|
|
NAME = Petit Gorille
|
|
|
|
diff --git a/arch/arc/kernel/traps.c b/arch/arc/kernel/traps.c
|
|
index bcd7c9fc5d0f..869ac2d421c8 100644
|
|
--- a/arch/arc/kernel/traps.c
|
|
+++ b/arch/arc/kernel/traps.c
|
|
@@ -155,3 +155,11 @@ void do_insterror_or_kprobe(unsigned long address, struct pt_regs *regs)
|
|
|
|
insterror_is_error(address, regs);
|
|
}
|
|
+
|
|
+/*
|
|
+ * abort() call generated by older gcc for __builtin_trap()
|
|
+ */
|
|
+void abort(void)
|
|
+{
|
|
+ __asm__ __volatile__("trap_s 5\n");
|
|
+}
|
|
diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c
|
|
index f469e0435903..73ecccc514e1 100644
|
|
--- a/arch/arm64/kernel/module.c
|
|
+++ b/arch/arm64/kernel/module.c
|
|
@@ -32,6 +32,7 @@
|
|
|
|
void *module_alloc(unsigned long size)
|
|
{
|
|
+ u64 module_alloc_end = module_alloc_base + MODULES_VSIZE;
|
|
gfp_t gfp_mask = GFP_KERNEL;
|
|
void *p;
|
|
|
|
@@ -39,9 +40,12 @@ void *module_alloc(unsigned long size)
|
|
if (IS_ENABLED(CONFIG_ARM64_MODULE_PLTS))
|
|
gfp_mask |= __GFP_NOWARN;
|
|
|
|
+ if (IS_ENABLED(CONFIG_KASAN))
|
|
+ /* don't exceed the static module region - see below */
|
|
+ module_alloc_end = MODULES_END;
|
|
+
|
|
p = __vmalloc_node_range(size, MODULE_ALIGN, module_alloc_base,
|
|
- module_alloc_base + MODULES_VSIZE,
|
|
- gfp_mask, PAGE_KERNEL_EXEC, 0,
|
|
+ module_alloc_end, gfp_mask, PAGE_KERNEL_EXEC, 0,
|
|
NUMA_NO_NODE, __builtin_return_address(0));
|
|
|
|
if (!p && IS_ENABLED(CONFIG_ARM64_MODULE_PLTS) &&
|
|
diff --git a/arch/mips/include/asm/netlogic/xlr/fmn.h b/arch/mips/include/asm/netlogic/xlr/fmn.h
|
|
index 5604db3d1836..d79c68fa78d9 100644
|
|
--- a/arch/mips/include/asm/netlogic/xlr/fmn.h
|
|
+++ b/arch/mips/include/asm/netlogic/xlr/fmn.h
|
|
@@ -301,8 +301,6 @@ static inline int nlm_fmn_send(unsigned int size, unsigned int code,
|
|
for (i = 0; i < 8; i++) {
|
|
nlm_msgsnd(dest);
|
|
status = nlm_read_c2_status0();
|
|
- if ((status & 0x2) == 1)
|
|
- pr_info("Send pending fail!\n");
|
|
if ((status & 0x4) == 0)
|
|
return 0;
|
|
}
|
|
diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c
|
|
index 91ad023ead8c..60c58005fd20 100644
|
|
--- a/arch/mips/mm/mmap.c
|
|
+++ b/arch/mips/mm/mmap.c
|
|
@@ -203,7 +203,7 @@ unsigned long arch_randomize_brk(struct mm_struct *mm)
|
|
|
|
int __virt_addr_valid(const volatile void *kaddr)
|
|
{
|
|
- unsigned long vaddr = (unsigned long)vaddr;
|
|
+ unsigned long vaddr = (unsigned long)kaddr;
|
|
|
|
if ((vaddr < PAGE_OFFSET) || (vaddr >= MAP_BASE))
|
|
return 0;
|
|
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
|
|
index 79b9f2ad3ff5..c2a6869418f7 100644
|
|
--- a/arch/mips/mm/tlbex.c
|
|
+++ b/arch/mips/mm/tlbex.c
|
|
@@ -388,6 +388,7 @@ static struct work_registers build_get_work_registers(u32 **p)
|
|
static void build_restore_work_registers(u32 **p)
|
|
{
|
|
if (scratch_reg >= 0) {
|
|
+ uasm_i_ehb(p);
|
|
UASM_i_MFC0(p, 1, c0_kscratch(), scratch_reg);
|
|
return;
|
|
}
|
|
@@ -671,10 +672,12 @@ static void build_restore_pagemask(u32 **p, struct uasm_reloc **r,
|
|
uasm_i_mtc0(p, 0, C0_PAGEMASK);
|
|
uasm_il_b(p, r, lid);
|
|
}
|
|
- if (scratch_reg >= 0)
|
|
+ if (scratch_reg >= 0) {
|
|
+ uasm_i_ehb(p);
|
|
UASM_i_MFC0(p, 1, c0_kscratch(), scratch_reg);
|
|
- else
|
|
+ } else {
|
|
UASM_i_LW(p, 1, scratchpad_offset(0), 0);
|
|
+ }
|
|
} else {
|
|
/* Reset default page size */
|
|
if (PM_DEFAULT_MASK >> 16) {
|
|
@@ -939,10 +942,12 @@ build_get_pgd_vmalloc64(u32 **p, struct uasm_label **l, struct uasm_reloc **r,
|
|
uasm_i_jr(p, ptr);
|
|
|
|
if (mode == refill_scratch) {
|
|
- if (scratch_reg >= 0)
|
|
+ if (scratch_reg >= 0) {
|
|
+ uasm_i_ehb(p);
|
|
UASM_i_MFC0(p, 1, c0_kscratch(), scratch_reg);
|
|
- else
|
|
+ } else {
|
|
UASM_i_LW(p, 1, scratchpad_offset(0), 0);
|
|
+ }
|
|
} else {
|
|
uasm_i_nop(p);
|
|
}
|
|
@@ -1259,6 +1264,7 @@ build_fast_tlb_refill_handler (u32 **p, struct uasm_label **l,
|
|
UASM_i_MTC0(p, odd, C0_ENTRYLO1); /* load it */
|
|
|
|
if (c0_scratch_reg >= 0) {
|
|
+ uasm_i_ehb(p);
|
|
UASM_i_MFC0(p, scratch, c0_kscratch(), c0_scratch_reg);
|
|
build_tlb_write_entry(p, l, r, tlb_random);
|
|
uasm_l_leave(l, *p);
|
|
@@ -1615,15 +1621,17 @@ static void build_setup_pgd(void)
|
|
uasm_i_dinsm(&p, a0, 0, 29, 64 - 29);
|
|
uasm_l_tlbl_goaround1(&l, p);
|
|
UASM_i_SLL(&p, a0, a0, 11);
|
|
- uasm_i_jr(&p, 31);
|
|
UASM_i_MTC0(&p, a0, C0_CONTEXT);
|
|
+ uasm_i_jr(&p, 31);
|
|
+ uasm_i_ehb(&p);
|
|
} else {
|
|
/* PGD in c0_KScratch */
|
|
- uasm_i_jr(&p, 31);
|
|
if (cpu_has_ldpte)
|
|
UASM_i_MTC0(&p, a0, C0_PWBASE);
|
|
else
|
|
UASM_i_MTC0(&p, a0, c0_kscratch(), pgd_reg);
|
|
+ uasm_i_jr(&p, 31);
|
|
+ uasm_i_ehb(&p);
|
|
}
|
|
#else
|
|
#ifdef CONFIG_SMP
|
|
@@ -1637,13 +1645,16 @@ static void build_setup_pgd(void)
|
|
UASM_i_LA_mostly(&p, a2, pgdc);
|
|
UASM_i_SW(&p, a0, uasm_rel_lo(pgdc), a2);
|
|
#endif /* SMP */
|
|
- uasm_i_jr(&p, 31);
|
|
|
|
/* if pgd_reg is allocated, save PGD also to scratch register */
|
|
- if (pgd_reg != -1)
|
|
+ if (pgd_reg != -1) {
|
|
UASM_i_MTC0(&p, a0, c0_kscratch(), pgd_reg);
|
|
- else
|
|
+ uasm_i_jr(&p, 31);
|
|
+ uasm_i_ehb(&p);
|
|
+ } else {
|
|
+ uasm_i_jr(&p, 31);
|
|
uasm_i_nop(&p);
|
|
+ }
|
|
#endif
|
|
if (p >= tlbmiss_handler_setup_pgd_end)
|
|
panic("tlbmiss_handler_setup_pgd space exceeded");
|
|
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c
|
|
index c020ba4b7eb6..ccc2b9d2956a 100644
|
|
--- a/arch/x86/kernel/ftrace.c
|
|
+++ b/arch/x86/kernel/ftrace.c
|
|
@@ -22,6 +22,7 @@
|
|
#include <linux/init.h>
|
|
#include <linux/list.h>
|
|
#include <linux/module.h>
|
|
+#include <linux/memory.h>
|
|
|
|
#include <trace/syscall.h>
|
|
|
|
@@ -36,6 +37,7 @@
|
|
|
|
int ftrace_arch_code_modify_prepare(void)
|
|
{
|
|
+ mutex_lock(&text_mutex);
|
|
set_kernel_text_rw();
|
|
set_all_modules_text_rw();
|
|
return 0;
|
|
@@ -45,6 +47,7 @@ int ftrace_arch_code_modify_post_process(void)
|
|
{
|
|
set_all_modules_text_ro();
|
|
set_kernel_text_ro();
|
|
+ mutex_unlock(&text_mutex);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
|
|
index 053e4937af0c..3aa0b8123c91 100644
|
|
--- a/arch/x86/kvm/lapic.c
|
|
+++ b/arch/x86/kvm/lapic.c
|
|
@@ -2161,7 +2161,7 @@ int kvm_apic_has_interrupt(struct kvm_vcpu *vcpu)
|
|
struct kvm_lapic *apic = vcpu->arch.apic;
|
|
u32 ppr;
|
|
|
|
- if (!apic_enabled(apic))
|
|
+ if (!kvm_apic_hw_enabled(apic))
|
|
return -1;
|
|
|
|
__apic_update_ppr(apic, &ppr);
|
|
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
|
index 858dd0d89b02..a8526042d176 100644
|
|
--- a/arch/x86/kvm/x86.c
|
|
+++ b/arch/x86/kvm/x86.c
|
|
@@ -1392,7 +1392,7 @@ static int set_tsc_khz(struct kvm_vcpu *vcpu, u32 user_tsc_khz, bool scale)
|
|
vcpu->arch.tsc_always_catchup = 1;
|
|
return 0;
|
|
} else {
|
|
- WARN(1, "user requested TSC rate below hardware speed\n");
|
|
+ pr_warn_ratelimited("user requested TSC rate below hardware speed\n");
|
|
return -1;
|
|
}
|
|
}
|
|
@@ -1402,8 +1402,8 @@ static int set_tsc_khz(struct kvm_vcpu *vcpu, u32 user_tsc_khz, bool scale)
|
|
user_tsc_khz, tsc_khz);
|
|
|
|
if (ratio == 0 || ratio >= kvm_max_tsc_scaling_ratio) {
|
|
- WARN_ONCE(1, "Invalid TSC scaling ratio - virtual-tsc-khz=%u\n",
|
|
- user_tsc_khz);
|
|
+ pr_warn_ratelimited("Invalid TSC scaling ratio - virtual-tsc-khz=%u\n",
|
|
+ user_tsc_khz);
|
|
return -1;
|
|
}
|
|
|
|
diff --git a/crypto/cryptd.c b/crypto/cryptd.c
|
|
index 248f6ba41688..4cc1871646a8 100644
|
|
--- a/crypto/cryptd.c
|
|
+++ b/crypto/cryptd.c
|
|
@@ -585,6 +585,7 @@ static void cryptd_skcipher_free(struct skcipher_instance *inst)
|
|
struct skcipherd_instance_ctx *ctx = skcipher_instance_ctx(inst);
|
|
|
|
crypto_drop_skcipher(&ctx->spawn);
|
|
+ kfree(inst);
|
|
}
|
|
|
|
static int cryptd_create_skcipher(struct crypto_template *tmpl,
|
|
diff --git a/crypto/crypto_user.c b/crypto/crypto_user.c
|
|
index b5758768920b..2b8fb8f1391e 100644
|
|
--- a/crypto/crypto_user.c
|
|
+++ b/crypto/crypto_user.c
|
|
@@ -55,6 +55,9 @@ static struct crypto_alg *crypto_alg_match(struct crypto_user_alg *p, int exact)
|
|
list_for_each_entry(q, &crypto_alg_list, cra_list) {
|
|
int match = 0;
|
|
|
|
+ if (crypto_is_larval(q))
|
|
+ continue;
|
|
+
|
|
if ((q->cra_flags ^ p->cru_type) & p->cru_mask)
|
|
continue;
|
|
|
|
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
|
|
index a67ec1bdc4e0..b8e7c2d8915e 100644
|
|
--- a/drivers/dma/imx-sdma.c
|
|
+++ b/drivers/dma/imx-sdma.c
|
|
@@ -632,7 +632,7 @@ static int sdma_load_script(struct sdma_engine *sdma, void *buf, int size,
|
|
spin_lock_irqsave(&sdma->channel_0_lock, flags);
|
|
|
|
bd0->mode.command = C0_SETPM;
|
|
- bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD;
|
|
+ bd0->mode.status = BD_DONE | BD_WRAP | BD_EXTD;
|
|
bd0->mode.count = size / 2;
|
|
bd0->buffer_addr = buf_phys;
|
|
bd0->ext_buffer_addr = address;
|
|
@@ -909,7 +909,7 @@ static int sdma_load_context(struct sdma_channel *sdmac)
|
|
context->gReg[7] = sdmac->watermark_level;
|
|
|
|
bd0->mode.command = C0_SETDM;
|
|
- bd0->mode.status = BD_DONE | BD_INTR | BD_WRAP | BD_EXTD;
|
|
+ bd0->mode.status = BD_DONE | BD_WRAP | BD_EXTD;
|
|
bd0->mode.count = sizeof(*context) / 4;
|
|
bd0->buffer_addr = sdma->context_phys;
|
|
bd0->ext_buffer_addr = 2048 + (sizeof(*context) / 4) * channel;
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
|
|
index b2eecfc9042e..53186c5e1066 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
|
|
@@ -1534,25 +1534,6 @@ static void gfx_v9_0_gpu_init(struct amdgpu_device *adev)
|
|
mutex_unlock(&adev->srbm_mutex);
|
|
|
|
gfx_v9_0_init_compute_vmid(adev);
|
|
-
|
|
- mutex_lock(&adev->grbm_idx_mutex);
|
|
- /*
|
|
- * making sure that the following register writes will be broadcasted
|
|
- * to all the shaders
|
|
- */
|
|
- gfx_v9_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
|
|
-
|
|
- WREG32_SOC15(GC, 0, mmPA_SC_FIFO_SIZE,
|
|
- (adev->gfx.config.sc_prim_fifo_size_frontend <<
|
|
- PA_SC_FIFO_SIZE__SC_FRONTEND_PRIM_FIFO_SIZE__SHIFT) |
|
|
- (adev->gfx.config.sc_prim_fifo_size_backend <<
|
|
- PA_SC_FIFO_SIZE__SC_BACKEND_PRIM_FIFO_SIZE__SHIFT) |
|
|
- (adev->gfx.config.sc_hiz_tile_fifo_size <<
|
|
- PA_SC_FIFO_SIZE__SC_HIZ_TILE_FIFO_SIZE__SHIFT) |
|
|
- (adev->gfx.config.sc_earlyz_tile_fifo_size <<
|
|
- PA_SC_FIFO_SIZE__SC_EARLYZ_TILE_FIFO_SIZE__SHIFT));
|
|
- mutex_unlock(&adev->grbm_idx_mutex);
|
|
-
|
|
}
|
|
|
|
static void gfx_v9_0_wait_for_rlc_serdes(struct amdgpu_device *adev)
|
|
diff --git a/drivers/gpu/drm/i915/intel_csr.c b/drivers/gpu/drm/i915/intel_csr.c
|
|
index 92c1f8e166dc..0bdbbd4027fe 100644
|
|
--- a/drivers/gpu/drm/i915/intel_csr.c
|
|
+++ b/drivers/gpu/drm/i915/intel_csr.c
|
|
@@ -277,10 +277,17 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
|
|
uint32_t i;
|
|
uint32_t *dmc_payload;
|
|
uint32_t required_version;
|
|
+ size_t fsize;
|
|
|
|
if (!fw)
|
|
return NULL;
|
|
|
|
+ fsize = sizeof(struct intel_css_header) +
|
|
+ sizeof(struct intel_package_header) +
|
|
+ sizeof(struct intel_dmc_header);
|
|
+ if (fsize > fw->size)
|
|
+ goto error_truncated;
|
|
+
|
|
/* Extract CSS Header information*/
|
|
css_header = (struct intel_css_header *)fw->data;
|
|
if (sizeof(struct intel_css_header) !=
|
|
@@ -350,6 +357,9 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
|
|
return NULL;
|
|
}
|
|
readcount += dmc_offset;
|
|
+ fsize += dmc_offset;
|
|
+ if (fsize > fw->size)
|
|
+ goto error_truncated;
|
|
|
|
/* Extract dmc_header information. */
|
|
dmc_header = (struct intel_dmc_header *)&fw->data[readcount];
|
|
@@ -380,6 +390,10 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
|
|
|
|
/* fw_size is in dwords, so multiplied by 4 to convert into bytes. */
|
|
nbytes = dmc_header->fw_size * 4;
|
|
+ fsize += nbytes;
|
|
+ if (fsize > fw->size)
|
|
+ goto error_truncated;
|
|
+
|
|
if (nbytes > CSR_MAX_FW_SIZE) {
|
|
DRM_ERROR("CSR firmware too big (%u) bytes\n", nbytes);
|
|
return NULL;
|
|
@@ -393,6 +407,10 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
|
|
}
|
|
|
|
return memcpy(dmc_payload, &fw->data[readcount], nbytes);
|
|
+
|
|
+error_truncated:
|
|
+ DRM_ERROR("Truncated DMC firmware, rejecting.\n");
|
|
+ return NULL;
|
|
}
|
|
|
|
static void csr_load_work_fn(struct work_struct *work)
|
|
diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c
|
|
index 957fbf8c55eb..12dd261fc308 100644
|
|
--- a/drivers/gpu/drm/imx/ipuv3-crtc.c
|
|
+++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
|
|
@@ -99,14 +99,14 @@ static void ipu_crtc_atomic_disable(struct drm_crtc *crtc,
|
|
ipu_dc_disable(ipu);
|
|
ipu_prg_disable(ipu);
|
|
|
|
+ drm_crtc_vblank_off(crtc);
|
|
+
|
|
spin_lock_irq(&crtc->dev->event_lock);
|
|
- if (crtc->state->event) {
|
|
+ if (crtc->state->event && !crtc->state->active) {
|
|
drm_crtc_send_vblank_event(crtc, crtc->state->event);
|
|
crtc->state->event = NULL;
|
|
}
|
|
spin_unlock_irq(&crtc->dev->event_lock);
|
|
-
|
|
- drm_crtc_vblank_off(crtc);
|
|
}
|
|
|
|
static void imx_drm_crtc_reset(struct drm_crtc *crtc)
|
|
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
|
|
index a2ca90fc403c..cada1c75c41c 100644
|
|
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
|
|
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
|
|
@@ -270,6 +270,7 @@ err_config_cleanup:
|
|
static void mtk_drm_kms_deinit(struct drm_device *drm)
|
|
{
|
|
drm_kms_helper_poll_fini(drm);
|
|
+ drm_atomic_helper_shutdown(drm);
|
|
|
|
component_unbind_all(drm->dev, drm);
|
|
drm_mode_config_cleanup(drm);
|
|
diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
|
|
index 7e5e24c2152a..c1b8caad65e6 100644
|
|
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
|
|
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
|
|
@@ -631,6 +631,15 @@ static void mtk_dsi_poweroff(struct mtk_dsi *dsi)
|
|
if (--dsi->refcount != 0)
|
|
return;
|
|
|
|
+ /*
|
|
+ * mtk_dsi_stop() and mtk_dsi_start() is asymmetric, since
|
|
+ * mtk_dsi_stop() should be called after mtk_drm_crtc_atomic_disable(),
|
|
+ * which needs irq for vblank, and mtk_dsi_stop() will disable irq.
|
|
+ * mtk_dsi_start() needs to be called in mtk_output_dsi_enable(),
|
|
+ * after dsi is fully set.
|
|
+ */
|
|
+ mtk_dsi_stop(dsi);
|
|
+
|
|
if (!mtk_dsi_switch_to_cmd_mode(dsi, VM_DONE_INT_FLAG, 500)) {
|
|
if (dsi->panel) {
|
|
if (drm_panel_unprepare(dsi->panel)) {
|
|
@@ -697,7 +706,6 @@ static void mtk_output_dsi_disable(struct mtk_dsi *dsi)
|
|
}
|
|
}
|
|
|
|
- mtk_dsi_stop(dsi);
|
|
mtk_dsi_poweroff(dsi);
|
|
|
|
dsi->enabled = false;
|
|
@@ -851,6 +859,8 @@ static void mtk_dsi_destroy_conn_enc(struct mtk_dsi *dsi)
|
|
/* Skip connector cleanup if creation was delegated to the bridge */
|
|
if (dsi->conn.dev)
|
|
drm_connector_cleanup(&dsi->conn);
|
|
+ if (dsi->panel)
|
|
+ drm_panel_detach(dsi->panel);
|
|
}
|
|
|
|
static void mtk_dsi_ddp_start(struct mtk_ddp_comp *comp)
|
|
diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c
|
|
index 4f3de2a8c4df..9aced80f31a2 100644
|
|
--- a/drivers/platform/x86/mlx-platform.c
|
|
+++ b/drivers/platform/x86/mlx-platform.c
|
|
@@ -318,7 +318,7 @@ static int __init mlxplat_init(void)
|
|
|
|
for (i = 0; i < ARRAY_SIZE(mlxplat_mux_data); i++) {
|
|
priv->pdev_mux[i] = platform_device_register_resndata(
|
|
- &mlxplat_dev->dev,
|
|
+ &priv->pdev_i2c->dev,
|
|
"i2c-mux-reg", i, NULL,
|
|
0, &mlxplat_mux_data[i],
|
|
sizeof(mlxplat_mux_data[i]));
|
|
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
|
|
index 5b4b7f9be2d7..6d520e8945f7 100644
|
|
--- a/drivers/scsi/hpsa.c
|
|
+++ b/drivers/scsi/hpsa.c
|
|
@@ -4800,7 +4800,7 @@ static int hpsa_scsi_ioaccel2_queue_command(struct ctlr_info *h,
|
|
curr_sg->reserved[0] = 0;
|
|
curr_sg->reserved[1] = 0;
|
|
curr_sg->reserved[2] = 0;
|
|
- curr_sg->chain_indicator = 0x80;
|
|
+ curr_sg->chain_indicator = IOACCEL2_CHAIN;
|
|
|
|
curr_sg = h->ioaccel2_cmd_sg_list[c->cmdindex];
|
|
}
|
|
@@ -4817,6 +4817,11 @@ static int hpsa_scsi_ioaccel2_queue_command(struct ctlr_info *h,
|
|
curr_sg++;
|
|
}
|
|
|
|
+ /*
|
|
+ * Set the last s/g element bit
|
|
+ */
|
|
+ (curr_sg - 1)->chain_indicator = IOACCEL2_LAST_SG;
|
|
+
|
|
switch (cmd->sc_data_direction) {
|
|
case DMA_TO_DEVICE:
|
|
cp->direction &= ~IOACCEL2_DIRECTION_MASK;
|
|
diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h
|
|
index 078afe448115..ecf15344b55d 100644
|
|
--- a/drivers/scsi/hpsa_cmd.h
|
|
+++ b/drivers/scsi/hpsa_cmd.h
|
|
@@ -516,6 +516,7 @@ struct ioaccel2_sg_element {
|
|
u8 reserved[3];
|
|
u8 chain_indicator;
|
|
#define IOACCEL2_CHAIN 0x80
|
|
+#define IOACCEL2_LAST_SG 0x40
|
|
};
|
|
|
|
/*
|
|
diff --git a/drivers/spi/spi-bitbang.c b/drivers/spi/spi-bitbang.c
|
|
index 3aa9e6e3dac8..4ef54436b9d4 100644
|
|
--- a/drivers/spi/spi-bitbang.c
|
|
+++ b/drivers/spi/spi-bitbang.c
|
|
@@ -392,7 +392,7 @@ int spi_bitbang_start(struct spi_bitbang *bitbang)
|
|
if (ret)
|
|
spi_master_put(master);
|
|
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL_GPL(spi_bitbang_start);
|
|
|
|
diff --git a/drivers/tty/rocket.c b/drivers/tty/rocket.c
|
|
index 070733ca94d5..32943afacffd 100644
|
|
--- a/drivers/tty/rocket.c
|
|
+++ b/drivers/tty/rocket.c
|
|
@@ -279,7 +279,7 @@ MODULE_PARM_DESC(pc104_3, "set interface types for ISA(PC104) board #3 (e.g. pc1
|
|
module_param_array(pc104_4, ulong, NULL, 0);
|
|
MODULE_PARM_DESC(pc104_4, "set interface types for ISA(PC104) board #4 (e.g. pc104_4=232,232,485,485,...");
|
|
|
|
-static int rp_init(void);
|
|
+static int __init rp_init(void);
|
|
static void rp_cleanup_module(void);
|
|
|
|
module_init(rp_init);
|
|
diff --git a/drivers/usb/gadget/udc/fusb300_udc.c b/drivers/usb/gadget/udc/fusb300_udc.c
|
|
index e0c1b0099265..089f39de6897 100644
|
|
--- a/drivers/usb/gadget/udc/fusb300_udc.c
|
|
+++ b/drivers/usb/gadget/udc/fusb300_udc.c
|
|
@@ -1345,12 +1345,15 @@ static const struct usb_gadget_ops fusb300_gadget_ops = {
|
|
static int fusb300_remove(struct platform_device *pdev)
|
|
{
|
|
struct fusb300 *fusb300 = platform_get_drvdata(pdev);
|
|
+ int i;
|
|
|
|
usb_del_gadget_udc(&fusb300->gadget);
|
|
iounmap(fusb300->reg);
|
|
free_irq(platform_get_irq(pdev, 0), fusb300);
|
|
|
|
fusb300_free_request(&fusb300->ep[0]->ep, fusb300->ep0_req);
|
|
+ for (i = 0; i < FUSB300_MAX_NUM_EP; i++)
|
|
+ kfree(fusb300->ep[i]);
|
|
kfree(fusb300);
|
|
|
|
return 0;
|
|
@@ -1494,6 +1497,8 @@ clean_up:
|
|
if (fusb300->ep0_req)
|
|
fusb300_free_request(&fusb300->ep[0]->ep,
|
|
fusb300->ep0_req);
|
|
+ for (i = 0; i < FUSB300_MAX_NUM_EP; i++)
|
|
+ kfree(fusb300->ep[i]);
|
|
kfree(fusb300);
|
|
}
|
|
if (reg)
|
|
diff --git a/drivers/usb/gadget/udc/lpc32xx_udc.c b/drivers/usb/gadget/udc/lpc32xx_udc.c
|
|
index 8f32b5ee7734..6df1aded4503 100644
|
|
--- a/drivers/usb/gadget/udc/lpc32xx_udc.c
|
|
+++ b/drivers/usb/gadget/udc/lpc32xx_udc.c
|
|
@@ -935,8 +935,7 @@ static struct lpc32xx_usbd_dd_gad *udc_dd_alloc(struct lpc32xx_udc *udc)
|
|
dma_addr_t dma;
|
|
struct lpc32xx_usbd_dd_gad *dd;
|
|
|
|
- dd = (struct lpc32xx_usbd_dd_gad *) dma_pool_alloc(
|
|
- udc->dd_cache, (GFP_KERNEL | GFP_DMA), &dma);
|
|
+ dd = dma_pool_alloc(udc->dd_cache, GFP_ATOMIC | GFP_DMA, &dma);
|
|
if (dd)
|
|
dd->this_dma = dma;
|
|
|
|
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
|
|
index 4eba9ee179e3..b40e8ded49c6 100644
|
|
--- a/drivers/vhost/net.c
|
|
+++ b/drivers/vhost/net.c
|
|
@@ -44,6 +44,12 @@ MODULE_PARM_DESC(experimental_zcopytx, "Enable Zero Copy TX;"
|
|
* Using this limit prevents one virtqueue from starving others. */
|
|
#define VHOST_NET_WEIGHT 0x80000
|
|
|
|
+/* Max number of packets transferred before requeueing the job.
|
|
+ * Using this limit prevents one virtqueue from starving others with small
|
|
+ * pkts.
|
|
+ */
|
|
+#define VHOST_NET_PKT_WEIGHT 256
|
|
+
|
|
/* MAX number of TX used buffers for outstanding zerocopy */
|
|
#define VHOST_MAX_PEND 128
|
|
#define VHOST_GOODCOPY_LEN 256
|
|
@@ -461,6 +467,7 @@ static void handle_tx(struct vhost_net *net)
|
|
struct socket *sock;
|
|
struct vhost_net_ubuf_ref *uninitialized_var(ubufs);
|
|
bool zcopy, zcopy_used;
|
|
+ int sent_pkts = 0;
|
|
|
|
mutex_lock(&vq->mutex);
|
|
sock = vq->private_data;
|
|
@@ -475,7 +482,7 @@ static void handle_tx(struct vhost_net *net)
|
|
hdr_size = nvq->vhost_hlen;
|
|
zcopy = nvq->ubufs;
|
|
|
|
- for (;;) {
|
|
+ do {
|
|
/* Release DMAs done buffers first */
|
|
if (zcopy)
|
|
vhost_zerocopy_signal_used(net, vq);
|
|
@@ -543,7 +550,6 @@ static void handle_tx(struct vhost_net *net)
|
|
msg.msg_control = NULL;
|
|
ubufs = NULL;
|
|
}
|
|
-
|
|
total_len += len;
|
|
if (total_len < VHOST_NET_WEIGHT &&
|
|
!vhost_vq_avail_empty(&net->dev, vq) &&
|
|
@@ -572,11 +578,7 @@ static void handle_tx(struct vhost_net *net)
|
|
else
|
|
vhost_zerocopy_signal_used(net, vq);
|
|
vhost_net_tx_packet(net);
|
|
- if (unlikely(total_len >= VHOST_NET_WEIGHT)) {
|
|
- vhost_poll_queue(&vq->poll);
|
|
- break;
|
|
- }
|
|
- }
|
|
+ } while (likely(!vhost_exceeds_weight(vq, ++sent_pkts, total_len)));
|
|
out:
|
|
mutex_unlock(&vq->mutex);
|
|
}
|
|
@@ -754,6 +756,7 @@ static void handle_rx(struct vhost_net *net)
|
|
struct socket *sock;
|
|
struct iov_iter fixup;
|
|
__virtio16 num_buffers;
|
|
+ int recv_pkts = 0;
|
|
|
|
mutex_lock_nested(&vq->mutex, 0);
|
|
sock = vq->private_data;
|
|
@@ -773,7 +776,11 @@ static void handle_rx(struct vhost_net *net)
|
|
vq->log : NULL;
|
|
mergeable = vhost_has_feature(vq, VIRTIO_NET_F_MRG_RXBUF);
|
|
|
|
- while ((sock_len = vhost_net_rx_peek_head_len(net, sock->sk))) {
|
|
+ do {
|
|
+ sock_len = vhost_net_rx_peek_head_len(net, sock->sk);
|
|
+
|
|
+ if (!sock_len)
|
|
+ break;
|
|
sock_len += sock_hlen;
|
|
vhost_len = sock_len + vhost_hlen;
|
|
headcount = get_rx_bufs(vq, vq->heads, vhost_len,
|
|
@@ -854,11 +861,8 @@ static void handle_rx(struct vhost_net *net)
|
|
vhost_log_write(vq, vq_log, log, vhost_len,
|
|
vq->iov, in);
|
|
total_len += vhost_len;
|
|
- if (unlikely(total_len >= VHOST_NET_WEIGHT)) {
|
|
- vhost_poll_queue(&vq->poll);
|
|
- goto out;
|
|
- }
|
|
- }
|
|
+ } while (likely(!vhost_exceeds_weight(vq, ++recv_pkts, total_len)));
|
|
+
|
|
vhost_net_enable_vq(net, vq);
|
|
out:
|
|
mutex_unlock(&vq->mutex);
|
|
@@ -936,7 +940,8 @@ static int vhost_net_open(struct inode *inode, struct file *f)
|
|
n->vqs[i].sock_hlen = 0;
|
|
vhost_net_buf_init(&n->vqs[i].rxq);
|
|
}
|
|
- vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX);
|
|
+ vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX,
|
|
+ VHOST_NET_PKT_WEIGHT, VHOST_NET_WEIGHT);
|
|
|
|
vhost_poll_init(n->poll + VHOST_NET_VQ_TX, handle_tx_net, POLLOUT, dev);
|
|
vhost_poll_init(n->poll + VHOST_NET_VQ_RX, handle_rx_net, POLLIN, dev);
|
|
diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
|
|
index 35ebf06d9ecb..cb4ab5b955ad 100644
|
|
--- a/drivers/vhost/scsi.c
|
|
+++ b/drivers/vhost/scsi.c
|
|
@@ -58,6 +58,12 @@
|
|
#define VHOST_SCSI_PREALLOC_UPAGES 2048
|
|
#define VHOST_SCSI_PREALLOC_PROT_SGLS 512
|
|
|
|
+/* Max number of requests before requeueing the job.
|
|
+ * Using this limit prevents one virtqueue from starving others with
|
|
+ * request.
|
|
+ */
|
|
+#define VHOST_SCSI_WEIGHT 256
|
|
+
|
|
struct vhost_scsi_inflight {
|
|
/* Wait for the flush operation to finish */
|
|
struct completion comp;
|
|
@@ -840,7 +846,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
|
|
u64 tag;
|
|
u32 exp_data_len, data_direction;
|
|
unsigned int out = 0, in = 0;
|
|
- int head, ret, prot_bytes;
|
|
+ int head, ret, prot_bytes, c = 0;
|
|
size_t req_size, rsp_size = sizeof(struct virtio_scsi_cmd_resp);
|
|
size_t out_size, in_size;
|
|
u16 lun;
|
|
@@ -859,7 +865,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
|
|
|
|
vhost_disable_notify(&vs->dev, vq);
|
|
|
|
- for (;;) {
|
|
+ do {
|
|
head = vhost_get_vq_desc(vq, vq->iov,
|
|
ARRAY_SIZE(vq->iov), &out, &in,
|
|
NULL, NULL);
|
|
@@ -1074,7 +1080,7 @@ vhost_scsi_handle_vq(struct vhost_scsi *vs, struct vhost_virtqueue *vq)
|
|
*/
|
|
INIT_WORK(&cmd->work, vhost_scsi_submission_work);
|
|
queue_work(vhost_scsi_workqueue, &cmd->work);
|
|
- }
|
|
+ } while (likely(!vhost_exceeds_weight(vq, ++c, 0)));
|
|
out:
|
|
mutex_unlock(&vq->mutex);
|
|
}
|
|
@@ -1427,7 +1433,7 @@ static int vhost_scsi_open(struct inode *inode, struct file *f)
|
|
vqs[i] = &vs->vqs[i].vq;
|
|
vs->vqs[i].vq.handle_kick = vhost_scsi_handle_kick;
|
|
}
|
|
- vhost_dev_init(&vs->dev, vqs, VHOST_SCSI_MAX_VQ);
|
|
+ vhost_dev_init(&vs->dev, vqs, VHOST_SCSI_MAX_VQ, VHOST_SCSI_WEIGHT, 0);
|
|
|
|
vhost_scsi_init_inflight(vs, NULL);
|
|
|
|
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
|
|
index 0e93ac888a5f..88fa81c482e8 100644
|
|
--- a/drivers/vhost/vhost.c
|
|
+++ b/drivers/vhost/vhost.c
|
|
@@ -412,8 +412,24 @@ static void vhost_dev_free_iovecs(struct vhost_dev *dev)
|
|
vhost_vq_free_iovecs(dev->vqs[i]);
|
|
}
|
|
|
|
+bool vhost_exceeds_weight(struct vhost_virtqueue *vq,
|
|
+ int pkts, int total_len)
|
|
+{
|
|
+ struct vhost_dev *dev = vq->dev;
|
|
+
|
|
+ if ((dev->byte_weight && total_len >= dev->byte_weight) ||
|
|
+ pkts >= dev->weight) {
|
|
+ vhost_poll_queue(&vq->poll);
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ return false;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(vhost_exceeds_weight);
|
|
+
|
|
void vhost_dev_init(struct vhost_dev *dev,
|
|
- struct vhost_virtqueue **vqs, int nvqs)
|
|
+ struct vhost_virtqueue **vqs, int nvqs,
|
|
+ int weight, int byte_weight)
|
|
{
|
|
struct vhost_virtqueue *vq;
|
|
int i;
|
|
@@ -427,6 +443,8 @@ void vhost_dev_init(struct vhost_dev *dev,
|
|
dev->iotlb = NULL;
|
|
dev->mm = NULL;
|
|
dev->worker = NULL;
|
|
+ dev->weight = weight;
|
|
+ dev->byte_weight = byte_weight;
|
|
init_llist_head(&dev->work_list);
|
|
init_waitqueue_head(&dev->wait);
|
|
INIT_LIST_HEAD(&dev->read_list);
|
|
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
|
|
index 75d21d4a8354..950c5c4e4ee3 100644
|
|
--- a/drivers/vhost/vhost.h
|
|
+++ b/drivers/vhost/vhost.h
|
|
@@ -173,9 +173,13 @@ struct vhost_dev {
|
|
struct list_head read_list;
|
|
struct list_head pending_list;
|
|
wait_queue_head_t wait;
|
|
+ int weight;
|
|
+ int byte_weight;
|
|
};
|
|
|
|
-void vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs, int nvqs);
|
|
+bool vhost_exceeds_weight(struct vhost_virtqueue *vq, int pkts, int total_len);
|
|
+void vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs,
|
|
+ int nvqs, int weight, int byte_weight);
|
|
long vhost_dev_set_owner(struct vhost_dev *dev);
|
|
bool vhost_dev_has_owner(struct vhost_dev *dev);
|
|
long vhost_dev_check_owner(struct vhost_dev *);
|
|
diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
|
|
index d0cf3d5aa570..5b9db5deffbb 100644
|
|
--- a/drivers/vhost/vsock.c
|
|
+++ b/drivers/vhost/vsock.c
|
|
@@ -21,6 +21,14 @@
|
|
#include "vhost.h"
|
|
|
|
#define VHOST_VSOCK_DEFAULT_HOST_CID 2
|
|
+/* Max number of bytes transferred before requeueing the job.
|
|
+ * Using this limit prevents one virtqueue from starving others. */
|
|
+#define VHOST_VSOCK_WEIGHT 0x80000
|
|
+/* Max number of packets transferred before requeueing the job.
|
|
+ * Using this limit prevents one virtqueue from starving others with
|
|
+ * small pkts.
|
|
+ */
|
|
+#define VHOST_VSOCK_PKT_WEIGHT 256
|
|
|
|
enum {
|
|
VHOST_VSOCK_FEATURES = VHOST_FEATURES,
|
|
@@ -78,6 +86,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
|
|
struct vhost_virtqueue *vq)
|
|
{
|
|
struct vhost_virtqueue *tx_vq = &vsock->vqs[VSOCK_VQ_TX];
|
|
+ int pkts = 0, total_len = 0;
|
|
bool added = false;
|
|
bool restart_tx = false;
|
|
|
|
@@ -89,7 +98,7 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
|
|
/* Avoid further vmexits, we're already processing the virtqueue */
|
|
vhost_disable_notify(&vsock->dev, vq);
|
|
|
|
- for (;;) {
|
|
+ do {
|
|
struct virtio_vsock_pkt *pkt;
|
|
struct iov_iter iov_iter;
|
|
unsigned out, in;
|
|
@@ -174,8 +183,9 @@ vhost_transport_do_send_pkt(struct vhost_vsock *vsock,
|
|
*/
|
|
virtio_transport_deliver_tap_pkt(pkt);
|
|
|
|
+ total_len += pkt->len;
|
|
virtio_transport_free_pkt(pkt);
|
|
- }
|
|
+ } while(likely(!vhost_exceeds_weight(vq, ++pkts, total_len)));
|
|
if (added)
|
|
vhost_signal(&vsock->dev, vq);
|
|
|
|
@@ -350,7 +360,7 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work)
|
|
struct vhost_vsock *vsock = container_of(vq->dev, struct vhost_vsock,
|
|
dev);
|
|
struct virtio_vsock_pkt *pkt;
|
|
- int head;
|
|
+ int head, pkts = 0, total_len = 0;
|
|
unsigned int out, in;
|
|
bool added = false;
|
|
|
|
@@ -360,7 +370,7 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work)
|
|
goto out;
|
|
|
|
vhost_disable_notify(&vsock->dev, vq);
|
|
- for (;;) {
|
|
+ do {
|
|
u32 len;
|
|
|
|
if (!vhost_vsock_more_replies(vsock)) {
|
|
@@ -401,9 +411,11 @@ static void vhost_vsock_handle_tx_kick(struct vhost_work *work)
|
|
else
|
|
virtio_transport_free_pkt(pkt);
|
|
|
|
- vhost_add_used(vq, head, sizeof(pkt->hdr) + len);
|
|
+ len += sizeof(pkt->hdr);
|
|
+ vhost_add_used(vq, head, len);
|
|
+ total_len += len;
|
|
added = true;
|
|
- }
|
|
+ } while(likely(!vhost_exceeds_weight(vq, ++pkts, total_len)));
|
|
|
|
no_more_replies:
|
|
if (added)
|
|
@@ -531,7 +543,8 @@ static int vhost_vsock_dev_open(struct inode *inode, struct file *file)
|
|
vsock->vqs[VSOCK_VQ_TX].handle_kick = vhost_vsock_handle_tx_kick;
|
|
vsock->vqs[VSOCK_VQ_RX].handle_kick = vhost_vsock_handle_rx_kick;
|
|
|
|
- vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs));
|
|
+ vhost_dev_init(&vsock->dev, vqs, ARRAY_SIZE(vsock->vqs),
|
|
+ VHOST_VSOCK_PKT_WEIGHT, VHOST_VSOCK_WEIGHT);
|
|
|
|
file->private_data = vsock;
|
|
spin_lock_init(&vsock->send_pkt_list_lock);
|
|
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
|
|
index d826fbaf7d50..e4d5e6eae409 100644
|
|
--- a/fs/btrfs/backref.c
|
|
+++ b/fs/btrfs/backref.c
|
|
@@ -1290,8 +1290,6 @@ again:
|
|
ret = -EIO;
|
|
goto out;
|
|
}
|
|
- btrfs_tree_read_lock(eb);
|
|
- btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
|
|
if (!path->skip_locking) {
|
|
btrfs_tree_read_lock(eb);
|
|
btrfs_set_lock_blocking_rw(eb, BTRFS_READ_LOCK);
|
|
diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
|
|
index f86457713e60..f1e9dd246ab0 100644
|
|
--- a/fs/btrfs/dev-replace.c
|
|
+++ b/fs/btrfs/dev-replace.c
|
|
@@ -512,18 +512,27 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
|
|
}
|
|
btrfs_wait_ordered_roots(fs_info, U64_MAX, 0, (u64)-1);
|
|
|
|
- trans = btrfs_start_transaction(root, 0);
|
|
- if (IS_ERR(trans)) {
|
|
- mutex_unlock(&dev_replace->lock_finishing_cancel_unmount);
|
|
- return PTR_ERR(trans);
|
|
+ while (1) {
|
|
+ trans = btrfs_start_transaction(root, 0);
|
|
+ if (IS_ERR(trans)) {
|
|
+ mutex_unlock(&dev_replace->lock_finishing_cancel_unmount);
|
|
+ return PTR_ERR(trans);
|
|
+ }
|
|
+ ret = btrfs_commit_transaction(trans);
|
|
+ WARN_ON(ret);
|
|
+ mutex_lock(&uuid_mutex);
|
|
+ /* keep away write_all_supers() during the finishing procedure */
|
|
+ mutex_lock(&fs_info->fs_devices->device_list_mutex);
|
|
+ mutex_lock(&fs_info->chunk_mutex);
|
|
+ if (src_device->has_pending_chunks) {
|
|
+ mutex_unlock(&root->fs_info->chunk_mutex);
|
|
+ mutex_unlock(&root->fs_info->fs_devices->device_list_mutex);
|
|
+ mutex_unlock(&uuid_mutex);
|
|
+ } else {
|
|
+ break;
|
|
+ }
|
|
}
|
|
- ret = btrfs_commit_transaction(trans);
|
|
- WARN_ON(ret);
|
|
|
|
- mutex_lock(&uuid_mutex);
|
|
- /* keep away write_all_supers() during the finishing procedure */
|
|
- mutex_lock(&fs_info->fs_devices->device_list_mutex);
|
|
- mutex_lock(&fs_info->chunk_mutex);
|
|
btrfs_dev_replace_lock(dev_replace, 1);
|
|
dev_replace->replace_state =
|
|
scrub_ret ? BTRFS_IOCTL_DEV_REPLACE_STATE_CANCELED
|
|
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
|
|
index 38ed8e259e00..85294fef1051 100644
|
|
--- a/fs/btrfs/volumes.c
|
|
+++ b/fs/btrfs/volumes.c
|
|
@@ -4851,6 +4851,7 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
|
|
for (i = 0; i < map->num_stripes; i++) {
|
|
num_bytes = map->stripes[i].dev->bytes_used + stripe_size;
|
|
btrfs_device_set_bytes_used(map->stripes[i].dev, num_bytes);
|
|
+ map->stripes[i].dev->has_pending_chunks = true;
|
|
}
|
|
|
|
atomic64_sub(stripe_size * map->num_stripes, &info->free_chunk_space);
|
|
@@ -7310,6 +7311,7 @@ void btrfs_update_commit_device_bytes_used(struct btrfs_fs_info *fs_info,
|
|
for (i = 0; i < map->num_stripes; i++) {
|
|
dev = map->stripes[i].dev;
|
|
dev->commit_bytes_used = dev->bytes_used;
|
|
+ dev->has_pending_chunks = false;
|
|
}
|
|
}
|
|
mutex_unlock(&fs_info->chunk_mutex);
|
|
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
|
|
index 76fb6e84f201..f6ae6cdf233d 100644
|
|
--- a/fs/btrfs/volumes.h
|
|
+++ b/fs/btrfs/volumes.h
|
|
@@ -61,6 +61,11 @@ struct btrfs_device {
|
|
|
|
spinlock_t io_lock ____cacheline_aligned;
|
|
int running_pending;
|
|
+ /* When true means this device has pending chunk alloc in
|
|
+ * current transaction. Protected by chunk_mutex.
|
|
+ */
|
|
+ bool has_pending_chunks;
|
|
+
|
|
/* regular prio bios */
|
|
struct btrfs_pending_bios pending_bios;
|
|
/* sync bios */
|
|
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
|
|
index 4657e2924ecb..0a0e1aa11f5e 100644
|
|
--- a/kernel/cgroup/cpuset.c
|
|
+++ b/kernel/cgroup/cpuset.c
|
|
@@ -2436,10 +2436,23 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask)
|
|
spin_unlock_irqrestore(&callback_lock, flags);
|
|
}
|
|
|
|
+/**
|
|
+ * cpuset_cpus_allowed_fallback - final fallback before complete catastrophe.
|
|
+ * @tsk: pointer to task_struct with which the scheduler is struggling
|
|
+ *
|
|
+ * Description: In the case that the scheduler cannot find an allowed cpu in
|
|
+ * tsk->cpus_allowed, we fall back to task_cs(tsk)->cpus_allowed. In legacy
|
|
+ * mode however, this value is the same as task_cs(tsk)->effective_cpus,
|
|
+ * which will not contain a sane cpumask during cases such as cpu hotplugging.
|
|
+ * This is the absolute last resort for the scheduler and it is only used if
|
|
+ * _every_ other avenue has been traveled.
|
|
+ **/
|
|
+
|
|
void cpuset_cpus_allowed_fallback(struct task_struct *tsk)
|
|
{
|
|
rcu_read_lock();
|
|
- do_set_cpus_allowed(tsk, task_cs(tsk)->effective_cpus);
|
|
+ do_set_cpus_allowed(tsk, is_in_v2_mode() ?
|
|
+ task_cs(tsk)->cpus_allowed : cpu_possible_mask);
|
|
rcu_read_unlock();
|
|
|
|
/*
|
|
diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
|
|
index 7c51f065b212..88754e9790f9 100644
|
|
--- a/kernel/livepatch/core.c
|
|
+++ b/kernel/livepatch/core.c
|
|
@@ -30,6 +30,7 @@
|
|
#include <linux/elf.h>
|
|
#include <linux/moduleloader.h>
|
|
#include <linux/completion.h>
|
|
+#include <linux/memory.h>
|
|
#include <asm/cacheflush.h>
|
|
#include "core.h"
|
|
#include "patch.h"
|
|
@@ -635,16 +636,21 @@ static int klp_init_object_loaded(struct klp_patch *patch,
|
|
struct klp_func *func;
|
|
int ret;
|
|
|
|
+ mutex_lock(&text_mutex);
|
|
+
|
|
module_disable_ro(patch->mod);
|
|
ret = klp_write_object_relocations(patch->mod, obj);
|
|
if (ret) {
|
|
module_enable_ro(patch->mod, true);
|
|
+ mutex_unlock(&text_mutex);
|
|
return ret;
|
|
}
|
|
|
|
arch_klp_init_object_loaded(patch, obj);
|
|
module_enable_ro(patch->mod, true);
|
|
|
|
+ mutex_unlock(&text_mutex);
|
|
+
|
|
klp_for_each_func(obj, func) {
|
|
ret = klp_find_object_symbol(obj->name, func->old_name,
|
|
func->old_sympos,
|
|
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
|
|
index a75959dc149e..09fb3f58a838 100644
|
|
--- a/kernel/ptrace.c
|
|
+++ b/kernel/ptrace.c
|
|
@@ -78,9 +78,7 @@ void __ptrace_link(struct task_struct *child, struct task_struct *new_parent,
|
|
*/
|
|
static void ptrace_link(struct task_struct *child, struct task_struct *new_parent)
|
|
{
|
|
- rcu_read_lock();
|
|
- __ptrace_link(child, new_parent, __task_cred(new_parent));
|
|
- rcu_read_unlock();
|
|
+ __ptrace_link(child, new_parent, current_cred());
|
|
}
|
|
|
|
/**
|
|
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
|
|
index 3e92852c8b23..c4a0ad18c859 100644
|
|
--- a/kernel/trace/ftrace.c
|
|
+++ b/kernel/trace/ftrace.c
|
|
@@ -4280,10 +4280,13 @@ void free_ftrace_func_mapper(struct ftrace_func_mapper *mapper,
|
|
struct ftrace_func_entry *entry;
|
|
struct ftrace_func_map *map;
|
|
struct hlist_head *hhd;
|
|
- int size = 1 << mapper->hash.size_bits;
|
|
- int i;
|
|
+ int size, i;
|
|
+
|
|
+ if (!mapper)
|
|
+ return;
|
|
|
|
if (free_func && mapper->hash.count) {
|
|
+ size = 1 << mapper->hash.size_bits;
|
|
for (i = 0; i < size; i++) {
|
|
hhd = &mapper->hash.buckets[i];
|
|
hlist_for_each_entry(entry, hhd, hlist) {
|
|
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
|
|
index 76267d82f157..91227e339ef6 100644
|
|
--- a/kernel/trace/trace.c
|
|
+++ b/kernel/trace/trace.c
|
|
@@ -6394,11 +6394,13 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt,
|
|
break;
|
|
}
|
|
#endif
|
|
- if (!tr->allocated_snapshot) {
|
|
+ if (tr->allocated_snapshot)
|
|
+ ret = resize_buffer_duplicate_size(&tr->max_buffer,
|
|
+ &tr->trace_buffer, iter->cpu_file);
|
|
+ else
|
|
ret = tracing_alloc_snapshot_instance(tr);
|
|
- if (ret < 0)
|
|
- break;
|
|
- }
|
|
+ if (ret < 0)
|
|
+ break;
|
|
local_irq_disable();
|
|
/* Now, we're going to swap */
|
|
if (iter->cpu_file == RING_BUFFER_ALL_CPUS)
|
|
diff --git a/lib/mpi/mpi-pow.c b/lib/mpi/mpi-pow.c
|
|
index 468fb7cd1221..edf345b7f06b 100644
|
|
--- a/lib/mpi/mpi-pow.c
|
|
+++ b/lib/mpi/mpi-pow.c
|
|
@@ -37,6 +37,7 @@
|
|
int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
|
|
{
|
|
mpi_ptr_t mp_marker = NULL, bp_marker = NULL, ep_marker = NULL;
|
|
+ struct karatsuba_ctx karactx = {};
|
|
mpi_ptr_t xp_marker = NULL;
|
|
mpi_ptr_t tspace = NULL;
|
|
mpi_ptr_t rp, ep, mp, bp;
|
|
@@ -164,13 +165,11 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
|
|
int c;
|
|
mpi_limb_t e;
|
|
mpi_limb_t carry_limb;
|
|
- struct karatsuba_ctx karactx;
|
|
|
|
xp = xp_marker = mpi_alloc_limb_space(2 * (msize + 1));
|
|
if (!xp)
|
|
goto enomem;
|
|
|
|
- memset(&karactx, 0, sizeof karactx);
|
|
negative_result = (ep[0] & 1) && base->sign;
|
|
|
|
i = esize - 1;
|
|
@@ -295,8 +294,6 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
|
|
if (mod_shift_cnt)
|
|
mpihelp_rshift(rp, rp, rsize, mod_shift_cnt);
|
|
MPN_NORMALIZE(rp, rsize);
|
|
-
|
|
- mpihelp_release_karatsuba_ctx(&karactx);
|
|
}
|
|
|
|
if (negative_result && rsize) {
|
|
@@ -313,6 +310,7 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
|
|
leave:
|
|
rc = 0;
|
|
enomem:
|
|
+ mpihelp_release_karatsuba_ctx(&karactx);
|
|
if (assign_rp)
|
|
mpi_assign_limb_space(res, rp, size);
|
|
if (mp_marker)
|
|
diff --git a/mm/mlock.c b/mm/mlock.c
|
|
index 46af369c13e5..1f9ee86672e8 100644
|
|
--- a/mm/mlock.c
|
|
+++ b/mm/mlock.c
|
|
@@ -629,11 +629,11 @@ static int apply_vma_lock_flags(unsigned long start, size_t len,
|
|
* is also counted.
|
|
* Return value: previously mlocked page counts
|
|
*/
|
|
-static int count_mm_mlocked_page_nr(struct mm_struct *mm,
|
|
+static unsigned long count_mm_mlocked_page_nr(struct mm_struct *mm,
|
|
unsigned long start, size_t len)
|
|
{
|
|
struct vm_area_struct *vma;
|
|
- int count = 0;
|
|
+ unsigned long count = 0;
|
|
|
|
if (mm == NULL)
|
|
mm = current->mm;
|
|
diff --git a/mm/vmscan.c b/mm/vmscan.c
|
|
index 414c5cf87234..290078e8d4b1 100644
|
|
--- a/mm/vmscan.c
|
|
+++ b/mm/vmscan.c
|
|
@@ -3439,19 +3439,18 @@ out:
|
|
}
|
|
|
|
/*
|
|
- * pgdat->kswapd_classzone_idx is the highest zone index that a recent
|
|
- * allocation request woke kswapd for. When kswapd has not woken recently,
|
|
- * the value is MAX_NR_ZONES which is not a valid index. This compares a
|
|
- * given classzone and returns it or the highest classzone index kswapd
|
|
- * was recently woke for.
|
|
+ * The pgdat->kswapd_classzone_idx is used to pass the highest zone index to be
|
|
+ * reclaimed by kswapd from the waker. If the value is MAX_NR_ZONES which is not
|
|
+ * a valid index then either kswapd runs for first time or kswapd couldn't sleep
|
|
+ * after previous reclaim attempt (node is still unbalanced). In that case
|
|
+ * return the zone index of the previous kswapd reclaim cycle.
|
|
*/
|
|
static enum zone_type kswapd_classzone_idx(pg_data_t *pgdat,
|
|
- enum zone_type classzone_idx)
|
|
+ enum zone_type prev_classzone_idx)
|
|
{
|
|
if (pgdat->kswapd_classzone_idx == MAX_NR_ZONES)
|
|
- return classzone_idx;
|
|
-
|
|
- return max(pgdat->kswapd_classzone_idx, classzone_idx);
|
|
+ return prev_classzone_idx;
|
|
+ return pgdat->kswapd_classzone_idx;
|
|
}
|
|
|
|
static void kswapd_try_to_sleep(pg_data_t *pgdat, int alloc_order, int reclaim_order,
|
|
@@ -3592,7 +3591,7 @@ kswapd_try_sleep:
|
|
|
|
/* Read the new order and classzone_idx */
|
|
alloc_order = reclaim_order = pgdat->kswapd_order;
|
|
- classzone_idx = kswapd_classzone_idx(pgdat, 0);
|
|
+ classzone_idx = kswapd_classzone_idx(pgdat, classzone_idx);
|
|
pgdat->kswapd_order = 0;
|
|
pgdat->kswapd_classzone_idx = MAX_NR_ZONES;
|
|
|
|
@@ -3643,8 +3642,12 @@ void wakeup_kswapd(struct zone *zone, int order, enum zone_type classzone_idx)
|
|
if (!cpuset_zone_allowed(zone, GFP_KERNEL | __GFP_HARDWALL))
|
|
return;
|
|
pgdat = zone->zone_pgdat;
|
|
- pgdat->kswapd_classzone_idx = kswapd_classzone_idx(pgdat,
|
|
- classzone_idx);
|
|
+
|
|
+ if (pgdat->kswapd_classzone_idx == MAX_NR_ZONES)
|
|
+ pgdat->kswapd_classzone_idx = classzone_idx;
|
|
+ else
|
|
+ pgdat->kswapd_classzone_idx = max(pgdat->kswapd_classzone_idx,
|
|
+ classzone_idx);
|
|
pgdat->kswapd_order = max(pgdat->kswapd_order, order);
|
|
if (!waitqueue_active(&pgdat->kswapd_wait))
|
|
return;
|
|
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
|
|
index e9698592cf98..0ee64f67300a 100644
|
|
--- a/net/bluetooth/l2cap_core.c
|
|
+++ b/net/bluetooth/l2cap_core.c
|
|
@@ -1352,7 +1352,7 @@ static bool l2cap_check_enc_key_size(struct hci_conn *hcon)
|
|
* actually encrypted before enforcing a key size.
|
|
*/
|
|
return (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags) ||
|
|
- hcon->enc_key_size > HCI_MIN_ENC_KEY_SIZE);
|
|
+ hcon->enc_key_size >= HCI_MIN_ENC_KEY_SIZE);
|
|
}
|
|
|
|
static void l2cap_do_start(struct l2cap_chan *chan)
|
|
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c
|
|
index 5caf8e722a11..51e6cf2dc277 100644
|
|
--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
|
|
+++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
|
|
@@ -524,9 +524,14 @@ static void handle_connect_req(struct rdma_cm_id *new_cma_id,
|
|
/* Save client advertised inbound read limit for use later in accept. */
|
|
newxprt->sc_ord = param->initiator_depth;
|
|
|
|
- /* Set the local and remote addresses in the transport */
|
|
sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.dst_addr;
|
|
svc_xprt_set_remote(&newxprt->sc_xprt, sa, svc_addr_len(sa));
|
|
+ /* The remote port is arbitrary and not under the control of the
|
|
+ * client ULP. Set it to a fixed value so that the DRC continues
|
|
+ * to be effective after a reconnect.
|
|
+ */
|
|
+ rpc_set_port((struct sockaddr *)&newxprt->sc_xprt.xpt_remote, 0);
|
|
+
|
|
sa = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.src_addr;
|
|
svc_xprt_set_local(&newxprt->sc_xprt, sa, svc_addr_len(sa));
|
|
|
|
diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh
|
|
index 98a7d63a723e..c4a9ddb174bc 100755
|
|
--- a/scripts/decode_stacktrace.sh
|
|
+++ b/scripts/decode_stacktrace.sh
|
|
@@ -66,7 +66,7 @@ parse_symbol() {
|
|
if [[ "${cache[$module,$address]+isset}" == "isset" ]]; then
|
|
local code=${cache[$module,$address]}
|
|
else
|
|
- local code=$(addr2line -i -e "$objfile" "$address")
|
|
+ local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address")
|
|
cache[$module,$address]=$code
|
|
fi
|
|
|
|
diff --git a/sound/core/seq/oss/seq_oss_ioctl.c b/sound/core/seq/oss/seq_oss_ioctl.c
|
|
index 5b8520177b0e..7d72e3d48ad5 100644
|
|
--- a/sound/core/seq/oss/seq_oss_ioctl.c
|
|
+++ b/sound/core/seq/oss/seq_oss_ioctl.c
|
|
@@ -62,7 +62,7 @@ static int snd_seq_oss_oob_user(struct seq_oss_devinfo *dp, void __user *arg)
|
|
if (copy_from_user(ev, arg, 8))
|
|
return -EFAULT;
|
|
memset(&tmpev, 0, sizeof(tmpev));
|
|
- snd_seq_oss_fill_addr(dp, &tmpev, dp->addr.port, dp->addr.client);
|
|
+ snd_seq_oss_fill_addr(dp, &tmpev, dp->addr.client, dp->addr.port);
|
|
tmpev.time.tick = 0;
|
|
if (! snd_seq_oss_process_event(dp, (union evrec *)ev, &tmpev)) {
|
|
snd_seq_oss_dispatch(dp, &tmpev, 0, 0);
|
|
diff --git a/sound/core/seq/oss/seq_oss_rw.c b/sound/core/seq/oss/seq_oss_rw.c
|
|
index 6a7b6aceeca9..499f3e8f4949 100644
|
|
--- a/sound/core/seq/oss/seq_oss_rw.c
|
|
+++ b/sound/core/seq/oss/seq_oss_rw.c
|
|
@@ -174,7 +174,7 @@ insert_queue(struct seq_oss_devinfo *dp, union evrec *rec, struct file *opt)
|
|
memset(&event, 0, sizeof(event));
|
|
/* set dummy -- to be sure */
|
|
event.type = SNDRV_SEQ_EVENT_NOTEOFF;
|
|
- snd_seq_oss_fill_addr(dp, &event, dp->addr.port, dp->addr.client);
|
|
+ snd_seq_oss_fill_addr(dp, &event, dp->addr.client, dp->addr.port);
|
|
|
|
if (snd_seq_oss_process_event(dp, rec, &event))
|
|
return 0; /* invalid event - no need to insert queue */
|
|
diff --git a/sound/firewire/amdtp-am824.c b/sound/firewire/amdtp-am824.c
|
|
index 23ccddb20de1..8fc554d745f6 100644
|
|
--- a/sound/firewire/amdtp-am824.c
|
|
+++ b/sound/firewire/amdtp-am824.c
|
|
@@ -321,7 +321,7 @@ static void read_midi_messages(struct amdtp_stream *s,
|
|
u8 *b;
|
|
|
|
for (f = 0; f < frames; f++) {
|
|
- port = (s->data_block_counter + f) % 8;
|
|
+ port = (8 - s->tx_first_dbc + s->data_block_counter + f) % 8;
|
|
b = (u8 *)&buffer[p->midi_position];
|
|
|
|
len = b[0] - 0x80;
|
|
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
|
index 6d06f5d029aa..3552b4b1f902 100644
|
|
--- a/sound/pci/hda/patch_realtek.c
|
|
+++ b/sound/pci/hda/patch_realtek.c
|
|
@@ -6590,6 +6590,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
|
SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
|
SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
|
|
+ SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
|
|
SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
|
|
SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
|
|
SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
|
|
diff --git a/sound/soc/codecs/cs4265.c b/sound/soc/codecs/cs4265.c
|
|
index 6e8eb1f5a041..bed64723e5d9 100644
|
|
--- a/sound/soc/codecs/cs4265.c
|
|
+++ b/sound/soc/codecs/cs4265.c
|
|
@@ -60,7 +60,7 @@ static const struct reg_default cs4265_reg_defaults[] = {
|
|
static bool cs4265_readable_register(struct device *dev, unsigned int reg)
|
|
{
|
|
switch (reg) {
|
|
- case CS4265_CHIP_ID ... CS4265_SPDIF_CTL2:
|
|
+ case CS4265_CHIP_ID ... CS4265_MAX_REGISTER:
|
|
return true;
|
|
default:
|
|
return false;
|
|
diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c
|
|
index cc66ea5cc776..3fe09828745a 100644
|
|
--- a/sound/soc/codecs/max98090.c
|
|
+++ b/sound/soc/codecs/max98090.c
|
|
@@ -1924,6 +1924,21 @@ static int max98090_configure_dmic(struct max98090_priv *max98090,
|
|
return 0;
|
|
}
|
|
|
|
+static int max98090_dai_startup(struct snd_pcm_substream *substream,
|
|
+ struct snd_soc_dai *dai)
|
|
+{
|
|
+ struct snd_soc_component *component = dai->component;
|
|
+ struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component);
|
|
+ unsigned int fmt = max98090->dai_fmt;
|
|
+
|
|
+ /* Remove 24-bit format support if it is not in right justified mode. */
|
|
+ if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) != SND_SOC_DAIFMT_RIGHT_J) {
|
|
+ substream->runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
|
|
+ snd_pcm_hw_constraint_msbits(substream->runtime, 0, 16, 16);
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int max98090_dai_hw_params(struct snd_pcm_substream *substream,
|
|
struct snd_pcm_hw_params *params,
|
|
struct snd_soc_dai *dai)
|
|
@@ -2331,6 +2346,7 @@ EXPORT_SYMBOL_GPL(max98090_mic_detect);
|
|
#define MAX98090_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE)
|
|
|
|
static const struct snd_soc_dai_ops max98090_dai_ops = {
|
|
+ .startup = max98090_dai_startup,
|
|
.set_sysclk = max98090_dai_set_sysclk,
|
|
.set_fmt = max98090_dai_set_fmt,
|
|
.set_tdm_slot = max98090_set_tdm_slot,
|
|
diff --git a/sound/soc/codecs/rt274.c b/sound/soc/codecs/rt274.c
|
|
index cd048df76232..43086ac9ffec 100644
|
|
--- a/sound/soc/codecs/rt274.c
|
|
+++ b/sound/soc/codecs/rt274.c
|
|
@@ -398,6 +398,8 @@ static int rt274_mic_detect(struct snd_soc_codec *codec,
|
|
{
|
|
struct rt274_priv *rt274 = snd_soc_codec_get_drvdata(codec);
|
|
|
|
+ rt274->jack = jack;
|
|
+
|
|
if (jack == NULL) {
|
|
/* Disable jack detection */
|
|
regmap_update_bits(rt274->regmap, RT274_EAPD_GPIO_IRQ_CTRL,
|
|
@@ -405,7 +407,6 @@ static int rt274_mic_detect(struct snd_soc_codec *codec,
|
|
|
|
return 0;
|
|
}
|
|
- rt274->jack = jack;
|
|
|
|
regmap_update_bits(rt274->regmap, RT274_EAPD_GPIO_IRQ_CTRL,
|
|
RT274_IRQ_EN, RT274_IRQ_EN);
|
|
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
|
|
index 584b7ffe78f5..052b6294a428 100644
|
|
--- a/sound/soc/soc-pcm.c
|
|
+++ b/sound/soc/soc-pcm.c
|
|
@@ -2233,7 +2233,8 @@ int dpcm_be_dai_prepare(struct snd_soc_pcm_runtime *fe, int stream)
|
|
|
|
if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) &&
|
|
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
|
|
- (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND))
|
|
+ (be->dpcm[stream].state != SND_SOC_DPCM_STATE_SUSPEND) &&
|
|
+ (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
|
|
continue;
|
|
|
|
dev_dbg(be->dev, "ASoC: prepare BE %s\n",
|
|
diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
|
|
index b4af5ce78ecb..da0a2083e12a 100644
|
|
--- a/sound/soc/sunxi/sun4i-i2s.c
|
|
+++ b/sound/soc/sunxi/sun4i-i2s.c
|
|
@@ -110,7 +110,7 @@
|
|
|
|
#define SUN8I_I2S_TX_CHAN_MAP_REG 0x44
|
|
#define SUN8I_I2S_TX_CHAN_SEL_REG 0x34
|
|
-#define SUN8I_I2S_TX_CHAN_OFFSET_MASK GENMASK(13, 11)
|
|
+#define SUN8I_I2S_TX_CHAN_OFFSET_MASK GENMASK(13, 12)
|
|
#define SUN8I_I2S_TX_CHAN_OFFSET(offset) (offset << 12)
|
|
#define SUN8I_I2S_TX_CHAN_EN_MASK GENMASK(11, 4)
|
|
#define SUN8I_I2S_TX_CHAN_EN(num_chan) (((1 << num_chan) - 1) << 4)
|
|
@@ -442,6 +442,10 @@ static int sun4i_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
|
regmap_update_bits(i2s->regmap, SUN8I_I2S_TX_CHAN_SEL_REG,
|
|
SUN8I_I2S_TX_CHAN_OFFSET_MASK,
|
|
SUN8I_I2S_TX_CHAN_OFFSET(offset));
|
|
+
|
|
+ regmap_update_bits(i2s->regmap, SUN8I_I2S_RX_CHAN_SEL_REG,
|
|
+ SUN8I_I2S_TX_CHAN_OFFSET_MASK,
|
|
+ SUN8I_I2S_TX_CHAN_OFFSET(offset));
|
|
}
|
|
|
|
regmap_field_write(i2s->field_fmt_mode, val);
|
|
diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c
|
|
index b3854f8c0c67..f5614507a81c 100644
|
|
--- a/sound/usb/line6/pcm.c
|
|
+++ b/sound/usb/line6/pcm.c
|
|
@@ -558,6 +558,11 @@ int line6_init_pcm(struct usb_line6 *line6,
|
|
line6pcm->max_packet_size_out =
|
|
usb_maxpacket(line6->usbdev,
|
|
usb_sndisocpipe(line6->usbdev, ep_write), 1);
|
|
+ if (!line6pcm->max_packet_size_in || !line6pcm->max_packet_size_out) {
|
|
+ dev_err(line6pcm->line6->ifcdev,
|
|
+ "cannot get proper max packet size\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
|
|
spin_lock_init(&line6pcm->out.lock);
|
|
spin_lock_init(&line6pcm->in.lock);
|
|
diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
|
|
index e1e7ce9ab217..b54f7dab8372 100644
|
|
--- a/sound/usb/mixer_quirks.c
|
|
+++ b/sound/usb/mixer_quirks.c
|
|
@@ -754,7 +754,7 @@ static int snd_ni_control_init_val(struct usb_mixer_interface *mixer,
|
|
return err;
|
|
}
|
|
|
|
- kctl->private_value |= (value << 24);
|
|
+ kctl->private_value |= ((unsigned int)value << 24);
|
|
return 0;
|
|
}
|
|
|
|
@@ -915,7 +915,7 @@ static int snd_ftu_eff_switch_init(struct usb_mixer_interface *mixer,
|
|
if (err < 0)
|
|
return err;
|
|
|
|
- kctl->private_value |= value[0] << 24;
|
|
+ kctl->private_value |= (unsigned int)value[0] << 24;
|
|
return 0;
|
|
}
|
|
|