4.7.6-stable review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 4.7.6-stable review
This is the start of the stable review cycle for the 4.7.6 release. There are 69 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 Fri Sep 30 09:04:31 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.7.6-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.7.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.7.6-rc1
Wilfried Klaebe <[email protected]>
builddeb: really include objtool binary in headers package
Steve Wise <[email protected]>
iw_cxgb4: stop MPA_REPLY timer when disconnecting
Andrey Ryabinin <[email protected]>
mm/kasan: don't reduce quarantine in atomic contexts
Alexander Potapenko <[email protected]>
kasan: avoid overflowing quarantine size on low memory systems
Dan Carpenter <[email protected]>
hostfs: Freeing an ERR_PTR in hostfs_fill_sb_common()
Dan Carpenter <[email protected]>
qxl: check for kmap failures
Jon Hunter <[email protected]>
soc/tegra: pmc: Don't probe PMC if early initialisation fails
Kshitiz Gupta <[email protected]>
igb: fix adjusting PTP timestamps for Tx/Rx latency
Alexander Duyck <[email protected]>
ixgbe: Re-enable ability to toggle VLAN filtering
Alexander Duyck <[email protected]>
ixgbe: Force VLNCTRL.VFE to be set in all VMDq paths
Sven Van Asbroeck <[email protected]>
power: supply: max17042_battery: fix model download bug.
Wei Yongjun <[email protected]>
power_supply: tps65217-charger: fix missing platform_set_drvdata()
James Morse <[email protected]>
PM / hibernate: Fix rtree_next_node() to avoid walking off list ends
Thomas Garnier <[email protected]>
PM / hibernate: Restore processor state before using per-CPU variables
Wei Yongjun <[email protected]>
libceph: fix return value check in alloc_msg_with_page_vector()
Phil Turnbull <[email protected]>
ceph: Correctly return NXIO errors from ceph_llseek
Arnd Bergmann <[email protected]>
ceph: fix symbol versioning for ceph_monc_do_statfs
Ilya Dryomov <[email protected]>
libceph: add an ONSTACK initializer for oids
Matt Fleming <[email protected]>
x86/mm/pat: Prevent hang during boot when mapping pages
Matt Redfearn <[email protected]>
MIPS: paravirt: Fix undefined reference to smp_bootstrap
Huacai Chen <[email protected]>
MIPS: Add a missing ".set pop" in an early commit
Marcin Nowakowski <[email protected]>
MIPS: Avoid a BUG warning during prctl(PR_SET_FP_MODE, ...)
Paul Burton <[email protected]>
MIPS: Remove compact branch policy Kconfig entries
James Hogan <[email protected]>
MIPS: vDSO: Fix Malta EVA mapping to vDSO page structs
Matt Redfearn <[email protected]>
MIPS: SMP: Fix possibility of deadlock when bringing CPUs online
Paul Burton <[email protected]>
MIPS: Fix pre-r6 emulation FPU initialisation
Sudeep Holla <[email protected]>
i2c: qup: skip qup_i2c_suspend if the device is already runtime suspended
Peter Rosin <[email protected]>
i2c: mux: pca954x: retry updating the mux selection on failure
Yadi.hu <[email protected]>
i2c-eg20t: fix race between i2c init and interrupt enable
Paul Burton <[email protected]>
irqchip/mips-gic: Fix local interrupts
Matt Fleming <[email protected]>
x86/efi: Only map RAM into EFI page tables if in mixed-mode
Jeff Mahoney <[email protected]>
btrfs: ensure that file descriptor used with subvol ioctls is a dir
Johannes Berg <[email protected]>
nl80211: validate number of probe response CSA counters
Beni Lev <[email protected]>
iwlwifi: mvm: update TX queue before making a copy of the skb
Marek Vasut <[email protected]>
net: can: ifi: Configure transmitter delay
Fabio Estevam <[email protected]>
can: flexcan: fix resume function
Hugh Dickins <[email protected]>
mm: delete unnecessary and unsafe init_tlb_ubc()
Steven Rostedt (Red Hat) <[email protected]>
tracing: Move mutex to protect against resetting of seq data
Al Viro <[email protected]>
fix memory leaks in tracing_buffers_splice_read()
Johannes Berg <[email protected]>
mac80211: reject TSPEC TIDs (TSIDs) for aggregation
Arvind Yadav <[email protected]>
power: reset: hisi-reboot: Unmap region obtained by of_iomap
Keerthy <[email protected]>
rtc: ds1307: Fix relying on reset value for weekday
John Youn <[email protected]>
reset: Return -ENOTSUPP when not configured
Brian Norris <[email protected]>
mtd: spi-nor: fix wrong "fully unlocked" test
Dan Carpenter <[email protected]>
mtd: pmcmsp-flash: Allocating too much in init_msp_flash()
Dan Carpenter <[email protected]>
mtd: maps: sa1100-flash: potential NULL dereference
Lothar Waßmann <[email protected]>
mtd: nand: mxc: fix obiwan error in mxc_nand_v[12]_ooblayout_free() functions
Phil Turnbull <[email protected]>
configfs: Return -EFBIG from configfs_write_bin_file.
David Daney <[email protected]>
arm64: Call numa_store_cpu_info() earlier.
Herbert Xu <[email protected]>
KEYS: Fix skcipher IV clobbering
Al Viro <[email protected]>
fix fault_in_multipages_...() on architectures with no-op access_ok()
Johannes Weiner <[email protected]>
cgroup: duplicate cgroup reference when cloning sockets
Johannes Weiner <[email protected]>
mm: memcontrol: make per-cpu charge cache IRQ-safe for socket accounting
Jan Kara <[email protected]>
fanotify: fix list corruption in fanotify_get_response()
Jan Kara <[email protected]>
fsnotify: add a way to stop queueing events on group shutdown
Santosh Shilimkar <[email protected]>
mm: fix the page_swap_info() BUG_ON check
Brian Foster <[email protected]>
xfs: prevent dropping ioend completions during buftarg wait
Steven Rostedt <[email protected]>
Makefile: Mute warning for __builtin_return_address(>0) for tracing only
Linus Torvalds <[email protected]>
Disable "frame-address" warning
Linus Torvalds <[email protected]>
Disable "maybe-uninitialized" warning globally
Ian Kent <[email protected]>
autofs: use dentry flags to block walks during expire
Junxiao Bi <[email protected]>
Revert "ocfs2: bump up o2cb network protocol version"
Ashish Samant <[email protected]>
ocfs2: fix start offset to ocfs2_zero_range_for_truncate()
Joseph Qi <[email protected]>
ocfs2/dlm: fix race between convert and migration
Herbert Xu <[email protected]>
crypto: echainiv - Replace chaining with multiplication
Herbert Xu <[email protected]>
crypto: skcipher - Fix blkcipher walk OOM crash
Ard Biesheuvel <[email protected]>
crypto: arm/aes-ctr - fix NULL dereference in tail processing
Ard Biesheuvel <[email protected]>
crypto: arm64/aes-ctr - fix NULL dereference in tail processing
Jeff Mahoney <[email protected]>
reiserfs: fix "new_insert_key may be used uninitialized ..."
-------------
Diffstat:
Makefile | 11 +- arch/arc/Makefile | 4 +- arch/arm/crypto/aes-ce-glue.c | 2 +- arch/arm64/crypto/aes-glue.c | 2 +- arch/arm64/kernel/smp.c | 14 ++- arch/mips/Kconfig.debug | 36 ------- arch/mips/Makefile | 4 - arch/mips/include/asm/asmmacro.h | 1 + .../include/asm/mach-paravirt/kernel-entry-init.h | 2 + arch/mips/kernel/mips-r2-to-r6-emul.c | 2 + arch/mips/kernel/process.c | 8 +- arch/mips/kernel/smp.c | 7 +- arch/mips/kernel/vdso.c | 8 +- arch/x86/mm/pageattr.c | 21 ++-- arch/x86/platform/efi/efi_64.c | 2 +- crypto/blkcipher.c | 3 +- crypto/echainiv.c | 115 +++++---------------- drivers/gpu/drm/qxl/qxl_draw.c | 2 + drivers/i2c/busses/i2c-eg20t.c | 18 ++-- drivers/i2c/busses/i2c-qup.c | 3 +- drivers/i2c/muxes/i2c-mux-pca954x.c | 2 +- drivers/infiniband/hw/cxgb4/cm.c | 12 ++- drivers/irqchip/irq-mips-gic.c | 105 +++++++++---------- drivers/mtd/maps/pmcmsp-flash.c | 6 +- drivers/mtd/maps/sa1100-flash.c | 4 +- drivers/mtd/nand/mxc_nand.c | 2 +- drivers/mtd/spi-nor/spi-nor.c | 2 +- drivers/net/can/flexcan.c | 13 ++- drivers/net/can/ifi_canfd/ifi_canfd.c | 11 +- drivers/net/ethernet/intel/igb/igb_ptp.c | 26 ++++- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 19 ++-- drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 19 ++-- drivers/power/max17042_battery.c | 15 +-- drivers/power/reset/hisi-reboot.c | 5 +- drivers/power/tps65217_charger.c | 1 + drivers/rtc/rtc-ds1307.c | 28 ++++- drivers/soc/tegra/pmc.c | 8 ++ fs/autofs4/expire.c | 55 +++++++--- fs/btrfs/ioctl.c | 12 +++ fs/ceph/file.c | 12 +-- fs/ceph/ioctl.c | 2 +- fs/configfs/file.c | 1 + fs/hostfs/hostfs_kern.c | 7 +- fs/notify/fanotify/fanotify.c | 13 +-- fs/notify/fanotify/fanotify_user.c | 36 ++++--- fs/notify/group.c | 19 ++++ fs/notify/notification.c | 23 ++--- fs/ocfs2/cluster/tcp_internal.h | 5 +- fs/ocfs2/dlm/dlmconvert.c | 12 +-- fs/ocfs2/file.c | 34 ++++-- fs/reiserfs/ibalance.c | 3 +- fs/xfs/xfs_buf.c | 2 +- include/linux/ceph/libceph.h | 3 +- include/linux/ceph/osdmap.h | 5 + include/linux/fsnotify_backend.h | 6 +- include/linux/pagemap.h | 38 +++---- include/linux/reset.h | 4 +- kernel/cgroup.c | 6 ++ kernel/power/hibernate.c | 4 +- kernel/power/snapshot.c | 10 +- kernel/trace/Makefile | 4 + kernel/trace/trace.c | 29 +++--- mm/kasan/kasan.c | 4 +- mm/kasan/quarantine.c | 9 +- mm/memcontrol.c | 31 ++++-- mm/page_io.c | 3 + mm/swapfile.c | 1 - mm/vmscan.c | 19 ---- net/ceph/osd_client.c | 2 +- net/core/sock.c | 5 +- net/mac80211/agg-rx.c | 8 +- net/mac80211/agg-tx.c | 3 + net/wireless/nl80211.c | 2 +- scripts/Makefile.ubsan | 4 - scripts/package/builddeb | 6 +- security/keys/encrypted-keys/encrypted.c | 11 +- 76 files changed, 540 insertions(+), 456 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/69 reiserfs: fix "new_insert_key may be used uninitialized ..."
4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Mahoney <[email protected]>
commit 0a11b9aae49adf1f952427ef1a1d9e793dd6ffb6 upstream.
new_insert_key only makes any sense when it's associated with a new_insert_ptr, which is initialized to NULL and changed to a buffer_head when we also initialize new_insert_key. We can key off of that to avoid the uninitialized warning.
--- fs/reiserfs/ibalance.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/reiserfs/ibalance.c +2 -1
@@ -1153,8 +1153,9 @@ int balance_internal(struct tree_balance insert_ptr); } -memcpy (new_insert_key_addr, &new_insert_key,KEY_SIZE ); insert_ptr[0 ] = new_insert_ptr; +if (new_insert_ptr) +memcpy (new_insert_key_addr, &new_insert_key,KEY_SIZE );return order; }
Greg Kroah-Hartman
maintainerPATCH 2/69 crypto: arm64/aes-ctr - fix NULL dereference in tail processing
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit 2db34e78f126c6001d79d3b66ab1abb482dc7caa upstream.
The AES-CTR glue code avoids calling into the blkcipher API for the tail portion of the walk, by comparing the remainder of walk.nbytes modulo AES_BLOCK_SIZE with the residual nbytes, and jumping straight into the tail processing block if they are equal. This tail processing block checks whether nbytes != 0, and does nothing otherwise.
However, in case of an allocation failure in the blkcipher layer, we may enter this code with walk.nbytes == 0, while nbytes > 0. In this case, we should not dereference the source and destination pointers, since they may be NULL. So instead of checking for nbytes != 0, check for (walk.nbytes % AES_BLOCK_SIZE) != 0, which implies the former in non-error conditions.
--- arch/arm64/crypto/aes-glue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/crypto/aes-glue.c +1 -1
@@ -216,7 +216,7 @@ static int ctr_encrypt(struct blkcipher_ err =blkcipher_walk_done (desc, &walk, walk.nbytes %AES_BLOCK_SIZE ); } -if (nbytes) { +if (walk.nbytes %AES_BLOCK_SIZE ) {u8 *tdst = walk.dst.virt.addr + blocks *AES_BLOCK_SIZE ;u8 *tsrc = walk.src.virt.addr + blocks *AES_BLOCK_SIZE ;u8 __aligned(8) tail[AES_BLOCK_SIZE ];
Greg Kroah-Hartman
maintainerPATCH 3/69 crypto: arm/aes-ctr - fix NULL dereference in tail processing
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit f82e90b28654804ab72881d577d87c3d5c65e2bc upstream.
The AES-CTR glue code avoids calling into the blkcipher API for the tail portion of the walk, by comparing the remainder of walk.nbytes modulo AES_BLOCK_SIZE with the residual nbytes, and jumping straight into the tail processing block if they are equal. This tail processing block checks whether nbytes != 0, and does nothing otherwise.
However, in case of an allocation failure in the blkcipher layer, we may enter this code with walk.nbytes == 0, while nbytes > 0. In this case, we should not dereference the source and destination pointers, since they may be NULL. So instead of checking for nbytes != 0, check for (walk.nbytes % AES_BLOCK_SIZE) != 0, which implies the former in non-error conditions.
--- arch/arm/crypto/aes-ce-glue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/crypto/aes-ce-glue.c +1 -1
@@ -284,7 +284,7 @@ static int ctr_encrypt(struct blkcipher_ err =blkcipher_walk_done (desc, &walk, walk.nbytes %AES_BLOCK_SIZE ); } -if (nbytes) { +if (walk.nbytes %AES_BLOCK_SIZE ) {u8 *tdst = walk.dst.virt.addr + blocks *AES_BLOCK_SIZE ;u8 *tsrc = walk.src.virt.addr + blocks *AES_BLOCK_SIZE ;u8 __aligned(8) tail[AES_BLOCK_SIZE ];
Greg Kroah-Hartman
maintainerPATCH 4/69 crypto: skcipher - Fix blkcipher walk OOM crash
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
commit acdb04d0b36769b3e05990c488dc74d8b7ac8060 upstream.
When we need to allocate a temporary blkcipher_walk_next and it fails, the code is supposed to take the slow path of processing the data block by block. However, due to an unrelated change we instead end up dereferencing the NULL pointer.
This patch fixes it by moving the unrelated bsize setting out of the way so that we enter the slow path as inteded.
--- crypto/blkcipher.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
crypto/blkcipher.c +2 -1
@@ -234,6 +234,8 @@ static int blkcipher_walk_next(struct blreturn blkcipher_walk_done (desc, walk, -EINVAL ); } + bsize =min (walk->walk_blocksize, n); + walk->flags &= ~(BLKCIPHER_WALK_SLOW |BLKCIPHER_WALK_COPY |BLKCIPHER_WALK_DIFF ); if (!scatterwalk_aligned(&walk->in, walk->alignmask) ||
@@ -246,7 +248,6 @@ static int blkcipher_walk_next(struct bl } } - bsize =min (walk->walk_blocksize, n); n =scatterwalk_clamp (&walk->in, n); n =scatterwalk_clamp (&walk->out, n);
Greg Kroah-Hartman
maintainerPATCH 5/69 crypto: echainiv - Replace chaining with multiplication
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
commit 53a5d5ddccf849dbc27a8c1bba0b43c3a45fb792 upstream.
The current implementation uses a global per-cpu array to store data which are used to derive the next IV. This is insecure as the attacker may change the stored data.
This patch removes all traces of chaining and replaces it with multiplication of the salt and the sequence number.
--- crypto/echainiv.c | 115 +++++++++++------------------------------------------- 1 file changed, 24 insertions(+), 91 deletions(-)
crypto/echainiv.c +24 -91
@@ -1,8 +1,8 @@/* * echainiv: Encrypted Chain IV Generator * -* This generator generates an IV based on a sequence number by xoring it -* with a salt and then encrypting it with the same key as used to encrypt +* This generator generates an IV based on a sequence number by multiplying +* it with a salt and then encrypting it with the same key as used to encrypt * the plain text. This algorithm requires that the block size be equal * to the IV size. It is mainly useful for CBC. *
@@ -23,81 +23,17 @@#include <linux/err.h> #include <linux/init.h> #include <linux/kernel.h> -#include <linux/mm.h> #include <linux/module.h> -#include <linux/percpu.h> -#include <linux/spinlock.h> +#include <linux/slab.h> #include <linux/string.h> -#define MAX_IV_SIZE 16 - -static DEFINE_PER_CPU(u32 [MAX_IV_SIZE / sizeof(u32)], echainiv_iv); - -/* We don't care if we get preempted and read/write IVs from the next CPU. */ -static void echainiv_read_iv (u8 *dst,unsigned size) -{ -u32 *a = (u32 *)dst; -u32 __percpu *b = echainiv_iv; - -for (; size >=4 ; size -=4 ) { - *a++ =this_cpu_read (*b); - b++; - } -} - -static void echainiv_write_iv (const u8 *src,unsigned size) -{ -const u32 *a = (const u32 *)src; -u32 __percpu *b = echainiv_iv; - -for (; size >=4 ; size -=4 ) { -this_cpu_write (*b, *a); - a++; - b++; - } -} - -static void echainiv_encrypt_complete2 (struct aead_request *req,int err) -{ -struct aead_request *subreq =aead_request_ctx (req); -struct crypto_aead *geniv; -unsigned int ivsize; - -if (err == -EINPROGRESS ) -return ; - -if (err) - goto out; - - geniv =crypto_aead_reqtfm (req); - ivsize =crypto_aead_ivsize (geniv); - -echainiv_write_iv (subreq->iv, ivsize); - -if (req->iv != subreq->iv) -memcpy (req->iv, subreq->iv, ivsize); - -out: -if (req->iv != subreq->iv) -kzfree (subreq->iv); -} - -static void echainiv_encrypt_complete (struct crypto_async_request *base, -int err) -{ -struct aead_request *req = base->data; - -echainiv_encrypt_complete2 (req, err); -aead_request_complete (req, err); -} -static int echainiv_encrypt (struct aead_request *req) {struct crypto_aead *geniv =crypto_aead_reqtfm (req);struct aead_geniv_ctx *ctx =crypto_aead_ctx (geniv);struct aead_request *subreq =aead_request_ctx (req); -crypto_completion_t compl; -void *data; +__be64 nseqno; +u64 seqno;u8 *info;unsigned int ivsize =crypto_aead_ivsize (geniv);int err;
@@ -107,8 +43,6 @@ static int echainiv_encrypt(struct aead_aead_request_set_tfm (subreq, ctx->child); - compl = echainiv_encrypt_complete; - data = req; info = req->iv;if (req->src != req->dst) {
@@ -123,29 +57,30 @@ static int echainiv_encrypt(struct aead_return err; } -if (unlikely (!IS_ALIGNED ((unsigned long )info, -crypto_aead_alignmask (geniv) +1 ))) { - info =kmalloc (ivsize, req->base.flags & -CRYPTO_TFM_REQ_MAY_SLEEP ?GFP_KERNEL : -GFP_ATOMIC ); -if (!info) -return -ENOMEM ; - -memcpy (info, req->iv, ivsize); - } - -aead_request_set_callback (subreq, req->base.flags, compl, data); +aead_request_set_callback (subreq, req->base.flags, + req->base.complete, req->base.data);aead_request_set_crypt (subreq, req->dst, req->dst, req->cryptlen, info);aead_request_set_ad (subreq, req->assoclen); -crypto_xor (info, ctx->salt, ivsize); +memcpy (&nseqno, info + ivsize -8 ,8 ); + seqno =be64_to_cpu (nseqno); +memset (info,0 , ivsize); +scatterwalk_map_and_copy (info, req->dst, req->assoclen, ivsize,1 ); -echainiv_read_iv (info, ivsize); - err =crypto_aead_encrypt (subreq); -echainiv_encrypt_complete2 (req, err); -return err; +do { +u64 a; + +memcpy (&a, ctx->salt + ivsize -8 ,8 ); + + a |=1 ; + a *= seqno; + +memcpy (info + ivsize -8 , &a,8 ); + }while ((ivsize -=8 )); + +return crypto_aead_encrypt (subreq); }static int echainiv_decrypt (struct aead_request *req)
@@ -192,8 +127,7 @@ static int echainiv_aead_create(struct c alg =crypto_spawn_aead_alg (spawn); err = -EINVAL ; -if (inst->alg.ivsize & (sizeof (u32) -1 ) || - inst->alg.ivsize >MAX_IV_SIZE ) +if (inst->alg.ivsize & (sizeof (u64) -1 ) || !inst->alg.ivsize) goto free_inst; inst->alg.encrypt = echainiv_encrypt;
@@ -202,7 +136,6 @@ static int echainiv_aead_create(struct c inst->alg.init = aead_init_geniv; inst->alg.exit = aead_exit_geniv; - inst->alg.base.cra_alignmask |= __alignof__(u32 ) -1 ; inst->alg.base.cra_ctxsize =sizeof (struct aead_geniv_ctx ); inst->alg.base.cra_ctxsize += inst->alg.ivsize;
Greg Kroah-Hartman
maintainerPATCH 6/69 ocfs2/dlm: fix race between convert and migration
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joseph Qi <[email protected]>
commit e6f0c6e6170fec175fe676495f29029aecdf486c upstream.
Commit ac7cf246dfdb ("ocfs2/dlm: fix race between convert and recovery") checks if lockres master has changed to identify whether new master has finished recovery or not. This will introduce a race that right after old master does umount ( means master will change), a new convert request comes.
In this case, it will reset lockres state to DLM_RECOVERING and then retry convert, and then fail with lockres->l_action being set to OCFS2_AST_INVALID, which will cause inconsistent lock level between ocfs2 and dlm, and then finally BUG.
Since dlm recovery will clear lock->convert_pending in dlm_move_lockres_to_recovery_list, we can use it to correctly identify the race case between convert and recovery. So fix it.
--- fs/ocfs2/dlm/dlmconvert.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
fs/ocfs2/dlm/dlmconvert.c +6 -6
@@ -268,7 +268,6 @@ enum dlm_status dlmconvert_remote(struct struct dlm_lock *lock, int flags, int type) { enum dlm_status status; -u8 old_owner = res->owner;mlog (0 ,"type=%d, convert_type=%d, busy=%d\n" , lock->ml.type, lock->ml.convert_type, res->state &DLM_LOCK_RES_IN_PROGRESS );
@@ -335,7 +334,6 @@ enum dlm_status dlmconvert_remote(structspin_lock (&res->spinlock); res->state &= ~DLM_LOCK_RES_IN_PROGRESS ; - lock->convert_pending =0 ;/* if it failed, move it back to granted queue. * if master returns DLM_NORMAL and then down before sending ast, * it may have already been moved to granted queue, reset to
@@ -344,12 +342,14 @@ enum dlm_status dlmconvert_remote(structif (status !=DLM_NOTQUEUED )dlm_error (status);dlm_revert_pending_convert (res, lock); - }else if ((res->state &DLM_LOCK_RES_RECOVERING ) || - (old_owner != res->owner)) { -mlog (0 ,"res %.*s is in recovering or has been recovered.\n" , - res->lockname.len, res->lockname.name); + }else if (!lock->convert_pending) { +mlog (0 ,"%s: res %.*s, owner died and lock has been moved back " +"to granted list, retry convert.\n" , + dlm->name, res->lockname.len, res->lockname.name); status =DLM_RECOVERING ; } + + lock->convert_pending =0 ; bail:spin_unlock (&res->spinlock);
Greg Kroah-Hartman
maintainerPATCH 7/69 ocfs2: fix start offset to ocfs2_zero_range_for_truncate()
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ashish Samant <[email protected]>
commit d21c353d5e99c56cdd5b5c1183ffbcaf23b8b960 upstream.
If we punch a hole on a reflink such that following conditions are met:
1. start offset is on a cluster boundary
2. end offset is not on a cluster boundary
3. (end offset is somewhere in another extent) or
(hole range > MAX_CONTIG_BYTES(1MB)),
we dont COW the first cluster starting at the start offset. But in this case, we were wrongly passing this cluster to ocfs2_zero_range_for_truncate() to zero out. This will modify the cluster in place and zero it in the source too.
Fix this by skipping this cluster in such a scenario.
To reproduce:
1. Create a random file of say 10 MB
xfs_io -c 'pwrite -b 4k 0 10M' -f 10MBfile
2. Reflink it
reflink -f 10MBfile reflnktest
3. Punch a hole at starting at cluster boundary with range greater that 1MB. You can also use a range that will put the end offset in another extent.
fallocate -p -o 0 -l 1048615 reflnktest
4. sync
5. Check the first cluster in the source file. (It will be zeroed out). dd if=10MBfile iflag=direct bs=<cluster size> count=1 | hexdump -C
--- fs/ocfs2/file.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-)
fs/ocfs2/file.c +26 -12
@@ -1506,7 +1506,8 @@ static int ocfs2_zero_partial_clusters(s u64 start, u64 len) { int ret = 0; -u64 tmpend, end = start + len; +u64 tmpend =0 ; +u64 end = start + len;struct ocfs2_super *osb =OCFS2_SB (inode->i_sb);unsigned int csize = osb->s_clustersize;handle_t *handle;
@@ -1538,18 +1539,31 @@ static int ocfs2_zero_partial_clusters(s }/* -* We want to get the byte offset of the end of the 1st cluster. +* If start is on a cluster boundary and end is somewhere in another +* cluster, we have not COWed the cluster starting at start, unless +* end is also within the same cluster. So, in this case, we skip this +* first call to ocfs2_zero_range_for_truncate() truncate and move on +* to the next one. */ - tmpend = (u64 )osb->s_clustersize + (start & ~(osb->s_clustersize -1 )); -if (tmpend > end) - tmpend = end; - -trace_ocfs2_zero_partial_clusters_range1 ((unsigned long long )start, - (unsigned long long )tmpend); - - ret =ocfs2_zero_range_for_truncate (inode, handle, start, tmpend); -if (ret) -mlog_errno (ret); +if ((start & (csize -1 )) !=0 ) { +/* +* We want to get the byte offset of the end of the 1st +* cluster. +*/ + tmpend = (u64 )osb->s_clustersize + + (start & ~(osb->s_clustersize -1 )); +if (tmpend > end) + tmpend = end; + +trace_ocfs2_zero_partial_clusters_range1 ( + (unsigned long long )start, + (unsigned long long )tmpend); + + ret =ocfs2_zero_range_for_truncate (inode, handle, start, + tmpend); +if (ret) +mlog_errno (ret); + }if (tmpend < end) {/*
Greg Kroah-Hartman
maintainerPATCH 8/69 Revert "ocfs2: bump up o2cb network protocol version"
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxiao Bi <[email protected]>
commit 63b52c4936a2e679639c38ef51a50aa8ca1c5c07 upstream.
This reverts commit 38b52efd218b ("ocfs2: bump up o2cb network protocol version").
This commit made rolling upgrade fail. When one node is upgraded to new version with this commit, the remaining nodes will fail to establish connections to it, then the application like VMs on the remaining nodes can't be live migrated to the upgraded one. This will cause an outage. Since negotiate hb timeout behavior didn't change without this commit, so revert it.
--- fs/ocfs2/cluster/tcp_internal.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
fs/ocfs2/cluster/tcp_internal.h +1 -4
@@ -44,9 +44,6 @@* version here in tcp_internal.h should not need to be bumped for * filesystem locking changes. * -* New in version 12 -* - Negotiate hb timeout when storage is down. -* * New in version 11 * - Negotiation of filesystem locking in the dlm join. *
@@ -78,7 +75,7 @@* - full 64 bit i_size in the metadata lock lvbs * - introduction of "rw" lock and pushing meta/data locking down */ -#define O2NET_PROTOCOL_VERSION 12ULL +#define O2NET_PROTOCOL_VERSION 11ULLstruct o2net_handshake {__be64 protocol_version;__be64 connector_id;
Greg Kroah-Hartman
maintainerPATCH 9/69 autofs: use dentry flags to block walks during expire
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Kent <[email protected]>
commit 7cbdb4a286a60c5d519cb9223fe2134d26870d39 upstream.
Somewhere along the way the autofs expire operation has changed to hold a spin lock over expired dentry selection. The autofs indirect mount expired dentry selection is complicated and quite lengthy so it isn't appropriate to hold a spin lock over the operation.
Commit 47be61845c77 ("fs/dcache.c: avoid soft-lockup in dput()") added a might_sleep() to dput() causing a WARN_ONCE() about this usage to be issued.
But the spin lock doesn't need to be held over this check, the autofs dentry info. flags are enough to block walks into dentrys during the expire.
I've left the direct mount expire as it is (for now) because it is much simpler and quicker than the indirect mount expire and adding spin lock release and re-aquires would do nothing more than add overhead.
--- fs/autofs4/expire.c | 55 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 13 deletions(-)
fs/autofs4/expire.c +42 -13
@@ -417,6 +417,7 @@ static struct dentry *should_expire(stru }return NULL ; } +/* * Find an eligible tree to time-out * A tree is eligible if :-
@@ -432,6 +433,7 @@ struct dentry *autofs4_expire_indirect(sstruct dentry *root = sb->s_root;struct dentry *dentry;struct dentry *expired; +struct dentry *found;struct autofs_info *ino;if (!root)
@@ -442,31 +444,46 @@ struct dentry *autofs4_expire_indirect(s dentry =NULL ;while ((dentry =get_next_positive_subdir (dentry, root))) { +int flags = how; +spin_lock (&sbi->fs_lock); ino =autofs4_dentry_ino (dentry); -if (ino->flags &AUTOFS_INF_WANT_EXPIRE ) - expired =NULL ; -else - expired =should_expire (dentry, mnt, timeout, how); -if (!expired) { +if (ino->flags &AUTOFS_INF_WANT_EXPIRE ) {spin_unlock (&sbi->fs_lock);continue ; } +spin_unlock (&sbi->fs_lock); + + expired =should_expire (dentry, mnt, timeout, flags); +if (!expired) +continue ; + +spin_lock (&sbi->fs_lock); ino =autofs4_dentry_ino (expired); ino->flags |=AUTOFS_INF_WANT_EXPIRE ;spin_unlock (&sbi->fs_lock);synchronize_rcu (); -spin_lock (&sbi->fs_lock); -if (should_expire (expired, mnt, timeout, how)) { -if (expired != dentry) -dput (dentry); - goto found; - } +/* Make sure a reference is not taken on found if +* things have changed. +*/ + flags &= ~AUTOFS_EXP_LEAVES ; + found =should_expire (expired, mnt, timeout, how); +if (!found || found != expired) +/* Something has changed, continue */ + goto next; + +if (expired != dentry) +dput (dentry); + +spin_lock (&sbi->fs_lock); + goto found; +next: +spin_lock (&sbi->fs_lock); ino->flags &= ~AUTOFS_INF_WANT_EXPIRE ; +spin_unlock (&sbi->fs_lock);if (expired != dentry)dput (expired); -spin_unlock (&sbi->fs_lock); }return NULL ;
@@ -483,6 +500,7 @@ int autofs4_expire_wait(struct dentry *dstruct autofs_sb_info *sbi =autofs4_sbi (dentry->d_sb);struct autofs_info *ino =autofs4_dentry_ino (dentry);int status; +int state;/* Block on any pending expire */ if (!(ino->flags &AUTOFS_INF_WANT_EXPIRE ))
@@ -490,8 +508,19 @@ int autofs4_expire_wait(struct dentry *dif (rcu_walk)return -ECHILD ; +retry:spin_lock (&sbi->fs_lock); -if (ino->flags &AUTOFS_INF_EXPIRING ) { + state = ino->flags & (AUTOFS_INF_WANT_EXPIRE |AUTOFS_INF_EXPIRING ); +if (state ==AUTOFS_INF_WANT_EXPIRE ) { +spin_unlock (&sbi->fs_lock); +/* +* Possibly being selected for expire, wait until +* it's selected or not. +*/ +schedule_timeout_uninterruptible (HZ /10 ); + goto retry; + } +if (state &AUTOFS_INF_EXPIRING ) {spin_unlock (&sbi->fs_lock);pr_debug ("waiting for expire %p name=%pd\n" , dentry, dentry);
Greg Kroah-Hartman
maintainerPATCH 10/69 Disable "maybe-uninitialized" warning globally
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Torvalds <[email protected]>
commit 6e8d666e925333c55378e8d5540a8a9ee0eea9c5 upstream.
Several build configurations had already disabled this warning because it generates a lot of false positives. But some had not, and it was still enabled for "allmodconfig" builds, for example.
Looking at the warnings produced, every single one I looked at was a false positive, and the warnings are frequent enough (and big enough) that they can easily hide real problems that you don't notice in the noise generated by -Wmaybe-uninitialized.
The warning is good in theory, but this is a classic case of a warning that causes more problems than the warning can solve.
If gcc gets better at avoiding false positives, we may be able to re-enable this warning. But as is, we're better off without it, and I want to be able to see the *real* warnings.
--- Makefile | 7 ++++--- arch/arc/Makefile | 4 +--- scripts/Makefile.ubsan | 4 ---- 3 files changed, 5 insertions(+), 10 deletions(-)
Makefile +4 -3
@@ -370,7 +370,7 @@ LDFLAGS_MODULE = CFLAGS_KERNEL = AFLAGS_KERNEL = LDFLAGS_vmlinux = -CFLAGS_GCOV = -fprofile-arcs -ftest-coverage -fno-tree-loop-im -Wno-maybe-uninitialized +CFLAGS_GCOV = -fprofile-arcs -ftest-coverage -fno-tree-loop-im CFLAGS_KCOV = -fsanitize-coverage=trace-pc
@@ -619,12 +619,13 @@ ARCH_CFLAGS := include arch/$(SRCARCH)/Makefile KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,) +KBUILD_CFLAGS += $(call cc-disable-warning,maybe-uninitialized,) ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE -KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,) +KBUILD_CFLAGS += -Os else ifdef CONFIG_PROFILE_ALL_BRANCHES -KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,) +KBUILD_CFLAGS += -O2 else KBUILD_CFLAGS += -O2 endif
arch/arc/Makefile +1 -3
@@ -74,9 +74,7 @@ endif ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE # Generic build system uses -O2, we want -O3 # Note: No need to add to cflags-y as that happens anyways -# -# Disable the false maybe-uninitialized warings gcc spits out at -O3 -ARCH_CFLAGS += -O3 $(call cc-disable-warning,maybe-uninitialized,) +ARCH_CFLAGS += -O3 endif # small data is default for elf32 tool-chain. If not usable, disable it
scripts/Makefile.ubsan +0 -4
@@ -14,8 +14,4 @@ ifdef CONFIG_UBSAN ifdef CONFIG_UBSAN_ALIGNMENT CFLAGS_UBSAN += $(call cc-option, -fsanitize=alignment) endif - - # -fsanitize=* options makes GCC less smart than usual and - # increase number of 'maybe-uninitialized false-positives - CFLAGS_UBSAN += $(call cc-option, -Wno-maybe-uninitialized) endif
Greg Kroah-Hartman
maintainerPATCH 12/69 Makefile: Mute warning for __builtin_return_address(>0) for tracing only
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit 377ccbb483738f84400ddf5840c7dd8825716985 upstream.
With the latest gcc compilers, they give a warning if __builtin_return_address() parameter is greater than 0. That is because if it is used by a function called by a top level function (or in the case of the kernel, by assembly), it can try to access stack frames outside the stack and crash the system.
The tracing system uses __builtin_return_address() of up to 2! But it is well aware of the dangers that it may have, and has even added precautions to protect against it (see the thunk code in arch/x86/entry/thunk*.S)
Linus originally added KBUILD_CFLAGS that would suppress the warning for the entire kernel, as simply adding KBUILD_CFLAGS to the tracing directory wouldn't work. The tracing directory plays a bit with the CFLAGS and requires a little more logic.
This adds that special logic to only suppress the warning for the tracing directory. If it is used anywhere else outside of tracing, the warning will still be triggered.
--- Makefile | 1 - kernel/trace/Makefile | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-)
Makefile +0 -1
@@ -620,7 +620,6 @@ include arch/$(SRCARCH)/Makefile KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,) KBUILD_CFLAGS += $(call cc-disable-warning,maybe-uninitialized,) -KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,) ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE KBUILD_CFLAGS += -Os
kernel/trace/Makefile +4 -0
@@ -1,4 +1,8 @@ +# We are fully aware of the dangers of __builtin_return_address() +FRAME_CFLAGS := $(call cc-disable-warning,frame-address) +KBUILD_CFLAGS += $(FRAME_CFLAGS) + # Do not instrument the tracer itself: ifdef CONFIG_FUNCTION_TRACER
Greg Kroah-Hartman
maintainerPATCH 13/69 xfs: prevent dropping ioend completions during buftarg wait
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Foster <[email protected]>
commit 800b2694f890cc35a1bda63501fc71c94389d517 upstream.
xfs_wait_buftarg() waits for all pending I/O, drains the ioend completion workqueue and walks the LRU until all buffers in the cache have been released. This is traditionally an unmount operation` but the mechanism is also reused during filesystem freeze.
xfs_wait_buftarg() invokes drain_workqueue() as part of the quiesce, which is intended more for a shutdown sequence in that it indicates to the queue that new operations are not expected once the drain has begun. New work jobs after this point result in a WARN_ON_ONCE() and are otherwise dropped.
With filesystem freeze, however, read operations are allowed and can proceed during or after the workqueue drain. If such a read occurs during the drain sequence, the workqueue infrastructure complains about the queued ioend completion work item and drops it on the floor. As a result, the buffer remains on the LRU and the freeze never completes.
Despite the fact that the overall buffer cache cleanup is not necessary during freeze, fix up this operation such that it is safe to invoke during non-unmount quiesce operations. Replace the drain_workqueue() call with flush_workqueue(), which runs a similar serialization on pending workqueue jobs without causing new jobs to be dropped. This is safe for unmount as unmount independently locks out new operations by the time xfs_wait_buftarg() is invoked.
--- fs/xfs/xfs_buf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/xfs/xfs_buf.c +1 -1
@@ -1531,7 +1531,7 @@ xfs_wait_buftarg(* ensure here that all reference counts have been dropped before we * start walking the LRU list. */ -drain_workqueue (btp->bt_mount->m_buf_workqueue); +flush_workqueue (btp->bt_mount->m_buf_workqueue);/* loop until there is nothing left on the lru list. */ while (list_lru_count (&btp->bt_lru)) {
Greg Kroah-Hartman
maintainerPATCH 14/69 mm: fix the page_swap_info() BUG_ON check
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Santosh Shilimkar <[email protected]>
commit c8de641b1e9c5489aa6ca57b7836acd68e7563f1 upstream.
Commit 62c230bc1790 ("mm: add support for a filesystem to activate swap files and use direct_IO for writing swap pages") replaced the swap_aops dirty hook from __set_page_dirty_no_writeback() with swap_set_page_dirty().
For normal cases without these special SWP flags code path falls back to __set_page_dirty_no_writeback() so the behaviour is expected to be the same as before.
But swap_set_page_dirty() makes use of the page_swap_info() helper to get the swap_info_struct to check for the flags like SWP_FILE, SWP_BLKDEV etc as desired for those features. This helper has BUG_ON(!PageSwapCache(page)) which is racy and safe only for the set_page_dirty_lock() path.
For the set_page_dirty() path which is often needed for cases to be called from irq context, kswapd() can toggle the flag behind the back while the call is getting executed when system is low on memory and heavy swapping is ongoing.
This ends up with undesired kernel panic.
This patch just moves the check outside the helper to its users appropriately to fix kernel panic for the described path. Couple of users of helpers already take care of SwapCache condition so I skipped them.
--- mm/page_io.c | 3 +++ mm/swapfile.c | 1 - 2 files changed, 3 insertions(+), 1 deletion(-)
mm/page_io.c +3 -0
@@ -262,6 +262,7 @@ int __swap_writepage(struct page *page,int ret, rw =WRITE ;struct swap_info_struct *sis =page_swap_info (page); +BUG_ON (!PageSwapCache (page));if (sis->flags &SWP_FILE ) {struct kiocb kiocb;struct file *swap_file = sis->swap_file;
@@ -333,6 +334,7 @@ int swap_readpage(struct page *page)int ret =0 ;struct swap_info_struct *sis =page_swap_info (page); +BUG_ON (!PageSwapCache (page));VM_BUG_ON_PAGE (!PageLocked (page), page);VM_BUG_ON_PAGE (PageUptodate (page), page);if (frontswap_load (page) ==0 ) {
@@ -381,6 +383,7 @@ int swap_set_page_dirty(struct page *pagif (sis->flags &SWP_FILE ) {struct address_space *mapping = sis->swap_file->f_mapping; +BUG_ON (!PageSwapCache (page));return mapping->a_ops->set_page_dirty (page); }else {return __set_page_dirty_no_writeback (page);
mm/swapfile.c +0 -1
@@ -2724,7 +2724,6 @@ int swapcache_prepare(swp_entry_t entry)struct swap_info_struct *page_swap_info (struct page *page) {swp_entry_t swap = { .val =page_private (page) }; -BUG_ON (!PageSwapCache (page));return swap_info[swp_type (swap)]; }
Greg Kroah-Hartman
maintainerPATCH 15/69 fsnotify: add a way to stop queueing events on group shutdown
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
commit 12703dbfeb15402260e7554d32a34ac40c233990 upstream.
Implement a function that can be called when a group is being shutdown to stop queueing new events to the group. Fanotify will use this.
--- fs/notify/group.c | 19 +++++++++++++++++++ fs/notify/notification.c | 8 +++++++- include/linux/fsnotify_backend.h | 3 +++ 3 files changed, 29 insertions(+), 1 deletion(-)
fs/notify/group.c +19 -0
@@ -40,6 +40,17 @@ static void fsnotify_final_destroy_group }/* +* Stop queueing new events for this group. Once this function returns +* fsnotify_add_event() will not add any new events to the group's queue. +*/ +void fsnotify_group_stop_queueing (struct fsnotify_group *group) +{ +mutex_lock (&group->notification_mutex); + group->shutdown = true; +mutex_unlock (&group->notification_mutex); +} + +/* * Trying to get rid of a group. Remove all marks, flush all events and release * the group reference. * Note that another thread calling fsnotify_clear_marks_by_group() may still
@@ -47,6 +58,14 @@ static void fsnotify_final_destroy_group*/ void fsnotify_destroy_group (struct fsnotify_group *group) { +/* +* Stop queueing new events. The code below is careful enough to not +* require this but fanotify needs to stop queuing events even before +* fsnotify_destroy_group() is called and this makes the other callers +* of fsnotify_destroy_group() to see the same behavior. +*/ +fsnotify_group_stop_queueing (group); +/* clear all inode marks for this group, attach them to destroy_list */ fsnotify_detach_group_marks (group);
fs/notify/notification.c +7 -1
@@ -82,7 +82,8 @@ void fsnotify_destroy_event(struct fsnot* Add an event to the group notification queue. The group can later pull this * event off the queue to deal with. The function returns 0 if the event was * added to the queue, 1 if the event was merged with some other queued event, -* 2 if the queue of events has overflown. +* 2 if the event was not queued - either the queue of events has overflown +* or the group is shutting down. */ int fsnotify_add_event(struct fsnotify_group *group, struct fsnotify_event *event,
@@ -96,6 +97,11 @@ int fsnotify_add_event(struct fsnotify_gmutex_lock (&group->notification_mutex); +if (group->shutdown) { +mutex_unlock (&group->notification_mutex); +return 2 ; + } +if (group->q_len >= group->max_events) { ret =2 ;/* Queue overflow event only if it isn't already queued */
include/linux/fsnotify_backend.h +3 -0
@@ -148,6 +148,7 @@ struct fsnotify_group {#define FS_PRIO_1 1/* fanotify content based access control */ #define FS_PRIO_2 2/* fanotify pre-content access */ unsigned int priority; +bool shutdown;/* group is being shut down, don't queue more events */ /* stores all fastpath marks assoc with this group so they can be cleaned on unregister */ struct mutex mark_mutex;/* protect marks_list */
@@ -303,6 +304,8 @@ extern struct fsnotify_group *fsnotify_aextern void fsnotify_get_group (struct fsnotify_group *group);/* drop reference on a group from fsnotify_alloc_group */ extern void fsnotify_put_group (struct fsnotify_group *group); +/* group destruction begins, stop queuing new events */ +extern void fsnotify_group_stop_queueing (struct fsnotify_group *group);/* destroy group */ extern void fsnotify_destroy_group (struct fsnotify_group *group);/* fasync handler function */
Greg Kroah-Hartman
maintainerPATCH 16/69 fanotify: fix list corruption in fanotify_get_response()
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
commit 96d41019e3ac55f6f0115b0ce97e4f24a3d636d2 upstream.
fanotify_get_response() calls fsnotify_remove_event() when it finds that group is being released from fanotify_release() (bypass_perm is set).
However the event it removes need not be only in the group's notification queue but it can have already moved to access_list (userspace read the event before closing the fanotify instance fd) which is protected by a different lock. Thus when fsnotify_remove_event() races with fanotify_release() operating on access_list, the list can get corrupted.
Fix the problem by moving all the logic removing permission events from the lists to one place - fanotify_release().
--- fs/notify/fanotify/fanotify.c | 13 +------------ fs/notify/fanotify/fanotify_user.c | 36 ++++++++++++++++++++++++------------ fs/notify/notification.c | 15 --------------- include/linux/fsnotify_backend.h | 3 --- 4 files changed, 25 insertions(+), 42 deletions(-)
fs/notify/fanotify/fanotify.c +1 -12
@@ -67,18 +67,7 @@ static int fanotify_get_response(structpr_debug ("%s: group=%p event=%p\n" , __func__, group, event); -wait_event (group->fanotify_data.access_waitq, event->response || -atomic_read (&group->fanotify_data.bypass_perm)); - -if (!event->response) {/* bypass_perm set */ -/* -* Event was canceled because group is being destroyed. Remove -* it from group's event list because we are responsible for -* freeing the permission event. -*/ -fsnotify_remove_event (group, &event->fae.fse); -return 0 ; - } +wait_event (group->fanotify_data.access_waitq, event->response);/* userspace responded, convert to something usable */ switch (event->response) {
fs/notify/fanotify/fanotify_user.c +24 -12
@@ -358,16 +358,20 @@ static int fanotify_release(struct inode#ifdef CONFIG_FANOTIFY_ACCESS_PERMISSIONS struct fanotify_perm_event_info *event, *next; +struct fsnotify_event *fsn_event;/* -* There may be still new events arriving in the notification queue -* but since userspace cannot use fanotify fd anymore, no event can -* enter or leave access_list by now. +* Stop new events from arriving in the notification queue. since +* userspace cannot use fanotify fd anymore, no event can enter or +* leave access_list by now either. */ -spin_lock (&group->fanotify_data.access_lock); - -atomic_inc (&group->fanotify_data.bypass_perm); +fsnotify_group_stop_queueing (group); +/* +* Process all permission events on access_list and notification queue +* and simulate reply from userspace. +*/ +spin_lock (&group->fanotify_data.access_lock);list_for_each_entry_safe (event, next, &group->fanotify_data.access_list, fae.fse.list) { pr_debug("%s: found group=%p event=%p\n", __func__, group,
@@ -379,12 +383,21 @@ static int fanotify_release(struct inodespin_unlock (&group->fanotify_data.access_lock);/* -* Since bypass_perm is set, newly queued events will not wait for -* access response. Wake up the already sleeping ones now. -* synchronize_srcu() in fsnotify_destroy_group() will wait for all -* processes sleeping in fanotify_handle_event() waiting for access -* response and thus also for all permission events to be freed. +* Destroy all non-permission events. For permission events just +* dequeue them and set the response. They will be freed once the +* response is consumed and fanotify_get_response() returns. */ +mutex_lock (&group->notification_mutex); +while (!fsnotify_notify_queue_is_empty (group)) { + fsn_event =fsnotify_remove_first_event (group); +if (!(fsn_event->mask &FAN_ALL_PERM_EVENTS )) +fsnotify_destroy_event (group, fsn_event); +else +FANOTIFY_PE (fsn_event)->response =FAN_ALLOW ; + } +mutex_unlock (&group->notification_mutex); + +/* Response for all permission events it set, wakeup waiters */ wake_up (&group->fanotify_data.access_waitq);#endif
@@ -755,7 +768,6 @@ SYSCALL_DEFINE2(fanotify_init, unsignedspin_lock_init (&group->fanotify_data.access_lock);init_waitqueue_head (&group->fanotify_data.access_waitq);INIT_LIST_HEAD (&group->fanotify_data.access_list); -atomic_set (&group->fanotify_data.bypass_perm,0 );#endif switch (flags &FAN_ALL_CLASS_BITS ) {case FAN_CLASS_NOTIF :
fs/notify/notification.c +0 -15
@@ -132,21 +132,6 @@ queue: }/* -* Remove @event from group's notification queue. It is the responsibility of -* the caller to destroy the event. -*/ -void fsnotify_remove_event (struct fsnotify_group *group, -struct fsnotify_event *event) -{ -mutex_lock (&group->notification_mutex); -if (!list_empty (&event->list)) { -list_del_init (&event->list); - group->q_len--; - } -mutex_unlock (&group->notification_mutex); -} - -/* * Remove and return the first event from the notification list. It is the * responsibility of the caller to destroy the obtained event */
include/linux/fsnotify_backend.h +0 -3
@@ -180,7 +180,6 @@ struct fsnotify_group {spinlock_t access_lock;struct list_head access_list;wait_queue_head_t access_waitq; -atomic_t bypass_perm;#endif /* CONFIG_FANOTIFY_ACCESS_PERMISSIONS */ int f_flags;unsigned int max_marks;
@@ -318,8 +317,6 @@ extern int fsnotify_add_event(struct fsnstruct fsnotify_event *event, int (*merge)(struct list_head *, struct fsnotify_event *)); -/* Remove passed event from groups notification queue */ -extern void fsnotify_remove_event (struct fsnotify_group *group,struct fsnotify_event *event);/* true if the group notification queue is empty */ extern bool fsnotify_notify_queue_is_empty (struct fsnotify_group *group);/* return, but do not dequeue the first event on the notification queue */
Greg Kroah-Hartman
maintainerPATCH 17/69 mm: memcontrol: make per-cpu charge cache IRQ-safe for socket accounting
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Weiner <[email protected]>
commit db2ba40c277dc545bab531671c3f45ac0afea6f8 upstream.
During cgroup2 rollout into production, we started encountering css refcount underflows and css access crashes in the memory controller. Splitting the heavily shared css reference counter into logical users narrowed the imbalance down to the cgroup2 socket memory accounting.
The problem turns out to be the per-cpu charge cache. Cgroup1 had a separate socket counter, but the new cgroup2 socket accounting goes through the common charge path that uses a shared per-cpu cache for all memory that is being tracked. Those caches are safe against scheduling preemption, but not against interrupts - such as the newly added packet receive path. When cache draining is interrupted by network RX taking pages out of the cache, the resuming drain operation will put references of in-use pages, thus causing the imbalance.
Disable IRQs during all per-cpu charge cache operations.
--- mm/memcontrol.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-)
mm/memcontrol.c +22 -9
@@ -1797,17 +1797,22 @@ static DEFINE_MUTEX(percpu_charge_mutex)static bool consume_stock (struct mem_cgroup *memcg,unsigned int nr_pages) {struct memcg_stock_pcp *stock; +unsigned long flags;bool ret = false;if (nr_pages >CHARGE_BATCH )return ret; - stock = &get_cpu_var (memcg_stock); +local_irq_save (flags); + + stock =this_cpu_ptr (&memcg_stock);if (memcg == stock->cached && stock->nr_pages >= nr_pages) { stock->nr_pages -= nr_pages; ret = true; } -put_cpu_var (memcg_stock); + +local_irq_restore (flags); +return ret; }
@@ -1828,15 +1833,18 @@ static void drain_stock(struct memcg_sto stock->cached =NULL ; } -/* -* This must be called under preempt disabled or must be called by -* a thread which is pinned to local cpu. -*/ static void drain_local_stock (struct work_struct *dummy) { -struct memcg_stock_pcp *stock =this_cpu_ptr (&memcg_stock); +struct memcg_stock_pcp *stock; +unsigned long flags; + +local_irq_save (flags); + + stock =this_cpu_ptr (&memcg_stock);drain_stock (stock);clear_bit (FLUSHING_CACHED_CHARGE , &stock->flags); + +local_irq_restore (flags); }/*
@@ -1845,14 +1853,19 @@ static void drain_local_stock(struct wor*/ static void refill_stock (struct mem_cgroup *memcg,unsigned int nr_pages) { -struct memcg_stock_pcp *stock = &get_cpu_var (memcg_stock); +struct memcg_stock_pcp *stock; +unsigned long flags; + +local_irq_save (flags); + stock =this_cpu_ptr (&memcg_stock);if (stock->cached != memcg) {/* reset if necessary */ drain_stock (stock); stock->cached = memcg; } stock->nr_pages += nr_pages; -put_cpu_var (memcg_stock); + +local_irq_restore (flags); }/*
Greg Kroah-Hartman
maintainerPATCH 18/69 cgroup: duplicate cgroup reference when cloning sockets
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Weiner <[email protected]>
commit d979a39d7242e0601bf9b60e89628fb8ac577179 upstream.
When a socket is cloned, the associated sock_cgroup_data is duplicated but not its reference on the cgroup. As a result, the cgroup reference count will underflow when both sockets are destroyed later on.
--- kernel/cgroup.c | 6 ++++++ net/core/sock.c | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-)
kernel/cgroup.c +6 -0
@@ -6240,6 +6240,12 @@ void cgroup_sk_alloc(struct sock_cgroup_if (cgroup_sk_alloc_disabled)return ; +/* Socket clone path */ +if (skcd->val) { +cgroup_get (sock_cgroup_ptr (skcd)); +return ; + } +rcu_read_lock ();while (true) {
net/core/sock.c +4 -1
@@ -1362,7 +1362,6 @@ static struct sock *sk_prot_alloc(structif (!try_module_get (prot->owner)) goto out_free_sec;sk_tx_queue_clear (sk); -cgroup_sk_alloc (&sk->sk_cgrp_data); }return sk;
@@ -1422,6 +1421,7 @@ struct sock *sk_alloc(struct net *net, isock_net_set (sk, net);atomic_set (&sk->sk_wmem_alloc,1 ); +cgroup_sk_alloc (&sk->sk_cgrp_data);sock_update_classid (&sk->sk_cgrp_data);sock_update_netprioidx (&sk->sk_cgrp_data); }
@@ -1566,6 +1566,9 @@ struct sock *sk_clone_lock(const struct newsk->sk_priority =0 ; newsk->sk_incoming_cpu =raw_smp_processor_id ();atomic64_set (&newsk->sk_cookie,0 ); + +cgroup_sk_alloc (&newsk->sk_cgrp_data); +/* * Before updating sk_refcnt, we must commit prior changes to memory * (Documentation/RCU/rculist_nulls.txt for details)
Greg Kroah-Hartman
maintainerPATCH 19/69 fix fault_in_multipages_...() on architectures with no-op access_ok()
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit e23d4159b109167126e5bcd7f3775c95de7fee47 upstream.
Switching iov_iter fault-in to multipages variants has exposed an old bug in underlying fault_in_multipages_...(); they break if the range passed to them wraps around. Normally access_ok() done by callers will prevent such (and it's a guaranteed EFAULT - ERR_PTR() values fall into such a range and they should not point to any valid objects).
However, on architectures where userland and kernel live in different MMU contexts (e.g. s390) access_ok() is a no-op and on those a range with a wraparound can reach fault_in_multipages_...().
Since any wraparound means EFAULT there, the fix is trivial - turn those
while (uaddr <= end)
...
into
if (unlikely(uaddr > end))
return -EFAULT;
do
...
while (uaddr <= end);--- include/linux/pagemap.h | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-)
include/linux/pagemap.h +19 -19
@@ -571,56 +571,56 @@ static inline int fault_in_pages_readabl*/ static inline int fault_in_multipages_writeable (char __user *uaddr,int size) { -int ret =0 ;char __user *end = uaddr + size -1 ;if (unlikely (size ==0 )) -return ret; +return 0 ; +if (unlikely (uaddr > end)) +return -EFAULT ;/* * Writing zeroes into userspace here is OK, because we know that if * the zero gets there, we'll be overwriting it. */ -while (uaddr <= end) { - ret =__put_user (0 , uaddr); -if (ret !=0 ) -return ret; +do { +if (unlikely (__put_user (0 , uaddr) !=0 )) +return -EFAULT ; uaddr +=PAGE_SIZE ; - } + }while (uaddr <= end);/* Check whether the range spilled into the next page. */ if (((unsigned long )uaddr &PAGE_MASK ) == ((unsigned long )end &PAGE_MASK )) - ret =__put_user (0 , end); +return __put_user (0 , end); -return ret; +return 0 ; }static inline int fault_in_multipages_readable (const char __user *uaddr,int size) {volatile char c; -int ret =0 ;const char __user *end = uaddr + size -1 ;if (unlikely (size ==0 )) -return ret; +return 0 ; + +if (unlikely (uaddr > end)) +return -EFAULT ; -while (uaddr <= end) { - ret =__get_user (c, uaddr); -if (ret !=0 ) -return ret; +do { +if (unlikely (__get_user (c, uaddr) !=0 )) +return -EFAULT ; uaddr +=PAGE_SIZE ; - } + }while (uaddr <= end);/* Check whether the range spilled into the next page. */ if (((unsigned long )uaddr &PAGE_MASK ) == ((unsigned long )end &PAGE_MASK )) { - ret =__get_user (c, end); - (void )c; +return __get_user (c, end); } -return ret; +return 0 ; } int add_to_page_cache_locked(struct page *page, struct address_space *mapping,
Greg Kroah-Hartman
maintainerPATCH 20/69 KEYS: Fix skcipher IV clobbering
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
commit 456bee986e0a372ad4beed5d3cedb3622633d9df upstream.
The IV must not be modified by the skcipher operation so we need to duplicate it.
--- security/keys/encrypted-keys/encrypted.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
security/keys/encrypted-keys/encrypted.c +7 -4
@@ -29,6 +29,7 @@#include <linux/rcupdate.h> #include <linux/scatterlist.h> #include <linux/ctype.h> +#include <crypto/aes.h> #include <crypto/hash.h> #include <crypto/sha.h> #include <crypto/skcipher.h>
@@ -478,6 +479,7 @@ static int derived_key_encrypt(struct enstruct crypto_skcipher *tfm;struct skcipher_request *req;unsigned int encrypted_datalen; +u8 iv[AES_BLOCK_SIZE ];unsigned int padlen;char pad[16 ];int ret;
@@ -500,8 +502,8 @@ static int derived_key_encrypt(struct ensg_init_table (sg_out,1 );sg_set_buf (sg_out, epayload->encrypted_data, encrypted_datalen); -skcipher_request_set_crypt (req, sg_in, sg_out, encrypted_datalen, - epayload->iv); +memcpy (iv, epayload->iv,sizeof (iv)); +skcipher_request_set_crypt (req, sg_in, sg_out, encrypted_datalen, iv); ret =crypto_skcipher_encrypt (req); tfm =crypto_skcipher_reqtfm (req);skcipher_request_free (req);
@@ -581,6 +583,7 @@ static int derived_key_decrypt(struct enstruct crypto_skcipher *tfm;struct skcipher_request *req;unsigned int encrypted_datalen; +u8 iv[AES_BLOCK_SIZE ];char pad[16 ];int ret;
@@ -599,8 +602,8 @@ static int derived_key_decrypt(struct en epayload->decrypted_datalen);sg_set_buf (&sg_out[1 ], pad,sizeof pad); -skcipher_request_set_crypt (req, sg_in, sg_out, encrypted_datalen, - epayload->iv); +memcpy (iv, epayload->iv,sizeof (iv)); +skcipher_request_set_crypt (req, sg_in, sg_out, encrypted_datalen, iv); ret =crypto_skcipher_decrypt (req); tfm =crypto_skcipher_reqtfm (req);skcipher_request_free (req);
Greg Kroah-Hartman
maintainerPATCH 21/69 arm64: Call numa_store_cpu_info() earlier.
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Daney <[email protected]>
commit c18df0adabf8400c1825b90382d06df5edc303fa upstream.
The wq_numa_init() function makes a private CPU to node map by calling cpu_to_node() early in the boot process, before the non-boot CPUs are brought online. Since the default implementation of cpu_to_node() returns zero for CPUs that have never been brought online, the workqueue system's view is that *all* CPUs are on node zero.
When the unbound workqueue for a non-zero node is created, the tsk_cpus_allowed() for the worker threads is the empty set because there are, in the view of the workqueue system, no CPUs on non-zero nodes. The code in try_to_wake_up() using this empty cpumask ends up using the cpumask empty set value of NR_CPUS as an index into the per-CPU area pointer array, and gets garbage as it is one past the end of the array. This results in:
[ 0.881970] Unable to handle kernel paging request at virtual address fffffb1008b926a4 [ 1.970095] pgd = fffffc00094b0000 [ 1.973530] [fffffb1008b926a4] *pgd=0000000000000000, *pud=0000000000000000, *pmd=0000000000000000 [ 1.982610] Internal error: Oops: 96000004 [#1] SMP [ 1.987541] Modules linked in: [ 1.990631] CPU: 48 PID: 295 Comm: cpuhp/48 Tainted: G W 4.8.0-rc6-preempt-vol+ #9 [ 1.999435] Hardware name: Cavium ThunderX CN88XX board (DT) [ 2.005159] task: fffffe0fe89cc300 task.stack: fffffe0fe8b8c000 [ 2.011158] PC is at try_to_wake_up+0x194/0x34c [ 2.015737] LR is at try_to_wake_up+0x150/0x34c [ 2.020318] pc : [<fffffc00080e7468>] lr : [<fffffc00080e7424>] pstate: 600000c5 [ 2.027803] sp : fffffe0fe8b8fb10 [ 2.031149] x29: fffffe0fe8b8fb10 x28: 0000000000000000 [ 2.036522] x27: fffffc0008c63bc8 x26: 0000000000001000 [ 2.041896] x25: fffffc0008c63c80 x24: fffffc0008bfb200 [ 2.047270] x23: 00000000000000c0 x22: 0000000000000004 [ 2.052642] x21: fffffe0fe89d25bc x20: 0000000000001000 [ 2.058014] x19: fffffe0fe89d1d00 x18: 0000000000000000 [ 2.063386] x17: 0000000000000000 x16: 0000000000000000 [ 2.068760] x15: 0000000000000018 x14: 0000000000000000 [ 2.074133] x13: 0000000000000000 x12: 0000000000000000 [ 2.079505] x11: 0000000000000000 x10: 0000000000000000 [ 2.084879] x9 : 0000000000000000 x8 : 0000000000000000 [ 2.090251] x7 : 0000000000000040 x6 : 0000000000000000 [ 2.095621] x5 : ffffffffffffffff x4 : 0000000000000000 [ 2.100991] x3 : 0000000000000000 x2 : 0000000000000000 [ 2.106364] x1 : fffffc0008be4c24 x0 : ffffff0ffffada80 [ 2.111737] [ 2.113236] Process cpuhp/48 (pid: 295, stack limit = 0xfffffe0fe8b8c020) [ 2.120102] Stack: (0xfffffe0fe8b8fb10 to 0xfffffe0fe8b90000) [ 2.125914] fb00: fffffe0fe8b8fb80 fffffc00080e7648 . . . [ 2.442859] Call trace: [ 2.445327] Exception stack(0xfffffe0fe8b8f940 to 0xfffffe0fe8b8fa70) [ 2.451843] f940: fffffe0fe89d1d00 0000040000000000 fffffe0fe8b8fb10 fffffc00080e7468 [ 2.459767] f960: fffffe0fe8b8f980 fffffc00080e4958 ffffff0ff91ab200 fffffc00080e4b64 [ 2.467690] f980: fffffe0fe8b8f9d0 fffffc00080e515c fffffe0fe8b8fa80 0000000000000000 [ 2.475614] f9a0: fffffe0fe8b8f9d0 fffffc00080e58e4 fffffe0fe8b8fa80 0000000000000000 [ 2.483540] f9c0: fffffe0fe8d10000 0000000000000040 fffffe0fe8b8fa50 fffffc00080e5ac4 [ 2.491465] f9e0: ffffff0ffffada80 fffffc0008be4c24 0000000000000000 0000000000000000 [ 2.499387] fa00: 0000000000000000 ffffffffffffffff 0000000000000000 0000000000000040 [ 2.507309] fa20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 [ 2.515233] fa40: 0000000000000000 0000000000000000 0000000000000000 0000000000000018 [ 2.523156] fa60: 0000000000000000 0000000000000000 [ 2.528089] [<fffffc00080e7468>] try_to_wake_up+0x194/0x34c [ 2.533723] [<fffffc00080e7648>] wake_up_process+0x28/0x34 [ 2.539275] [<fffffc00080d3764>] create_worker+0x110/0x19c [ 2.544824] [<fffffc00080d69dc>] alloc_unbound_pwq+0x3cc/0x4b0 [ 2.550724] [<fffffc00080d6bcc>] wq_update_unbound_numa+0x10c/0x1e4 [ 2.557066] [<fffffc00080d7d78>] workqueue_online_cpu+0x220/0x28c [ 2.563234] [<fffffc00080bd288>] cpuhp_invoke_callback+0x6c/0x168 [ 2.569398] [<fffffc00080bdf74>] cpuhp_up_callbacks+0x44/0xe4 [ 2.575210] [<fffffc00080be194>] cpuhp_thread_fun+0x13c/0x148 [ 2.581027] [<fffffc00080dfbac>] smpboot_thread_fn+0x19c/0x1a8 [ 2.586929] [<fffffc00080dbd64>] kthread+0xdc/0xf0 [ 2.591776] [<fffffc0008083380>] ret_from_fork+0x10/0x50 [ 2.597147] Code: b00057e1 91304021 91005021 b8626822 (b8606821) [ 2.603464] ---[ end trace 58c0cd36b88802bc ]--- [ 2.608138] Kernel panic - not syncing: Fatal exception
Fix by moving call to numa_store_cpu_info() for all CPUs into smp_prepare_cpus(), which happens before wq_numa_init(). Since smp_store_cpu_info() now contains only a single function call, simplify by removing the function and out-lining its contents.
--- arch/arm64/kernel/smp.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
arch/arm64/kernel/smp.c +6 -8
@@ -201,12 +201,6 @@ int __cpu_up(unsigned int cpu, struct tareturn ret; } -static void smp_store_cpu_info (unsigned int cpuid) -{ -store_cpu_topology (cpuid); -numa_store_cpu_info (cpuid); -} -/* * This is the secondary CPU boot entry. We're using this CPUs * idle thread stack, but a set of temporary page tables.
@@ -254,7 +248,7 @@ asmlinkage void secondary_start_kernel(v*/ notify_cpu_starting (cpu); -smp_store_cpu_info (cpu); +store_cpu_topology (cpu);/* * OK, now it's safe to let the boot CPU continue. Wait for
@@ -687,10 +681,13 @@ void __init smp_prepare_cpus(unsigned in {int err;unsigned int cpu; +unsigned int this_cpu;init_cpu_topology (); -smp_store_cpu_info (smp_processor_id ()); + this_cpu =smp_processor_id (); +store_cpu_topology (this_cpu); +numa_store_cpu_info (this_cpu);/* * If UP is mandated by "nosmp" (which implies "maxcpus=0"), don't set
@@ -717,6 +714,7 @@ void __init smp_prepare_cpus(unsigned incontinue ;set_cpu_present (cpu, true); +numa_store_cpu_info (cpu); } }
Greg Kroah-Hartman
maintainerPATCH 22/69 configfs: Return -EFBIG from configfs_write_bin_file.
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Turnbull <[email protected]>
commit 42857cf512cb34c2c8cb50f1e766689d979d64e0 upstream.
The check for writing more than cb_max_size bytes does not 'goto out' so it is a no-op which allows users to vmalloc an arbitrary amount.
--- fs/configfs/file.c | 1 + 1 file changed, 1 insertion(+)
fs/configfs/file.c +1 -0
@@ -333,6 +333,7 @@ configfs_write_bin_file(struct file *filif (bin_attr->cb_max_size && *ppos + count > bin_attr->cb_max_size) { len = -EFBIG ; + goto out; } tbuf =vmalloc (*ppos + count);
Greg Kroah-Hartman
maintainerPATCH 24/69 mtd: maps: sa1100-flash: potential NULL dereference
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit dc01a28d80a42cef08c94dfc595565aaebe46d15 upstream.
We check for NULL but then dereference "info->mtd" on the next line.
--- drivers/mtd/maps/sa1100-flash.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/mtd/maps/sa1100-flash.c +3 -1
@@ -230,8 +230,10 @@ static struct sa_info *sa1100_setup_mtd( info->mtd =mtd_concat_create (cdev, info->num_subdev, plat->name); -if (info->mtd ==NULL ) +if (info->mtd ==NULL ) { ret = -ENXIO ; + goto err; + } } info->mtd->dev.parent = &pdev->dev;
Greg Kroah-Hartman
maintainerPATCH 25/69 mtd: pmcmsp-flash: Allocating too much in init_msp_flash()
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 79ad07d45743721010e766e65dc004ad249bd429 upstream.
There is a cut and paste issue here. The bug is that we are allocating more memory than necessary for msp_maps. We should be allocating enough space for a map_info struct (144 bytes) but we instead allocate enough for an mtd_info struct (1840 bytes). It's a small waste.
The other part of this is not harmful but when we allocated msp_flash then we allocated enough space fro a map_info pointer instead of an mtd_info pointer. But since pointers are the same size it works out fine.
Anyway, I decided to clean up all three allocations a bit to make them a bit more consistent and clear.
--- drivers/mtd/maps/pmcmsp-flash.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/mtd/maps/pmcmsp-flash.c +3 -3
@@ -75,15 +75,15 @@ static int __init init_msp_flash(void)printk (KERN_NOTICE "Found %d PMC flash devices\n" , fcnt); - msp_flash =kmalloc (fcnt *sizeof (struct map_info *),GFP_KERNEL ); + msp_flash =kcalloc (fcnt,sizeof (*msp_flash),GFP_KERNEL );if (!msp_flash)return -ENOMEM ; - msp_parts =kmalloc (fcnt *sizeof (struct mtd_partition *),GFP_KERNEL ); + msp_parts =kcalloc (fcnt,sizeof (*msp_parts),GFP_KERNEL );if (!msp_parts) goto free_msp_flash; - msp_maps =kcalloc (fcnt,sizeof (struct mtd_info ),GFP_KERNEL ); + msp_maps =kcalloc (fcnt,sizeof (*msp_maps),GFP_KERNEL );if (!msp_maps) goto free_msp_parts;
Greg Kroah-Hartman
maintainerPATCH 26/69 mtd: spi-nor: fix wrong "fully unlocked" test
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Norris <[email protected]>
commit 06586204714b7befec99e554c71687b0b40f351c upstream.
In stm_unlock(), the test to determine whether we've fully unlocked the flash checks for the lock length to be equal to the flash size. That is a typo/think-o -- the condition actually means the flash is completely *locked.* We should be using the inverse condition -- that the lock length is 0 (i.e., no protection).
The result of this bug is that we never actually turn off the Status Register Write Disable bit, even if the flash is completely unlocked. Now we can.
--- drivers/mtd/spi-nor/spi-nor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/spi-nor/spi-nor.c +1 -1
@@ -661,7 +661,7 @@ static int stm_unlock(struct spi_nor *no status_new = (status_old & ~mask & ~SR_TB ) | val;/* Don't protect status register if we're fully unlocked */ -if (lock_len == mtd->size) +if (lock_len ==0 ) status_new &= ~SR_SRWD ;if (!use_top)
Greg Kroah-Hartman
maintainerPATCH 27/69 reset: Return -ENOTSUPP when not configured
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Youn <[email protected]>
commit 168d7c4e8bb25c076ed8be67fcca84f5dcd0b2c6 upstream.
Prior to commit 6c96f05c8bb8 ("reset: Make [of_]reset_control_get[_foo] functions wrappers"), the "optional" functions returned -ENOTSUPP when CONFIG_RESET_CONTROLLER was not set.
Revert back to the old behavior by changing the new __devm_reset_control_get() and __of_reset_control_get() functions to return ERR_PTR(-ENOTSUPP) when compiled without CONFIG_RESET_CONTROLLER.
Otherwise they will return -EINVAL causing users to think that an error occurred when CONFIG_RESET_CONTROLLER is not set.
--- include/linux/reset.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/reset.h +2 -2
@@ -71,14 +71,14 @@ static inline struct reset_control *__ofstruct device_node *node, const char *id, int index, int shared) { - return ERR_PTR(-EINVAL); + return ERR_PTR(-ENOTSUPP); }static inline struct reset_control *__devm_reset_control_get (struct device *dev,const char *id,int index,int shared) { -return ERR_PTR (-EINVAL ); +return ERR_PTR (-ENOTSUPP ); }#endif /* CONFIG_RESET_CONTROLLER */
Greg Kroah-Hartman
maintainerPATCH 28/69 rtc: ds1307: Fix relying on reset value for weekday
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keerthy <[email protected]>
commit e29385fab0bf94017fac130ee32f5bb2daf74417 upstream.
The reset value of weekday is 0x1. This is wrong since the reset values of the day/month/year make up to Jan 1 2001. When computed weekday comes out to be Monday. On a scale of 1-7(Sunday - Saturday) it should be 0x2. So we should not be relying on the reset value.
Hence compute the wday using the current date/month/year values. Check if reset wday is any different from the computed wday, If different then set the wday which we computed using date/month/year values.
Document Referred:
http://ww1.microchip.com/downloads/en/DeviceDoc/20002266F.pdf
--- drivers/rtc/rtc-ds1307.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-)
drivers/rtc/rtc-ds1307.c +27 -1
@@ -602,6 +602,8 @@ static const struct rtc_class_ops ds13xx* Alarm support for mcp794xx devices. */ +#define MCP794XX_REG_WEEKDAY 0x3 +#define MCP794XX_REG_WEEKDAY_WDAY_MASK 0x7#define MCP794XX_REG_CONTROL 0x07# define MCP794XX_BIT_ALM0_EN 0x10# define MCP794XX_BIT_ALM1_EN 0x20
@@ -1231,13 +1233,16 @@ static int ds1307_probe(struct i2c_clien {struct ds1307 *ds1307;int err = -ENODEV ; -int tmp; +int tmp, wday;struct chip_desc *chip = &chips[id->driver_data];struct i2c_adapter *adapter =to_i2c_adapter (client->dev.parent);bool want_irq = false;bool ds1307_can_wakeup_device = false;unsigned char *buf;struct ds1307_platform_data *pdata =dev_get_platdata (&client->dev); +struct rtc_time tm; +unsigned long timestamp; +irq_handler_t irq_handler = ds1307_irq;static const int bbsqi_bitpos[] = {
@@ -1526,6 +1531,27 @@ read_rtc: bin2bcd(tmp)); } +/* +* Some IPs have weekday reset value = 0x1 which might not correct +* hence compute the wday using the current date/month/year values +*/ +ds1307_get_time (&client->dev, &tm); + wday = tm.tm_wday; + timestamp =rtc_tm_to_time64 (&tm); +rtc_time64_to_tm (timestamp, &tm); + +/* +* Check if reset wday is different from the computed wday +* If different then set the wday which we computed using +* timestamp +*/ +if (wday != tm.tm_wday) { + wday =i2c_smbus_read_byte_data (client,MCP794XX_REG_WEEKDAY ); + wday = wday & ~MCP794XX_REG_WEEKDAY_WDAY_MASK ; + wday = wday | (tm.tm_wday +1 ); +i2c_smbus_write_byte_data (client,MCP794XX_REG_WEEKDAY , wday); + } +if (want_irq) {device_set_wakeup_capable (&client->dev, true);set_bit (HAS_ALARM , &ds1307->flags);
Greg Kroah-Hartman
maintainerPATCH 29/69 power: reset: hisi-reboot: Unmap region obtained by of_iomap
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arvind Yadav <[email protected]>
commit bae170efd6c42bf116f513a1dd07639d68fa71b9 upstream.
Free memory mapping, if probe is not successful.
--- drivers/power/reset/hisi-reboot.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/power/reset/hisi-reboot.c +4 -1
@@ -53,13 +53,16 @@ static int hisi_reboot_probe(struct platif (of_property_read_u32 (np,"reboot-offset" , &reboot_offset) <0 ) {pr_err ("failed to find reboot-offset property\n" ); +iounmap (base);return -EINVAL ; } err =register_restart_handler (&hisi_restart_nb); -if (err) +if (err) {dev_err (&pdev->dev,"cannot register restart handler (err=%d)\n" , err); +iounmap (base); + }return err; }
Greg Kroah-Hartman
maintainerPATCH 30/69 mac80211: reject TSPEC TIDs (TSIDs) for aggregation
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
commit 85d5313ed717ad60769491c7c072d23bc0a68e7a upstream.
Since mac80211 doesn't currently support TSIDs 8-15 which can only be used after QoS TSPEC negotiation (and not even after WMM negotiation), reject attempts to set up aggregation sessions for them, which might confuse drivers. In mac80211 we do correctly handle that, but the TSIDs should never get used anyway, and drivers might not be able to handle it.
--- net/mac80211/agg-rx.c | 8 +++++++- net/mac80211/agg-tx.c | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-)
net/mac80211/agg-rx.c +7 -1
@@ -261,10 +261,16 @@ void __ieee80211_start_rx_ba_session(str .timeout = timeout, .ssn = start_seq_num, }; -int i, ret = -EOPNOTSUPP ;u16 status =WLAN_STATUS_REQUEST_DECLINED ; +if (tid >=IEEE80211_FIRST_TSPEC_TSID ) { +ht_dbg (sta->sdata, +"STA %pM requests BA session on unsupported tid %d\n" , + sta->sta.addr, tid); + goto end_no_lock; + } +if (!sta->sta.ht_cap.ht_supported) { ht_dbg(sta->sdata, "STA %pM erroneously requests BA session on tid %d w/o QoS\n",
net/mac80211/agg-tx.c +3 -0
@@ -580,6 +580,9 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw_check(&local->hw, TX_AMPDU_SETUP_IN_HW))return -EINVAL ; +if (WARN_ON (tid >=IEEE80211_FIRST_TSPEC_TSID )) +return -EINVAL ; +ht_dbg (sdata,"Open BA session requested for %pM tid %u\n" , pubsta->addr, tid);
Greg Kroah-Hartman
maintainerPATCH 31/69 fix memory leaks in tracing_buffers_splice_read()
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 1ae2293dd6d2f5c823cf97e60b70d03631cd622f upstream.
--- kernel/trace/trace.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
kernel/trace/trace.c +8 -6
@@ -5929,9 +5929,6 @@ tracing_buffers_splice_read(struct filereturn -EBUSY ;#endif -if (splice_grow_spd (pipe, &spd)) -return -ENOMEM ; -if (*ppos & (PAGE_SIZE -1 ))return -EINVAL ;
@@ -5941,6 +5938,9 @@ tracing_buffers_splice_read(struct file len &=PAGE_MASK ; } +if (splice_grow_spd (pipe, &spd)) +return -ENOMEM ; + again:trace_access_lock (iter->cpu_file); entries =ring_buffer_entries_cpu (iter->trace_buffer->buffer, iter->cpu_file);
@@ -5998,19 +5998,21 @@ tracing_buffers_splice_read(struct file/* did we read anything? */ if (!spd.nr_pages) {if (ret) -return ret; + goto out; + ret = -EAGAIN ;if ((file->f_flags &O_NONBLOCK ) || (flags &SPLICE_F_NONBLOCK )) -return -EAGAIN ; + goto out; ret =wait_on_pipe (iter, true);if (ret) -return ret; + goto out; goto again; } ret =splice_to_pipe (pipe, &spd); +out:splice_shrink_spd (&spd);return ret;
Greg Kroah-Hartman
maintainerPATCH 32/69 tracing: Move mutex to protect against resetting of seq data
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt (Red Hat) <[email protected]>
commit 1245800c0f96eb6ebb368593e251d66c01e61022 upstream.
The iter->seq can be reset outside the protection of the mutex. So can reading of user data. Move the mutex up to the beginning of the function.
--- kernel/trace/trace.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
kernel/trace/trace.c +8 -7
@@ -4890,19 +4890,20 @@ tracing_read_pipe(struct file *filp, chastruct trace_iterator *iter = filp->private_data;ssize_t sret; -/* return any leftover data */ - sret =trace_seq_to_user (&iter->seq, ubuf, cnt); -if (sret != -EBUSY ) -return sret; - -trace_seq_init (&iter->seq); -/* * Avoid more than one consumer on a single file descriptor * This is just a matter of traces coherency, the ring buffer itself * is protected. */ mutex_lock (&iter->mutex); + +/* return any leftover data */ + sret =trace_seq_to_user (&iter->seq, ubuf, cnt); +if (sret != -EBUSY ) + goto out; + +trace_seq_init (&iter->seq); +if (iter->trace->read) { sret = iter->trace->read (iter, filp, ubuf, cnt, ppos);if (sret)
Greg Kroah-Hartman
maintainerPATCH 33/69 mm: delete unnecessary and unsafe init_tlb_ubc()
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hugh Dickins <[email protected]>
commit b385d21f27d86426472f6ae92a231095f7de2a8d upstream.
init_tlb_ubc() looked unnecessary to me: tlb_ubc is statically initialized with zeroes in the init_task, and copied from parent to child while it is quiescent in arch_dup_task_struct(); so I went to delete it.
But inserted temporary debug WARN_ONs in place of init_tlb_ubc() to check that it was always empty at that point, and found them firing:
because memcg reclaim can recurse into global reclaim (when allocating biosets for swapout in my case), and arrive back at the init_tlb_ubc() in shrink_node_memcg().
Resetting tlb_ubc.flush_required at that point is wrong: if the upper level needs a deferred TLB flush, but the lower level turns out not to, we miss a TLB flush. But fortunately, that's the only part of the protocol that does not nest: with the initialization removed, cpumask collects bits from upper and lower levels, and flushes TLB when needed.
--- mm/vmscan.c | 19 ------------------- 1 file changed, 19 deletions(-)
mm/vmscan.c +0 -19
@@ -2150,23 +2150,6 @@ out: } } -#ifdef CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH -static void init_tlb_ubc (void ) -{ -/* -* This deliberately does not clear the cpumask as it's expensive -* and unnecessary. If there happens to be data in there then the -* first SWAP_CLUSTER_MAX pages will send an unnecessary IPI and -* then will be cleared. -*/ - current->tlb_ubc.flush_required = false; -} -#else -static inline void init_tlb_ubc (void ) -{ -} -#endif /* CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH */ -/* * This is a basic per-zone page freer. Used by both kswapd and direct reclaim. */
@@ -2202,8 +2185,6 @@ static void shrink_zone_memcg(struct zon scan_adjusted = (global_reclaim (sc) && !current_is_kswapd () && sc->priority ==DEF_PRIORITY ); -init_tlb_ubc (); -blk_start_plug (&plug);while (nr[LRU_INACTIVE_ANON ] || nr[LRU_ACTIVE_FILE ] || nr[LRU_INACTIVE_FILE ]) {
Greg Kroah-Hartman
maintainerPATCH 34/69 can: flexcan: fix resume function
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fabio Estevam <[email protected]>
commit 4de349e786a3a2d51bd02d56f3de151bbc3c3df9 upstream.
On a imx6ul-pico board the following error is seen during system suspend:
dpm_run_callback(): platform_pm_resume+0x0/0x54 returns -110
PM: Device 2090000.flexcan failed to resume: error -110
The reason for this suspend error is because when the CAN interface is not active the clocks are disabled and then flexcan_chip_enable() will always fail due to a timeout error.
In order to fix this issue, only call flexcan_chip_enable/disable() when the CAN interface is active.
Based on a patch from Dong Aisheng in the NXP kernel.
--- drivers/net/can/flexcan.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/net/can/flexcan.c +8 -5
@@ -1268,11 +1268,10 @@ static int __maybe_unused flexcan_suspenstruct flexcan_priv *priv =netdev_priv (dev);int err; - err =flexcan_chip_disable (priv); -if (err) -return err; -if (netif_running (dev)) { + err =flexcan_chip_disable (priv); +if (err) +return err;netif_stop_queue (dev);netif_device_detach (dev); }
@@ -1285,13 +1284,17 @@ static int __maybe_unused flexcan_resume {struct net_device *dev =dev_get_drvdata (device);struct flexcan_priv *priv =netdev_priv (dev); +int err; priv->can.state =CAN_STATE_ERROR_ACTIVE ;if (netif_running (dev)) {netif_device_attach (dev);netif_start_queue (dev); + err =flexcan_chip_enable (priv); +if (err) +return err; } -return flexcan_chip_enable (priv); +return 0 ; } static SIMPLE_DEV_PM_OPS(flexcan_pm_ops, flexcan_suspend, flexcan_resume);
Greg Kroah-Hartman
maintainerPATCH 35/69 net: can: ifi: Configure transmitter delay
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Vasut <[email protected]>
commit 8d58790b832e13d6006d842037732304af357c3c upstream.
Configure the transmitter delay register at +0x1c to correctly handle the CAN FD bitrate switch (BRS). This moves the SSP (secondary sample point) to a proper offset, so that the TDC mechanism works and won't generate error frames on the CAN link.
--- drivers/net/can/ifi_canfd/ifi_canfd.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/net/can/ifi_canfd/ifi_canfd.c +10 -1
@@ -81,6 +81,10 @@#define IFI_CANFD_TIME_SET_TIMEA_4_12_6_6 BIT(15)#define IFI_CANFD_TDELAY 0x1c +#define IFI_CANFD_TDELAY_DEFAULT 0xb +#define IFI_CANFD_TDELAY_MASK 0x3fff +#define IFI_CANFD_TDELAY_ABS BIT(14) +#define IFI_CANFD_TDELAY_EN BIT(15)#define IFI_CANFD_ERROR 0x20#define IFI_CANFD_ERROR_TX_OFFSET 0
@@ -641,7 +645,7 @@ static void ifi_canfd_set_bittiming(strustruct ifi_canfd_priv *priv =netdev_priv (ndev);const struct can_bittiming *bt = &priv->can.bittiming;const struct can_bittiming *dbt = &priv->can.data_bittiming; -u16 brp, sjw, tseg1, tseg2; +u16 brp, sjw, tseg1, tseg2, tdc;/* Configure bit timing */ brp = bt->brp -2 ;
@@ -664,6 +668,11 @@ static void ifi_canfd_set_bittiming(stru (brp <<IFI_CANFD_TIME_PRESCALE_OFF ) | (sjw <<IFI_CANFD_TIME_SJW_OFF_7_9_8_8 ), priv->base + IFI_CANFD_FTIME); + +/* Configure transmitter delay */ + tdc = (dbt->brp * (dbt->phase_seg1 +1 )) &IFI_CANFD_TDELAY_MASK ; +writel (IFI_CANFD_TDELAY_EN |IFI_CANFD_TDELAY_ABS | tdc, + priv->base +IFI_CANFD_TDELAY ); } static void ifi_canfd_set_filter(struct net_device *ndev, const u32 id,
Greg Kroah-Hartman
maintainerPATCH 36/69 iwlwifi: mvm: update TX queue before making a copy of the skb
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Beni Lev <[email protected]>
commit 54c5ef2e93ea002dc5dd63349298b2778fe59edb upstream.
Off-channel action frames (such as ANQP frames) must be sent either on the AUX queue or on the offchannel queue, otherwise the firmware will cause a SYSASSERT.
In the current implementation, the queue to be used is correctly set in the original skb, but this is done after it is copied. Thus the copy remains with the original, incorrect queue.
Fix this by setting the queue in the original skb before copying it.
--- drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/tx.c +9 -10
@@ -501,6 +501,15 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvint hdrlen =ieee80211_hdrlen (hdr->frame_control);int queue; +/* IWL_MVM_OFFCHANNEL_QUEUE is used for ROC packets that can be used +* in 2 different types of vifs, P2P & STATION. P2P uses the offchannel +* queue. STATION (HS2.0) uses the auxiliary context of the FW, +* and hence needs to be sent on the aux queue +*/ +if (IEEE80211_SKB_CB (skb)->hw_queue ==IWL_MVM_OFFCHANNEL_QUEUE && + skb_info->control.vif->type ==NL80211_IFTYPE_STATION ) +IEEE80211_SKB_CB (skb)->hw_queue = mvm->aux_queue; +memcpy (&info, skb->cb,sizeof (info));if (WARN_ON_ONCE (info.flags &IEEE80211_TX_CTL_AMPDU ))
@@ -514,16 +523,6 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mv/* This holds the amsdu headers length */ skb_info->driver_data[0 ] = (void *)(uintptr_t )0 ; -/* -* IWL_MVM_OFFCHANNEL_QUEUE is used for ROC packets that can be used -* in 2 different types of vifs, P2P & STATION. P2P uses the offchannel -* queue. STATION (HS2.0) uses the auxiliary context of the FW, -* and hence needs to be sent on the aux queue -*/ -if (IEEE80211_SKB_CB (skb)->hw_queue ==IWL_MVM_OFFCHANNEL_QUEUE && - info.control.vif->type ==NL80211_IFTYPE_STATION ) -IEEE80211_SKB_CB (skb)->hw_queue = mvm->aux_queue; - queue = info.hw_queue;/*
Greg Kroah-Hartman
maintainerPATCH 37/69 nl80211: validate number of probe response CSA counters
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
commit ad5987b47e96a0fb6d13fea250e936aed000093c upstream.
Due to an apparent copy/paste bug, the number of counters for the beacon configuration were checked twice, instead of checking the number of probe response counters. Fix this to check the number of probe response counters before parsing those.
--- net/wireless/nl80211.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/wireless/nl80211.c +1 -1
@@ -6811,7 +6811,7 @@ static int nl80211_channel_switch(struct params.n_counter_offsets_presp = len /sizeof (u16);if (rdev->wiphy.max_num_csa_counters && - (params.n_counter_offsets_beacon > + (params.n_counter_offsets_presp > rdev->wiphy.max_num_csa_counters))return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 38/69 btrfs: ensure that file descriptor used with subvol ioctls is a dir
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Mahoney <[email protected]>
commit 325c50e3cebb9208009083e841550f98a863bfa0 upstream.
If the subvol/snapshot create/destroy ioctls are passed a regular file with execute permissions set, we'll eventually Oops while trying to do inode->i_op->lookup via lookup_one_len.
This patch ensures that the file descriptor refers to a directory.
--- fs/btrfs/ioctl.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
fs/btrfs/ioctl.c +12 -0
@@ -1634,6 +1634,9 @@ static noinline int btrfs_ioctl_snap_creint namelen;int ret =0 ; +if (!S_ISDIR (file_inode (file)->i_mode)) +return -ENOTDIR ; + ret =mnt_want_write_file (file);if (ret) goto out;
@@ -1691,6 +1694,9 @@ static noinline int btrfs_ioctl_snap_crestruct btrfs_ioctl_vol_args *vol_args;int ret; +if (!S_ISDIR (file_inode (file)->i_mode)) +return -ENOTDIR ; + vol_args =memdup_user (arg,sizeof (*vol_args));if (IS_ERR (vol_args))return PTR_ERR (vol_args);
@@ -1714,6 +1720,9 @@ static noinline int btrfs_ioctl_snap_crebool readonly = false;struct btrfs_qgroup_inherit *inherit =NULL ; +if (!S_ISDIR (file_inode (file)->i_mode)) +return -ENOTDIR ; + vol_args =memdup_user (arg,sizeof (*vol_args));if (IS_ERR (vol_args))return PTR_ERR (vol_args);
@@ -2358,6 +2367,9 @@ static noinline int btrfs_ioctl_snap_desint ret;int err =0 ; +if (!S_ISDIR (dir->i_mode)) +return -ENOTDIR ; + vol_args =memdup_user (arg,sizeof (*vol_args));if (IS_ERR (vol_args))return PTR_ERR (vol_args);
Greg Kroah-Hartman
maintainerPATCH 39/69 x86/efi: Only map RAM into EFI page tables if in mixed-mode
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Fleming <[email protected]>
commit 1297667083d5442aafe3e337b9413bf02b114edb upstream.
Waiman reported that booting with CONFIG_EFI_MIXED enabled on his multi-terabyte HP machine results in boot crashes, because the EFI region mapping functions loop forever while trying to map those regions describing RAM.
While this patch doesn't fix the underlying hang, there's really no reason to map EFI_CONVENTIONAL_MEMORY regions into the EFI page tables when mixed-mode is not in use at runtime.
--- arch/x86/platform/efi/efi_64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/platform/efi/efi_64.c +1 -1
@@ -244,7 +244,7 @@ int __init efi_setup_page_tables(unsigne* text and allocate a new stack because we can't rely on the * stack pointer being < 4GB. */ -if (!IS_ENABLED (CONFIG_EFI_MIXED )) +if (!IS_ENABLED (CONFIG_EFI_MIXED ) ||efi_is_native ())return 0 ;/*
Greg Kroah-Hartman
maintainerPATCH 40/69 irqchip/mips-gic: Fix local interrupts
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Burton <[email protected]>
commit e875bd66dfb68f4e898e9a43ef42858c504a7f23 upstream.
Since the device hierarchy domain was added by commit c98c1822ee13 ("irqchip/mips-gic: Add device hierarchy domain"), GIC local interrupts have been broken.
Users attempting to setup a per-cpu local IRQ, for example the GIC timer clock events code in drivers/clocksource/mips-gic-timer.c, the setup_percpu_irq function would refuse with -EINVAL because the GIC irqchip driver never called irq_set_percpu_devid so the IRQ_PER_CPU_DEVID flag was never set for the IRQ. This happens because irq_set_percpu_devid was being called from the gic_irq_domain_map function which is no longer called.
Doing only that runs into further problems because gic_dev_domain_alloc set the struct irq_chip for all interrupts, local or shared, to gic_level_irq_controller despite that only being suitable for shared interrupts. The typical outcome of this is that gic_level_irq_controller callback functions are called for local interrupts, and then hwirq number calculations overflow & the driver ends up attempting to access some invalid register with an address calculated from an invalid hwirq number. Best case scenario is that this then leads to a bus error. This is fixed by abstracting the setup of the hwirq & chip to a new function gic_setup_dev_chip which is used by both the root GIC IRQ domain & the device domain.
Finally, decoding local interrupts failed because gic_dev_domain_alloc only called irq_domain_alloc_irqs_parent for shared interrupts. Local ones were therefore never associated with hwirqs in the root GIC IRQ domain and the virq in gic_handle_local_int would always be 0. This is fixed by calling irq_domain_alloc_irqs_parent unconditionally & having gic_irq_domain_alloc handle both local & shared interrupts, which is easy due to the aforementioned abstraction of chip setup into gic_setup_dev_chip.
This fixes use of the MIPS GIC timer for clock events, which has been broken since c98c1822ee13 ("irqchip/mips-gic: Add device hierarchy domain") but hadn't been noticed due to a silent fallback to the MIPS coprocessor 0 count/compare clock events device.
--- drivers/irqchip/irq-mips-gic.c | 105 +++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 55 deletions(-)
drivers/irqchip/irq-mips-gic.c +50 -55
@@ -638,27 +638,6 @@ static int gic_local_irq_domain_map(struif (!gic_local_irq_is_routable (intr))return -EPERM ; -/* -* HACK: These are all really percpu interrupts, but the rest -* of the MIPS kernel code does not use the percpu IRQ API for -* the CP0 timer and performance counter interrupts. -*/ -switch (intr) { -case GIC_LOCAL_INT_TIMER : -case GIC_LOCAL_INT_PERFCTR : -case GIC_LOCAL_INT_FDC : -irq_set_chip_and_handler (virq, - &gic_all_vpes_local_irq_controller, - handle_percpu_irq); -break ; -default : -irq_set_chip_and_handler (virq, - &gic_local_irq_controller, - handle_percpu_devid_irq); -irq_set_percpu_devid (virq); -break ; - } -spin_lock_irqsave (&gic_lock, flags);for (i =0 ; i < gic_vpes; i++) {u32 val =GIC_MAP_TO_PIN_MSK | gic_cpu_pin;
@@ -724,16 +703,42 @@ static int gic_shared_irq_domain_map(strreturn 0 ; } -static int gic_irq_domain_map (struct irq_domain *d,unsigned int virq, -irq_hw_number_t hw) +static int gic_setup_dev_chip (struct irq_domain *d,unsigned int virq, +unsigned int hwirq) { -if (GIC_HWIRQ_TO_LOCAL (hw) <GIC_NUM_LOCAL_INTRS ) -return gic_local_irq_domain_map (d, virq, hw); +struct irq_chip *chip; +int err; -irq_set_chip_and_handler (virq, &gic_level_irq_controller, - handle_level_irq); +if (hwirq >=GIC_SHARED_HWIRQ_BASE ) { + err =irq_domain_set_hwirq_and_chip (d, virq, hwirq, + &gic_level_irq_controller, +NULL ); + }else { +switch (GIC_HWIRQ_TO_LOCAL (hwirq)) { +case GIC_LOCAL_INT_TIMER : +case GIC_LOCAL_INT_PERFCTR : +case GIC_LOCAL_INT_FDC : +/* +* HACK: These are all really percpu interrupts, but +* the rest of the MIPS kernel code does not use the +* percpu IRQ API for them. +*/ + chip = &gic_all_vpes_local_irq_controller; +irq_set_handler (virq, handle_percpu_irq); +break ; + +default : + chip = &gic_local_irq_controller; +irq_set_handler (virq, handle_percpu_devid_irq); +irq_set_percpu_devid (virq); +break ; + } -return gic_shared_irq_domain_map (d, virq, hw,0 ); + err =irq_domain_set_hwirq_and_chip (d, virq, hwirq, + chip,NULL ); + } + +return err; } static int gic_irq_domain_alloc(struct irq_domain *d, unsigned int virq,
@@ -744,15 +749,12 @@ static int gic_irq_domain_alloc(struct iint cpu, ret, i;if (spec->type ==GIC_DEVICE ) { -/* verify that it doesn't conflict with an IPI irq */ -if (test_bit (spec->hwirq, ipi_resrv)) +/* verify that shared irqs don't conflict with an IPI irq */ +if ((spec->hwirq >=GIC_SHARED_HWIRQ_BASE ) && +test_bit (GIC_HWIRQ_TO_SHARED (spec->hwirq), ipi_resrv))return -EBUSY ; - hwirq =GIC_SHARED_TO_HWIRQ (spec->hwirq); - -return irq_domain_set_hwirq_and_chip (d, virq, hwirq, - &gic_level_irq_controller, -NULL ); +return gic_setup_dev_chip (d, virq, spec->hwirq); }else { base_hwirq =find_first_bit (ipi_resrv, gic_shared_intrs);if (base_hwirq == gic_shared_intrs) {
@@ -821,7 +823,6 @@ int gic_irq_domain_match(struct irq_doma }static const struct irq_domain_ops gic_irq_domain_ops = { - .map = gic_irq_domain_map, .alloc = gic_irq_domain_alloc, .free = gic_irq_domain_free, .match = gic_irq_domain_match,
@@ -852,29 +853,20 @@ static int gic_dev_domain_alloc(struct istruct irq_fwspec *fwspec = arg;struct gic_irq_spec spec = { .type =GIC_DEVICE , - .hwirq = fwspec->param[1 ], };int i, ret; -bool is_shared = fwspec->param[0 ] ==GIC_SHARED ; - -if (is_shared) { - ret =irq_domain_alloc_irqs_parent (d, virq, nr_irqs, &spec); -if (ret) -return ret; - } -for (i =0 ; i < nr_irqs; i++) { -irq_hw_number_t hwirq; +if (fwspec->param[0 ] ==GIC_SHARED ) + spec.hwirq =GIC_SHARED_TO_HWIRQ (fwspec->param[1 ]); +else + spec.hwirq =GIC_LOCAL_TO_HWIRQ (fwspec->param[1 ]); -if (is_shared) - hwirq =GIC_SHARED_TO_HWIRQ (spec.hwirq + i); -else - hwirq =GIC_LOCAL_TO_HWIRQ (spec.hwirq + i); + ret =irq_domain_alloc_irqs_parent (d, virq, nr_irqs, &spec); +if (ret) +return ret; - ret =irq_domain_set_hwirq_and_chip (d, virq + i, - hwirq, - &gic_level_irq_controller, -NULL ); +for (i =0 ; i < nr_irqs; i++) { + ret =gic_setup_dev_chip (d, virq + i, spec.hwirq + i);if (ret) goto error; }
@@ -896,7 +888,10 @@ void gic_dev_domain_free(struct irq_domastatic void gic_dev_domain_activate (struct irq_domain *domain,struct irq_data *d) { -gic_shared_irq_domain_map (domain, d->irq, d->hwirq,0 ); +if (GIC_HWIRQ_TO_LOCAL (d->hwirq) <GIC_NUM_LOCAL_INTRS ) +gic_local_irq_domain_map (domain, d->irq, d->hwirq); +else +gic_shared_irq_domain_map (domain, d->irq, d->hwirq,0 ); }static struct irq_domain_ops gic_dev_domain_ops = {
Greg Kroah-Hartman
maintainerPATCH 41/69 i2c-eg20t: fix race between i2c init and interrupt enable
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yadi.hu <[email protected]>
commit 371a015344b6e270e7e3632107d9554ec6d27a6b upstream.
the eg20t driver call request_irq() function before the pch_base_address, base address of i2c controller's register, is assigned an effective value.
there is one possible scenario that an interrupt which isn't inside eg20t arrives immediately after request_irq() is executed when i2c controller shares an interrupt number with others. since the interrupt handler pch_i2c_handler() has already active as shared action, it will be called and read its own register to determine if this interrupt is from itself.
At that moment, since base address of i2c registers is not remapped in kernel space yet,so the INT handler will access an illegal address and then a error occurs.
--- drivers/i2c/busses/i2c-eg20t.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
drivers/i2c/busses/i2c-eg20t.c +11 -7
@@ -773,13 +773,6 @@ static int pch_i2c_probe(struct pci_dev/* Set the number of I2C channel instance */ adap_info->ch_num = id->driver_data; - ret =request_irq (pdev->irq, pch_i2c_handler,IRQF_SHARED , -KBUILD_MODNAME , adap_info); -if (ret) { -pch_pci_err (pdev,"request_irq FAILED\n" ); - goto err_request_irq; - } -for (i =0 ; i < adap_info->ch_num; i++) { pch_adap = &adap_info->pch_data[i].pch_adapter; adap_info->pch_i2c_suspended = false;
@@ -797,6 +790,17 @@ static int pch_i2c_probe(struct pci_dev pch_adap->dev.of_node = pdev->dev.of_node; pch_adap->dev.parent = &pdev->dev; + } + + ret =request_irq (pdev->irq, pch_i2c_handler,IRQF_SHARED , +KBUILD_MODNAME , adap_info); +if (ret) { +pch_pci_err (pdev,"request_irq FAILED\n" ); + goto err_request_irq; + } + +for (i =0 ; i < adap_info->ch_num; i++) { + pch_adap = &adap_info->pch_data[i].pch_adapter;pch_i2c_init (&adap_info->pch_data[i]);
Greg Kroah-Hartman
maintainerPATCH 42/69 i2c: mux: pca954x: retry updating the mux selection on failure
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Rosin <[email protected]>
commit 463e8f845cbf1c01e4cc8aeef1703212991d8e1e upstream.
The cached value of the last selected channel prevents retries on the next call, even on failure to update the selected channel. Fix that.
--- drivers/i2c/muxes/i2c-mux-pca954x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/muxes/i2c-mux-pca954x.c +1 -1
@@ -164,7 +164,7 @@ static int pca954x_select_chan(struct i2/* Only select the channel if its different from the last channel */ if (data->last_chan != regval) { ret =pca954x_reg_write (muxc->parent, client, regval); - data->last_chan = regval; + data->last_chan = ret ?0 : regval; }return ret;
Greg Kroah-Hartman
maintainerPATCH 43/69 i2c: qup: skip qup_i2c_suspend if the device is already runtime suspended
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sudeep Holla <[email protected]>
commit 331dcf421c34d227784d07943eb01e4023a42b0a upstream.
If the i2c device is already runtime suspended, if qup_i2c_suspend is executed during suspend-to-idle or suspend-to-ram it will result in the following splat:
WARNING: CPU: 3 PID: 1593 at drivers/clk/clk.c:476 clk_core_unprepare+0x80/0x90 Modules linked in: CPU: 3 PID: 1593 Comm: bash Tainted: G W 4.8.0-rc3 #14 Hardware name: Qualcomm Technologies, Inc. APQ 8016 SBC (DT) PC is at clk_core_unprepare+0x80/0x90 LR is at clk_unprepare+0x28/0x40 pc : [<ffff0000086eecf0>] lr : [<ffff0000086f0c58>] pstate: 60000145 Call trace: clk_core_unprepare+0x80/0x90 qup_i2c_disable_clocks+0x2c/0x68 qup_i2c_suspend+0x10/0x20 platform_pm_suspend+0x24/0x68 ...
This patch fixes the issue by executing qup_i2c_pm_suspend_runtime conditionally in qup_i2c_suspend.
--- drivers/i2c/busses/i2c-qup.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/i2c/busses/i2c-qup.c +2 -1
@@ -1610,7 +1610,8 @@ static int qup_i2c_pm_resume_runtime(str#ifdef CONFIG_PM_SLEEP static int qup_i2c_suspend (struct device *device) { -qup_i2c_pm_suspend_runtime (device); +if (!pm_runtime_suspended (device)) +return qup_i2c_pm_suspend_runtime (device);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 44/69 MIPS: Fix pre-r6 emulation FPU initialisation
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Burton <[email protected]>
commit 7e956304eb8a285304a78582e4537e72c6365f20 upstream.
In the mipsr2_decoder() function, used to emulate pre-MIPSr6 instructions that were removed in MIPSr6, the init_fpu() function is called if a removed pre-MIPSr6 floating point instruction is the first floating point instruction used by the task. However, init_fpu() performs varous actions that rely upon not being migrated. For example in the most basic case it sets the coprocessor 0 Status.CU1 bit to enable the FPU & then loads FP register context into the FPU registers. If the task were to migrate during this time, it may end up attempting to load FP register context on a different CPU where it hasn't set the CU1 bit, leading to errors such as:
do_cpu invoked from kernel context![#2]:
CPU: 2 PID: 7338 Comm: fp-prctl Tainted: G D 4.7.0-00424-g49b0c82 #2
task: 838e4000 ti: 88d38000 task.ti: 88d38000
$ 0 : 00000000 00000001 ffffffff 88d3fef8
$ 4 : 838e4000 88d38004 00000000 00000001
$ 8 : 3400fc01 801f8020 808e9100 24000000
$12 : dbffffff 807b69d8 807b0000 00000000
$16 : 00000000 80786150 00400fc4 809c0398
$20 : 809c0338 0040273c 88d3ff28 808e9d30
$24 : 808e9d30 00400fb4
$28 : 88d38000 88d3fe88 00000000 8011a2ac
Hi : 0040273c
Lo : 88d3ff28
epc : 80114178 _restore_fp+0x10/0xa0
ra : 8011a2ac mipsr2_decoder+0xd5c/0x1660
Status: 1400fc03 KERNEL EXL IE
Cause : 1080002c (ExcCode 0b)
PrId : 0001a920 (MIPS I6400)
Modules linked in:
Process fp-prctl (pid: 7338, threadinfo=88d38000, task=838e4000, tls=766527d0)
Stack : 00000000 00000000 00000000 88d3fe98 00000000 00000000 809c0398 809c0338
808e9100 00000000 88d3ff28 00400fc4 00400fc4 0040273c 7fb69e18 004a0000
004a0000 004a0000 7664add0 8010de18 00000000 00000000 88d3fef8 88d3ff28
808e9100 00000000 766527d0 8010e534 000c0000 85755000 8181d580 00000000
00000000 00000000 004a0000 00000000 766527d0 7fb69e18 004a0000 80105c20
...
Call Trace:
[<80114178>] _restore_fp+0x10/0xa0
[<8011a2ac>] mipsr2_decoder+0xd5c/0x1660
[<8010de18>] do_ri+0x90/0x6b8
[<80105c20>] ret_from_exception+0x0/0x10Fix this by disabling preemption around the call to init_fpu(), ensuring that it starts & completes on one CPU.
Patchwork: https://patchwork.linux-mips.org/patch/14305/
--- arch/mips/kernel/mips-r2-to-r6-emul.c | 2 ++ 1 file changed, 2 insertions(+)
arch/mips/kernel/mips-r2-to-r6-emul.c +2 -0
@@ -1164,7 +1164,9 @@ fpu_emul: regs->regs[31 ] = r31; regs->cp0_epc = epc;if (!used_math ()) {/* First time FPU user. */ +preempt_disable (); err =init_fpu (); +preempt_enable ();set_used_math (); }lose_fpu (1 );/* Save FPU state for the emulator. */
Greg Kroah-Hartman
maintainerPATCH 45/69 MIPS: SMP: Fix possibility of deadlock when bringing CPUs online
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Redfearn <[email protected]>
commit 8f46cca1e6c06a058374816887059bcc017b382f upstream.
This patch fixes the possibility of a deadlock when bringing up secondary CPUs.
The deadlock occurs because the set_cpu_online() is called before synchronise_count_slave(). This can cause a deadlock if the boot CPU, having scheduled another thread, attempts to send an IPI to the secondary CPU, which it sees has been marked online. The secondary is blocked in synchronise_count_slave() waiting for the boot CPU to enter synchronise_count_master(), but the boot cpu is blocked in smp_call_function_many() waiting for the secondary to respond to it's IPI request.
Fix this by marking the CPU online in cpu_callin_map and synchronising counters before declaring the CPU online and calculating the maps for IPIs.
Patchwork: https://patchwork.linux-mips.org/patch/14302/
--- arch/mips/kernel/smp.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
arch/mips/kernel/smp.c +3 -4
@@ -320,6 +320,9 @@ asmlinkage void start_secondary(void)cpumask_set_cpu (cpu, &cpu_coherent_mask);notify_cpu_starting (cpu); +cpumask_set_cpu (cpu, &cpu_callin_map); +synchronise_count_slave (cpu); +set_cpu_online (cpu, true);set_cpu_sibling_map (cpu);
@@ -327,10 +330,6 @@ asmlinkage void start_secondary(void)calculate_cpu_foreign_map (); -cpumask_set_cpu (cpu, &cpu_callin_map); - -synchronise_count_slave (cpu); -/* * irq will be enabled in ->smp_finish(), enabling it too early * is dangerous.
Greg Kroah-Hartman
maintainerPATCH 46/69 MIPS: vDSO: Fix Malta EVA mapping to vDSO page structs
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
commit 554af0c396380baf416f54c439b99b495180b2f4 upstream.
The page structures associated with the vDSO pages in the kernel image are calculated using virt_to_page(), which uses __pa() under the hood to find the pfn associated with the virtual address. The vDSO data pointers however point to kernel symbols, so __pa_symbol() should really be used instead.
Since there is no equivalent to virt_to_page() which uses __pa_symbol(), fix init_vdso_image() to work directly with pfns, calculated with __phys_to_pfn(__pa_symbol(...)).
This issue broke the Malta Enhanced Virtual Addressing (EVA) configuration which has a non-default implementation of __pa_symbol(). This is because it uses a physical alias so that the kernel executes from KSeg0 (VA 0x80000000 -> PA 0x00000000), while RAM is provided to the kernel in the KUSeg range (VA 0x00000000 -> PA 0x80000000) which uses the same underlying RAM.
Since there are no page structures associated with the low physical address region, some arbitrary kernel memory would be interpreted as a page structure for the vDSO pages and badness ensues.
Patchwork: https://patchwork.linux-mips.org/patch/14229/
--- arch/mips/kernel/vdso.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/mips/kernel/vdso.c +4 -4
@@ -39,16 +39,16 @@ static struct vm_special_mapping vdso_vvstatic void __init init_vdso_image (struct mips_vdso_image *image) {unsigned long num_pages, i; +unsigned long data_pfn;BUG_ON (!PAGE_ALIGNED (image->data));BUG_ON (!PAGE_ALIGNED (image->size)); num_pages = image->size /PAGE_SIZE ; -for (i =0 ; i < num_pages; i++) { - image->mapping.pages[i] = -virt_to_page (image->data + (i *PAGE_SIZE )); - } + data_pfn =__phys_to_pfn (__pa_symbol (image->data)); +for (i =0 ; i < num_pages; i++) + image->mapping.pages[i] =pfn_to_page (data_pfn + i); }static int __init init_vdso (void )
Greg Kroah-Hartman
maintainerPATCH 47/69 MIPS: Remove compact branch policy Kconfig entries
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Burton <[email protected]>
commit b03c1e3b8eed9026733c473071d1f528358a0e50 upstream.
Commit c1a0e9bc885d ("MIPS: Allow compact branch policy to be changed") added Kconfig entries allowing for the compact branch policy used by the compiler for MIPSr6 kernels to be specified. This can be useful for debugging, particularly in systems where compact branches have recently been introduced.
Unfortunately mainline gcc 5.x supports MIPSr6 but not the -mcompact-branches compiler flag, leading to MIPSr6 kernels failing to build with gcc 5.x with errors such as:
mipsel-linux-gnu-gcc: error: unrecognized command line option '-mcompact-branches=optimal' make[2]: *** [kernel/bounds.s] Error 1
Fixing this by hiding the Kconfig entry behind another seems to be more hassle than it's worth, as MIPSr6 & compact branches have been around for a while now and if policy does need to be set for debug it can be done easily enough with KCFLAGS. Therefore remove the compact branch policy Kconfig entries & their handling in the Makefile.
This reverts commit c1a0e9bc885d ("MIPS: Allow compact branch policy to be changed").
Patchwork: https://patchwork.linux-mips.org/patch/14241/
--- arch/mips/Kconfig.debug | 36 ------------------------------------ arch/mips/Makefile | 4 ---- 2 files changed, 40 deletions(-)
arch/mips/Kconfig.debug +0 -36
@@ -113,42 +113,6 @@ config SPINLOCK_TEST help Add several files to the debugfs to test spinlock speed. -if CPU_MIPSR6 - -choice - prompt "Compact branch policy" - default MIPS_COMPACT_BRANCHES_OPTIMAL - -config MIPS_COMPACT_BRANCHES_NEVER - bool "Never (force delay slot branches)" - help - Pass the -mcompact-branches=never flag to the compiler in order to - force it to always emit branches with delay slots, and make no use - of the compact branch instructions introduced by MIPSr6. This is - useful if you suspect there may be an issue with compact branches in - either the compiler or the CPU. - -config MIPS_COMPACT_BRANCHES_OPTIMAL - bool "Optimal (use where beneficial)" - help - Pass the -mcompact-branches=optimal flag to the compiler in order for - it to make use of compact branch instructions where it deems them - beneficial, and use branches with delay slots elsewhere. This is the - default compiler behaviour, and should be used unless you have a - reason to choose otherwise. - -config MIPS_COMPACT_BRANCHES_ALWAYS - bool "Always (force compact branches)" - help - Pass the -mcompact-branches=always flag to the compiler in order to - force it to always emit compact branches, making no use of branch - instructions with delay slots. This can result in more compact code - which may be beneficial in some scenarios. - -endchoice - -endif # CPU_MIPSR6 - config SCACHE_DEBUGFS bool "L2 cache debugfs entries" depends on DEBUG_FS
arch/mips/Makefile +0 -4
@@ -203,10 +203,6 @@ endif toolchain-virt := $(call cc-option-yn,$(mips-cflags) -mvirt) cflags-$(toolchain-virt) += -DTOOLCHAIN_SUPPORTS_VIRT -cflags-$(CONFIG_MIPS_COMPACT_BRANCHES_NEVER) += -mcompact-branches=never -cflags-$(CONFIG_MIPS_COMPACT_BRANCHES_OPTIMAL) += -mcompact-branches=optimal -cflags-$(CONFIG_MIPS_COMPACT_BRANCHES_ALWAYS) += -mcompact-branches=always - # # Firmware support #
Greg Kroah-Hartman
maintainerPATCH 48/69 MIPS: Avoid a BUG warning during prctl(PR_SET_FP_MODE, ...)
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcin Nowakowski <[email protected]>
commit b244614a60ab7ce54c12a9cbe15cfbf8d79d0967 upstream.
cpu_has_fpu macro uses smp_processor_id() and is currently executed with preemption enabled, that triggers the warning at runtime.
It is assumed throughout the kernel that if any CPU has an FPU, then all CPUs would have an FPU as well, so it is safe to perform the check with preemption enabled - change the code to use raw_ variant of the check to avoid the warning.
Patchwork: https://patchwork.linux-mips.org/patch/14125/
--- arch/mips/kernel/process.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/mips/kernel/process.c +4 -4
@@ -591,14 +591,14 @@ int mips_set_process_fp_mode(struct taskreturn -EOPNOTSUPP ;/* Avoid inadvertently triggering emulation */ -if ((value &PR_FP_MODE_FR ) && cpu_has_fpu && - !(current_cpu_data.fpu_id &MIPS_FPIR_F64 )) +if ((value &PR_FP_MODE_FR ) && raw_cpu_has_fpu && + !(raw_current_cpu_data.fpu_id &MIPS_FPIR_F64 ))return -EOPNOTSUPP ; -if ((value &PR_FP_MODE_FRE ) && cpu_has_fpu && !cpu_has_fre) +if ((value &PR_FP_MODE_FRE ) && raw_cpu_has_fpu && !cpu_has_fre)return -EOPNOTSUPP ;/* FR = 0 not supported in MIPS R6 */ -if (!(value &PR_FP_MODE_FR ) && cpu_has_fpu && cpu_has_mips_r6) +if (!(value &PR_FP_MODE_FR ) && raw_cpu_has_fpu && cpu_has_mips_r6)return -EOPNOTSUPP ;/* Proceed with the mode switch */
Greg Kroah-Hartman
maintainerPATCH 49/69 MIPS: Add a missing ".set pop" in an early commit
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
commit 3cbc6fc9c99f1709203711f125bc3b79487aba06 upstream.
Commit 842dfc11ea9a21 ("MIPS: Fix build with binutils 2.24.51+") missing a ".set pop" in macro fpu_restore_16even, so add it.
Patchwork: https://patchwork.linux-mips.org/patch/14210/
--- arch/mips/include/asm/asmmacro.h | 1 + 1 file changed, 1 insertion(+)
arch/mips/include/asm/asmmacro.h +1 -0
@@ -157,6 +157,7 @@ ldc1 $f28, THREAD_FPR28(\thread) ldc1 $f30, THREAD_FPR30(\thread) ctc1 \tmp, fcr31 + .set pop .endm .macro fpu_restore_16odd thread
Greg Kroah-Hartman
maintainerPATCH 50/69 MIPS: paravirt: Fix undefined reference to smp_bootstrap
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Redfearn <[email protected]>
commit 951c39cd3bc0aedf67fbd8fb4b9380287e6205d1 upstream.
If the paravirt machine is compiles without CONFIG_SMP, the following linker error occurs
arch/mips/kernel/head.o: In function `kernel_entry':
(.ref.text+0x10): undefined reference to `smp_bootstrap'
due to the kernel entry macro always including SMP startup code. Wrap this code in CONFIG_SMP to fix the error.
Patchwork: https://patchwork.linux-mips.org/patch/14212/
--- arch/mips/include/asm/mach-paravirt/kernel-entry-init.h | 2 ++ 1 file changed, 2 insertions(+)
arch/mips/include/asm/mach-paravirt/kernel-entry-init.h +2 -0
@@ -11,11 +11,13 @@#define CP0_EBASE $15, 1 .macro kernel_entry_setup +#ifdef CONFIG_SMP mfc0 t0,CP0_EBASE andi t0, t0, 0x3ff # CPUNum beqz t0, 1f # CPUs other than zero goto smp_bootstrap j smp_bootstrap +#endif /* CONFIG_SMP */ 1: .endm
Greg Kroah-Hartman
maintainerPATCH 51/69 x86/mm/pat: Prevent hang during boot when mapping pages
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Fleming <[email protected]>
commit e535ec0899d1fe52ec3a84c9bc03457ac67ad6f7 upstream.
There's a mixture of signed 32-bit and unsigned 32-bit and 64-bit data types used for keeping track of how many pages have been mapped.
This leads to hangs during boot when mapping large numbers of pages (multiple terabytes, as reported by Waiman) because those values are interpreted as being negative.
commit 742563777e8d ("x86/mm/pat: Avoid truncation when converting cpa->numpages to address") fixed one of those bugs, but there is another lurking in __change_page_attr_set_clr().
Additionally, the return value type for the populate_*() functions can return negative values when a large number of pages have been mapped, triggering the error paths even though no error occurred.
Consistently use 64-bit types on 64-bit platforms when counting pages. Even in the signed case this gives us room for regions 8PiB (pebibytes) in size whilst still allowing the usual negative value error checking idiom.
--- arch/x86/mm/pageattr.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
arch/x86/mm/pageattr.c +11 -10
@@ -932,11 +932,11 @@ static void populate_pte(struct cpa_data } } -static int populate_pmd (struct cpa_data *cpa, -unsigned long start,unsigned long end, -unsigned num_pages,pud_t *pud,pgprot_t pgprot) +static long populate_pmd (struct cpa_data *cpa, +unsigned long start,unsigned long end, +unsigned num_pages,pud_t *pud,pgprot_t pgprot) { -unsigned int cur_pages =0 ; +long cur_pages =0 ;pmd_t *pmd;pgprot_t pmd_pgprot;
@@ -1006,12 +1006,12 @@ static int populate_pmd(struct cpa_datareturn num_pages; } -static int populate_pud (struct cpa_data *cpa,unsigned long start,pgd_t *pgd, -pgprot_t pgprot) +static long populate_pud (struct cpa_data *cpa,unsigned long start,pgd_t *pgd, +pgprot_t pgprot) {pud_t *pud;unsigned long end; -int cur_pages =0 ; +long cur_pages =0 ;pgprot_t pud_pgprot; end = start + (cpa->numpages <<PAGE_SHIFT );
@@ -1067,7 +1067,7 @@ static int populate_pud(struct cpa_data/* Map trailing leftover */ if (start < end) { -int tmp; +long tmp; pud =pud_offset (pgd, start);if (pud_none (*pud))
@@ -1093,7 +1093,7 @@ static int populate_pgd(struct cpa_datapgprot_t pgprot =__pgprot (_KERNPG_TABLE);pud_t *pud =NULL ;/* shut up gcc */ pgd_t *pgd_entry; -int ret; +long ret; pgd_entry = cpa->pgd +pgd_index (addr);
@@ -1336,7 +1336,8 @@ static int cpa_process_alias(struct cpa_static int __change_page_attr_set_clr (struct cpa_data *cpa,int checkalias) { -int ret, numpages = cpa->numpages; +unsigned long numpages = cpa->numpages; +int ret;while (numpages) {/*
Greg Kroah-Hartman
maintainerPATCH 52/69 libceph: add an ONSTACK initializer for oids
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilya Dryomov <[email protected]>
commit 281dbe5db81c6137def9757e07a7aea14b1ed86e upstream.
An on-stack oid in ceph_ioctl_get_dataloc() is not initialized, resulting in a WARN and a NULL pointer dereference later on. We will have more of these on-stack in the future, so fix it with a convenience macro.
--- fs/ceph/ioctl.c | 2 +- include/linux/ceph/osdmap.h | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-)
fs/ceph/ioctl.c +1 -1
@@ -183,7 +183,7 @@ static long ceph_ioctl_get_dataloc(strucstruct ceph_osd_client *osdc = &ceph_sb_to_client (inode->i_sb)->client->osdc;struct ceph_object_locator oloc; -struct ceph_object_id oid; +CEPH_DEFINE_OID_ONSTACK (oid);u64 len =1 , olen;u64 tmp;struct ceph_pg pgid;
include/linux/ceph/osdmap.h +5 -0
@@ -115,6 +115,11 @@ static inline void ceph_oid_init(struct oid->name_len =0 ; } +#define CEPH_OID_INIT_ONSTACK (oid) \ + ({ ceph_oid_init(&oid); oid; }) +#define CEPH_DEFINE_OID_ONSTACK (oid) \ + struct ceph_object_id oid = CEPH_OID_INIT_ONSTACK(oid) +static inline bool ceph_oid_empty (const struct ceph_object_id *oid) {return oid->name == oid->inline_name && !oid->name_len;
Greg Kroah-Hartman
maintainerPATCH 53/69 ceph: fix symbol versioning for ceph_monc_do_statfs
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit a0f2b65275413b3438e9f55b1427273cd893c3b2 upstream.
The genksyms helper in the kernel cannot parse a type definition like "typeof(((type *)0)->keyfld)" that is used in the DEFINE_RB_FUNCS helper, causing the following EXPORT_SYMBOL() statement to be ignored when computing the crcs, and triggering a warning about this:
WARNING: "ceph_monc_do_statfs" [fs/ceph/ceph.ko] has no CRC
To work around the problem, we can rewrite the type to reference an undefined 'extern' symbol instead of a NULL pointer. This is evidently ok for genksyms, and it no longer complains about the line when calling it with 'genksyms -w'.
I've looked briefly into extending genksyms instead, but it seems really hard to do. Jan Beulich introduced basic support for 'typeof' a while ago in dc53324060f3 ("genksyms: fix typeof() handling"), but that is not sufficient for the expression we have here.
--- include/linux/ceph/libceph.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
include/linux/ceph/libceph.h +2 -1
@@ -214,8 +214,9 @@ static void erase_##name(struct rb_root }#define DEFINE_RB_LOOKUP_FUNC (name, type, keyfld, nodefld) \ +extern type __lookup_##name##_key; \ static type *lookup_##name(struct rb_root *root, \ - typeof(((type *)0)->keyfld) key) \ + typeof(__lookup_##name##_key.keyfld) key) \ { \ struct rb_node *n = root->rb_node; \ \
Greg Kroah-Hartman
maintainerPATCH 54/69 ceph: Correctly return NXIO errors from ceph_llseek
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Phil Turnbull <[email protected]>
commit 955818cd5b6c4b58ea574ace4573e7afa4c19c1e upstream.
ceph_llseek does not correctly return NXIO errors because the 'out' path always returns 'offset'.
--- fs/ceph/file.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
fs/ceph/file.c +5 -7
@@ -1448,16 +1448,14 @@ static loff_t ceph_llseek(struct file *f {struct inode *inode = file->f_mapping->host;loff_t i_size; -int ret; +loff_t ret;inode_lock (inode);if (whence ==SEEK_END || whence ==SEEK_DATA || whence ==SEEK_HOLE ) { ret =ceph_do_getattr (inode,CEPH_STAT_CAP_SIZE , false); -if (ret <0 ) { - offset = ret; +if (ret <0 ) goto out; - } } i_size =i_size_read (inode);
@@ -1473,7 +1471,7 @@ static loff_t ceph_llseek(struct file *f* write() or lseek() might have altered it */ if (offset ==0 ) { - offset = file->f_pos; + ret = file->f_pos; goto out; } offset += file->f_pos;
@@ -1493,11 +1491,11 @@ static loff_t ceph_llseek(struct file *fbreak ; } - offset =vfs_setpos (file, offset, inode->i_sb->s_maxbytes); + ret =vfs_setpos (file, offset, inode->i_sb->s_maxbytes); out:inode_unlock (inode); -return offset; +return ret; } static inline void ceph_zero_partial_page(
Greg Kroah-Hartman
maintainerPATCH 55/69 libceph: fix return value check in alloc_msg_with_page_vector()
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit c22e853a2ed19321d00c1eae339ffdc4f5e7757e upstream.
In case of error, the function ceph_alloc_page_vector() returns ERR_PTR() and never returns NULL. The NULL test in the return value check should be replaced with IS_ERR().
--- net/ceph/osd_client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ceph/osd_client.c +1 -1
@@ -4187,7 +4187,7 @@ static struct ceph_msg *alloc_msg_with_p pages =ceph_alloc_page_vector (calc_pages_for (0 , data_len),GFP_NOIO ); -if (!pages) { +if (IS_ERR (pages)) {ceph_msg_put (m);return NULL ; }
Greg Kroah-Hartman
maintainerPATCH 56/69 PM / hibernate: Restore processor state before using per-CPU variables
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Garnier <[email protected]>
commit 62822e2ec4ad091ba31f823f577ef80db52e3c2c upstream.
Restore the processor state before calling any other functions to ensure per-CPU variables can be used with KASLR memory randomization.
Tracing functions use per-CPU variables (GS based on x86) and one was called just before restoring the processor state fully. It resulted in a double fault when both the tracing & the exception handler functions tried to use a per-CPU variable.
--- kernel/power/hibernate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/power/hibernate.c +2 -2
@@ -299,12 +299,12 @@ static int create_image(int platform_modsave_processor_state ();trace_suspend_resume (TPS ("machine_suspend" ),PM_EVENT_HIBERNATE , true); error =swsusp_arch_suspend (); +/* Restore control flow magically appears here */ +restore_processor_state ();trace_suspend_resume (TPS ("machine_suspend" ),PM_EVENT_HIBERNATE , false);if (error)printk (KERN_ERR "PM: Error %d creating hibernation image\n" , error); -/* Restore control flow magically appears here */ -restore_processor_state ();if (!in_suspend) events_check_enabled = false;
Greg Kroah-Hartman
maintainerPATCH 57/69 PM / hibernate: Fix rtree_next_node() to avoid walking off list ends
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Morse <[email protected]>
commit 924d8696751c4b9e58263bc82efdafcf875596a6 upstream.
rtree_next_node() walks the linked list of leaf nodes to find the next block of pages in the struct memory_bitmap. If it walks off the end of the list of nodes, it walks the list of memory zones to find the next region of memory. If it walks off the end of the list of zones, it returns false.
This leaves the struct bm_position's node and zone pointers pointing at their respective struct list_heads in struct mem_zone_bm_rtree.
memory_bm_find_bit() uses struct bm_position's node and zone pointers to avoid walking lists and trees if the next bit appears in the same node/zone. It handles these values being stale.
Swap rtree_next_node()s 'step then test' to 'test-next then step', this means if we reach the end of memory we return false and leave the node and zone pointers as they were.
This fixes a panic on resume using AMD Seattle with 64K pages:
[ 6.868732] Freezing user space processes ... (elapsed 0.000 seconds) done. [ 6.875753] Double checking all user space processes after OOM killer disable... (elapsed 0.000 seconds) [ 6.896453] PM: Using 3 thread(s) for decompression. [ 6.896453] PM: Loading and decompressing image data (5339 pages)... [ 7.318890] PM: Image loading progress: 0% [ 7.323395] Unable to handle kernel paging request at virtual address 00800040 [ 7.330611] pgd = ffff000008df0000 [ 7.334003] [00800040] *pgd=00000083fffe0003, *pud=00000083fffe0003, *pmd=00000083fffd0003, *pte=0000000000000000 [ 7.344266] Internal error: Oops: 96000005 [#1] PREEMPT SMP [ 7.349825] Modules linked in: [ 7.352871] CPU: 2 PID: 1 Comm: swapper/0 Tainted: G W I 4.8.0-rc1 #4737 [ 7.360512] Hardware name: AMD Overdrive/Supercharger/Default string, BIOS ROD1002C 04/08/2016 [ 7.369109] task: ffff8003c0220000 task.stack: ffff8003c0280000 [ 7.375020] PC is at set_bit+0x18/0x30 [ 7.378758] LR is at memory_bm_set_bit+0x24/0x30 [ 7.383362] pc : [<ffff00000835bbc8>] lr : [<ffff0000080faf18>] pstate: 60000045 [ 7.390743] sp : ffff8003c0283b00 [ 7.473551] [ 7.475031] Process swapper/0 (pid: 1, stack limit = 0xffff8003c0280020) [ 7.481718] Stack: (0xffff8003c0283b00 to 0xffff8003c0284000) [ 7.800075] Call trace: [ 7.887097] [<ffff00000835bbc8>] set_bit+0x18/0x30 [ 7.891876] [<ffff0000080fb038>] duplicate_memory_bitmap.constprop.38+0x54/0x70 [ 7.899172] [<ffff0000080fcc40>] snapshot_write_next+0x22c/0x47c [ 7.905166] [<ffff0000080fe1b4>] load_image_lzo+0x754/0xa88 [ 7.910725] [<ffff0000080ff0a8>] swsusp_read+0x144/0x230 [ 7.916025] [<ffff0000080fa338>] load_image_and_restore+0x58/0x90 [ 7.922105] [<ffff0000080fa660>] software_resume+0x2f0/0x338 [ 7.927752] [<ffff000008083350>] do_one_initcall+0x38/0x11c [ 7.933314] [<ffff000008b40cc0>] kernel_init_freeable+0x14c/0x1ec [ 7.939395] [<ffff0000087ce564>] kernel_init+0x10/0xfc [ 7.944520] [<ffff000008082e90>] ret_from_fork+0x10/0x40 [ 7.949820] Code: d2800022 8b400c21 f9800031 9ac32043 (c85f7c22) [ 7.955909] ---[ end trace 0024a5986e6ff323 ]--- [ 7.960529] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
Here struct mem_zone_bm_rtree's start_pfn has been returned instead of struct rtree_node's addr as the node/zone pointers are corrupt after we walked off the end of the lists during mark_unsafe_pages().
This behaviour was exposed by commit 6dbecfd345a6 ("PM / hibernate:
Simplify mark_unsafe_pages()"), which caused mark_unsafe_pages() to call duplicate_memory_bitmap(), which uses memory_bm_find_bit() after walking off the end of the memory bitmap.
--- kernel/power/snapshot.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
kernel/power/snapshot.c +5 -5
@@ -765,9 +765,9 @@ static bool memory_bm_pfn_present(struct*/ static bool rtree_next_node (struct memory_bitmap *bm) { - bm->cur.node =list_entry (bm->cur.node->list.next, - struct rtree_node, list); -if (&bm->cur.node->list != &bm->cur.zone->leaves) { +if (!list_is_last (&bm->cur.node->list, &bm->cur.zone->leaves)) { + bm->cur.node =list_entry (bm->cur.node->list.next, + struct rtree_node, list); bm->cur.node_pfn +=BM_BITS_PER_BLOCK ; bm->cur.node_bit =0 ;touch_softlockup_watchdog ();
@@ -775,9 +775,9 @@ static bool rtree_next_node(struct memor }/* No more nodes, goto next zone */ - bm->cur.zone =list_entry (bm->cur.zone->list.next, +if (!list_is_last (&bm->cur.zone->list, &bm->zones)) { + bm->cur.zone =list_entry (bm->cur.zone->list.next, struct mem_zone_bm_rtree, list); -if (&bm->cur.zone->list != &bm->zones) { bm->cur.node =list_entry (bm->cur.zone->leaves.next, struct rtree_node, list); bm->cur.node_pfn =0 ;
Greg Kroah-Hartman
maintainerPATCH 58/69 power_supply: tps65217-charger: fix missing platform_set_drvdata()
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit 33e7664a0af6e9a516f01014f39737aaa119b6d9 upstream.
Add missing platform_set_drvdata() in tps65217_charger_probe(), otherwise calling platform_get_drvdata() in remove returns NULL.
This is detected by Coccinelle semantic patch.
--- drivers/power/tps65217_charger.c | 1 + 1 file changed, 1 insertion(+)
drivers/power/tps65217_charger.c +1 -0
@@ -206,6 +206,7 @@ static int tps65217_charger_probe(structif (!charger)return -ENOMEM ; +platform_set_drvdata (pdev, charger); charger->tps = tps; charger->dev = &pdev->dev;
Greg Kroah-Hartman
maintainerPATCH 59/69 power: supply: max17042_battery: fix model download bug.
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Van Asbroeck <[email protected]>
commit 5381cfb6f0422da24cfa9da35b0433c0415830e0 upstream.
The device's model download function returns the model data as an array of u32s, which is later compared to the reference model data. However, since the latter is an array of u16s, the comparison does not happen correctly, and model verification fails. This in turn breaks the POR initialization sequence.
--- drivers/power/max17042_battery.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/power/max17042_battery.c +9 -6
@@ -457,13 +457,16 @@ static inline void max17042_write_model_ }static inline void max17042_read_model_data (struct max17042_chip *chip, -u8 addr,u32 *data,int size) +u8 addr,u16 *data,int size) {struct regmap *map = chip->regmap;int i; +u32 tmp; -for (i =0 ; i < size; i++) -regmap_read (map, addr + i, &data[i]); +for (i =0 ; i < size; i++) { +regmap_read (map, addr + i, &tmp); + data[i] = (u16 )tmp; + } } static inline int max17042_model_data_compare(struct max17042_chip *chip,
@@ -486,7 +489,7 @@ static int max17042_init_model(struct ma {int ret;int table_size =ARRAY_SIZE (chip->pdata->config_data->cell_char_tbl); -u32 *temp_data; +u16 *temp_data; temp_data =kcalloc (table_size,sizeof (*temp_data),GFP_KERNEL );if (!temp_data)
@@ -501,7 +504,7 @@ static int max17042_init_model(struct ma ret =max17042_model_data_compare ( chip, chip->pdata->config_data->cell_char_tbl, - (u16 *)temp_data, + temp_data, table_size);max10742_lock_model (chip);
@@ -514,7 +517,7 @@ static int max17042_verify_model_lock(st {int i;int table_size =ARRAY_SIZE (chip->pdata->config_data->cell_char_tbl); -u32 *temp_data; +u16 *temp_data;int ret =0 ; temp_data =kcalloc (table_size,sizeof (*temp_data),GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 60/69 ixgbe: Force VLNCTRL.VFE to be set in all VMDq paths
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Duyck <[email protected]>
commit f60439bc21e3337429838e477903214f5bd8277f upstream.
When I was adding the code for enabling VLAN promiscuous mode with SR-IOV enabled I had inadvertently left the VLNCTRL.VFE bit unchanged as I has assumed there was code in another path that was setting it when we enabled SR-IOV. This wasn't the case and as a result we were just disabling VLAN filtering for all the VFs apparently.
Also the previous patches were always clearing CFIEN which was always set to 0 by the hardware anyway so I am dropping the redundant bit clearing.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +12 -6
@@ -4100,6 +4100,8 @@ static void ixgbe_vlan_promisc_enable(ststruct ixgbe_hw *hw = &adapter->hw;u32 vlnctrl, i; + vlnctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); +switch (hw->mac.type) {case ixgbe_mac_82599EB:case ixgbe_mac_X540:
@@ -4112,8 +4114,7 @@ static void ixgbe_vlan_promisc_enable(st/* fall through */ case ixgbe_mac_82598EB:/* legacy case, we can just disable VLAN filtering */ - vlnctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); - vlnctrl &= ~(IXGBE_VLNCTRL_VFE |IXGBE_VLNCTRL_CFIEN ); + vlnctrl &= ~IXGBE_VLNCTRL_VFE ;IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , vlnctrl);return ; }
@@ -4125,6 +4126,10 @@ static void ixgbe_vlan_promisc_enable(st/* Set flag so we don't redo unnecessary work */ adapter->flags2 |=IXGBE_FLAG2_VLAN_PROMISC ; +/* For VMDq and SR-IOV we must leave VLAN filtering enabled */ + vlnctrl |=IXGBE_VLNCTRL_VFE ; +IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , vlnctrl); +/* Add PF to all active pools */ for (i =IXGBE_VLVF_ENTRIES ; --i;) {u32 reg_offset =IXGBE_VLVFB (i *2 +VMDQ_P (0 ) /32 );
@@ -4191,6 +4196,11 @@ static void ixgbe_vlan_promisc_disable(sstruct ixgbe_hw *hw = &adapter->hw;u32 vlnctrl, i; +/* Set VLAN filtering to enabled */ + vlnctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); + vlnctrl |=IXGBE_VLNCTRL_VFE ; +IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , vlnctrl); +switch (hw->mac.type) {case ixgbe_mac_82599EB:case ixgbe_mac_X540:
@@ -4202,10 +4212,6 @@ static void ixgbe_vlan_promisc_disable(sbreak ;/* fall through */ case ixgbe_mac_82598EB: - vlnctrl =IXGBE_READ_REG (hw,IXGBE_VLNCTRL ); - vlnctrl &= ~IXGBE_VLNCTRL_CFIEN ; - vlnctrl |=IXGBE_VLNCTRL_VFE ; -IXGBE_WRITE_REG (hw,IXGBE_VLNCTRL , vlnctrl);return ; }
Greg Kroah-Hartman
maintainerPATCH 61/69 ixgbe: Re-enable ability to toggle VLAN filtering
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Duyck <[email protected]>
commit 3d951822be216d8c6fcfc8abf75e5ed307eeb646 upstream.
Back when I submitted the GSO code I messed up and dropped the support for disabling the VLAN tag filtering via the feature bit. This patch re-enables the use of the NETIF_F_HW_VLAN_CTAG_FILTER to enable/disable the VLAN filtering independent of toggling promiscuous mode.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +1 -0
@@ -9502,6 +9502,7 @@ skip_sriov:/* copy netdev features into list of user selectable features */ netdev->hw_features |= netdev->features | +NETIF_F_HW_VLAN_CTAG_FILTER |NETIF_F_HW_VLAN_CTAG_RX |NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_RXALL |
Greg Kroah-Hartman
maintainerPATCH 62/69 igb: fix adjusting PTP timestamps for Tx/Rx latency
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kshitiz Gupta <[email protected]>
commit 0066c8b6f4050d7c57f6379d6fd4535e2f267f17 upstream.
Fix PHY delay compensation math in igb_ptp_tx_hwtstamp() and igb_ptp_rx_rgtstamp. Add PHY delay compensation in igb_ptp_rx_pktstamp().
In the IGB driver, there are two functions that retrieve timestamps received by the PHY - igb_ptp_rx_rgtstamp() and igb_ptp_rx_pktstamp(). The previous commit only changed igb_ptp_rx_rgtstamp(), and the change was incorrect.
There are two instances in which PHY delay compensations should be made:
- Before the packet transmission over the PHY, the latency between when the packet is timestamped and transmission of the packets, should be an add operation, but it is currently a subtract.
- After the packets are received from the PHY, the latency between the receiving and timestamping of the packets should be a subtract operation, but it is currently an add.
--- drivers/net/ethernet/intel/igb/igb_ptp.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/igb/igb_ptp.c +23 -3
@@ -743,7 +743,8 @@ static void igb_ptp_tx_hwtstamp(struct i } } - shhwtstamps.hwtstamp =ktime_sub_ns (shhwtstamps.hwtstamp, adjust); + shhwtstamps.hwtstamp = +ktime_add_ns (shhwtstamps.hwtstamp, adjust);skb_tstamp_tx (adapter->ptp_tx_skb, &shhwtstamps);dev_kfree_skb_any (adapter->ptp_tx_skb);
@@ -766,13 +767,32 @@ void igb_ptp_rx_pktstamp(struct igb_q_ve struct sk_buff *skb) {__le64 *regval = (__le64 *)va; +struct igb_adapter *adapter = q_vector->adapter; +int adjust =0 ;/* The timestamp is recorded in little endian format. * DWORD: 0 1 2 3 * Field: Reserved Reserved SYSTIML SYSTIMH */ -igb_ptp_systim_to_hwtstamp (q_vector->adapter,skb_hwtstamps (skb), +igb_ptp_systim_to_hwtstamp (adapter,skb_hwtstamps (skb),le64_to_cpu (regval[1 ])); + +/* adjust timestamp for the RX latency based on link speed */ +if (adapter->hw.mac.type == e1000_i210) { +switch (adapter->link_speed) { +case SPEED_10 : + adjust =IGB_I210_RX_LATENCY_10 ; +break ; +case SPEED_100 : + adjust =IGB_I210_RX_LATENCY_100 ; +break ; +case SPEED_1000 : + adjust =IGB_I210_RX_LATENCY_1000 ; +break ; + } + } +skb_hwtstamps (skb)->hwtstamp = +ktime_sub_ns (skb_hwtstamps (skb)->hwtstamp, adjust); }/**
@@ -824,7 +844,7 @@ void igb_ptp_rx_rgtstamp(struct igb_q_ve } }skb_hwtstamps (skb)->hwtstamp = -ktime_add_ns (skb_hwtstamps (skb)->hwtstamp, adjust); +ktime_sub_ns (skb_hwtstamps (skb)->hwtstamp, adjust);/* Update the last_rx_timestamp timer in order to enable watchdog check * for error case of latched timestamp on a dropped packet.
Greg Kroah-Hartman
maintainerPATCH 63/69 soc/tegra: pmc: Dont probe PMC if early initialisation fails
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jon Hunter <[email protected]>
commit a83f1fc3f33930d01e579b9d4de92a045297b402 upstream.
Commit 0259f522e04f ('soc/tegra: pmc: Restore base address on probe failure') fixes an issue where the PMC base address pointer is not restored on probe failure. However, this fix creates another problem where if early initialisation of the PMC driver fails and an initial mapping for the PMC address space is not created, then when the PMC device is probed, the PMC base address pointer will not be valid and this will cause a crash when tegra_pmc_init() is called and attempts to access a register.
Although the PMC address space is mapped a 2nd time during the probe and so this could be fixed by populating the base address pointer earlier during the probe, this adds more complexity to the code. Moreover, the PMC probe also assumes the the soc data pointer is also initialised when the device is probed and if not will also lead to a crash when calling tegra_pmc_init_tsense_reset(). Given that if the early initialisation does fail then something bad has happen, it seems acceptable to allow the PMC device probe to fail as well. Therefore, if the PMC base address pointer or soc data pointer are not valid when probing the PMC device, WARN and return an error.
--- drivers/soc/tegra/pmc.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/soc/tegra/pmc.c +8 -0
@@ -1205,6 +1205,14 @@ static int tegra_pmc_probe(struct platfostruct resource *res;int err; +/* +* Early initialisation should have configured an initial +* register mapping and setup the soc data pointer. If these +* are not valid then something went badly wrong! +*/ +if (WARN_ON (!pmc->base || !pmc->soc)) +return -ENODEV ; + err =tegra_pmc_parse_dt (pmc, pdev->dev.of_node);if (err <0 )return err;
Greg Kroah-Hartman
maintainerPATCH 64/69 qxl: check for kmap failures
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit f4cceb2affcd1285d4ce498089e8a79f4cd2fa66 upstream.
If kmap fails, it leads to memory corruption.
--- drivers/gpu/drm/qxl/qxl_draw.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/qxl/qxl_draw.c +2 -0
@@ -136,6 +136,8 @@ static int qxl_palette_create_1bit(struc* correctly globaly, since that would require * tracking all of our palettes. */ ret =qxl_bo_kmap (palette_bo, (void **)&pal); +if (ret) +return ret; pal->num_ents =2 ; pal->unique = unique++;if (visual ==FB_VISUAL_TRUECOLOR || visual ==FB_VISUAL_DIRECTCOLOR ) {
Greg Kroah-Hartman
maintainerPATCH 65/69 hostfs: Freeing an ERR_PTR in hostfs_fill_sb_common()
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 8a545f185145e3c09348cd74326268ecfc6715a3 upstream.
We can't pass error pointers to kfree() or it causes an oops.
--- fs/hostfs/hostfs_kern.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
fs/hostfs/hostfs_kern.c +4 -3
@@ -959,10 +959,11 @@ static int hostfs_fill_sb_common(structif (S_ISLNK (root_inode->i_mode)) {char *name =follow_link (host_root_path); -if (IS_ERR (name)) +if (IS_ERR (name)) { err =PTR_ERR (name); -else - err =read_name (root_inode, name); + goto out_put; + } + err =read_name (root_inode, name);kfree (name);if (err) goto out_put;
Greg Kroah-Hartman
maintainerPATCH 66/69 kasan: avoid overflowing quarantine size on low memory systems
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Potapenko <[email protected]>
commit c3cee372282cb6bcdf19ac1457581d5dd5ecb554 upstream.
If the total amount of memory assigned to quarantine is less than the amount of memory assigned to per-cpu quarantines, |new_quarantine_size| may overflow. Instead, set it to zero.
--- mm/kasan/quarantine.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
mm/kasan/quarantine.c +7 -2
@@ -196,7 +196,7 @@ void quarantine_put(struct kasan_free_mevoid quarantine_reduce (void ) { -size_t new_quarantine_size; +size_t new_quarantine_size, percpu_quarantines;unsigned long flags;struct qlist_head to_free =QLIST_INIT ;size_t size_to_free =0 ;
@@ -214,7 +214,12 @@ void quarantine_reduce(void)*/ new_quarantine_size = (READ_ONCE (totalram_pages) <<PAGE_SHIFT ) /QUARANTINE_FRACTION ; - new_quarantine_size -=QUARANTINE_PERCPU_SIZE *num_online_cpus (); + percpu_quarantines =QUARANTINE_PERCPU_SIZE *num_online_cpus (); +if (WARN_ONCE (new_quarantine_size < percpu_quarantines, +"Too little memory, disabling global KASAN quarantine.\n" )) + new_quarantine_size =0 ; +else + new_quarantine_size -= percpu_quarantines;WRITE_ONCE (quarantine_size, new_quarantine_size); last = global_quarantine.head;
Greg Kroah-Hartman
maintainerPATCH 67/69 mm/kasan: dont reduce quarantine in atomic contexts
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrey Ryabinin <[email protected]>
commit 4b3ec5a3f4b1d5c9d64b9ab704042400d050d432 upstream.
Currently we call quarantine_reduce() for ___GFP_KSWAPD_RECLAIM (implied by __GFP_RECLAIM) allocation. So, basically we call it on almost every allocation. quarantine_reduce() sometimes is heavy operation, and calling it with disabled interrupts may trigger hard LOCKUP:
NMI watchdog: Watchdog detected hard LOCKUP on cpu 2irq event stamp: 1411258
Call Trace: <NMI> dump_stack+0x68/0x96 watchdog_overflow_callback+0x15b/0x190 __perf_event_overflow+0x1b1/0x540 perf_event_overflow+0x14/0x20 intel_pmu_handle_irq+0x36a/0xad0 perf_event_nmi_handler+0x2c/0x50 nmi_handle+0x128/0x480 default_do_nmi+0xb2/0x210 do_nmi+0x1aa/0x220 end_repeat_nmi+0x1a/0x1e <<EOE>> __kernel_text_address+0x86/0xb0 print_context_stack+0x7b/0x100 dump_trace+0x12b/0x350 save_stack_trace+0x2b/0x50 set_track+0x83/0x140 free_debug_processing+0x1aa/0x420 __slab_free+0x1d6/0x2e0 ___cache_free+0xb6/0xd0 qlist_free_all+0x83/0x100 quarantine_reduce+0x177/0x1b0 kasan_kmalloc+0xf3/0x100
Reduce the quarantine_reduce iff direct reclaim is allowed.
--- mm/kasan/kasan.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
mm/kasan/kasan.c +2 -2
@@ -562,7 +562,7 @@ void kasan_kmalloc(struct kmem_cache *caunsigned long redzone_start;unsigned long redzone_end; -if (flags & __GFP_RECLAIM) +if (gfpflags_allow_blocking (flags))quarantine_reduce ();if (unlikely (object ==NULL ))
@@ -595,7 +595,7 @@ void kasan_kmalloc_large(const void *ptrunsigned long redzone_start;unsigned long redzone_end; -if (flags & __GFP_RECLAIM) +if (gfpflags_allow_blocking (flags))quarantine_reduce ();if (unlikely (ptr ==NULL ))
Greg Kroah-Hartman
maintainerPATCH 68/69 iw_cxgb4: stop MPA_REPLY timer when disconnecting
In reply to Greg Kroah-Hartman4.7-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steve Wise <[email protected]>
commit 12eb5137edecfd8fb6d23dacec2a3630e729736f upstream.
There exists a race where the application can setup a connection and then disconnect it before iw_cxgb4 processes the fw4_ack message. For passive side connections, the fw4_ack message is used to know when to stop the ep timer for MPA_REPLY messages.
If the application disconnects before the fw4_ack is handled then c4iw_ep_disconnect() needs to clean up the timer state and stop the timer before restarting it for the disconnect timer. Failure to do this results in a "timer already started" message and a premature stopping of the disconnect timer.
--- drivers/infiniband/hw/cxgb4/cm.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/infiniband/hw/cxgb4/cm.c +11 -1
@@ -3011,9 +3011,9 @@ static int fw4_ack(struct c4iw_dev *dev,PDBG ("%s last streaming msg ack ep %p tid %u state %u " "initiator %u freeing skb\n" , __func__, ep, ep->hwtid,state_read (&ep->com), ep->mpa_attr.initiator ?1 :0 ); +mutex_lock (&ep->com.mutex);kfree_skb (ep->mpa_skb); ep->mpa_skb =NULL ; -mutex_lock (&ep->com.mutex);if (test_bit (STOP_MPA_TIMER , &ep->com.flags))stop_ep_timer (ep);mutex_unlock (&ep->com.mutex);
@@ -3582,6 +3582,16 @@ int c4iw_ep_disconnect(struct c4iw_ep *e ep->com.state =ABORTING ; else { ep->com.state =CLOSING ; + +/* +* if we close before we see the fw4_ack() then we fix +* up the timer state since we're reusing it. +*/ +if (ep->mpa_skb && +test_bit (STOP_MPA_TIMER , &ep->com.flags)) { +clear_bit (STOP_MPA_TIMER , &ep->com.flags); +stop_ep_timer (ep); + }start_ep_timer (ep); }set_bit (CLOSE_SENT , &ep->com.flags);
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.7.6 release. There are 69 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 Fri Sep 30 09:04:31 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.7.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.7.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]
Greg Kroah-Hartman
maintainerQuoted 15 lines · Shuah Khan
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.7.6 release. There are 69 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 Fri Sep 30 09:04:31 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.7.6-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.7.y
and the diffstat can be found below.
Quoted 6 lines
Quoted 4 lines
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
Great! Thanks for testing and letting me know.
greg k-h
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.7.6 release. There are 69 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 Fri Sep 30 09:04:31 UTC 2016. Anything received after that time might be too late.
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 108 pass: 108 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
Greg Kroah-Hartman
maintainerQuoted 9 lines · Guenter Roeck
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.7.6 release. There are 69 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 Fri Sep 30 09:04:31 UTC 2016. Anything received after that time might be too late.
Quoted 6 lines
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 108 pass: 108 fail: 0Details are available at http://kerneltests.org/builders.
Thanks for testing these and letting me know.
greg k-h
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
Greg Kroah-Hartman
maintainerQuoted 18 lines · Kevin Hilman
Quoted 16 lines · kernelci.org bot
stable-rc boot: 105 boots: 1 failed, 100 passed with 4 offline (v4.7.5-70-g64e4c0f6d4b1)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/kernel/v4.7.5-70-g64e4c0f6d4b1/
Full Build Summary: https://kernelci.org/build/stable-rc/kernel/v4.7.5-70-g64e4c0f6d4b1/Tree: stable-rc
Branch: local/linux-4.7.y
Git Describe: v4.7.5-70-g64e4c0f6d4b1
Git Commit:64e4c0f6d4b12abd1966ac9ad2082a0815a3d0eb
Git URL: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 32 unique boards, 12 SoC families, 20 builds out of 205Boot Failure Detected: https://kernelci.org/boot/?v4.7.5-70-g64e4c0f6d4b1&fail
arm:
Quoted 7 lines
Quoted 2 lines
multi_v7_defconfig+CONFIG_PROVE_LOCKING=y:
at91-sama5d3_xplained: 1 failed labThis looks like a legit new failure, and the same thing is happening on stable-rc/linux-4.4.y.
I've asked the lab with this board to have a closer look,
Thanks, I don't see anything obvious in the patch series that would have affected this board, but given the PROVE_LOCKING option, maybe it was a more generic change that is causing the issue.
greg k-h
Quoted 22 lines · Greg Kroah-Hartman
Quoted 21 lines · Kevin Hilman
Quoted 18 lines · kernelci.org bot
stable-rc boot: 105 boots: 1 failed, 100 passed with 4 offline (v4.7.5-70-g64e4c0f6d4b1)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/kernel/v4.7.5-70-g64e4c0f6d4b1/
Full Build Summary: https://kernelci.org/build/stable-rc/kernel/v4.7.5-70-g64e4c0f6d4b1/Tree: stable-rc
Branch: local/linux-4.7.y
Git Describe: v4.7.5-70-g64e4c0f6d4b1
Git Commit:64e4c0f6d4b12abd1966ac9ad2082a0815a3d0eb
Git URL: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 32 unique boards, 12 SoC families, 20 builds out of 205Boot Failure Detected: https://kernelci.org/boot/?v4.7.5-70-g64e4c0f6d4b1&fail
arm:
multi_v7_defconfig+CONFIG_PROVE_LOCKING=y:
at91-sama5d3_xplained: 1 failed lab
Quoted 8 lines
Quoted 4 lines
This looks like a legit new failure, and the same thing is happening on stable-rc/linux-4.4.y.
I've asked the lab with this board to have a closer look,
Thanks, I don't see anything obvious in the patch series that would have affected this board, but given the
PROVE_LOCKINGoption, maybe it was a more generic change that is causing the issue.
Since the kernelci email report went out, another lab reported a PASS for this board on the same defconfig, so this particular FAIL is likely a lab-specific issue, so I wouldn't let this block stable release.
FYI... I have a few other boards[1] that are failing in mainline with CONFIG_PROVE_LOCKING=y, and I've yet to get to the root of the problem.
My best guess currently is that those seem to be related to the bootloader/boot-firmware not being able to deal with large zImage (CONFIG_PROVE_LOCKING makes a bit bigger image.)
I don't know the closed bootloader/boot-firmware on these qualcomm platforms, so I've asked the qcom maintainers for some help.
Kevin
[1] https://kernelci.org/boot/all/job/mainline/kernel/v4.8-rc8-13-g53061afee43b/
Greg Kroah-Hartman
maintainerQuoted 29 lines · Kevin Hilman
Quoted 27 lines · Greg Kroah-Hartman
Quoted 25 lines · Kevin Hilman
Quoted 12 lines · kernelci.org bot
stable-rc boot: 105 boots: 1 failed, 100 passed with 4 offline (v4.7.5-70-g64e4c0f6d4b1)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/kernel/v4.7.5-70-g64e4c0f6d4b1/
Full Build Summary: https://kernelci.org/build/stable-rc/kernel/v4.7.5-70-g64e4c0f6d4b1/Tree: stable-rc
Branch: local/linux-4.7.y
Git Describe: v4.7.5-70-g64e4c0f6d4b1
Git Commit:64e4c0f6d4b12abd1966ac9ad2082a0815a3d0eb
Git URL: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 32 unique boards, 12 SoC families, 20 builds out of 205Quoted 6 lines
Boot Failure Detected: https://kernelci.org/boot/?v4.7.5-70-g64e4c0f6d4b1&fail
arm:
multi_v7_defconfig+CONFIG_PROVE_LOCKING=y:
at91-sama5d3_xplained: 1 failed labThis looks like a legit new failure, and the same thing is happening on stable-rc/linux-4.4.y.
I've asked the lab with this board to have a closer look,
Quoted 7 lines
Quoted 3 lines
Thanks, I don't see anything obvious in the patch series that would have affected this board, but given the
PROVE_LOCKINGoption, maybe it was a more generic change that is causing the issue.Since the kernelci email report went out, another lab reported a PASS for this board on the same defconfig, so this particular FAIL is likely a lab-specific issue, so I wouldn't let this block stable release.
Great, thanks for letting me know, I will now not worry about it :)
greg k-h