4.4.25-stable review
Subsystems (6)
Greg Kroah-Hartman
maintainercover 4.4.25-stable review
This is the start of the stable review cycle for the 4.4.25 release. There are 21 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 Sun Oct 16 11:40:11 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.25-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.25-rc1
Jarkko Sakkinen <[email protected]>
tpm_crb: fix crb_req_canceled behavior
Jarkko Sakkinen <[email protected]>
tpm: fix a race condition in tpm2_unseal_trusted()
Miklos Szeredi <[email protected]>
ima: use file_dentry()
Christophe Jaillet <[email protected]>
ARM: cpuidle: Fix error return code
Linus Walleij <[email protected]>
ARM: dts: MSM8064 remove flags from SPMI/MPP IRQs
Grzegorz Jaszczyk <[email protected]>
ARM: dts: mvebu: armada-390: add missing compatibility string and bracket
Josh Poimboeuf <[email protected]>
x86/dumpstack: Fix x86_32 kernel_stack_pointer() previous stack access
Mika Westerberg <[email protected]>
x86/irq: Prevent force migration of irqs which are not in the vector domain
Dan Williams <[email protected]>
x86/boot: Fix kdump, cleanup aborted E820_PRAM max_pfn manipulation
Dan Carpenter <[email protected]>
KVM: PPC: BookE: Fix a sanity check
James Hogan <[email protected]>
KVM: MIPS: Drop other CPU ASIDs on guest MMU changes
Thomas Huth <[email protected]>
KVM: PPC: Book3s PR: Allow access to unprivileged MMCR2 register
Uwe Kleine-König <[email protected]>
mfd: wm8350-i2c: Make sure the i2c regmap functions are compiled
Dan Carpenter <[email protected]>
mfd: 88pm80x: Double shifting bug in suspend/resume
Boris Brezillon <[email protected]>
mfd: atmel-hlcdc: Do not sleep in atomic context
Lu Baolu <[email protected]>
mfd: rtsx_usb: Avoid setting ucr->current_sg.status
Takashi Sakamoto <[email protected]>
ALSA: usb-line6: use the same declaration as definition in header for MIDI manufacturer ID
Anssi Hannula <[email protected]>
ALSA: usb-audio: Extend DragonFly dB scale quirk to cover other variants
Takashi Iwai <[email protected]>
ALSA: ali5451: Fix out-of-bound position reporting
John Stultz <[email protected]>
timekeeping: Fix __ktime_get_fast_ns() regression
Christopher S. Hall <[email protected]>
time: Add cycles to nanoseconds translation
-------------
Diffstat:
Makefile | 4 +- arch/arm/boot/dts/armada-390.dtsi | 3 + arch/arm/boot/dts/qcom-apq8064.dtsi | 76 ++++++++++++++++++------- arch/mips/kvm/emulate.c | 63 +++++++++++++++++---- arch/powerpc/include/asm/reg.h | 1 + arch/powerpc/kvm/book3s_emulate.c | 2 + arch/powerpc/kvm/booke.c | 2 +- arch/x86/kernel/apic/vector.c | 23 +++++++- arch/x86/kernel/e820.c | 14 ++--- arch/x86/kernel/ptrace.c | 4 +- drivers/char/tpm/tpm-dev.c | 2 +- drivers/char/tpm/tpm-interface.c | 51 +++++++++-------- drivers/char/tpm/tpm-sysfs.c | 2 +- drivers/char/tpm/tpm.h | 12 ++-- drivers/char/tpm/tpm2-cmd.c | 101 ++++++++++++++++++++++------------ drivers/char/tpm/tpm_crb.c | 7 ++- drivers/cpuidle/cpuidle-arm.c | 1 + drivers/mfd/Kconfig | 1 + drivers/mfd/atmel-hlcdc.c | 5 +- drivers/mfd/rtsx_usb.c | 10 ++-- include/linux/mfd/88pm80x.h | 4 +- kernel/time/timekeeping.c | 32 +++++++++-- security/integrity/ima/ima_api.c | 2 +- security/integrity/ima/ima_appraise.c | 4 +- sound/pci/ali5451/ali5451.c | 2 + sound/usb/line6/driver.c | 2 +- sound/usb/mixer_quirks.c | 22 ++++++-- 27 files changed, 314 insertions(+), 138 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/21 time: Add cycles to nanoseconds translation
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christopher S. Hall <[email protected]>
commit 6bd58f09e1d8cc6c50a824c00bf0d617919986a1 upstream.
The timekeeping code does not currently provide a way to translate externally provided clocksource cycles to system time. The cycle count is always provided by the result clocksource read() method internal to the timekeeping code. The added function timekeeping_cycles_to_ns() calculated a nanosecond value from a cycle count that can be added to tk_read_base.base value yielding the current system time. This allows clocksource cycle values external to the timekeeping code to provide a cycle count that can be transformed to system time.
--- kernel/time/timekeeping.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-)
kernel/time/timekeeping.c +21 -4
@@ -298,17 +298,34 @@ u32 (*arch_gettimeoffset)(void) = defaulstatic inline u32 arch_gettimeoffset (void ) {return 0 ; }#endif +static inline s64 timekeeping_delta_to_ns (struct tk_read_base *tkr, +cycle_t delta) +{ +s64 nsec; + + nsec = delta * tkr->mult + tkr->xtime_nsec; + nsec >>= tkr->shift; + +/* If arch requires, add in get_arch_timeoffset() */ +return nsec +arch_gettimeoffset (); +} +static inline s64 timekeeping_get_ns (struct tk_read_base *tkr) {cycle_t delta; -s64 nsec; delta =timekeeping_get_delta (tkr); +return timekeeping_delta_to_ns (tkr, delta); +} - nsec = (delta * tkr->mult + tkr->xtime_nsec) >> tkr->shift; +static inline s64 timekeeping_cycles_to_ns (struct tk_read_base *tkr, +cycle_t cycles) +{ +cycle_t delta; -/* If arch requires, add in get_arch_timeoffset() */ -return nsec +arch_gettimeoffset (); +/* calculate the delta since the last update_wall_time */ + delta =clocksource_delta (cycles, tkr->cycle_last, tkr->mask); +return timekeeping_delta_to_ns (tkr, delta); }/**
Greg Kroah-Hartman
maintainerPATCH 2/21 timekeeping: Fix __ktime_get_fast_ns() regression
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Stultz <[email protected]>
commit 58bfea9532552d422bde7afa207e1a0f08dffa7d upstream.
In commit 27727df240c7 ("Avoid taking lock in NMI path with CONFIG_DEBUG_TIMEKEEPING"), I changed the logic to open-code the timekeeping_get_ns() function, but I forgot to include the unit conversion from cycles to nanoseconds, breaking the function's output, which impacts users like perf.
This results in bogus perf timestamps like:
swapper 0 [000] 253.427536: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 254.426573: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 254.426687: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 254.426800: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 254.426905: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 254.427022: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 254.427127: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 254.427239: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 254.427346: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 254.427463: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 255.426572: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms])
Instead of more reasonable expected timestamps like:
swapper 0 [000] 39.953768: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 40.064839: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 40.175956: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 40.287103: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 40.398217: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 40.509324: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 40.620437: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 40.731546: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 40.842654: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 40.953772: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms]) swapper 0 [000] 41.064881: 111111111 cpu-clock: ffffffff810a0de6 native_safe_halt+0x6 ([kernel.kallsyms])
Add the proper use of timekeeping_delta_to_ns() to convert the cycle delta to nanoseconds as needed.
Thanks to Brendan and Alexei for finding this quickly after the v4.8 release. Unfortunately the problematic commit has landed in some -stable trees so they'll need this fix as well.
Many apologies for this mistake. I'll be looking to add a perf-clock sanity test to the kselftest timers tests soon.
--- kernel/time/timekeeping.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
kernel/time/timekeeping.c +5 -2
@@ -402,8 +402,11 @@ static __always_inline u64 __ktime_get_f tkr = tkf->base + (seq &0x01 ); now =ktime_to_ns (tkr->base); - now +=clocksource_delta (tkr->read (tkr->clock), - tkr->cycle_last, tkr->mask); + now +=timekeeping_delta_to_ns (tkr, +clocksource_delta ( + tkr->read (tkr->clock), + tkr->cycle_last, + tkr->mask)); }while (read_seqcount_retry (&tkf->seq, seq));return now;
Greg Kroah-Hartman
maintainerPATCH 3/21 ALSA: ali5451: Fix out-of-bound position reporting
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit db68577966abc1aeae4ec597b3dcfa0d56e92041 upstream.
The pointer callbacks of ali5451 driver may return the value at the boundary occasionally, and it results in the kernel warning like
snd_ali5451 0000:00:06.0: BUG: , pos = 16384, buffer size = 16384, period size = 1024
It seems that folding the position offset is enough for fixing the warning and no ill-effect has been seen by that.
--- sound/pci/ali5451/ali5451.c | 2 ++ 1 file changed, 2 insertions(+)
sound/pci/ali5451/ali5451.c +2 -0
@@ -1408,6 +1408,7 @@ snd_ali_playback_pointer(struct snd_pcm_spin_unlock (&codec->reg_lock);dev_dbg (codec->card->dev,"playback pointer returned cso=%xh.\n" , cso); + cso %= runtime->buffer_size;return cso; }
@@ -1428,6 +1429,7 @@ static snd_pcm_uframes_t snd_ali_pointer cso =inw (ALI_REG (codec,ALI_CSO_ALPHA_FMS +2 ));spin_unlock (&codec->reg_lock); + cso %= runtime->buffer_size;return cso; }
Greg Kroah-Hartman
maintainerPATCH 4/21 ALSA: usb-audio: Extend DragonFly dB scale quirk to cover other variants
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anssi Hannula <[email protected]>
commit eb1a74b7bea17eea31915c4f76385cefe69d9795 upstream.
The DragonFly quirk added in 42e3121d90f4 ("ALSA: usb-audio: Add a more accurate volume quirk for AudioQuest DragonFly") applies a custom dB map on the volume control when its range is reported as 0..50 (0 .. 0.2dB).
However, there exists at least one other variant (hw v1.0c, as opposed to the tested v1.2) which reports a different non-sensical volume range (0..53) and the custom map is therefore not applied for that device.
This results in all of the volume change appearing close to 100% on mixer UIs that utilize the dB TLV information.
Add a fallback case where no dB TLV is reported at all if the control range is not 0..50 but still 0..N where N <= 1000 (3.9 dB). Also restrict the quirk to only apply to the volume control as there is also a mute control which would match the check otherwise.
--- sound/usb/mixer_quirks.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
sound/usb/mixer_quirks.c +16 -6
@@ -1831,6 +1831,7 @@ void snd_usb_mixer_rc_memory_change(stru }static void snd_dragonfly_quirk_db_scale (struct usb_mixer_interface *mixer, +struct usb_mixer_elem_info *cval,struct snd_kcontrol *kctl) {/* Approximation using 10 ranges based on output measurement on hw v1.2.
@@ -1848,10 +1849,19 @@ static void snd_dragonfly_quirk_db_scale 41, 50, TLV_DB_MINMAX_ITEM(-441, 0), ); -usb_audio_info (mixer->chip,"applying DragonFly dB scale quirk\n" ); - kctl->tlv.p = scale; - kctl->vd[0 ].access |=SNDRV_CTL_ELEM_ACCESS_TLV_READ ; - kctl->vd[0 ].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK ; +if (cval->min ==0 && cval->max ==50 ) { +usb_audio_info (mixer->chip,"applying DragonFly dB scale quirk (0-50 variant)\n" ); + kctl->tlv.p = scale; + kctl->vd[0 ].access |=SNDRV_CTL_ELEM_ACCESS_TLV_READ ; + kctl->vd[0 ].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK ; + + }else if (cval->min ==0 && cval->max <=1000 ) { +/* Some other clearly broken DragonFly variant. +* At least a 0..53 variant (hw v1.0) exists. +*/ +usb_audio_info (mixer->chip,"ignoring too narrow dB range on a DragonFly device" ); + kctl->vd[0 ].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK ; + } } void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
@@ -1860,8 +1870,8 @@ void snd_usb_mixer_fu_apply_quirk(struct {switch (mixer->chip->usb_id) {case USB_ID (0x21b4 ,0x0081 ):/* AudioQuest DragonFly */ -if (unitid ==7 && cval->min ==0 && cval->max ==50 ) -snd_dragonfly_quirk_db_scale (mixer, kctl); +if (unitid ==7 && cval->control ==UAC_FU_VOLUME ) +snd_dragonfly_quirk_db_scale (mixer, cval, kctl);break ; } }
Greg Kroah-Hartman
maintainerPATCH 5/21 ALSA: usb-line6: use the same declaration as definition in header for MIDI manufacturer ID
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Sakamoto <[email protected]>
commit 8da08ca03b73593d5299893bf29fc08569c3fb5f upstream.
Currently, usb-line6 module exports an array of MIDI manufacturer ID and usb-pod module uses it. However, the declaration is not the definition in common header. The difference is explicit length of array. Although compiler calculates it and everything goes well, it's better to use the same representation between definition and declaration.
This commit fills the length of array for usb-line6 module. As a small good sub-effect, this commit suppress below warnings from static analysis by sparse v0.5.0.
sound/usb/line6/driver.c:274:43: error: cannot size expression sound/usb/line6/driver.c:275:16: error: cannot size expression sound/usb/line6/driver.c:276:16: error: cannot size expression sound/usb/line6/driver.c:277:16: error: cannot size expression
--- sound/usb/line6/driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/usb/line6/driver.c +1 -1
@@ -29,7 +29,7 @@/* This is Line 6's MIDI manufacturer ID. */ -const unsigned char line6_midi_id[] = { +const unsigned char line6_midi_id[3 ] = {0x00 ,0x01 ,0x0c };EXPORT_SYMBOL_GPL (line6_midi_id);
Greg Kroah-Hartman
maintainerPATCH 6/21 mfd: rtsx_usb: Avoid setting ucr->current_sg.status
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lu Baolu <[email protected]>
commit 8dcc5ff8fcaf778bb57ab4448fedca9e381d088f upstream.
Member "status" of struct usb_sg_request is managed by usb core. A spin lock is used to serialize the change of it. The driver could check the value of req->status, but should avoid changing it without the hold of the spinlock. Otherwise, it could cause race or error in usb core.
This patch could be backported to stable kernels with version later than v3.14.
--- drivers/mfd/rtsx_usb.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/mfd/rtsx_usb.c +5 -5
@@ -46,9 +46,6 @@ static void rtsx_usb_sg_timed_out(unsigndev_dbg (&ucr->pusb_intf->dev,"%s: sg transfer timed out" , __func__);usb_sg_cancel (&ucr->current_sg); - -/* we know the cancellation is caused by time-out */ - ucr->current_sg.status = -ETIMEDOUT ; } static int rtsx_usb_bulk_transfer_sglist(struct rtsx_ucr *ucr,
@@ -67,12 +64,15 @@ static int rtsx_usb_bulk_transfer_sglist ucr->sg_timer.expires = jiffies +msecs_to_jiffies (timeout);add_timer (&ucr->sg_timer);usb_sg_wait (&ucr->current_sg); -del_timer_sync (&ucr->sg_timer); +if (!del_timer_sync (&ucr->sg_timer)) + ret = -ETIMEDOUT ; +else + ret = ucr->current_sg.status;if (act_len) *act_len = ucr->current_sg.bytes; -return ucr->current_sg.status; +return ret; } int rtsx_usb_transfer_data(struct rtsx_ucr *ucr, unsigned int pipe,
Greg Kroah-Hartman
maintainerPATCH 7/21 mfd: atmel-hlcdc: Do not sleep in atomic context
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 2c2469bc03d569c49119db2cccb5cb3f0c6a5b33 upstream.
readl_poll_timeout() calls usleep_range(), but regmap_atmel_hlcdc_reg_write() is called in atomic context (regmap spinlock held).
Replace the readl_poll_timeout() call by readl_poll_timeout_atomic().
--- drivers/mfd/atmel-hlcdc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/mfd/atmel-hlcdc.c +3 -2
@@ -50,8 +50,9 @@ static int regmap_atmel_hlcdc_reg_write(if (reg <=ATMEL_HLCDC_DIS ) {u32 status; -readl_poll_timeout (hregmap->regs +ATMEL_HLCDC_SR , status, - !(status &ATMEL_HLCDC_SIP ),1 ,100 ); +readl_poll_timeout_atomic (hregmap->regs +ATMEL_HLCDC_SR , + status, !(status &ATMEL_HLCDC_SIP ), +1 ,100 ); }writel (val, hregmap->regs + reg);
Greg Kroah-Hartman
maintainerPATCH 8/21 mfd: 88pm80x: Double shifting bug in suspend/resume
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 9a6dc644512fd083400a96ac4a035ac154fe6b8d upstream.
set_bit() and clear_bit() take the bit number so this code is really doing "1 << (1 << irq)" which is a double shift bug. It's done consistently so it won't cause a problem unless "irq" is more than 4.
--- include/linux/mfd/88pm80x.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/mfd/88pm80x.h +2 -2
@@ -350,7 +350,7 @@ static inline int pm80x_dev_suspend(struint irq =platform_get_irq (pdev,0 );if (device_may_wakeup (dev)) -set_bit ((1 << irq), &chip->wu_flag); +set_bit (irq, &chip->wu_flag);return 0 ; }
@@ -362,7 +362,7 @@ static inline int pm80x_dev_resume(strucint irq =platform_get_irq (pdev,0 );if (device_may_wakeup (dev)) -clear_bit ((1 << irq), &chip->wu_flag); +clear_bit (irq, &chip->wu_flag);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 10/21 KVM: PPC: Book3s PR: Allow access to unprivileged MMCR2 register
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Huth <[email protected]>
commit fa73c3b25bd8d0d393dc6109a1dba3c2aef0451e upstream.
The MMCR2 register is available twice, one time with number 785 (privileged access), and one time with number 769 (unprivileged, but it can be disabled completely). In former times, the Linux kernel was using the unprivileged register 769 only, but since commit 8dd75ccb571f3c92c ("powerpc: Use privileged SPR number for MMCR2"), it uses the privileged register 785 instead. The KVM-PR code then of course also switched to use the SPR 785, but this is causing older guest kernels to crash, since these kernels still access 769 instead. So to support older kernels with KVM-PR again, we have to support register 769 in KVM-PR, too.
--- arch/powerpc/include/asm/reg.h | 1 + arch/powerpc/kvm/book3s_emulate.c | 2 ++ 2 files changed, 3 insertions(+)
arch/powerpc/include/asm/reg.h +1 -0
@@ -708,6 +708,7 @@#define MMCR0_FCHV 0x00000001UL/* freeze conditions in hypervisor mode */ #define SPRN_MMCR1 798#define SPRN_MMCR2 785 +#define SPRN_UMMCR2 769#define SPRN_MMCRA 0x312#define MMCRA_SDSYNC 0x80000000UL/* SDAR synced with SIAR */ #define MMCRA_SDAR_DCACHE_MISS 0x40000000UL
arch/powerpc/kvm/book3s_emulate.c +2 -0
@@ -498,6 +498,7 @@ int kvmppc_core_emulate_mtspr_pr(structcase SPRN_MMCR0 :case SPRN_MMCR1 :case SPRN_MMCR2 : +case SPRN_UMMCR2 :#endif break ; unprivileged:
@@ -640,6 +641,7 @@ int kvmppc_core_emulate_mfspr_pr(structcase SPRN_MMCR0 :case SPRN_MMCR1 :case SPRN_MMCR2 : +case SPRN_UMMCR2 :case SPRN_TIR :#endif *spr_val =0 ;
Greg Kroah-Hartman
maintainerPATCH 11/21 KVM: MIPS: Drop other CPU ASIDs on guest MMU changes
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
commit 91e4f1b6073dd680d86cdb7e42d7cccca9db39d8 upstream.
When a guest TLB entry is replaced by TLBWI or TLBWR, we only invalidate TLB entries on the local CPU. This doesn't work correctly on an SMP host when the guest is migrated to a different physical CPU, as it could pick up stale TLB mappings from the last time the vCPU ran on that physical CPU.
Therefore invalidate both user and kernel host ASIDs on other CPUs, which will cause new ASIDs to be generated when it next runs on those CPUs.
We're careful only to do this if the TLB entry was already valid, and only for the kernel ASID where the virtual address it mapped is outside of the guest user address range.
--- arch/mips/kvm/emulate.c | 63 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 10 deletions(-)
arch/mips/kvm/emulate.c +53 -10
@@ -807,6 +807,47 @@ enum emulation_result kvm_mips_emul_tlbrreturn EMULATE_FAIL ; } +/** +* kvm_mips_invalidate_guest_tlb() - Indicates a change in guest MMU map. +* @vcpu: VCPU with changed mappings. +* @tlb: TLB entry being removed. +* +* This is called to indicate a single change in guest MMU mappings, so that we +* can arrange TLB flushes on this and other CPUs. +*/ +static void kvm_mips_invalidate_guest_tlb (struct kvm_vcpu *vcpu, +struct kvm_mips_tlb *tlb) +{ +int cpu, i; +bool user; + +/* No need to flush for entries which are already invalid */ +if (!((tlb->tlb_lo[0 ] | tlb->tlb_lo[1 ]) &ENTRYLO_V )) +return ; +/* User address space doesn't need flushing for KSeg2/3 changes */ + user = tlb->tlb_hi <KVM_GUEST_KSEG0 ; + +preempt_disable (); + +/* +* Probe the shadow host TLB for the entry being overwritten, if one +* matches, invalidate it +*/ +kvm_mips_host_tlb_inv (vcpu, tlb->tlb_hi); + +/* Invalidate the whole ASID on other CPUs */ + cpu =smp_processor_id (); +for_each_possible_cpu (i) { +if (i == cpu) +continue ; +if (user) + vcpu->arch.guest_user_asid[i] =0 ; + vcpu->arch.guest_kernel_asid[i] =0 ; + } + +preempt_enable (); +} +/* Write Guest TLB Entry @ Index */ enum emulation_result kvm_mips_emul_tlbwi (struct kvm_vcpu *vcpu) {
@@ -826,11 +867,8 @@ enum emulation_result kvm_mips_emul_tlbw } tlb = &vcpu->arch.guest_tlb[index]; -/* -* Probe the shadow host TLB for the entry being overwritten, if one -* matches, invalidate it -*/ -kvm_mips_host_tlb_inv (vcpu, tlb->tlb_hi); + +kvm_mips_invalidate_guest_tlb (vcpu, tlb); tlb->tlb_mask =kvm_read_c0_guest_pagemask (cop0); tlb->tlb_hi =kvm_read_c0_guest_entryhi (cop0);
@@ -859,11 +897,7 @@ enum emulation_result kvm_mips_emul_tlbw tlb = &vcpu->arch.guest_tlb[index]; -/* -* Probe the shadow host TLB for the entry being overwritten, if one -* matches, invalidate it -*/ -kvm_mips_host_tlb_inv (vcpu, tlb->tlb_hi); +kvm_mips_invalidate_guest_tlb (vcpu, tlb); tlb->tlb_mask =kvm_read_c0_guest_pagemask (cop0); tlb->tlb_hi =kvm_read_c0_guest_entryhi (cop0);
@@ -982,6 +1016,7 @@ enum emulation_result kvm_mips_emulate_Cint32_t rt, rd, copz, sel, co_bit, op;uint32_t pc = vcpu->arch.pc;unsigned long curr_pc; +int cpu, i;/* * Update PC and hold onto current PC in case there is
@@ -1089,8 +1124,16 @@ enum emulation_result kvm_mips_emulate_C vcpu->arch.gprs[rt] & ASID_MASK); +preempt_disable ();/* Blow away the shadow host TLBs */ kvm_mips_flush_host_tlb (1 ); + cpu =smp_processor_id (); +for_each_possible_cpu (i) +if (i != cpu) { + vcpu->arch.guest_user_asid[i] =0 ; + vcpu->arch.guest_kernel_asid[i] =0 ; + } +preempt_enable (); }kvm_write_c0_guest_entryhi (cop0, vcpu->arch.gprs[rt]);
Greg Kroah-Hartman
maintainerPATCH 12/21 KVM: PPC: BookE: Fix a sanity check
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit ac0e89bb4744d3882ccd275f2416d9ce22f4e1e7 upstream.
We use logical negate where bitwise negate was intended. It means that we never return -EINVAL here.
--- arch/powerpc/kvm/booke.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/kvm/booke.c +1 -1
@@ -2033,7 +2033,7 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(if (type ==KVMPPC_DEBUG_NONE )continue ; -if (type & !(KVMPPC_DEBUG_WATCH_READ | +if (type & ~(KVMPPC_DEBUG_WATCH_READ |KVMPPC_DEBUG_WATCH_WRITE |KVMPPC_DEBUG_BREAKPOINT ))return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 13/21 x86/boot: Fix kdump, cleanup aborted E820_PRAM max_pfn manipulation
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit 917db484dc6a69969d317b3e57add4208a8d9d42 upstream.
In commit:
ec776ef6bbe1 ("x86/mm: Add support for the non-standard protected e820 type")
Christoph references the original patch I wrote implementing pmem support. The intent of the 'max_pfn' changes in that commit were to enable persistent memory ranges to be covered by the struct page memmap by default.
However, that approach was abandoned when Christoph ported the patches [1], and that functionality has since been replaced by devm_memremap_pages().
In the meantime, this max_pfn manipulation is confusing kdump [2] that assumes that everything covered by the max_pfn is "System RAM". This results in kdump hanging or crashing.
[1]: https://lists.01.org/pipermail/linux-nvdimm/2015-March/000348.html
[2]: https://bugzilla.redhat.com/show_bug.cgi?id=1351098
So fix it.
--- arch/x86/kernel/e820.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
arch/x86/kernel/e820.c +5 -9
@@ -347,7 +347,7 @@ int __init sanitize_e820_map(struct e820* continue building up new bios map based on this * information */ -if (current_type != last_type || current_type ==E820_PRAM ) { +if (current_type != last_type) {if (last_type !=0 ) { new_bios[new_bios_entry].size = change_point[chgidx]->addr - last_addr;
@@ -753,7 +753,7 @@ u64 __init early_reserve_e820(u64 size,/* * Find the highest page frame number we have available */ -static unsigned long __init e820_end_pfn (unsigned long limit_pfn) +static unsigned long __init e820_end_pfn (unsigned long limit_pfn,unsigned type) {int i;unsigned long last_pfn =0 ;
@@ -764,11 +764,7 @@ static unsigned long __init e820_end_pfnunsigned long start_pfn;unsigned long end_pfn; -/* -* Persistent memory is accounted as ram for purposes of -* establishing max_pfn and mem_map. -*/ -if (ei->type !=E820_RAM && ei->type !=E820_PRAM ) +if (ei->type != type)continue ; start_pfn = ei->addr >>PAGE_SHIFT ;
@@ -793,12 +789,12 @@ static unsigned long __init e820_end_pfn }unsigned long __init e820_end_of_ram_pfn (void ) { -return e820_end_pfn (MAX_ARCH_PFN ); +return e820_end_pfn (MAX_ARCH_PFN ,E820_RAM ); }unsigned long __init e820_end_of_low_ram_pfn (void ) { -return e820_end_pfn (1UL << (32 -PAGE_SHIFT )); +return e820_end_pfn (1UL << (32 -PAGE_SHIFT ),E820_RAM ); }static void early_panic (char *msg)
Greg Kroah-Hartman
maintainerPATCH 14/21 x86/irq: Prevent force migration of irqs which are not in the vector domain
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mika Westerberg <[email protected]>
commit db91aa793ff984ac048e199ea1c54202543952fe upstream.
When a CPU is about to be offlined we call fixup_irqs() that resets IRQ affinities related to the CPU in question. The same thing is also done when the system is suspended to S-states like S3 (mem).
For each IRQ we try to complete any on-going move regardless whether the IRQ is actually part of x86_vector_domain. For each IRQ descriptor we fetch its chip_data, assume it is of type struct apic_chip_data and manipulate it by clearing old_domain mask etc. For irq_chips that are not part of the x86_vector_domain, like those created by various GPIO drivers, will find their chip_data being changed unexpectly.
Below is an example where GPIO chip owned by pinctrl-sunrisepoint.c gets corrupted after resume:
# cat /sys/kernel/debug/gpio gpiochip0: GPIOs 360-511, parent: platform/INT344B:00, INT344B:00: gpio-511 ( |sysfs ) in hi
# rtcwake -s10 -mmem <10 seconds passes>
# cat /sys/kernel/debug/gpio gpiochip0: GPIOs 360-511, parent: platform/INT344B:00, INT344B:00: gpio-511 ( |sysfs ) in ?
Note '?' in the output. It means the struct gpio_chip ->get function is NULL whereas before suspend it was there.
Fix this by first checking that the IRQ belongs to x86_vector_domain before we try to use the chip_data as struct apic_chip_data.
--- arch/x86/kernel/apic/vector.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
arch/x86/kernel/apic/vector.c +20 -3
@@ -659,11 +659,28 @@ void irq_complete_move(struct irq_cfg *c*/ void irq_force_complete_move (struct irq_desc *desc) { -struct irq_data *irqdata =irq_desc_get_irq_data (desc); -struct apic_chip_data *data =apic_chip_data (irqdata); -struct irq_cfg *cfg = data ? &data->cfg :NULL ; +struct irq_data *irqdata; +struct apic_chip_data *data; +struct irq_cfg *cfg;unsigned int cpu; +/* +* The function is called for all descriptors regardless of which +* irqdomain they belong to. For example if an IRQ is provided by +* an irq_chip as part of a GPIO driver, the chip data for that +* descriptor is specific to the irq_chip in question. +* +* Check first that the chip_data is what we expect +* (apic_chip_data) before touching it any further. +*/ + irqdata =irq_domain_get_irq_data (x86_vector_domain, +irq_desc_get_irq (desc)); +if (!irqdata) +return ; + + data =apic_chip_data (irqdata); + cfg = data ? &data->cfg :NULL ; +if (!cfg)return ;
Greg Kroah-Hartman
maintainerPATCH 15/21 x86/dumpstack: Fix x86_32 kernel_stack_pointer() previous stack access
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josh Poimboeuf <[email protected]>
commit 72b4f6a5e903b071f2a7c4eb1418cbe4eefdc344 upstream.
On x86_32, when an interrupt happens from kernel space, SS and SP aren't pushed and the existing stack is used. So pt_regs is effectively two words shorter, and the previous stack pointer is normally the memory after the shortened pt_regs, aka '®s->sp'.
But in the rare case where the interrupt hits right after the stack pointer has been changed to point to an empty stack, like for example when call_on_stack() is used, the address immediately after the shortened pt_regs is no longer on the stack. In that case, instead of '®s->sp', the previous stack pointer should be retrieved from the beginning of the current stack page.
kernel_stack_pointer() wants to do that, but it forgets to dereference the pointer. So instead of returning a pointer to the previous stack, it returns a pointer to the beginning of the current stack.
Note that it's probably outside of kernel_stack_pointer()'s scope to be switching stacks at all. The x86_64 version of this function doesn't do it, and it would be better for the caller to do it if necessary. But that's a patch for another day. This just fixes the original intent.
--- arch/x86/kernel/ptrace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/kernel/ptrace.c +2 -2
@@ -188,8 +188,8 @@ unsigned long kernel_stack_pointer(strucreturn sp; prev_esp = (u32 *)(context); -if (prev_esp) -return (unsigned long )prev_esp; +if (*prev_esp) +return (unsigned long )*prev_esp;return (unsigned long )regs; }
Greg Kroah-Hartman
maintainerPATCH 16/21 ARM: dts: mvebu: armada-390: add missing compatibility string and bracket
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Grzegorz Jaszczyk <[email protected]>
commit 061492cfad9f11dbc32df741a7164f307b69b6e6 upstream.
The armada-390.dtsi was broken since the first patch which adds Device Tree files for Armada 39x SoC was introduced.
Fixes 538da83 ("ARM: mvebu: add Device Tree files for Armada 39x SoC and board")
--- arch/arm/boot/dts/armada-390.dtsi | 3 +++ 1 file changed, 3 insertions(+)
arch/arm/boot/dts/armada-390.dtsi +3 -0
@@ -47,6 +47,8 @@ #include "armada-39x.dtsi" / { + compatible = "marvell,armada390"; + soc { internal-regs { pinctrl@18000 {
@@ -54,4 +56,5 @@ reg = <0x18000 0x20>; }; }; + }; };
Greg Kroah-Hartman
maintainerPATCH 18/21 ARM: cpuidle: Fix error return code
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Jaillet <[email protected]>
commit af48d7bc3756a0cd882d65bff14ab39746ba57fe upstream.
We know that 'ret = 0' because it has been tested a few lines above. So, if 'kzalloc' fails, 0 will be returned instead of an error code. Return -ENOMEM instead.
--- drivers/cpuidle/cpuidle-arm.c | 1 + 1 file changed, 1 insertion(+)
drivers/cpuidle/cpuidle-arm.c +1 -0
@@ -135,6 +135,7 @@ static int __init arm_idle_init(void) dev =kzalloc (sizeof (*dev),GFP_KERNEL );if (!dev) {pr_err ("Failed to allocate cpuidle device\n" ); + ret = -ENOMEM ; goto out_fail; } dev->cpu = cpu;
Greg Kroah-Hartman
maintainerPATCH 19/21 ima: use file_dentry()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
commit e71b9dff0634edb127f449e076e883ef24a8c76c upstream.
Ima tries to call ->setxattr() on overlayfs dentry after having locked underlying inode, which results in a deadlock.
--- security/integrity/ima/ima_api.c | 2 +- security/integrity/ima/ima_appraise.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
security/integrity/ima/ima_api.c +1 -1
@@ -202,7 +202,7 @@ int ima_collect_measurement(struct integ } hash;if (xattr_value) - *xattr_len =ima_read_xattr (file->f_path.dentry, xattr_value); + *xattr_len =ima_read_xattr (file_dentry (file), xattr_value);if (!(iint->flags &IMA_COLLECTED )) {u64 i_version =file_inode (file)->i_version;
security/integrity/ima/ima_appraise.c +2 -2
@@ -189,7 +189,7 @@ int ima_appraise_measurement(int func, s {static const char op[] ="appraise_data" ;char *cause ="unknown" ; -struct dentry *dentry = file->f_path.dentry; +struct dentry *dentry =file_dentry (file);struct inode *inode =d_backing_inode (dentry);enum integrity_status status =INTEGRITY_UNKNOWN ;int rc = xattr_len, hash_start =0 ;
@@ -289,7 +289,7 @@ out:*/ void ima_update_xattr (struct integrity_iint_cache *iint,struct file *file) { -struct dentry *dentry = file->f_path.dentry; +struct dentry *dentry =file_dentry (file);int rc =0 ;/* do not collect and update hash for digital signatures */
Greg Kroah-Hartman
maintainerPATCH 20/21 tpm: fix a race condition in tpm2_unseal_trusted()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Sakkinen <[email protected]>
commit d4816edfe706497a8525480c1685ceb9871bc118 upstream.
Unseal and load operations should be done as an atomic operation. This commit introduces unlocked tpm_transmit() so that tpm2_unseal_trusted() can do the locking by itself.
--- drivers/char/tpm/tpm-dev.c | 2 drivers/char/tpm/tpm-interface.c | 51 ++++++++++--------- drivers/char/tpm/tpm-sysfs.c | 2 drivers/char/tpm/tpm.h | 12 +++- drivers/char/tpm/tpm2-cmd.c | 101 +++++++++++++++++++++++++-------------- 5 files changed, 103 insertions(+), 65 deletions(-)
drivers/char/tpm/tpm-dev.c +1 -1
@@ -139,7 +139,7 @@ static ssize_t tpm_write(struct file *fi/* atomic tpm command send and result receive */ out_size =tpm_transmit (priv->chip, priv->data_buffer, -sizeof (priv->data_buffer)); +sizeof (priv->data_buffer),0 );if (out_size <0 ) {mutex_unlock (&priv->buffer_mutex);return out_size;
drivers/char/tpm/tpm-interface.c +28 -23
162 lines not on this page · raw message
drivers/char/tpm/tpm-sysfs.c +1 -1
@@ -39,7 +39,7 @@ static ssize_t pubek_show(struct devicestruct tpm_chip *chip =dev_get_drvdata (dev); tpm_cmd.header.in = tpm_readpubek_header; - err =tpm_transmit_cmd (chip, &tpm_cmd,READ_PUBEK_RESULT_SIZE , + err =tpm_transmit_cmd (chip, &tpm_cmd,READ_PUBEK_RESULT_SIZE ,0 ,"attempting to read the PUBEK" );if (err) goto out;
drivers/char/tpm/tpm.h +8 -4
@@ -498,11 +498,15 @@ extern struct class *tpm_class;extern dev_t tpm_devt;extern const struct file_operations tpm_fops; +enum tpm_transmit_flags { +TPM_TRANSMIT_UNLOCKED =BIT (0 ), +}; + +ssize_t tpm_transmit (struct tpm_chip *chip,const u8 *buf,size_t bufsiz, +unsigned int flags); +ssize_t tpm_transmit_cmd (struct tpm_chip *chip,const void *cmd,int len, +unsigned int flags,const char *desc);ssize_t tpm_getcap (struct device *,__be32 ,cap_t *,const char *); -ssize_t tpm_transmit (struct tpm_chip *chip,const char *buf, -size_t bufsiz); -ssize_t tpm_transmit_cmd (struct tpm_chip *chip,void *cmd,int len, -const char *desc);extern int tpm_get_timeouts (struct tpm_chip *);extern void tpm_gen_interrupt (struct tpm_chip *);extern int tpm_do_selftest (struct tpm_chip *);
drivers/char/tpm/tpm2-cmd.c +65 -36
221 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 21/21 tpm_crb: fix crb_req_canceled behavior
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jarkko Sakkinen <[email protected]>
commit 72fd50e14e46dc0edf360631bdece87c2f066a97 upstream.
The req_canceled() callback is used by tpm_transmit() periodically to check whether the request has been canceled while it is receiving a response from the TPM.
The TPM_CRB_CTRL_CANCEL register was cleared already in the crb_cancel callback, which has two consequences:
* Cancel might not happen.
* req_canceled() always returns zero.
A better place to clear the register is when starting to send a new command. The behavior of TPM_CRB_CTRL_CANCEL is described in the section 5.5.3.6 of the PTP specification.
--- drivers/char/tpm/tpm_crb.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/char/tpm/tpm_crb.c +5 -2
@@ -149,6 +149,11 @@ static int crb_send(struct tpm_chip *chistruct crb_priv *priv = chip->vendor.priv;int rc =0 ; +/* Zero the cancel register so that the next command will not get +* canceled. +*/ +iowrite32 (0 , &priv->cca->cancel); +if (len >le32_to_cpu (ioread32 (&priv->cca->cmd_size))) { dev_err(&chip->dev, "invalid command count value %x %zx\n",
@@ -182,8 +187,6 @@ static void crb_cancel(struct tpm_chip *if ((priv->flags &CRB_FL_ACPI_START ) &&crb_do_acpi_start (chip))dev_err (&chip->dev,"ACPI Start failed\n" ); - -iowrite32 (0 , &priv->cca->cancel); }static bool crb_req_canceled (struct tpm_chip *chip,u8 status)
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.25 release. There are 21 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 Sun Oct 16 11:40:11 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.25-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.25 release. There are 21 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 Sun Oct 16 11:40:11 UTC 2016. Anything received after that time might be too late.
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 103 pass: 103 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter