4.4.62-stable review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 4.4.62-stable review
This is the start of the stable review cycle for the 4.4.62 release. There are 18 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue Apr 18 08:02:00 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.62-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.4.62-rc1
Thomas Falcon <[email protected]>
ibmveth: set correct gso_size and gso_type
Jack Morgenstein <[email protected]>
net/mlx4_core: Fix when to save some qp context flags for dynamic VST to VGT transitions
Jack Morgenstein <[email protected]>
net/mlx4_core: Fix racy CQ (Completion Queue) free
Eugenia Emantayev <[email protected]>
net/mlx4_en: Fix bad WQE issue
Guenter Roeck <[email protected]>
usb: hub: Wait for connection to be reestablished after port reset
Gabriel Krisman Bertazi <[email protected]>
blk-mq: Avoid memory reclaim when remapping queues
Andrey Konovalov <[email protected]>
net/packet: fix overflow in check for priv area size
Horia Geantă <[email protected]>
crypto: caam - fix RNG deinstantiation error checking
Matt Redfearn <[email protected]>
MIPS: IRQ Stack: Fix erroneous jal to plat_irq_dispatch
Matt Redfearn <[email protected]>
MIPS: Select HAVE_IRQ_EXIT_ON_IRQ_STACK
Matt Redfearn <[email protected]>
MIPS: Switch to the irq_stack in interrupts
Matt Redfearn <[email protected]>
MIPS: Only change $28 to thread_info if coming from user mode
Matt Redfearn <[email protected]>
MIPS: Stack unwinding while on IRQ stack
Matt Redfearn <[email protected]>
MIPS: Introduce irq_stack
Rafał Miłecki <[email protected]>
mtd: bcm47xxpart: fix parsing first block after aligned TRX
Janusz Dziedzic <[email protected]>
usb: dwc3: gadget: delay unmap of bounced requests
Chris Wilson <[email protected]>
drm/i915: Stop using RP_DOWN_EI on Baytrail
Mika Kuoppala <[email protected]>
drm/i915: Avoid tweaking evaluation thresholds on Baytrail v3
-------------
Diffstat:
Makefile | 4 +- arch/mips/Kconfig | 1 + arch/mips/include/asm/irq.h | 12 ++++ arch/mips/include/asm/stackframe.h | 7 ++ arch/mips/kernel/asm-offsets.c | 1 + arch/mips/kernel/genex.S | 81 ++++++++++++++++++++-- arch/mips/kernel/irq.c | 11 +++ arch/mips/kernel/process.c | 15 +++- block/blk-mq.c | 6 +- drivers/crypto/caam/ctrl.c | 3 +- drivers/gpu/drm/i915/i915_drv.h | 2 +- drivers/gpu/drm/i915/i915_irq.c | 73 ++++++++----------- drivers/gpu/drm/i915/intel_pm.c | 12 +++- drivers/mtd/bcm47xxpart.c | 10 ++- drivers/net/ethernet/ibm/ibmveth.c | 65 ++++++++++++++++- drivers/net/ethernet/ibm/ibmveth.h | 1 + drivers/net/ethernet/mellanox/mlx4/cq.c | 38 +++++----- drivers/net/ethernet/mellanox/mlx4/en_rx.c | 8 ++- .../net/ethernet/mellanox/mlx4/resource_tracker.c | 5 +- drivers/usb/core/hub.c | 11 ++- drivers/usb/dwc3/gadget.c | 21 ++++-- net/packet/af_packet.c | 4 +- 22 files changed, 294 insertions(+), 97 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 2/18 drm/i915: Stop using RP_DOWN_EI on Baytrail
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Wilson <[email protected]>
commit 8f68d591d4765b2e1ce9d916ac7bc5583285c4ad upstream.
On Baytrail, we manually calculate busyness over the evaluation interval to avoid issues with miscaluations with RC6 enabled. However, it turns out that the DOWN_EI interrupt generator is completely bust - it operates in two modes, continuous or never. Neither of which are conducive to good behaviour. Stop unmask the DOWN_EI interrupt and just compute everything from the UP_EI which does seem to correspond to the desired interval.
v2: Fixup gen6_rps_pm_mask() as well
v3: Inline vlv_c0_above() to combine the now identical elapsed calculation for up/down and simplify the threshold testing
--- drivers/gpu/drm/i915/i915_drv.h | 2 - drivers/gpu/drm/i915/i915_irq.c | 73 +++++++++++++++------------------------- drivers/gpu/drm/i915/intel_pm.c | 5 +- 3 files changed, 32 insertions(+), 48 deletions(-)
drivers/gpu/drm/i915/i915_drv.h +1 -1
@@ -1159,7 +1159,7 @@ struct intel_gen6_power_mgmt {struct intel_rps_client semaphores, mmioflips;/* manual wa residency calculations */ -struct intel_rps_ei up_ei, down_ei; +struct intel_rps_ei ei;/* * Protects RPS/RC6 register access and PCU communication.
drivers/gpu/drm/i915/i915_irq.c +28 -45
103 lines not on this page · raw message
drivers/gpu/drm/i915/intel_pm.c +3 -2
@@ -4411,8 +4411,9 @@ static u32 gen6_rps_pm_mask(struct drm_i {u32 mask =0 ; +/* We use UP_EI_EXPIRED interupts for both up/down in manual mode */ if (val > dev_priv->rps.min_freq_softlimit) - mask |=GEN6_PM_RP_DOWN_EI_EXPIRED |GEN6_PM_RP_DOWN_THRESHOLD |GEN6_PM_RP_DOWN_TIMEOUT ; + mask |=GEN6_PM_RP_UP_EI_EXPIRED |GEN6_PM_RP_DOWN_THRESHOLD |GEN6_PM_RP_DOWN_TIMEOUT ;if (val < dev_priv->rps.max_freq_softlimit) mask |=GEN6_PM_RP_UP_EI_EXPIRED |GEN6_PM_RP_UP_THRESHOLD ;
@@ -4516,7 +4517,7 @@ void gen6_rps_busy(struct drm_i915_priva {mutex_lock (&dev_priv->rps.hw_lock);if (dev_priv->rps.enabled) { -if (dev_priv->pm_rps_events & (GEN6_PM_RP_DOWN_EI_EXPIRED |GEN6_PM_RP_UP_EI_EXPIRED )) +if (dev_priv->pm_rps_events &GEN6_PM_RP_UP_EI_EXPIRED )gen6_rps_reset_ei (dev_priv);I915_WRITE (GEN6_PMINTRMSK ,gen6_rps_pm_mask (dev_priv, dev_priv->rps.cur_freq));
Greg Kroah-Hartman
maintainerPATCH 3/18 usb: dwc3: gadget: delay unmap of bounced requests
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Janusz Dziedzic <[email protected]>
commit de288e36fe33f7e06fa272bc8e2f85aa386d99aa upstream.
In the case of bounced ep0 requests, we must delay DMA operation until after ->complete() otherwise we might overwrite contents of req->buf.
This caused problems with RNDIS gadget.
--- drivers/usb/dwc3/gadget.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-)
drivers/usb/dwc3/gadget.c +17 -4
@@ -235,6 +235,7 @@ void dwc3_gadget_giveback(struct dwc3_ep int status) {struct dwc3 *dwc = dep->dwc; +unsigned int unmap_after_complete = false;int i;if (req->queued) {
@@ -259,11 +260,19 @@ void dwc3_gadget_giveback(struct dwc3_epif (req->request.status == -EINPROGRESS ) req->request.status = status; -if (dwc->ep0_bounced && dep->number <=1 ) +/* +* NOTICE we don't want to unmap before calling ->complete() if we're +* dealing with a bounced ep0 request. If we unmap it here, we would end +* up overwritting the contents of req->buf and this could confuse the +* gadget driver. +*/ +if (dwc->ep0_bounced && dep->number <=1 ) { dwc->ep0_bounced = false; - -usb_gadget_unmap_request (&dwc->gadget, &req->request, - req->direction); + unmap_after_complete = true; + }else { +usb_gadget_unmap_request (&dwc->gadget, + &req->request, req->direction); + } dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n", req, dep->name, req->request.actual,
@@ -273,6 +282,10 @@ void dwc3_gadget_giveback(struct dwc3_epspin_unlock (&dwc->lock);usb_gadget_giveback_request (&dep->endpoint, &req->request);spin_lock (&dwc->lock); + +if (unmap_after_complete) +usb_gadget_unmap_request (&dwc->gadget, + &req->request, req->direction); }int dwc3_send_gadget_generic_command (struct dwc3 *dwc,unsigned cmd,u32 param)
Greg Kroah-Hartman
maintainerPATCH 5/18 MIPS: Introduce irq_stack
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Redfearn <[email protected]>
commit fe8bd18ffea5327344d4ec2bf11f47951212abd0 upstream.
Allocate a per-cpu irq stack for use within interrupt handlers.
Also add a utility function on_irq_stack to determine if a given stack pointer is within the irq stack for that cpu.
Patchwork: https://patchwork.linux-mips.org/patch/14740/
--- arch/mips/include/asm/irq.h | 12 ++++++++++++ arch/mips/kernel/asm-offsets.c | 1 + arch/mips/kernel/irq.c | 11 +++++++++++ 3 files changed, 24 insertions(+)
arch/mips/include/asm/irq.h +12 -0
@@ -17,6 +17,18 @@#include <irq.h> +#define IRQ_STACK_SIZE THREAD_SIZE + +extern void *irq_stack[NR_CPUS ]; + +static inline bool on_irq_stack (int cpu,unsigned long sp) +{ +unsigned long low = (unsigned long )irq_stack[cpu]; +unsigned long high = low +IRQ_STACK_SIZE ; + +return (low <= sp && sp <= high); +} +#ifdef CONFIG_I8259 static inline int irq_canonicalize (int irq) {
arch/mips/kernel/asm-offsets.c +1 -0
@@ -101,6 +101,7 @@ void output_thread_info_defines(void)OFFSET (TI_REGS , thread_info, regs);DEFINE (_THREAD_SIZE,THREAD_SIZE );DEFINE (_THREAD_MASK,THREAD_MASK ); +DEFINE (_IRQ_STACK_SIZE,IRQ_STACK_SIZE );BLANK (); }
arch/mips/kernel/irq.c +11 -0
@@ -25,6 +25,8 @@#include <linux/atomic.h> #include <asm/uaccess.h> +void *irq_stack[NR_CPUS ]; +/* * 'what should we do if we get a hw irq event on an illegal vector'. * each architecture has to answer this themselves.
@@ -55,6 +57,15 @@ void __init init_IRQ(void)irq_set_noprobe (i);arch_init_irq (); + +for_each_possible_cpu (i) { +int irq_pages =IRQ_STACK_SIZE /PAGE_SIZE ; +void *s = (void *)__get_free_pages (GFP_KERNEL , irq_pages); + + irq_stack[i] = s; +pr_debug ("CPU%d IRQ stack at 0x%p - 0x%p\n" , i, + irq_stack[i], irq_stack[i] +IRQ_STACK_SIZE ); + } }#ifdef CONFIG_DEBUG_STACKOVERFLOW
Greg Kroah-Hartman
maintainerPATCH 6/18 MIPS: Stack unwinding while on IRQ stack
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Redfearn <[email protected]>
commit d42d8d106b0275b027c1e8992c42aecf933436ea upstream.
Within unwind stack, check if the stack pointer being unwound is within the CPU's irq_stack and if so use that page rather than the task's stack page.
Patchwork: https://patchwork.linux-mips.org/patch/14741/
--- arch/mips/kernel/process.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
arch/mips/kernel/process.c +14 -1
@@ -32,6 +32,7 @@#include <asm/cpu.h> #include <asm/dsp.h> #include <asm/fpu.h> +#include <asm/irq.h> #include <asm/msa.h> #include <asm/pgtable.h> #include <asm/mipsregs.h>
@@ -552,7 +553,19 @@ EXPORT_SYMBOL(unwind_stack_by_address);unsigned long unwind_stack (struct task_struct *task,unsigned long *sp,unsigned long pc,unsigned long *ra) { -unsigned long stack_page = (unsigned long )task_stack_page (task); +unsigned long stack_page =0 ; +int cpu; + +for_each_possible_cpu (cpu) { +if (on_irq_stack (cpu, *sp)) { + stack_page = (unsigned long )irq_stack[cpu]; +break ; + } + } + +if (!stack_page) + stack_page = (unsigned long )task_stack_page (task); +return unwind_stack_by_address (stack_page, sp, pc, ra); }#endif
Greg Kroah-Hartman
maintainerPATCH 7/18 MIPS: Only change $28 to thread_info if coming from user mode
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Redfearn <[email protected]>
commit 510d86362a27577f5ee23f46cfb354ad49731e61 upstream.
The SAVE_SOME macro is used to save the execution context on all exceptions.
If an exception occurs while executing user code, the stack is switched to the kernel's stack for the current task, and register $28 is switched to point to the current_thread_info, which is at the bottom of the stack region.
If the exception occurs while executing kernel code, the stack is left, and this change ensures that register $28 is not updated. This is the correct behaviour when the kernel can be executing on the separate irq stack, because the thread_info will not be at the base of it.
With this change, register $28 is only switched to it's kernel conventional usage of the currrent thread info pointer at the point at which execution enters kernel space. Doing it on every exception was redundant, but OK without an IRQ stack, but will be erroneous once that is introduced.
Patchwork: https://patchwork.linux-mips.org/patch/14742/
--- arch/mips/include/asm/stackframe.h | 7 +++++++ 1 file changed, 7 insertions(+)
arch/mips/include/asm/stackframe.h +7 -0
@@ -216,12 +216,19 @@ LONG_S $25, PT_R25(sp) LONG_S $28, PT_R28(sp) LONG_S $31, PT_R31(sp) + + /* Set thread_info if we're coming from user mode */ + mfc0 k0, CP0_STATUS + sll k0, 3 /* extract cu0 bit */ + bltz k0, 9f + ori $28, sp, _THREAD_MASK xori $28, _THREAD_MASK #ifdef CONFIG_CPU_CAVIUM_OCTEON .set mips64 pref 0, 0($28) /* Prefetch the current pointer */ #endif +9: .set pop .endm
Greg Kroah-Hartman
maintainerPATCH 8/18 MIPS: Switch to the irq_stack in interrupts
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Redfearn <[email protected]>
commit dda45f701c9d7ad4ac0bb446e3a96f6df9a468d9 upstream.
When enterring interrupt context via handle_int or except_vec_vi, switch to the irq_stack of the current CPU if it is not already in use.
The current stack pointer is masked with the thread size and compared to the base or the irq stack. If it does not match then the stack pointer is set to the top of that stack, otherwise this is a nested irq being handled on the irq stack so the stack pointer should be left as it was.
The in-use stack pointer is placed in the callee saved register s1. It will be saved to the stack when plat_irq_dispatch is invoked and can be restored once control returns here.
Patchwork: https://patchwork.linux-mips.org/patch/14743/
--- arch/mips/kernel/genex.S | 81 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 5 deletions(-)
arch/mips/kernel/genex.S +76 -5
@@ -188,9 +188,44 @@ NESTED(handle_int, PT_SIZE, sp) LONG_L s0, TI_REGS($28) LONG_S sp, TI_REGS($28) - PTR_LA ra, ret_from_irq - PTR_LA v0, plat_irq_dispatch - jr v0 + + /* + * SAVE_ALL ensures we are using a valid kernel stack for the thread. + * Check if we are already using the IRQ stack. + */ + move s1, sp # Preserve the sp + + /* Get IRQ stack for this CPU */ + ASM_CPUID_MFC0 k0, ASM_SMP_CPUID_REG +#if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32) + lui k1, %hi(irq_stack) +#else + lui k1, %highest(irq_stack) + daddiu k1, %higher(irq_stack) + dsll k1, 16 + daddiu k1, %hi(irq_stack) + dsll k1, 16 +#endif + LONG_SRL k0, SMP_CPUID_PTRSHIFT + LONG_ADDU k1, k0 + LONG_L t0, %lo(irq_stack)(k1) + + # Check if already on IRQ stack + PTR_LI t1, ~(_THREAD_SIZE-1) + and t1, t1, sp + beq t0, t1, 2f + + /* Switch to IRQ stack */ + li t1, _IRQ_STACK_SIZE + PTR_ADD sp, t0, t1 + +2: + jal plat_irq_dispatch + + /* Restore sp */ + move sp, s1 + + j ret_from_irq #ifdef CONFIG_CPU_MICROMIPS nop #endif
@@ -263,8 +298,44 @@ NESTED(except_vec_vi_handler, 0, sp) LONG_L s0, TI_REGS($28) LONG_S sp, TI_REGS($28) - PTR_LA ra, ret_from_irq - jr v0 + + /* + * SAVE_ALL ensures we are using a valid kernel stack for the thread. + * Check if we are already using the IRQ stack. + */ + move s1, sp # Preserve the sp + + /* Get IRQ stack for this CPU */ + ASM_CPUID_MFC0 k0, ASM_SMP_CPUID_REG +#if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32) + lui k1, %hi(irq_stack) +#else + lui k1, %highest(irq_stack) + daddiu k1, %higher(irq_stack) + dsll k1, 16 + daddiu k1, %hi(irq_stack) + dsll k1, 16 +#endif + LONG_SRL k0, SMP_CPUID_PTRSHIFT + LONG_ADDU k1, k0 + LONG_L t0, %lo(irq_stack)(k1) + + # Check if already on IRQ stack + PTR_LI t1, ~(_THREAD_SIZE-1) + and t1, t1, sp + beq t0, t1, 2f + + /* Switch to IRQ stack */ + li t1, _IRQ_STACK_SIZE + PTR_ADD sp, t0, t1 + +2: + jal plat_irq_dispatch + + /* Restore sp */ + move sp, s1 + + j ret_from_irq END(except_vec_vi_handler) /*
Greg Kroah-Hartman
maintainerPATCH 9/18 MIPS: Select HAVE_IRQ_EXIT_ON_IRQ_STACK
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Redfearn <[email protected]>
commit 3cc3434fd6307d06b53b98ce83e76bf9807689b9 upstream.
Since do_IRQ is now invoked on a separate IRQ stack, we select HAVE_IRQ_EXIT_ON_IRQ_STACK so that softirq's may be invoked directly from irq_exit(), rather than requiring do_softirq_own_stack.
Patchwork: https://patchwork.linux-mips.org/patch/14744/
--- arch/mips/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/mips/Kconfig +1 -0
@@ -9,6 +9,7 @@ config MIPS select HAVE_CONTEXT_TRACKING select HAVE_GENERIC_DMA_COHERENT select HAVE_IDE + select HAVE_IRQ_EXIT_ON_IRQ_STACK select HAVE_OPROFILE select HAVE_PERF_EVENTS select PERF_USE_VMALLOC
Greg Kroah-Hartman
maintainerPATCH 10/18 MIPS: IRQ Stack: Fix erroneous jal to plat_irq_dispatch
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Redfearn <[email protected]>
commit c25f8064c1d5731a2ce5664def890140dcdd3e5c upstream.
Commit dda45f701c9d ("MIPS: Switch to the irq_stack in interrupts") changed both the normal and vectored interrupt handlers. Unfortunately the vectored version, "except_vec_vi_handler", was incorrectly modified to unconditionally jal to plat_irq_dispatch, rather than doing a jalr to the vectored handler that has been set up. This is ok for many platforms which set the vectored handler to plat_irq_dispatch anyway, but will cause problems with platforms that use other handlers.
Patchwork: https://patchwork.linux-mips.org/patch/15110/
--- arch/mips/kernel/genex.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/kernel/genex.S +1 -1
@@ -330,7 +330,7 @@ NESTED(except_vec_vi_handler, 0, sp) PTR_ADD sp, t0, t1 2: - jal plat_irq_dispatch + jalr v0 /* Restore sp */ move sp, s1
Greg Kroah-Hartman
maintainerPATCH 12/18 net/packet: fix overflow in check for priv area size
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Konovalov <[email protected]>
commit 2b6867c2ce76c596676bec7d2d525af525fdc6e2 upstream.
Subtracting tp_sizeof_priv from tp_block_size and casting to int to check whether one is less then the other doesn't always work (both of them are unsigned ints).
Compare them as is instead.
Also cast tp_sizeof_priv to u64 before using BLK_PLUS_PRIV, as it can overflow inside BLK_PLUS_PRIV otherwise.
--- net/packet/af_packet.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/packet/af_packet.c +2 -2
@@ -4138,8 +4138,8 @@ static int packet_set_ring(struct sock *if (unlikely (!PAGE_ALIGNED (req->tp_block_size))) goto out;if (po->tp_version >=TPACKET_V3 && - (int )(req->tp_block_size - -BLK_PLUS_PRIV (req_u->req3.tp_sizeof_priv)) <=0 ) + req->tp_block_size <= +BLK_PLUS_PRIV ((u64 )req_u->req3.tp_sizeof_priv)) goto out;if (unlikely (req->tp_frame_size < po->tp_hdrlen + po->tp_reserve))
Greg Kroah-Hartman
maintainerPATCH 13/18 blk-mq: Avoid memory reclaim when remapping queues
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gabriel Krisman Bertazi <[email protected]>
commit 36e1f3d107867b25c616c2fd294f5a1c9d4e5d09 upstream.
While stressing memory and IO at the same time we changed SMT settings, we were able to consistently trigger deadlocks in the mm system, which froze the entire machine.
I think that under memory stress conditions, the large allocations performed by blk_mq_init_rq_map may trigger a reclaim, which stalls waiting on the block layer remmaping completion, thus deadlocking the system. The trace below was collected after the machine stalled, waiting for the hotplug event completion.
The simplest fix for this is to make allocations in this path non-reclaimable, with GFP_NOIO. With this patch, We couldn't hit the issue anymore.
This should apply on top of Jens's for-next branch cleanly.
Changes since v1:
- Use GFP_NOIO instead of GFP_NOWAIT.
Call Trace:
[c000000f0160aaf0] [c000000f0160ab50] 0xc000000f0160ab50 (unreliable) [c000000f0160acc0] [c000000000016624] __switch_to+0x2e4/0x430 [c000000f0160ad20] [c000000000b1a880] __schedule+0x310/0x9b0 [c000000f0160ae00] [c000000000b1af68] schedule+0x48/0xc0 [c000000f0160ae30] [c000000000b1b4b0] schedule_preempt_disabled+0x20/0x30 [c000000f0160ae50] [c000000000b1d4fc] __mutex_lock_slowpath+0xec/0x1f0 [c000000f0160aed0] [c000000000b1d678] mutex_lock+0x78/0xa0 [c000000f0160af00] [d000000019413cac] xfs_reclaim_inodes_ag+0x33c/0x380 [xfs] [c000000f0160b0b0] [d000000019415164] xfs_reclaim_inodes_nr+0x54/0x70 [xfs] [c000000f0160b0f0] [d0000000194297f8] xfs_fs_free_cached_objects+0x38/0x60 [xfs] [c000000f0160b120] [c0000000003172c8] super_cache_scan+0x1f8/0x210 [c000000f0160b190] [c00000000026301c] shrink_slab.part.13+0x21c/0x4c0 [c000000f0160b2d0] [c000000000268088] shrink_zone+0x2d8/0x3c0 [c000000f0160b380] [c00000000026834c] do_try_to_free_pages+0x1dc/0x520 [c000000f0160b450] [c00000000026876c] try_to_free_pages+0xdc/0x250 [c000000f0160b4e0] [c000000000251978] __alloc_pages_nodemask+0x868/0x10d0 [c000000f0160b6f0] [c000000000567030] blk_mq_init_rq_map+0x160/0x380 [c000000f0160b7a0] [c00000000056758c] blk_mq_map_swqueue+0x33c/0x360 [c000000f0160b820] [c000000000567904] blk_mq_queue_reinit+0x64/0xb0 [c000000f0160b850] [c00000000056a16c] blk_mq_queue_reinit_notify+0x19c/0x250 [c000000f0160b8a0] [c0000000000f5d38] notifier_call_chain+0x98/0x100 [c000000f0160b8f0] [c0000000000c5fb0] __cpu_notify+0x70/0xe0 [c000000f0160b930] [c0000000000c63c4] notify_prepare+0x44/0xb0 [c000000f0160b9b0] [c0000000000c52f4] cpuhp_invoke_callback+0x84/0x250 [c000000f0160ba10] [c0000000000c570c] cpuhp_up_callbacks+0x5c/0x120 [c000000f0160ba60] [c0000000000c7cb8] _cpu_up+0xf8/0x1d0 [c000000f0160bac0] [c0000000000c7eb0] do_cpu_up+0x120/0x150 [c000000f0160bb40] [c0000000006fe024] cpu_subsys_online+0x64/0xe0 [c000000f0160bb90] [c0000000006f5124] device_online+0xb4/0x120 [c000000f0160bbd0] [c0000000006f5244] online_store+0xb4/0xc0 [c000000f0160bc20] [c0000000006f0a68] dev_attr_store+0x68/0xa0 [c000000f0160bc60] [c0000000003ccc30] sysfs_kf_write+0x80/0xb0 [c000000f0160bca0] [c0000000003cbabc] kernfs_fop_write+0x17c/0x250 [c000000f0160bcf0] [c00000000030fe6c] __vfs_write+0x6c/0x1e0 [c000000f0160bd90] [c000000000311490] vfs_write+0xd0/0x270 [c000000f0160bde0] [c0000000003131fc] SyS_write+0x6c/0x110 [c000000f0160be30] [c000000000009204] system_call+0x38/0xec
--- block/blk-mq.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
block/blk-mq.c +3 -3
@@ -1470,7 +1470,7 @@ static struct blk_mq_tags *blk_mq_init_rINIT_LIST_HEAD (&tags->page_list); tags->rqs =kzalloc_node (set->queue_depth *sizeof (struct request *), -GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY, +GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY, set->numa_node);if (!tags->rqs) {blk_mq_free_tags (tags);
@@ -1496,7 +1496,7 @@ static struct blk_mq_tags *blk_mq_init_r do { page = alloc_pages_node(set->numa_node, - GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY | __GFP_ZERO, + GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY | __GFP_ZERO, this_order); if (page) break;
@@ -1517,7 +1517,7 @@ static struct blk_mq_tags *blk_mq_init_r* Allow kmemleak to scan these pages as they contain pointers * to additional allocations like via ops->init_request(). */ -kmemleak_alloc (p,order_to_size (this_order),1 ,GFP_KERNEL ); +kmemleak_alloc (p,order_to_size (this_order),1 ,GFP_NOIO ); entries_per_page =order_to_size (this_order) / rq_size; to_do =min (entries_per_page, set->queue_depth - i); left -= to_do * rq_size;
Greg Kroah-Hartman
maintainerPATCH 14/18 usb: hub: Wait for connection to be reestablished after port reset
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guenter Roeck <[email protected]>
commit 22547c4cc4fe20698a6a85a55b8788859134b8e4 upstream.
On a system with a defective USB device connected to an USB hub, an endless sequence of port connect events was observed. The sequence of events as observed is as follows:
- Port reports connected event (port status=USB_PORT_STAT_CONNECTION).
- Event handler debounces port and resets it by calling hub_port_reset().
- hub_port_reset() calls hub_port_wait_reset() to wait for the reset to complete.
- The reset completes, but USB_PORT_STAT_CONNECTION is not immediately set in the port status register.
- hub_port_wait_reset() returns -ENOTCONN.
- Port initialization sequence is aborted.
- A few milliseconds later, the port again reports a connected event, and the sequence repeats.
This continues either forever or, randomly, stops if the connection is already re-established when the port status is read. It results in a high rate of udev events. This in turn destabilizes userspace since the above sequence holds the device mutex pretty much continuously and prevents userspace from actually reading the device status.
To prevent the problem from happening, let's wait for the connection to be re-established after a port reset. If the device was actually disconnected, the code will still return an error, but it will do so only after the long reset timeout.
--- drivers/usb/core/hub.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/usb/core/hub.c +9 -2
@@ -2602,8 +2602,15 @@ static int hub_port_wait_reset(struct usif (ret <0 )return ret; -/* The port state is unknown until the reset completes. */ -if (!(portstatus &USB_PORT_STAT_RESET )) +/* +* The port state is unknown until the reset completes. +* +* On top of that, some chips may require additional time +* to re-establish a connection after the reset is complete, +* so also wait for the connection to be re-established. +*/ +if (!(portstatus &USB_PORT_STAT_RESET ) && + (portstatus &USB_PORT_STAT_CONNECTION ))break ;/* switch to the long delay after two short delay failures */
Greg Kroah-Hartman
maintainerPATCH 15/18 net/mlx4_en: Fix bad WQE issue
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eugenia Emantayev <[email protected]>
commit 6496bbf0ec481966ef9ffe5b6660d8d1b55c60cc upstream.
Single send WQE in RX buffer should be stamped with software ownership in order to prevent the flow of QP in error in FW once UPDATE_QP is called.
--- drivers/net/ethernet/mellanox/mlx4/en_rx.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx4/en_rx.c +7 -1
@@ -439,8 +439,14 @@ int mlx4_en_activate_rx_rings(struct mlx ring->cqn = priv->rx_cq[ring_ind]->mcq.cqn; ring->stride = stride; -if (ring->stride <=TXBB_SIZE ) +if (ring->stride <=TXBB_SIZE ) { +/* Stamp first unused send wqe */ +__be32 *ptr = (__be32 *)ring->buf; +__be32 stamp =cpu_to_be32 (1 <<STAMP_SHIFT ); + *ptr = stamp; +/* Move pointer to start of rx section */ ring->buf +=TXBB_SIZE ; + } ring->log_stride =ffs (ring->stride) -1 ; ring->buf_size = ring->size * ring->stride;
Greg Kroah-Hartman
maintainerPATCH 16/18 net/mlx4_core: Fix racy CQ (Completion Queue) free
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jack Morgenstein <[email protected]>
commit 291c566a28910614ce42d0ffe82196eddd6346f4 upstream.
In function mlx4_cq_completion() and mlx4_cq_event(), the radix_tree_lookup requires a rcu_read_lock.
This is mandatory: if another core frees the CQ, it could run the radix_tree_node_rcu_free() call_rcu() callback while its being used by the radix tree lookup function.
Additionally, in function mlx4_cq_event(), since we are adding the rcu lock around the radix-tree lookup, we no longer need to take the spinlock. Also, the synchronize_irq() call for the async event eliminates the need for incrementing the cq reference count in mlx4_cq_event().
Other changes:
1. In function mlx4_cq_free(), replace spin_lock_irq with spin_lock:
we no longer take this spinlock in the interrupt context. The spinlock here, therefore, simply protects against different threads simultaneously invoking mlx4_cq_free() for different cq's.
2. In function mlx4_cq_free(), we move the radix tree delete to before the synchronize_irq() calls. This guarantees that we will not access this cq during any subsequent interrupts, and therefore can safely free the CQ after the synchronize_irq calls. The rcu_read_lock in the interrupt handlers only needs to protect against corrupting the radix tree; the interrupt handlers may access the cq outside the rcu_read_lock due to the synchronize_irq calls which protect against premature freeing of the cq.
3. In function mlx4_cq_event(), we change the mlx_warn message to mlx4_dbg.
4. We leave the cq reference count mechanism in place, because it is still needed for the cq completion tasklet mechanism.
--- drivers/net/ethernet/mellanox/mlx4/cq.c | 38 ++++++++++++++++---------------- 1 file changed, 20 insertions(+), 18 deletions(-)
drivers/net/ethernet/mellanox/mlx4/cq.c +20 -18
@@ -101,13 +101,19 @@ void mlx4_cq_completion(struct mlx4_dev {struct mlx4_cq *cq; +rcu_read_lock (); cq =radix_tree_lookup (&mlx4_priv (dev)->cq_table.tree, cqn & (dev->caps.num_cqs -1 )); +rcu_read_unlock (); +if (!cq) {mlx4_dbg (dev,"Completion event for bogus CQ %08x\n" , cqn);return ; } +/* Acessing the CQ outside of rcu_read_lock is safe, because +* the CQ is freed only after interrupt handling is completed. +*/ ++cq->arm_sn; cq->comp (cq);
@@ -118,23 +124,19 @@ void mlx4_cq_event(struct mlx4_dev *dev,struct mlx4_cq_table *cq_table = &mlx4_priv (dev)->cq_table;struct mlx4_cq *cq; -spin_lock (&cq_table->lock); - +rcu_read_lock (); cq =radix_tree_lookup (&cq_table->tree, cqn & (dev->caps.num_cqs -1 )); -if (cq) -atomic_inc (&cq->refcount); - -spin_unlock (&cq_table->lock); +rcu_read_unlock ();if (!cq) { -mlx4_warn (dev,"Async event for bogus CQ %08x\n" , cqn); +mlx4_dbg (dev,"Async event for bogus CQ %08x\n" , cqn);return ; } +/* Acessing the CQ outside of rcu_read_lock is safe, because +* the CQ is freed only after interrupt handling is completed. +*/ cq->event (cq, event_type); - -if (atomic_dec_and_test (&cq->refcount)) -complete (&cq->free); } static int mlx4_SW2HW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox,
@@ -301,9 +303,9 @@ int mlx4_cq_alloc(struct mlx4_dev *dev,if (err)return err; -spin_lock_irq (&cq_table->lock); +spin_lock (&cq_table->lock); err =radix_tree_insert (&cq_table->tree, cq->cqn, cq); -spin_unlock_irq (&cq_table->lock); +spin_unlock (&cq_table->lock);if (err) goto err_icm;
@@ -347,9 +349,9 @@ int mlx4_cq_alloc(struct mlx4_dev *dev,return 0 ; err_radix: -spin_lock_irq (&cq_table->lock); +spin_lock (&cq_table->lock);radix_tree_delete (&cq_table->tree, cq->cqn); -spin_unlock_irq (&cq_table->lock); +spin_unlock (&cq_table->lock); err_icm:mlx4_cq_free_icm (dev, cq->cqn);
@@ -368,15 +370,15 @@ void mlx4_cq_free(struct mlx4_dev *dev,if (err)mlx4_warn (dev,"HW2SW_CQ failed (%d) for CQN %06x\n" , err, cq->cqn); +spin_lock (&cq_table->lock); +radix_tree_delete (&cq_table->tree, cq->cqn); +spin_unlock (&cq_table->lock); +synchronize_irq (priv->eq_table.eq[MLX4_CQ_TO_EQ_VECTOR (cq->vector)].irq);if (priv->eq_table.eq[MLX4_CQ_TO_EQ_VECTOR (cq->vector)].irq != priv->eq_table.eq[MLX4_EQ_ASYNC ].irq)synchronize_irq (priv->eq_table.eq[MLX4_EQ_ASYNC ].irq); -spin_lock_irq (&cq_table->lock); -radix_tree_delete (&cq_table->tree, cq->cqn); -spin_unlock_irq (&cq_table->lock); -if (atomic_dec_and_test (&cq->refcount))complete (&cq->free);wait_for_completion (&cq->free);
Greg Kroah-Hartman
maintainerPATCH 17/18 net/mlx4_core: Fix when to save some qp context flags for dynamic VST to VGT transitions
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jack Morgenstein <[email protected]>
commit 7c3945bc2073554bb2ecf983e073dee686679c53 upstream.
Save the qp context flags byte containing the flag disabling vlan stripping in the RESET to INIT qp transition, rather than in the INIT to RTR transition. Per the firmware spec, the flags in this byte are active in the RESET to INIT transition.
As a result of saving the flags in the incorrect qp transition, when switching dynamically from VGT to VST and back to VGT, the vlan remained stripped (as is required for VST) and did not return to not-stripped (as is required for VGT).
--- drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +3 -2
@@ -2955,6 +2955,9 @@ int mlx4_RST2INIT_QP_wrapper(struct mlx4put_res (dev, slave, srqn,RES_SRQ ); qp->srq = srq; } + +/* Save param3 for dynamic changes from VST back to VGT */ + qp->param3 = qpc->param3;put_res (dev, slave, rcqn,RES_CQ );put_res (dev, slave, mtt_base,RES_MTT );res_end_move (dev, slave,RES_QP , qpn);
@@ -3747,7 +3750,6 @@ int mlx4_INIT2RTR_QP_wrapper(struct mlx4int qpn = vhcr->in_modifier &0x7fffff ;struct res_qp *qp;u8 orig_sched_queue; -__be32 orig_param3 = qpc->param3;u8 orig_vlan_control = qpc->pri_path.vlan_control;u8 orig_fvl_rx = qpc->pri_path.fvl_rx;u8 orig_pri_path_fl = qpc->pri_path.fl;
@@ -3789,7 +3791,6 @@ out:*/ if (!err) { qp->sched_queue = orig_sched_queue; - qp->param3 = orig_param3; qp->vlan_control = orig_vlan_control; qp->fvl_rx = orig_fvl_rx; qp->pri_path_fl = orig_pri_path_fl;
Greg Kroah-Hartman
maintainerPATCH 18/18 ibmveth: set correct gso_size and gso_type
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Falcon <[email protected]>
commit 7b5967389f5a8dfb9d32843830f5e2717e20995d upstream.
This patch is based on an earlier one submitted
by Jon Maxwell with the following commit message:
"We recently encountered a bug where a few customers using ibmveth on the same LPAR hit an issue where a TCP session hung when large receive was enabled. Closer analysis revealed that the session was stuck because the one side was advertising a zero window repeatedly.
We narrowed this down to the fact the ibmveth driver did not set gso_size which is translated by TCP into the MSS later up the stack. The MSS is used to calculate the TCP window size and as that was abnormally large, it was calculating a zero window, even although the sockets receive buffer was completely empty."
We rely on the Virtual I/O Server partition in a pseries environment to provide the MSS through the TCP header checksum field. The stipulation is that users should not disable checksum offloading if rx packet aggregation is enabled through VIOS.
Some firmware offerings provide the MSS in the RX buffer. This is signalled by a bit in the RX queue descriptor.
--- drivers/net/ethernet/ibm/ibmveth.c | 65 +++++++++++++++++++++++++++++++++++-- drivers/net/ethernet/ibm/ibmveth.h | 1 2 files changed, 64 insertions(+), 2 deletions(-)
drivers/net/ethernet/ibm/ibmveth.c +63 -2
@@ -58,7 +58,7 @@ static struct kobj_type ktype_veth_pool;static const char ibmveth_driver_name[] ="ibmveth" ;static const char ibmveth_driver_string[] ="IBM Power Virtual Ethernet Driver" ; -#define ibmveth_driver_version "1.05" +#define ibmveth_driver_version "1.06"MODULE_AUTHOR ("Santiago Leon <[email protected]>" );MODULE_DESCRIPTION ("IBM Power Virtual Ethernet Driver" );
@@ -137,6 +137,11 @@ static inline int ibmveth_rxq_frame_offsreturn ibmveth_rxq_flags (adapter) &IBMVETH_RXQ_OFF_MASK ; } +static inline int ibmveth_rxq_large_packet (struct ibmveth_adapter *adapter) +{ +return ibmveth_rxq_flags (adapter) &IBMVETH_RXQ_LRG_PKT ; +} +static inline int ibmveth_rxq_frame_length (struct ibmveth_adapter *adapter) {return be32_to_cpu (adapter->rx_queue.queue_addr[adapter->rx_queue.index].length);
@@ -1172,6 +1177,45 @@ map_failed: goto retry_bounce; } +static void ibmveth_rx_mss_helper (struct sk_buff *skb,u16 mss,int lrg_pkt) +{ +int offset =0 ; + +/* only TCP packets will be aggregated */ +if (skb->protocol ==htons (ETH_P_IP )) { +struct iphdr *iph = (struct iphdr *)skb->data; + +if (iph->protocol ==IPPROTO_TCP ) { + offset = iph->ihl *4 ; +skb_shinfo (skb)->gso_type =SKB_GSO_TCPV4 ; + }else { +return ; + } + }else if (skb->protocol ==htons (ETH_P_IPV6 )) { +struct ipv6hdr *iph6 = (struct ipv6hdr *)skb->data; + +if (iph6->nexthdr ==IPPROTO_TCP ) { + offset =sizeof (struct ipv6hdr ); +skb_shinfo (skb)->gso_type =SKB_GSO_TCPV6 ; + }else { +return ; + } + }else { +return ; + } +/* if mss is not set through Large Packet bit/mss in rx buffer, +* expect that the mss will be written to the tcp header checksum. +*/ +if (lrg_pkt) { +skb_shinfo (skb)->gso_size = mss; + }else if (offset) { +struct tcphdr *tcph = (struct tcphdr *)(skb->data + offset); + +skb_shinfo (skb)->gso_size =ntohs (tcph->check); + tcph->check =0 ; + } +} +static int ibmveth_poll (struct napi_struct *napi,int budget) { struct ibmveth_adapter *adapter =
@@ -1180,6 +1224,7 @@ static int ibmveth_poll(struct napi_struint frames_processed =0 ;unsigned long lpar_rc;struct iphdr *iph; +u16 mss =0 ; restart_poll:while (frames_processed < budget) {
@@ -1197,9 +1242,21 @@ restart_poll:int length =ibmveth_rxq_frame_length (adapter);int offset =ibmveth_rxq_frame_offset (adapter);int csum_good =ibmveth_rxq_csum_good (adapter); +int lrg_pkt =ibmveth_rxq_large_packet (adapter); skb =ibmveth_rxq_get_buffer (adapter); +/* if the large packet bit is set in the rx queue +* descriptor, the mss will be written by PHYP eight +* bytes from the start of the rx buffer, which is +* skb->data at this stage +*/ +if (lrg_pkt) { +__be64 *rxmss = (__be64 *)(skb->data +8 ); + + mss = (u16 )be64_to_cpu (*rxmss); + } + new_skb =NULL ;if (length < rx_copybreak) new_skb =netdev_alloc_skb (netdev, length);
@@ -1233,11 +1290,15 @@ restart_poll:if (iph->check ==0xffff ) { iph->check =0 ; iph->check =ip_fast_csum ((unsigned char *)iph, iph->ihl); - adapter->rx_large_packets++; } } } +if (length > netdev->mtu +ETH_HLEN ) { +ibmveth_rx_mss_helper (skb, mss, lrg_pkt); + adapter->rx_large_packets++; + } +napi_gro_receive (napi, skb);/* send it up */ netdev->stats.rx_packets++;
drivers/net/ethernet/ibm/ibmveth.h +1 -0
@@ -209,6 +209,7 @@ struct ibmveth_rx_q_entry {#define IBMVETH_RXQ_TOGGLE 0x80000000#define IBMVETH_RXQ_TOGGLE_SHIFT 31#define IBMVETH_RXQ_VALID 0x40000000 +#define IBMVETH_RXQ_LRG_PKT 0x04000000#define IBMVETH_RXQ_NO_CSUM 0x02000000#define IBMVETH_RXQ_CSUM_GOOD 0x01000000#define IBMVETH_RXQ_OFF_MASK 0x0000FFFF
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.62 release. There are 18 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue Apr 18 08:02:00 UTC 2017. Anything received after that time might be too late.
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 115 pass: 115 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.62 release. There are 18 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue Apr 18 08:02:00 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.62-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 12 lines · kernelci.org bot
stable-rc/linux-4.4.y boot: 87 boots: 2 failed, 82 passed with 3 offline (v4.4.61-19-ge153e9e2397b)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/branch/linux-4.4.y/kernel/v4.4.61-19-ge153e9e2397b/
Full Build Summary: https://kernelci.org/build/stable-rc/branch/linux-4.4.y/kernel/v4.4.61-19-ge153e9e2397b/Tree: stable-rc
Branch: linux-4.4.y
Git Describe: v4.4.61-19-ge153e9e2397b
Git Commit:e153e9e2397bd8b93af00fdf9a417568b342e271
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 12 unique boards, 6 SoC families, 22 builds out of 201
Quoted 7 lines
Boot Regressions Detected:
arm:
multi_v7_defconfig+CONFIG_SMP=n: exynos5250-snow: lab-collabora: failing since 92 days (last pass: v4.4.40-59-g1d41ca34dce6 - first fail: v4.4.42-28-g707ffd8554f6)
My understanding is that CONFIG_SMP=n is blacklisted for exynos. Are you testing this config now?
I will follow up to see if !SMP use-case is important one to fix it. That said, I am not sure if this is a regression in the sense that, if !SMP ever worked on exynos.
thanks,
-- Shuah