4.4.39-stable review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 4.4.39-stable review
This is the start of the stable review cycle for the 4.4.39 release. There are 16 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 Thu Dec 15 17:15:06 UTC 2016. 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.39-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.39-rc1
David Michael <[email protected]>
crypto: rsa - Add Makefile dependencies to fix parallel builds
Michal Hocko <[email protected]>
hotplug: Make register and unregister notifier API symmetric
Sven Eckelmann <[email protected]>
batman-adv: Check for alloc errors when preparing TT local data
Boris Brezillon <[email protected]>
m68k: Fix ndelay() macro
James Morse <[email protected]>
arm64: futex.h: Add missing PAN toggling
추지호 <[email protected]>
can: peak: fix bad memory access and free sequence
Marc Kleine-Budde <[email protected]>
can: raw: raw_setsockopt: limit number of can_filter that can be set
tim <[email protected]>
crypto: mcryptd - Check mcryptd algorithm compatibility
Peter Zijlstra (Intel) <[email protected]>
perf/x86: Fix full width counter, counter overflow
Thomas Gleixner <[email protected]>
locking/rtmutex: Use READ_ONCE() in rt_mutex_owner()
Thomas Gleixner <[email protected]>
locking/rtmutex: Prevent dequeue vs. unlock race
Sergey Senozhatsky <[email protected]>
zram: restrict add/remove attributes to root only
Helge Deller <[email protected]>
parisc: Fix TLB related boot crash on SMP machines
John David Anglin <[email protected]>
parisc: Remove unnecessary TLB purges from flush_dcache_page_asm and flush_icache_page_asm
John David Anglin <[email protected]>
parisc: Purge TLB before setting PTE
Andrew Donnellan <[email protected]>
powerpc/eeh: Fix deadlock when PE frozen state can't be cleared
-------------
Diffstat:
Makefile | 4 +- arch/arm64/include/asm/futex.h | 2 + arch/m68k/include/asm/delay.h | 2 +- arch/parisc/include/asm/pgtable.h | 8 ++-- arch/parisc/kernel/cache.c | 11 +++++ arch/parisc/kernel/pacache.S | 22 +-------- arch/powerpc/kernel/eeh_driver.c | 4 +- arch/x86/kernel/cpu/perf_event.c | 2 +- arch/x86/kernel/cpu/perf_event_intel.c | 2 +- crypto/Makefile | 1 + crypto/mcryptd.c | 19 +++++--- drivers/block/zram/zram_drv.c | 8 +++- drivers/net/can/usb/peak_usb/pcan_usb_core.c | 6 ++- include/linux/cpu.h | 15 ++---- include/uapi/linux/can.h | 1 + kernel/cpu.c | 3 +- kernel/locking/rtmutex.c | 68 +++++++++++++++++++++++++++- kernel/locking/rtmutex_common.h | 5 +- net/batman-adv/translation-table.c | 4 +- net/can/raw.c | 3 ++ 20 files changed, 130 insertions(+), 60 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/16 powerpc/eeh: Fix deadlock when PE frozen state cant be cleared
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Donnellan <[email protected]>
commit 409bf7f8a02ef88db5a0f2cdcf9489914f4b8508 upstream.
In eeh_reset_device(), we take the pci_rescan_remove_lock immediately after after we call eeh_reset_pe() to reset the PCI controller. We then call eeh_clear_pe_frozen_state(), which can return an error. In this case, we bail out of eeh_reset_device() without calling pci_unlock_rescan_remove().
Add a call to pci_unlock_rescan_remove() in the eeh_clear_pe_frozen_state() error path so that we don't cause a deadlock later on.
--- arch/powerpc/kernel/eeh_driver.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/powerpc/kernel/eeh_driver.c +3 -1
@@ -612,8 +612,10 @@ static int eeh_reset_device(struct eeh_p/* Clear frozen state */ rc =eeh_clear_pe_frozen_state (pe, false); -if (rc) +if (rc) { +pci_unlock_rescan_remove ();return rc; + }/* Give the system 5 seconds to finish running the user-space * hotplug shutdown scripts, e.g. ifdown for ethernet. Yes,
Re: [PATCH 4.4 01/16] powerpc/eeh: Fix deadlock when PE frozen state cant be cleared
Quoted 16 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Donnellan <[email protected]>
commit
409bf7f8a02ef88db5a0f2cdcf9489914f4b8508upstream.In
eeh_reset_device(), we take thepci_rescan_remove_lockimmediately after after we calleeh_reset_pe()to reset the PCI controller. We then calleeh_clear_pe_frozen_state(), which can return an error. In this case, we bail out ofeeh_reset_device()without callingpci_unlock_rescan_remove().Add a call to
pci_unlock_rescan_remove()in theeeh_clear_pe_frozen_state()error path so that we don't cause a deadlock later on.
Quoted 6 lines
Reported-by Pradipta Ghosh <[email protected]>Fixes 78954700631f ("powerpc/eeh: Avoid I/O access during PE reset")Signed-off-by Andrew Donnellan <[email protected]>Acked-by Russell Currey <[email protected]>Signed-off-by Michael Ellerman <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>
It seems that something in your scripts munged the apostrophe in the summary line when generating these emails. Though it looks fine in the actual tree.
Andrew
Signature · 2 lines
Andrew Donnellan OzLabs, ADL Canberra [email protected] IBM Australia Limited
Greg Kroah-Hartman
maintainerRe: [PATCH 4.4 01/16] powerpc/eeh: Fix deadlock when PE frozen state cant be cleared
Quoted 24 lines · Andrew Donnellan
Quoted 16 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Donnellan <[email protected]>
commit
409bf7f8a02ef88db5a0f2cdcf9489914f4b8508upstream.In
eeh_reset_device(), we take thepci_rescan_remove_lockimmediately after after we calleeh_reset_pe()to reset the PCI controller. We then calleeh_clear_pe_frozen_state(), which can return an error. In this case, we bail out ofeeh_reset_device()without callingpci_unlock_rescan_remove().Add a call to
pci_unlock_rescan_remove()in theeeh_clear_pe_frozen_state()error path so that we don't cause a deadlock later on.Quoted 6 lines
Reported-by Pradipta Ghosh <[email protected]>Fixes 78954700631f ("powerpc/eeh: Avoid I/O access during PE reset")Signed-off-by Andrew Donnellan <[email protected]>Acked-by Russell Currey <[email protected]>Signed-off-by Michael Ellerman <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>
Quoted 2 lines
It seems that something in your scripts munged the apostrophe in the summary line when generating these emails. Though it looks fine in the actual tree.
Odd, the original patch has the subject right, so git will do it correctly when it commits the patch. But, something dropped the ' character when the email was created. Given that it goes through quilt a few different ways to get here to the mailing list, I'll blame it :)
thanks,
greg k-h
Greg Kroah-Hartman
maintainerPATCH 2/16 parisc: Purge TLB before setting PTE
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: John David Anglin <[email protected]>
commit c78e710c1c9fbeff43dddc0aa3d0ff458e70b0cc upstream.
The attached change interchanges the order of purging the TLB and setting the corresponding page table entry. TLB purges are strongly ordered. It occurred to me one night that setting the PTE first might have subtle ordering issues on SMP machines and cause random memory corruption.
A TLB lock guards the insertion of user TLB entries. So after the TLB is purged, a new entry can't be inserted until the lock is released. This ensures that the new PTE value is used when the lock is released.
Since making this change, no random segmentation faults have been observed on the Debian hppa buildd servers.
--- arch/parisc/include/asm/pgtable.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/parisc/include/asm/pgtable.h +4 -4
@@ -65,9 +65,9 @@ static inline void purge_tlb_entries(strunsigned long flags; \spin_lock_irqsave (&pa_tlb_lock, flags); \ old_pte = *ptep; \ -set_pte (ptep, pteval); \if (pte_inserted (old_pte)) \purge_tlb_entries (mm, addr); \ +set_pte (ptep, pteval); \spin_unlock_irqrestore (&pa_tlb_lock, flags); \ }while (0 )
@@ -478,8 +478,8 @@ static inline int ptep_test_and_clear_yospin_unlock_irqrestore (&pa_tlb_lock, flags);return 0 ; } -set_pte (ptep,pte_mkold (pte));purge_tlb_entries (vma->vm_mm, addr); +set_pte (ptep,pte_mkold (pte));spin_unlock_irqrestore (&pa_tlb_lock, flags);return 1 ; }
@@ -492,9 +492,9 @@ static inline pte_t ptep_get_and_clear(sspin_lock_irqsave (&pa_tlb_lock, flags); old_pte = *ptep; -set_pte (ptep,__pte (0 ));if (pte_inserted (old_pte))purge_tlb_entries (mm, addr); +set_pte (ptep,__pte (0 ));spin_unlock_irqrestore (&pa_tlb_lock, flags);return old_pte;
@@ -504,8 +504,8 @@ static inline void ptep_set_wrprotect(st {unsigned long flags;spin_lock_irqsave (&pa_tlb_lock, flags); -set_pte (ptep,pte_wrprotect (*ptep));purge_tlb_entries (mm, addr); +set_pte (ptep,pte_wrprotect (*ptep));spin_unlock_irqrestore (&pa_tlb_lock, flags); }
Greg Kroah-Hartman
maintainerPATCH 3/16 parisc: Remove unnecessary TLB purges from flush_dcache_page_asm and flush_icache_page_asm
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: John David Anglin <[email protected]>
commit febe42964fe182281859b3d43d844bb25ca49367 upstream.
We have four routines in pacache.S that use temporary alias pages:copy_user_page_asm(), clear_user_page_asm(), flush_dcache_page_asm() and flush_icache_page_asm(). copy_user_page_asm() and clear_user_page_asm() don't purge the TLB entry used for the operation. flush_dcache_page_asm() and flush_icache_page_asm do purge the entry.
Presumably, this was thought to optimize TLB use. However, the operation is quite heavy weight on PA 1.X processors as we need to take the TLB lock and a TLB broadcast is sent to all processors.
This patch removes the purges from flush_dcache_page_asm() and flush_icache_page_asm.
--- arch/parisc/kernel/pacache.S | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-)
arch/parisc/kernel/pacache.S +1 -21
@@ -886,19 +886,10 @@ ENTRY(flush_dcache_page_asm) fdc,m r31(%r28) fdc,m r31(%r28) fdc,m r31(%r28) - cmpb,COND(<<) %r28, %r25,1b + cmpb,COND(<<) %r28, %r25,1b fdc,m r31(%r28) sync - -#ifdef CONFIG_PA20 - pdtlb,l %r0(%r25) -#else - tlb_lock %r20,%r21,%r22 - pdtlb %r0(%r25) - tlb_unlock %r20,%r21,%r22 -#endif - bv %r0(%r2) nop .exit
@@ -973,17 +964,6 @@ ENTRY(flush_icache_page_asm) fic,m %r31(%sr4,%r28) sync - -#ifdef CONFIG_PA20 - pdtlb,l %r0(%r28) - pitlb,l %r0(%sr4,%r25) -#else - tlb_lock %r20,%r21,%r22 - pdtlb %r0(%r28) - pitlb %r0(%sr4,%r25) - tlb_unlock %r20,%r21,%r22 -#endif - bv %r0(%r2) nop .exit
Greg Kroah-Hartman
maintainerPATCH 4/16 parisc: Fix TLB related boot crash on SMP machines
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
commit 24d0492b7d5d321a9c5846c8c974eba9823ffaa0 upstream.
At bootup we run measurements to calculate the best threshold for when we should be using full TLB flushes instead of just flushing a specific amount of TLB entries. This performance test is run over the kernel text segment.
But running this TLB performance test on the kernel text segment turned out to crash some SMP machines when the kernel text pages were mapped as huge pages.
To avoid those crashes this patch simply skips this test on some SMP machines and calculates an optimal threshold based on the maximum number of available TLB entries and number of online CPUs.
On a technical side, this seems to happen:
The TLB measurement code uses flush_tlb_kernel_range() to flush specific TLB entries with a page size of 4k (pdtlb 0(sr1,addr)). On UP systems this purge instruction seems to work without problems even if the pages were mapped as huge pages. But on SMP systems the TLB purge instruction is broadcasted to other CPUs. Those CPUs then crash the machine because the page size is not as expected. C8000 machines with PA8800/PA8900 CPUs were not affected by this problem, because the required cache coherency prohibits to use huge pages at all. Sadly I didn't found any documentation about this behaviour, so this finding is purely based on testing with phyiscal SMP machines (A500-44 and J5000, both were 2-way boxes).
--- arch/parisc/kernel/cache.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
arch/parisc/kernel/cache.c +11 -0
@@ -375,6 +375,15 @@ void __init parisc_setup_cache_timing(vo/* calculate TLB flush threshold */ +/* On SMP machines, skip the TLB measure of kernel text which +* has been mapped as huge pages. */ +if (num_online_cpus () >1 && !parisc_requires_coherency ()) { + threshold =max (cache_info.it_size, cache_info.dt_size); + threshold *=PAGE_SIZE ; + threshold /=num_online_cpus (); + goto set_tlb_threshold; + } + alltime =mfctl (16 );flush_tlb_all (); alltime =mfctl (16 ) - alltime;
@@ -393,6 +402,8 @@ void __init parisc_setup_cache_timing(vo alltime, size, rangetime); threshold =PAGE_ALIGN (num_online_cpus () * size * alltime / rangetime); + +set_tlb_threshold:if (threshold) parisc_tlb_flush_threshold = threshold; printk(KERN_INFO "TLB flush threshold set to %lu KiB\n",
Greg Kroah-Hartman
maintainerPATCH 5/16 zram: restrict add/remove attributes to root only
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Senozhatsky <[email protected]>
commit 5c7e9ccd91b90d87029261f8856294ee51934cab upstream.
zram hot_add sysfs attribute is a very 'special' attribute - reading from it creates a new uninitialized zram device. This file, by a mistake, can be read by a 'normal' user at the moment, while only root must be able to create a new zram device, therefore hot_add attribute must have S_IRUSR mode, not S_IRUGO.
--- drivers/block/zram/zram_drv.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/block/zram/zram_drv.c +7 -1
@@ -1378,8 +1378,14 @@ static ssize_t hot_remove_store(struct creturn ret ? ret : count; } +/* +* NOTE: hot_add attribute is not the usual read-only sysfs attribute. In a +* sense that reading from this file does alter the state of your system -- it +* creates a new un-initialized zram device and returns back this device's +* device_id (or an error code if it fails to create a new device). +*/ static struct class_attribute zram_control_class_attrs[] = { -__ATTR_RO (hot_add), +__ATTR (hot_add,0400 , hot_add_show,NULL ),__ATTR_WO (hot_remove), __ATTR_NULL, };
Greg Kroah-Hartman
maintainerPATCH 6/16 locking/rtmutex: Prevent dequeue vs. unlock race
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit dbb26055defd03d59f678cb5f2c992abe05b064a upstream.
David reported a futex/rtmutex state corruption. It's caused by the following problem:
CPU0 CPU1 CPU2
l->owner=T1
rt_mutex_lock(l)
lock(l->wait_lock)
l->owner = T1 | HAS_WAITERS;
enqueue(T2)
boost()
unlock(l->wait_lock)
schedule()
rt_mutex_lock(l)
lock(l->wait_lock)
l->owner = T1 | HAS_WAITERS;
enqueue(T3)
boost()
unlock(l->wait_lock)
schedule()
signal(->T2) signal(->T3)
lock(l->wait_lock)
dequeue(T2)
deboost()
unlock(l->wait_lock)
lock(l->wait_lock)
dequeue(T3)
===> wait list is now empty
deboost()
unlock(l->wait_lock)
lock(l->wait_lock)
fixup_rt_mutex_waiters()
if (wait_list_empty(l)) {
owner = l->owner & ~HAS_WAITERS;
l->owner = owner
==> l->owner = T1
}
lock(l->wait_lock)
rt_mutex_unlock(l) fixup_rt_mutex_waiters()
if (wait_list_empty(l)) {
owner = l->owner & ~HAS_WAITERS;
cmpxchg(l->owner, T1, NULL)
===> Success (l->owner = NULL)
l->owner = owner
==> l->owner = T1
}That means the problem is caused by fixup_rt_mutex_waiters() which does the RMW to clear the waiters bit unconditionally when there are no waiters in the rtmutexes rbtree.
This can be fatal: A concurrent unlock can release the rtmutex in the fastpath because the waiters bit is not set. If the cmpxchg() gets in the middle of the RMW operation then the previous owner, which just unlocked the rtmutex is set as the owner again when the write takes place after the successfull cmpxchg().
The solution is rather trivial: verify that the owner member of the rtmutex has the waiters bit set before clearing it. This does not require a cmpxchg() or other atomic operations because the waiters bit can only be set and cleared with the rtmutex wait_lock held. It's also safe against the fast path unlock attempt. The unlock attempt via cmpxchg() will either see the bit set and take the slowpath or see the bit cleared and release it atomically in the fastpath.
It's remarkable that the test program provided by David triggers on ARM64 and MIPS64 really quick, but it refuses to reproduce on x86-64, while the problem exists there as well. That refusal might explain that this got not discovered earlier despite the bug existing from day one of the rtmutex implementation more than 10 years ago.
Thanks to David for meticulously instrumenting the code and providing the information which allowed to decode this subtle problem.
--- kernel/locking/rtmutex.c | 68 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-)
kernel/locking/rtmutex.c +66 -2
@@ -65,8 +65,72 @@ static inline void clear_rt_mutex_waiterstatic void fixup_rt_mutex_waiters (struct rt_mutex *lock) { -if (!rt_mutex_has_waiters (lock)) -clear_rt_mutex_waiters (lock); +unsigned long owner, *p = (unsigned long *) &lock->owner; + +if (rt_mutex_has_waiters (lock)) +return ; + +/* +* The rbtree has no waiters enqueued, now make sure that the +* lock->owner still has the waiters bit set, otherwise the +* following can happen: +* +* CPU 0 CPU 1 CPU2 +* l->owner=T1 +* rt_mutex_lock(l) +* lock(l->lock) +* l->owner = T1 | HAS_WAITERS; +* enqueue(T2) +* boost() +* unlock(l->lock) +* block() +* +* rt_mutex_lock(l) +* lock(l->lock) +* l->owner = T1 | HAS_WAITERS; +* enqueue(T3) +* boost() +* unlock(l->lock) +* block() +* signal(->T2) signal(->T3) +* lock(l->lock) +* dequeue(T2) +* deboost() +* unlock(l->lock) +* lock(l->lock) +* dequeue(T3) +* ==> wait list is empty +* deboost() +* unlock(l->lock) +* lock(l->lock) +* fixup_rt_mutex_waiters() +* if (wait_list_empty(l) { +* l->owner = owner +* owner = l->owner & ~HAS_WAITERS; +* ==> l->owner = T1 +* } +* lock(l->lock) +* rt_mutex_unlock(l) fixup_rt_mutex_waiters() +* if (wait_list_empty(l) { +* owner = l->owner & ~HAS_WAITERS; +* cmpxchg(l->owner, T1, NULL) +* ===> Success (l->owner = NULL) +* +* l->owner = owner +* ==> l->owner = T1 +* } +* +* With the check for the waiter bit in place T3 on CPU2 will not +* overwrite. All tasks fiddling with the waiters bit are +* serialized by l->lock, so nothing else can modify the waiters +* bit. If the bit is set then nothing can change l->owner either +* so the simple RMW is safe. The cmpxchg() will simply fail if it +* happens in the middle of the RMW because the waiters bit is +* still set. +*/ + owner =READ_ONCE (*p); +if (owner &RT_MUTEX_HAS_WAITERS ) +WRITE_ONCE (*p, owner & ~RT_MUTEX_HAS_WAITERS ); }/*
Greg Kroah-Hartman
maintainerPATCH 7/16 locking/rtmutex: Use READ_ONCE() in rt_mutex_owner()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 1be5d4fa0af34fb7bafa205aeb59f5c7cc7a089d upstream.
While debugging the rtmutex unlock vs. dequeue race Will suggested to use READ_ONCE() in rt_mutex_owner() as it might race against the cmpxchg_release() in unlock_rt_mutex_safe().
Will: "It's a minor thing which will most likely not matter in practice"
Careful search did not unearth an actual problem in todays code, but it's better to be safe than surprised.
--- kernel/locking/rtmutex_common.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/locking/rtmutex_common.h +3 -2
@@ -75,8 +75,9 @@ task_top_pi_waiter(struct task_struct *pstatic inline struct task_struct *rt_mutex_owner (struct rt_mutex *lock) { -return (struct task_struct *) - ((unsigned long )lock->owner & ~RT_MUTEX_OWNER_MASKALL ); +unsigned long owner = (unsigned long )READ_ONCE (lock->owner); + +return (struct task_struct *) (owner & ~RT_MUTEX_OWNER_MASKALL ); }/*
Greg Kroah-Hartman
maintainerPATCH 8/16 perf/x86: Fix full width counter, counter overflow
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra (Intel) <[email protected]>
commit 7f612a7f0bc13a2361a152862435b7941156b6af upstream.
Lukasz reported that perf stat counters overflow handling is broken on KNL/SLM.
Both these parts have full_width_write set, and that does indeed have a problem. In order to deal with counter wrap, we must sample the counter at at least half the counter period (see also the sampling theorem) such that we can unambiguously reconstruct the count.
However commit:
069e0c3c4058 ("perf/x86/intel: Support full width counting")
sets the sampling interval to the full period, not half.
Fixing that exposes another issue, in that we must not sign extend the delta value when we shift it right; the counter cannot have decremented after all.
With both these issues fixed, counter overflow functions correctly again.
--- arch/x86/kernel/cpu/perf_event.c | 2 +- arch/x86/kernel/cpu/perf_event_intel.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/x86/kernel/cpu/perf_event.c +1 -1
@@ -67,7 +67,7 @@ u64 x86_perf_event_update(struct perf_evint shift =64 - x86_pmu.cntval_bits;u64 prev_raw_count, new_raw_count;int idx = hwc->idx; -s64 delta; +u64 delta;if (idx ==INTEL_PMC_IDX_FIXED_BTS )return 0 ;
arch/x86/kernel/cpu/perf_event_intel.c +1 -1
@@ -3636,7 +3636,7 @@ __init int intel_pmu_init(void)/* Support full width counters using alternative MSR range */ if (x86_pmu.intel_cap.full_width_write) { - x86_pmu.max_period = x86_pmu.cntval_mask; + x86_pmu.max_period = x86_pmu.cntval_mask >>1 ; x86_pmu.perfctr =MSR_IA32_PMC0 ;pr_cont ("full-width counters, " ); }
Greg Kroah-Hartman
maintainerPATCH 9/16 crypto: mcryptd - Check mcryptd algorithm compatibility
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: tim <[email protected]>
commit 48a992727d82cb7db076fa15d372178743b1f4cd upstream.
Algorithms not compatible with mcryptd could be spawned by mcryptd with a direct crypto_alloc_tfm invocation using a "mcryptd(alg)" name construct. This causes mcryptd to crash the kernel if an arbitrary "alg" is incompatible and not intended to be used with mcryptd. It is an issue if AF_ALG tries to spawn mcryptd(alg) to expose it externally. But such algorithms must be used internally and not be exposed.
We added a check to enforce that only internal algorithms are allowed with mcryptd at the time mcryptd is spawning an algorithm.
--- crypto/mcryptd.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-)
crypto/mcryptd.c +12 -7
@@ -258,18 +258,22 @@ out_free_inst: goto out; } -static inline void mcryptd_check_internal (struct rtattr **tb,u32 *type, +static inline bool mcryptd_check_internal (struct rtattr **tb,u32 *type,u32 *mask) {struct crypto_attr_type *algt; algt =crypto_get_attr_type (tb);if (IS_ERR (algt)) -return ; -if ((algt->type &CRYPTO_ALG_INTERNAL )) - *type |=CRYPTO_ALG_INTERNAL ; -if ((algt->mask &CRYPTO_ALG_INTERNAL )) - *mask |=CRYPTO_ALG_INTERNAL ; +return false; + + *type |= algt->type &CRYPTO_ALG_INTERNAL ; + *mask |= algt->mask &CRYPTO_ALG_INTERNAL ; + +if (*type & *mask &CRYPTO_ALG_INTERNAL ) +return true; +else +return false; }static int mcryptd_hash_init_tfm (struct crypto_tfm *tfm)
@@ -498,7 +502,8 @@ static int mcryptd_create_hash(struct cru32 mask =0 ;int err; -mcryptd_check_internal (tb, &type, &mask); +if (!mcryptd_check_internal (tb, &type, &mask)) +return -EINVAL ; salg =shash_attr_alg (tb[1 ], type, mask);if (IS_ERR (salg))
Greg Kroah-Hartman
maintainerPATCH 10/16 can: raw: raw_setsockopt: limit number of can_filter that can be set
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Kleine-Budde <[email protected]>
commit 332b05ca7a438f857c61a3c21a88489a21532364 upstream.
This patch adds a check to limit the number of can_filters that can be set via setsockopt on CAN_RAW sockets. Otherwise allocations > MAX_ORDER are not prevented resulting in a warning.
Reference: https://lkml.org/lkml/2016/12/2/230
--- include/uapi/linux/can.h | 1 + net/can/raw.c | 3 +++ 2 files changed, 4 insertions(+)
include/uapi/linux/can.h +1 -0
@@ -196,5 +196,6 @@ struct can_filter { };#define CAN_INV_FILTER 0x20000000U/* to be set in can_filter.can_id */ +#define CAN_RAW_FILTER_MAX 512/* maximum number of can_filter set via setsockopt() */ #endif /* !_UAPI_CAN_H */
net/can/raw.c +3 -0
@@ -499,6 +499,9 @@ static int raw_setsockopt(struct socketif (optlen %sizeof (struct can_filter ) !=0 )return -EINVAL ; +if (optlen >CAN_RAW_FILTER_MAX *sizeof (struct can_filter )) +return -EINVAL ; + count = optlen /sizeof (struct can_filter );if (count >1 ) {
Greg Kroah-Hartman
maintainerPATCH 12/16 arm64: futex.h: Add missing PAN toggling
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Morse <[email protected]>
commit 811d61e384e24759372bb3f01772f3744b0a8327 upstream.
futex.h's futex_atomic_cmpxchg_inatomic() does not use the __futex_atomic_op() macro and needs its own PAN toggling. This was missed when the feature was implemented.
--- arch/arm64/include/asm/futex.h | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/include/asm/futex.h +2 -0
@@ -121,6 +121,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval,return -EFAULT ; asmvolatile ("// futex_atomic_cmpxchg_inatomic\n" +ALTERNATIVE("nop", SET_PSTATE_PAN(0), ARM64_HAS_PAN, CONFIG_ARM64_PAN)" prfm pstl1strm, %2\n" "1: ldxr %w1, %2\n" " sub %w3, %w1, %w4\n"
@@ -137,6 +138,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval," .align 3\n" " .quad 1b, 4b, 2b, 4b\n" " .popsection\n" +ALTERNATIVE ("nop" ,SET_PSTATE_PAN (1 ),ARM64_HAS_PAN ,CONFIG_ARM64_PAN ) : "+r" (ret), "=&r" (val), "+Q" (*uaddr), "=&r" (tmp) : "r" (oldval), "r" (newval), "Ir" (-EFAULT) : "memory");
Greg Kroah-Hartman
maintainerPATCH 13/16 m68k: Fix ndelay() macro
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit 7e251bb21ae08ca2e4fb28cc0981fac2685a8efa upstream.
The current ndelay() macro definition has an extra semi-colon at the end of the line thus leading to a compilation error when ndelay is used in a conditional block without curly braces like this one:
if (cond) ndelay(t); else ...
which, after the preprocessor pass gives:
if (cond) m68k_ndelay(t);; else ...
thus leading to the following gcc error:
error: 'else' without a previous 'if'
Remove this extra semi-colon.
--- arch/m68k/include/asm/delay.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/m68k/include/asm/delay.h +1 -1
@@ -114,6 +114,6 @@ static inline void __udelay(unsigned lon*/ #define HZSCALE (268435456 / (1000000 / HZ)) -#define ndelay (n) __delay(DIV_ROUND_UP((n) * ((((HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6), 1000)); +#define ndelay (n) __delay(DIV_ROUND_UP((n) * ((((HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6), 1000))#endif /* defined(_M68K_DELAY_H) */
Greg Kroah-Hartman
maintainerPATCH 14/16 batman-adv: Check for alloc errors when preparing TT local data
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Eckelmann <[email protected]>
commit c2d0f48a13e53b4747704c9e692f5e765e52041a upstream.
batadv_tt_prepare_tvlv_local_data can fail to allocate the memory for the new TVLV block. The caller is informed about this problem with the returned length of 0. Not checking this value results in an invalid memory access when either tt_data or tt_change is accessed.
--- net/batman-adv/translation-table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/batman-adv/translation-table.c +2 -2
@@ -2764,7 +2764,7 @@ static bool batadv_send_my_tt_response(s &tvlv_tt_data, &tt_change, &tt_len); -if (!tt_len) +if (!tt_len || !tvlv_len) goto unlock;/* Copy the last orig_node's OGM buffer */
@@ -2782,7 +2782,7 @@ static bool batadv_send_my_tt_response(s &tvlv_tt_data, &tt_change, &tt_len); -if (!tt_len) +if (!tt_len || !tvlv_len) goto out;/* fill the rest of the tvlv with the real TT entries */
Greg Kroah-Hartman
maintainerPATCH 15/16 hotplug: Make register and unregister notifier API symmetric
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Hocko <[email protected]>
commit 777c6e0daebb3fcefbbd6f620410a946b07ef6d0 upstream.
Yu Zhao has noticed that __unregister_cpu_notifier only unregisters its notifiers when HOTPLUG_CPU=y while the registration might succeed even when HOTPLUG_CPU=n if MODULE is enabled. This means that e.g. zswap might keep a stale notifier on the list on the manual clean up during the pool tear down and thus corrupt the list. Resulting in the following
[ 144.964346] BUG: unable to handle kernel paging request at ffff880658a2be78 [ 144.971337] IP: [<ffffffffa290b00b>] raw_notifier_chain_register+0x1b/0x40 <snipped> [ 145.122628] Call Trace: [ 145.125086] [<ffffffffa28e5cf8>] __register_cpu_notifier+0x18/0x20 [ 145.131350] [<ffffffffa2a5dd73>] zswap_pool_create+0x273/0x400 [ 145.137268] [<ffffffffa2a5e0fc>] __zswap_param_set+0x1fc/0x300 [ 145.143188] [<ffffffffa2944c1d>] ? trace_hardirqs_on+0xd/0x10 [ 145.149018] [<ffffffffa2908798>] ? kernel_param_lock+0x28/0x30 [ 145.154940] [<ffffffffa2a3e8cf>] ? __might_fault+0x4f/0xa0 [ 145.160511] [<ffffffffa2a5e237>] zswap_compressor_param_set+0x17/0x20 [ 145.167035] [<ffffffffa2908d3c>] param_attr_store+0x5c/0xb0 [ 145.172694] [<ffffffffa290848d>] module_attr_store+0x1d/0x30 [ 145.178443] [<ffffffffa2b2b41f>] sysfs_kf_write+0x4f/0x70 [ 145.183925] [<ffffffffa2b2a5b9>] kernfs_fop_write+0x149/0x180 [ 145.189761] [<ffffffffa2a99248>] __vfs_write+0x18/0x40 [ 145.194982] [<ffffffffa2a9a412>] vfs_write+0xb2/0x1a0 [ 145.200122] [<ffffffffa2a9a732>] SyS_write+0x52/0xa0 [ 145.205177] [<ffffffffa2ff4d97>] entry_SYSCALL_64_fastpath+0x12/0x17
This can be even triggered manually by changing /sys/module/zswap/parameters/compressor multiple times.
Fix this issue by making unregister APIs symmetric to the register so there are no surprises.
--- include/linux/cpu.h | 15 ++++----------- kernel/cpu.c | 3 +-- 2 files changed, 5 insertions(+), 13 deletions(-)
include/linux/cpu.h +4 -11
@@ -131,22 +131,16 @@ enum { { .notifier_call = fn, .priority = pri }; \ __register_cpu_notifier(&fn##_nb); \ } -#else /* #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */ -#define cpu_notifier (fn, pri) do { (void)(fn); } while (0) -#define __cpu_notifier (fn, pri) do { (void)(fn); } while (0) -#endif /* #else #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */ -#ifdef CONFIG_HOTPLUG_CPUextern int register_cpu_notifier (struct notifier_block *nb);extern int __register_cpu_notifier (struct notifier_block *nb);extern void unregister_cpu_notifier (struct notifier_block *nb);extern void __unregister_cpu_notifier (struct notifier_block *nb); -#else -#ifndef MODULE -extern int register_cpu_notifier(struct notifier_block *nb); -extern int __register_cpu_notifier(struct notifier_block *nb); -#else +#else /* #if defined(CONFIG_HOTPLUG_CPU) || !defined(MODULE) */ +#define cpu_notifier (fn, pri) do { (void)(fn); } while (0) +#define __cpu_notifier (fn, pri) do { (void)(fn); } while (0) +static inline int register_cpu_notifier (struct notifier_block *nb) {return 0 ;
@@ -156,7 +150,6 @@ static inline int __register_cpu_notifie {return 0 ; } -#endif static inline void unregister_cpu_notifier (struct notifier_block *nb) {
kernel/cpu.c +1 -2
@@ -223,8 +223,6 @@ static int cpu_notify(unsigned long val,return __cpu_notify (val, v,-1 ,NULL ); } -#ifdef CONFIG_HOTPLUG_CPU -static void cpu_notify_nofail (unsigned long val,void *v) {BUG_ON (cpu_notify (val, v));
@@ -246,6 +244,7 @@ void __unregister_cpu_notifier(struct no }EXPORT_SYMBOL (__unregister_cpu_notifier); +#ifdef CONFIG_HOTPLUG_CPU /** * clear_tasks_mm_cpumask - Safely clear tasks' mm_cpumask for a CPU * @cpu: a CPU id
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Greg Kroah-Hartman
maintainerPATCH 16/16 crypto: rsa - Add Makefile dependencies to fix parallel builds
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Michael <[email protected]>
commit 57891633eeef60e732e045731cf20e50ee80acb4 upstream.
Both asn1 headers are included by rsa_helper.c, so rsa_helper.o should explicitly depend on them.
--- crypto/Makefile | 1 + 1 file changed, 1 insertion(+)
crypto/Makefile +1 -0
@@ -33,6 +33,7 @@ obj-$(CONFIG_CRYPTO_AKCIPHER2) += akciph $(obj)/rsapubkey-asn1.o: $(obj)/rsapubkey-asn1.c $(obj)/rsapubkey-asn1.h $(obj)/rsaprivkey-asn1.o: $(obj)/rsaprivkey-asn1.c $(obj)/rsaprivkey-asn1.h +$(obj)/rsa_helper.o: $(obj)/rsapubkey-asn1.h $(obj)/rsaprivkey-asn1.h clean-files += rsapubkey-asn1.c rsapubkey-asn1.h clean-files += rsaprivkey-asn1.c rsaprivkey-asn1.h
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.39 release. There are 16 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 Thu Dec 15 17:15:06 UTC 2016. 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.39-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
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America(Silicon Valley) [email protected]
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.39 release. There are 16 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 Thu Dec 15 17:15:06 UTC 2016. 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