5.4.51-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainercover 5.4.51-rc1 review
This is the start of the stable review cycle for the 5.4.51 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 09 Jul 2020 14:57:34 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.51-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-5.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.4.51-rc1
Peter Jones <[email protected]>
efi: Make it possible to disable efivar_ssdt entirely
Hou Tao <[email protected]>
dm zoned: assign max_io_len correctly
Babu Moger <[email protected]>
x86/resctrl: Fix memory bandwidth counter width for AMD
Vlastimil Babka <[email protected]>
mm, compaction: make capture control handling safe wrt interrupts
Vlastimil Babka <[email protected]>
mm, compaction: fully assume capture is not NULL in compact_zone_order()
Marc Zyngier <[email protected]>
irqchip/gic: Atomically update affinity
Sumit Semwal <[email protected]>
dma-buf: Move dma_buf_release() from fops to dentry_ops
Alex Deucher <[email protected]>
drm/amdgpu/atomfirmware: fix vram_info fetching for renoir
Alex Deucher <[email protected]>
drm/amdgpu: use %u rather than %d for sclk/mclk
Nicholas Kazlauskas <[email protected]>
drm/amd/display: Only revalidate bandwidth on medium and fast updates
Hauke Mehrtens <[email protected]>
MIPS: Add missing EHB in mtc0 -> mfc0 sequence for DSPen
Martin Blumenstingl <[email protected]>
MIPS: lantiq: xway: sysctrl: fix the GPHY clock alias names
Zhang Xiaoxu <[email protected]>
cifs: Fix the target file was deleted when rename failed.
Paul Aurich <[email protected]>
SMB3: Honor 'handletimeout' flag for multiuser mounts
Paul Aurich <[email protected]>
SMB3: Honor lease disabling for multiuser mounts
Paul Aurich <[email protected]>
SMB3: Honor persistent/resilient handle flags for multiuser mounts
Paul Aurich <[email protected]>
SMB3: Honor 'seal' flag for multiuser mounts
Greg Kroah-Hartman <[email protected]>
Revert "ALSA: usb-audio: Improve frames size computation"
J. Bruce Fields <[email protected]>
nfsd: apply umask on fs without ACL support
Krzysztof Kozlowski <[email protected]>
spi: spi-fsl-dspi: Fix external abort on interrupt in resume or exit paths
Wolfram Sang <[email protected]>
i2c: mlxcpld: check correct size of maximum RECV_LEN packet
Chris Packham <[email protected]>
i2c: algo-pca: Add 0x78 as SCL stuck low status for PCA9665
Kees Cook <[email protected]>
samples/vfs: avoid warning in statx override
Christoph Hellwig <[email protected]>
nvme: fix a crash in nvme_mpath_add_disk
Sagi Grimberg <[email protected]>
nvme: fix identify error status silent ignore
Paul Aurich <[email protected]>
SMB3: Honor 'posix' flag for multiuser mounts
Hou Tao <[email protected]>
virtio-blk: free vblk-vqs in error path of virtblk_probe()
Chen-Yu Tsai <[email protected]>
drm: sun4i: hdmi: Remove extra HPD polling
J. Bruce Fields <[email protected]>
nfsd: fix nfsdfs inode reference count leak
J. Bruce Fields <[email protected]>
nfsd4: fix nfsdfs reference count loop
J. Bruce Fields <[email protected]>
nfsd: clients don't need to break their own delegations
J. Bruce Fields <[email protected]>
kthread: save thread function
Dien Pham <[email protected]>
thermal/drivers/rcar_gen3: Fix undefined temperature if negative
Michael Kao <[email protected]>
thermal/drivers/mediatek: Fix bank number settings on mt8183
Misono Tomohiro <[email protected]>
hwmon: (acpi_power_meter) Fix potential memory leak in acpi_power_meter_add()
Chu Lin <[email protected]>
hwmon: (max6697) Make sure the OVERT mask is set correctly
Rahul Lakkireddy <[email protected]>
cxgb4: fix SGE queue dump destination buffer context
Rahul Lakkireddy <[email protected]>
cxgb4: use correct type for all-mask IP address comparison
Rahul Lakkireddy <[email protected]>
cxgb4: fix endian conversions for L4 ports in filters
Rahul Lakkireddy <[email protected]>
cxgb4: parse TC-U32 key values and masks natively
Rahul Lakkireddy <[email protected]>
cxgb4: use unaligned conversion for fetching timestamp
Mark Zhang <[email protected]>
RDMA/counter: Query a counter before release
David Howells <[email protected]>
rxrpc: Fix afs large storage transmission performance drop
Chen Tao <[email protected]>
drm/msm/dpu: fix error return code in dpu_encoder_init
Herbert Xu <[email protected]>
crypto: af_alg - fix use-after-free in af_alg_accept() due to bh_lock_sock()
James Bottomley <[email protected]>
tpm: Fix TIS locality timeout problems
Jarkko Sakkinen <[email protected]>
selftests: tpm: Use /bin/sh instead of /bin/bash
Douglas Anderson <[email protected]>
kgdb: Avoid suspicious RCU usage warning
Sagi Grimberg <[email protected]>
nvme-multipath: fix bogus request queue reference put
Anton Eidelman <[email protected]>
nvme-multipath: fix deadlock due to head->lock
Anton Eidelman <[email protected]>
nvme-multipath: fix deadlock between ana_work and scan_work
Sagi Grimberg <[email protected]>
nvme: fix possible deadlock when I/O is blocked
Keith Busch <[email protected]>
nvme-multipath: set bdi capabilities once
Christian Borntraeger <[email protected]>
s390/debug: avoid kernel warning on too large number of pages
Steven Rostedt (VMware) <[email protected]>
tools lib traceevent: Handle __attribute__((user)) in field names
Steven Rostedt (VMware) <[email protected]>
tools lib traceevent: Add append() function helper for appending strings
Zqiang <[email protected]>
usb: usbtest: fix missing kfree(dev->buf) in usbtest_disconnect
David Howells <[email protected]>
rxrpc: Fix race between incoming ACK parser and retransmitter
Qian Cai <[email protected]>
mm/slub: fix stack overruns with SLUB_STATS
Dongli Zhang <[email protected]>
mm/slub.c: fix corrupted freechain in deactivate_slab()
Valentin Schneider <[email protected]>
sched/debug: Make sd->flags sysctl read-only
Tuomas Tynkkynen <[email protected]>
usbnet: smsc95xx: Fix use-after-free after removal
Borislav Petkov <[email protected]>
EDAC/amd64: Read back the scrub rate PCI register on F15h
Hugh Dickins <[email protected]>
mm: fix swap cache node allocation mask
Jens Axboe <[email protected]>
io_uring: make sure async workqueue is canceled on exit
-------------
Diffstat:
Documentation/filesystems/locking.rst | 2 + Makefile | 4 +- arch/mips/kernel/traps.c | 1 + arch/mips/lantiq/xway/sysctrl.c | 8 +- arch/s390/kernel/debug.c | 3 +- arch/x86/kernel/cpu/resctrl/core.c | 2 + arch/x86/kernel/cpu/resctrl/internal.h | 3 + arch/x86/kernel/cpu/resctrl/monitor.c | 3 +- crypto/af_alg.c | 26 ++-- crypto/algif_aead.c | 9 +- crypto/algif_hash.c | 9 +- crypto/algif_skcipher.c | 9 +- drivers/block/virtio_blk.c | 1 + drivers/char/tpm/tpm-dev-common.c | 19 ++- drivers/dma-buf/dma-buf.c | 54 ++++----- drivers/edac/amd64_edac.c | 2 + drivers/firmware/efi/Kconfig | 11 ++ drivers/firmware/efi/efi.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 4 +- drivers/gpu/drm/amd/display/dc/core/dc.c | 10 +- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 2 +- drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c | 5 +- drivers/hwmon/acpi_power_meter.c | 4 +- drivers/hwmon/max6697.c | 7 +- drivers/i2c/algos/i2c-algo-pca.c | 3 +- drivers/i2c/busses/i2c-mlxcpld.c | 4 +- drivers/infiniband/core/counters.c | 4 +- drivers/irqchip/irq-gic.c | 14 +-- drivers/md/dm-zoned-target.c | 2 +- drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c | 6 +- drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c | 25 ++-- drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 2 +- .../net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c | 30 ++--- drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32.c | 18 +-- .../ethernet/chelsio/cxgb4/cxgb4_tc_u32_parse.h | 122 ++++++++++++------- drivers/net/ethernet/chelsio/cxgb4/sge.c | 2 +- drivers/net/usb/smsc95xx.c | 2 +- drivers/nvme/host/core.c | 13 +- drivers/nvme/host/multipath.c | 45 +++++-- drivers/nvme/host/nvme.h | 2 + drivers/spi/spi-fsl-dspi.c | 17 ++- drivers/thermal/mtk_thermal.c | 5 +- drivers/thermal/rcar_gen3_thermal.c | 2 +- drivers/usb/misc/usbtest.c | 1 + fs/cifs/connect.c | 10 +- fs/cifs/inode.c | 10 +- fs/io_uring.c | 63 ++++++++++ fs/locks.c | 3 + fs/nfsd/nfs4proc.c | 2 + fs/nfsd/nfs4state.c | 22 +++- fs/nfsd/nfsctl.c | 23 ++-- fs/nfsd/nfsd.h | 5 + fs/nfsd/nfssvc.c | 6 + fs/nfsd/vfs.c | 6 + include/crypto/if_alg.h | 4 +- include/linux/fs.h | 1 + include/linux/kthread.h | 1 + include/linux/sunrpc/svc.h | 1 + kernel/debug/debug_core.c | 4 + kernel/kthread.c | 17 +++ kernel/sched/debug.c | 2 +- mm/compaction.c | 19 ++- mm/slub.c | 30 ++++- mm/swap_state.c | 4 +- net/rxrpc/call_event.c | 29 ++--- samples/vfs/test-statx.c | 2 + sound/usb/card.h | 4 - sound/usb/endpoint.c | 43 +------ sound/usb/endpoint.h | 1 - sound/usb/pcm.c | 2 - tools/lib/traceevent/event-parse.c | 133 ++++++++++++--------- tools/testing/selftests/tpm2/test_smoke.sh | 2 +- tools/testing/selftests/tpm2/test_space.sh | 2 +- 74 files changed, 609 insertions(+), 362 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/65 io_uring: make sure async workqueue is canceled on exit
From: Jens Axboe <[email protected]>
Track async work items that we queue, so we can safely cancel them if the ring is closed or the process exits. Newer kernels handle this automatically with io-wq, but the old workqueue based setup needs a bit of special help to get there.
There's no upstream variant of this, as that would require backporting all the io-wq changes from 5.5 and on. Hence I made a one-off that ensures that we don't leak memory if we have async work items that need active cancelation (like socket IO).
--- fs/io_uring.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+)
fs/io_uring.c +63 -0
@@ -267,6 +267,9 @@ struct io_ring_ctx {#if defined(CONFIG_UNIX )struct socket *ring_sock;#endif + +struct list_head task_list; +spinlock_t task_lock; };struct sqe_submit {
@@ -331,14 +334,18 @@ struct io_kiocb {#define REQ_F_ISREG 2048/* regular file */ #define REQ_F_MUST_PUNT 4096/* must be punted even for NONBLOCK */ #define REQ_F_TIMEOUT_NOSEQ 8192/* no timeout sequence */ +#define REQ_F_CANCEL 16384/* cancel request */ unsigned long fsize;u64 user_data;u32 result;u32 sequence; +struct task_struct *task;struct fs_struct *fs;struct work_struct work; +struct task_struct *work_task; +struct list_head task_list; };#define IO_PLUG_THRESHOLD 2
@@ -425,6 +432,8 @@ static struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p)INIT_LIST_HEAD (&ctx->cancel_list);INIT_LIST_HEAD (&ctx->defer_list);INIT_LIST_HEAD (&ctx->timeout_list); +INIT_LIST_HEAD (&ctx->task_list); +spin_lock_init (&ctx->task_lock);return ctx; }
@@ -492,6 +501,7 @@ static void __io_commit_cqring(struct io_ring_ctx *ctx)static inline void io_queue_async_work (struct io_ring_ctx *ctx,struct io_kiocb *req) { +unsigned long flags;int rw =0 ;if (req->submit.sqe) {
@@ -503,6 +513,13 @@ static inline void io_queue_async_work(struct io_ring_ctx *ctx, } } + req->task = current; + +spin_lock_irqsave (&ctx->task_lock, flags); +list_add (&req->task_list, &ctx->task_list); + req->work_task =NULL ; +spin_unlock_irqrestore (&ctx->task_lock, flags); +queue_work (ctx->sqo_wq[rw], &req->work); }
@@ -2201,6 +2218,8 @@ static void io_sq_wq_submit_work(struct work_struct *work) old_cred =override_creds (ctx->creds); async_list =io_async_list_from_sqe (ctx, req->submit.sqe); + +allow_kernel_signal (SIGINT ); restart: do { struct sqe_submit *s = &req->submit;
@@ -2232,6 +2251,12 @@ static void io_sq_wq_submit_work(struct work_struct *work) }if (!ret) { + req->work_task = current; +if (req->flags &REQ_F_CANCEL ) { + ret = -ECANCELED ; + goto end_req; + } + s->has_user = cur_mm !=NULL ; s->needs_lock = true; do {
@@ -2246,6 +2271,12 @@ static void io_sq_wq_submit_work(struct work_struct *work)break ;cond_resched (); }while (1 ); +end_req: +if (!list_empty (&req->task_list)) { +spin_lock_irq (&ctx->task_lock); +list_del_init (&req->task_list); +spin_unlock_irq (&ctx->task_lock); + } }/* drop submission reference */
@@ -2311,6 +2342,7 @@ static void io_sq_wq_submit_work(struct work_struct *work) } out: +disallow_signal (SIGINT );if (cur_mm) {set_fs (old_fs);unuse_mm (cur_mm);
@@ -3675,12 +3707,32 @@ static int io_uring_fasync(int fd, struct file *file, int on)return fasync_helper (fd, file, on, &ctx->cq_fasync); } +static void io_cancel_async_work (struct io_ring_ctx *ctx, +struct task_struct *task) +{ +if (list_empty (&ctx->task_list)) +return ; + +spin_lock_irq (&ctx->task_lock); +while (!list_empty (&ctx->task_list)) { +struct io_kiocb *req; + + req = list_first_entry(&ctx->task_list, struct io_kiocb, task_list); +list_del_init (&req->task_list); + req->flags |=REQ_F_CANCEL ; +if (req->work_task && (!task || req->task == task)) +send_sig (SIGINT , req->work_task,1 ); + } +spin_unlock_irq (&ctx->task_lock); +} +static void io_ring_ctx_wait_and_kill (struct io_ring_ctx *ctx) {mutex_lock (&ctx->uring_lock);percpu_ref_kill (&ctx->refs);mutex_unlock (&ctx->uring_lock); +io_cancel_async_work (ctx,NULL );io_kill_timeouts (ctx);io_poll_remove_all (ctx);io_iopoll_reap_events (ctx);
@@ -3688,6 +3740,16 @@ static void io_ring_ctx_wait_and_kill(struct io_ring_ctx *ctx)io_ring_ctx_free (ctx); } +static int io_uring_flush (struct file *file,void *data) +{ +struct io_ring_ctx *ctx = file->private_data; + +if (fatal_signal_pending (current) || (current->flags &PF_EXITING )) +io_cancel_async_work (ctx, current); + +return 0 ; +} +static int io_uring_release (struct inode *inode,struct file *file) {struct io_ring_ctx *ctx = file->private_data;
@@ -3792,6 +3854,7 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,static const struct file_operations io_uring_fops = { .release = io_uring_release, + .flush = io_uring_flush, .mmap = io_uring_mmap, .poll = io_uring_poll, .fasync = io_uring_fasync,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 2/65 mm: fix swap cache node allocation mask
In reply to Greg Kroah-HartmanFrom: Hugh Dickins <[email protected]>
[ Upstream commit 243bce09c91b0145aeaedd5afba799d81841c030 ]
Chris Murphy reports that a slightly overcommitted load, testing swap and zram along with i915, splats and keeps on splatting, when it had better fail less noisily:
gnome-shell: page allocation failure: order:0, mode:0x400d0(__GFP_IO|__GFP_FS|__GFP_COMP|__GFP_RECLAIMABLE), nodemask=(null),cpuset=/,mems_allowed=0
CPU: 2 PID: 1155 Comm: gnome-shell Not tainted 5.7.0-1.fc33.x86_64 #1
Call Trace:
dump_stack+0x64/0x88
warn_alloc.cold+0x75/0xd9
__alloc_pages_slowpath.constprop.0+0xcfa/0xd30
__alloc_pages_nodemask+0x2df/0x320
alloc_slab_page+0x195/0x310
allocate_slab+0x3c5/0x440
___slab_alloc+0x40c/0x5f0
__slab_alloc+0x1c/0x30
kmem_cache_alloc+0x20e/0x220
xas_nomem+0x28/0x70
add_to_swap_cache+0x321/0x400
__read_swap_cache_async+0x105/0x240
swap_cluster_readahead+0x22c/0x2e0
shmem_swapin+0x8e/0xc0
shmem_swapin_page+0x196/0x740
shmem_getpage_gfp+0x3a2/0xa60
shmem_read_mapping_page_gfp+0x32/0x60
shmem_get_pages+0x155/0x5e0 [i915]
__i915_gem_object_get_pages+0x68/0xa0 [i915]
i915_vma_pin+0x3fe/0x6c0 [i915]
eb_add_vma+0x10b/0x2c0 [i915]
i915_gem_do_execbuffer+0x704/0x3430 [i915]
i915_gem_execbuffer2_ioctl+0x1ea/0x3e0 [i915]
drm_ioctl_kernel+0x86/0xd0 [drm]
drm_ioctl+0x206/0x390 [drm]
ksys_ioctl+0x82/0xc0
__x64_sys_ioctl+0x16/0x20
do_syscall_64+0x5b/0xf0
entry_SYSCALL_64_after_hwframe+0x44/0xa9Reported on 5.7, but it goes back really to 3.1: when shmem_read_mapping_page_gfp() was implemented for use by i915, and allowed for __GFP_NORETRY and __GFP_NOWARN flags in most places, but missed swapin's "& GFP_KERNEL" mask for page tree node allocation in __read_swap_cache_async() - that was to mask off HIGHUSER_MOVABLE bits from what page cache uses, but GFP_RECLAIM_MASK is now what's needed.
--- mm/swap_state.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
mm/swap_state.c +3 -1
@@ -23,6 +23,7 @@#include <linux/huge_mm.h> #include <asm/pgtable.h> +#include "internal.h" /* * swapper_space is a fiction, retained to simplify the path through
@@ -418,7 +419,8 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask,/* May fail (-ENOMEM) if XArray node allocation failed. */ __SetPageLocked (new_page);__SetPageSwapBacked (new_page); - err =add_to_swap_cache (new_page, entry, gfp_mask &GFP_KERNEL ); + err =add_to_swap_cache (new_page, entry, + gfp_mask &GFP_RECLAIM_MASK );if (likely (!err)) {/* Initiate read into locked page */ SetPageWorkingset (new_page);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 3/65 EDAC/amd64: Read back the scrub rate PCI register on F15h
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
[ Upstream commit ee470bb25d0dcdf126f586ec0ae6dca66cb340a4 ]
Commit:
da92110dfdfa ("EDAC, amd64_edac: Extend scrub rate support to F15hM60h")
added support for F15h, model 0x60 CPUs but in doing so, missed to read back SCRCTRL PCI config register on F15h CPUs which are *not* model 0x60. Add that read so that doing
$ cat /sys/devices/system/edac/mc/mc0/sdram_scrub_rate
can show the previously set DRAM scrub rate.
--- drivers/edac/amd64_edac.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/edac/amd64_edac.c +2 -0
@@ -265,6 +265,8 @@ static int get_scrub_rate(struct mem_ctl_info *mci)if (pvt->model ==0x60 )amd64_read_pci_cfg (pvt->F2,F15H_M60H_SCRCTRL , &scrubval); +else +amd64_read_pci_cfg (pvt->F3,SCRCTRL , &scrubval);break ;case 0x17 :
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 4/65 usbnet: smsc95xx: Fix use-after-free after removal
In reply to Greg Kroah-HartmanFrom: Tuomas Tynkkynen <[email protected]>
[ Upstream commit b835a71ef64a61383c414d6bf2896d2c0161deca ]
Syzbot reports an use-after-free in workqueue context:
BUG: KASAN: use-after-free in mutex_unlock+0x19/0x40 kernel/locking/mutex.c:737 mutex_unlock+0x19/0x40 kernel/locking/mutex.c:737 __smsc95xx_mdio_read drivers/net/usb/smsc95xx.c:217 [inline] smsc95xx_mdio_read+0x583/0x870 drivers/net/usb/smsc95xx.c:278 check_carrier+0xd1/0x2e0 drivers/net/usb/smsc95xx.c:644 process_one_work+0x777/0xf90 kernel/workqueue.c:2274 worker_thread+0xa8f/0x1430 kernel/workqueue.c:2420 kthread+0x2df/0x300 kernel/kthread.c:255
It looks like that smsc95xx_unbind() is freeing the structures that are still in use by the concurrently running workqueue callback. Thus switch to using cancel_delayed_work_sync() to ensure the work callback really is no longer active.
--- drivers/net/usb/smsc95xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/usb/smsc95xx.c +1 -1
@@ -1324,7 +1324,7 @@ static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf)struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0 ]);if (pdata) { -cancel_delayed_work (&pdata->carrier_check); +cancel_delayed_work_sync (&pdata->carrier_check);netif_dbg (dev, ifdown, dev->net,"free pdata\n" );kfree (pdata); pdata =NULL ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 5/65 sched/debug: Make sd->flags sysctl read-only
In reply to Greg Kroah-HartmanFrom: Valentin Schneider <[email protected]>
[ Upstream commit 9818427c6270a9ce8c52c8621026fe9cebae0f92 ]
Writing to the sysctl of a sched_domain->flags directly updates the value of the field, and goes nowhere near update_top_cache_domain(). This means that the cached domain pointers can end up containing stale data (e.g. the domain pointed to doesn't have the relevant flag set anymore).
Explicit domain walks that check for flags will be affected by the write, but this won't be in sync with the cached pointers which will still point to the domains that were cached at the last sched_domain build.
In other words, writing to this interface is playing a dangerous game. It could be made to trigger an update of the cached sched_domain pointers when written to, but this does not seem to be worth the trouble. Make it read-only.
--- kernel/sched/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/debug.c +1 -1
@@ -258,7 +258,7 @@ sd_alloc_ctl_domain_table(struct sched_domain *sd)set_table_entry (&table[2 ],"busy_factor" , &sd->busy_factor,sizeof (int ),0644 , proc_dointvec_minmax);set_table_entry (&table[3 ],"imbalance_pct" , &sd->imbalance_pct,sizeof (int ),0644 , proc_dointvec_minmax);set_table_entry (&table[4 ],"cache_nice_tries" , &sd->cache_nice_tries,sizeof (int ),0644 , proc_dointvec_minmax); -set_table_entry (&table[5 ],"flags" , &sd->flags,sizeof (int ),0644 , proc_dointvec_minmax); +set_table_entry (&table[5 ],"flags" , &sd->flags,sizeof (int ),0444 , proc_dointvec_minmax);set_table_entry (&table[6 ],"max_newidle_lb_cost" , &sd->max_newidle_lb_cost,sizeof (long ),0644 , proc_doulongvec_minmax);set_table_entry (&table[7 ],"name" , sd->name,CORENAME_MAX_SIZE ,0444 , proc_dostring);/* &table[8] is terminator */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 6/65 mm/slub.c: fix corrupted freechain in deactivate_slab()
In reply to Greg Kroah-HartmanFrom: Dongli Zhang <[email protected]>
[ Upstream commit 52f23478081ae0dcdb95d1650ea1e7d52d586829 ]
The slub_debug is able to fix the corrupted slab freelist/page. However, alloc_debug_processing() only checks the validity of current and next freepointer during allocation path. As a result, once some objects have their freepointers corrupted, deactivate_slab() may lead to page fault.
Below is from a test kernel module when 'slub_debug=PUF,kmalloc-128 slub_nomerge'. The test kernel corrupts the freepointer of one free object on purpose. Unfortunately, deactivate_slab() does not detect it when iterating the freechain.
BUG: unable to handle page fault for address: 00000000123456f8 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: 0000 [#1] SMP PTI ... ... RIP: 0010:deactivate_slab.isra.92+0xed/0x490 ... ... Call Trace: ___slab_alloc+0x536/0x570 __slab_alloc+0x17/0x30 __kmalloc+0x1d9/0x200 ext4_htree_store_dirent+0x30/0xf0 htree_dirblock_to_tree+0xcb/0x1c0 ext4_htree_fill_tree+0x1bc/0x2d0 ext4_readdir+0x54f/0x920 iterate_dir+0x88/0x190 __x64_sys_getdents+0xa6/0x140 do_syscall_64+0x49/0x170 entry_SYSCALL_64_after_hwframe+0x44/0xa9
Therefore, this patch adds extra consistency check in deactivate_slab(). Once an object's freepointer is corrupted, all following objects starting at this object are isolated.
--- mm/slub.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
mm/slub.c +27 -0
@@ -644,6 +644,20 @@ static void slab_fix(struct kmem_cache *s, char *fmt, ...)va_end (args); } +static bool freelist_corrupted (struct kmem_cache *s,struct page *page, +void *freelist,void *nextfree) +{ +if ((s->flags &SLAB_CONSISTENCY_CHECKS ) && + !check_valid_pointer (s, page, nextfree)) { +object_err (s, page, freelist,"Freechain corrupt" ); + freelist =NULL ; +slab_fix (s,"Isolate corrupted freechain" ); +return true; + } + +return false; +} +static void print_trailer (struct kmem_cache *s,struct page *page,u8 *p) {unsigned int off;/* Offset of last byte */
@@ -1379,6 +1393,11 @@ static inline void inc_slabs_node(struct kmem_cache *s, int node,static inline void dec_slabs_node (struct kmem_cache *s,int node,int objects) {} +static bool freelist_corrupted (struct kmem_cache *s,struct page *page, +void *freelist,void *nextfree) +{ +return false; +}#endif /* CONFIG_SLUB_DEBUG */ /*
@@ -2062,6 +2081,14 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page,void *prior;unsigned long counters; +/* +* If 'nextfree' is invalid, it is possible that the object at +* 'freelist' is already corrupted. So isolate all objects +* starting at 'freelist'. +*/ +if (freelist_corrupted (s, page, freelist, nextfree)) +break ; + do { prior = page->freelist; counters = page->counters;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 7/65 mm/slub: fix stack overruns with SLUB_STATS
In reply to Greg Kroah-HartmanFrom: Qian Cai <[email protected]>
[ Upstream commit a68ee0573991e90af2f1785db309206408bad3e5 ]
There is no need to copy SLUB_STATS items from root memcg cache to new memcg cache copies. Doing so could result in stack overruns because the store function only accepts 0 to clear the stat and returns an error for everything else while the show method would print out the whole stat.
Then, the mismatch of the lengths returns from show and store methods happens in memcg_propagate_slab_attrs():
else if (root_cache->max_attr_size < ARRAY_SIZE(mbuf)) buf = mbuf;
max_attr_size is only 2 from slab_attr_store(), then, it uses mbuf[64] in show_stat() later where a bounch of sprintf() would overrun the stack variable. Fix it by always allocating a page of buffer to be used in show_stat() if SLUB_STATS=y which should only be used for debug purpose.
# echo 1 > /sys/kernel/slab/fs_cache/shrink BUG: KASAN: stack-out-of-bounds in number+0x421/0x6e0 Write of size 1 at addr ffffc900256cfde0 by task kworker/76:0/53251
Hardware name: HPE ProLiant DL385 Gen10/ProLiant DL385 Gen10, BIOS A40 07/10/2019
Workqueue: memcg_kmem_cache memcg_kmem_cache_create_func
Call Trace:
number+0x421/0x6e0
vsnprintf+0x451/0x8e0
sprintf+0x9e/0xd0
show_stat+0x124/0x1d0
alloc_slowpath_show+0x13/0x20
__kmem_cache_create+0x47a/0x6b0 addr ffffc900256cfde0 is located in stack of task kworker/76:0/53251 at offset 0 in frame:
process_one_work+0x0/0xb90
this frame has 1 object:
[32, 72) 'lockdep_map'
Memory state around the buggy address:
ffffc900256cfc80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffffc900256cfd00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>ffffc900256cfd80: 00 00 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1
^
ffffc900256cfe00: 00 00 00 00 00 f2 f2 f2 00 00 00 00 00 00 00 00
ffffc900256cfe80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
==================================================================
Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: __kmem_cache_create+0x6ac/0x6b0
Workqueue: memcg_kmem_cache memcg_kmem_cache_create_func
Call Trace:
__kmem_cache_create+0x6ac/0x6b0--- mm/slub.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
mm/slub.c +2 -1
@@ -5648,7 +5648,8 @@ static void memcg_propagate_slab_attrs(struct kmem_cache *s)*/ if (buffer) buf = buffer; -else if (root_cache->max_attr_size <ARRAY_SIZE (mbuf)) +else if (root_cache->max_attr_size <ARRAY_SIZE (mbuf) && + !IS_ENABLED (CONFIG_SLUB_STATS )) buf = mbuf;else { buffer = (char *)get_zeroed_page (GFP_KERNEL );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 8/65 rxrpc: Fix race between incoming ACK parser and retransmitter
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
[ Upstream commit 2ad6691d988c0c611362ddc2aad89e0fb50e3261 ]
There's a race between the retransmission code and the received ACK parser. The problem is that the retransmission loop has to drop the lock under which it is iterating through the transmission buffer in order to transmit a packet, but whilst the lock is dropped, the ACK parser can crank the Tx window round and discard the packets from the buffer.
The retransmission code then updated the annotations for the wrong packet and a later retransmission thought it had to retransmit a packet that wasn't there, leading to a NULL pointer dereference.
Fix this by:
(1) Moving the annotation change to before we drop the lock prior to transmission. This means we can't vary the annotation depending on the outcome of the transmission, but that's fine - we'll retransmit again later if it failed now.
(2) Skipping the packet if the skb pointer is NULL.
The following oops was seen:
BUG: kernel NULL pointer dereference, address: 000000000000002d Workqueue: krxrpcd rxrpc_process_call RIP: 0010:rxrpc_get_skb+0x14/0x8a ... Call Trace: rxrpc_resend+0x331/0x41e ? get_vtime_delta+0x13/0x20 rxrpc_process_call+0x3c0/0x4ac process_one_work+0x18f/0x27f worker_thread+0x1a3/0x247 ? create_worker+0x17d/0x17d kthread+0xe6/0xeb ? kthread_delayed_work_timer_fn+0x83/0x83 ret_from_fork+0x1f/0x30
--- net/rxrpc/call_event.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-)
net/rxrpc/call_event.c +11 -18
@@ -248,7 +248,18 @@ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j)if (anno_type !=RXRPC_TX_ANNO_RETRANS )continue ; +/* We need to reset the retransmission state, but we need to do +* so before we drop the lock as a new ACK/NAK may come in and +* confuse things +*/ + annotation &= ~RXRPC_TX_ANNO_MASK ; + annotation |=RXRPC_TX_ANNO_RESENT ; + call->rxtx_annotations[ix] = annotation; + skb = call->rxtx_buffer[ix]; +if (!skb) +continue ; +rxrpc_get_skb (skb, rxrpc_skb_got);spin_unlock_bh (&call->lock);
@@ -262,24 +273,6 @@ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j)rxrpc_free_skb (skb, rxrpc_skb_freed);spin_lock_bh (&call->lock); - -/* We need to clear the retransmit state, but there are two -* things we need to be aware of: A new ACK/NAK might have been -* received and the packet might have been hard-ACK'd (in which -* case it will no longer be in the buffer). -*/ -if (after (seq, call->tx_hard_ack)) { - annotation = call->rxtx_annotations[ix]; - anno_type = annotation &RXRPC_TX_ANNO_MASK ; -if (anno_type ==RXRPC_TX_ANNO_RETRANS || - anno_type ==RXRPC_TX_ANNO_NAK ) { - annotation &= ~RXRPC_TX_ANNO_MASK ; - annotation |=RXRPC_TX_ANNO_UNACK ; - } - annotation |=RXRPC_TX_ANNO_RESENT ; - call->rxtx_annotations[ix] = annotation; - } -if (after (call->tx_hard_ack, seq)) seq = call->tx_hard_ack; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 9/65 usb: usbtest: fix missing kfree(dev->buf) in usbtest_disconnect
In reply to Greg Kroah-HartmanFrom: Zqiang <[email protected]>
[ Upstream commit 28ebeb8db77035e058a510ce9bd17c2b9a009dba ]
BUG: memory leak
unreferenced object 0xffff888055046e00 (size 256):
comm "kworker/2:9", pid 2570, jiffies 4294942129 (age 1095.500s)
hex dump (first 32 bytes):
00 70 04 55 80 88 ff ff 18 bb 5a 81 ff ff ff ff .p.U......Z.....
f5 96 78 81 ff ff ff ff 37 de 8e 81 ff ff ff ff ..x.....7.......
backtrace:
[<00000000d121dccf>] kmemleak_alloc_recursive
include/linux/kmemleak.h:43 [inline]
[<00000000d121dccf>] slab_post_alloc_hook mm/slab.h:586 [inline]
[<00000000d121dccf>] slab_alloc_node mm/slub.c:2786 [inline]
[<00000000d121dccf>] slab_alloc mm/slub.c:2794 [inline]
[<00000000d121dccf>] kmem_cache_alloc_trace+0x15e/0x2d0 mm/slub.c:2811
[<000000005c3c3381>] kmalloc include/linux/slab.h:555 [inline]
[<000000005c3c3381>] usbtest_probe+0x286/0x19d0
drivers/usb/misc/usbtest.c:2790
[<000000001cec6910>] usb_probe_interface+0x2bd/0x870
drivers/usb/core/driver.c:361
[<000000007806c118>] really_probe+0x48d/0x8f0 drivers/base/dd.c:551
[<00000000a3308c3e>] driver_probe_device+0xfc/0x2a0 drivers/base/dd.c:724
[<000000003ef66004>] __device_attach_driver+0x1b6/0x240
drivers/base/dd.c:831
[<00000000eee53e97>] bus_for_each_drv+0x14e/0x1e0 drivers/base/bus.c:431
[<00000000bb0648d0>] __device_attach+0x1f9/0x350 drivers/base/dd.c:897
[<00000000838b324a>] device_initial_probe+0x1a/0x20 drivers/base/dd.c:944
[<0000000030d501c1>] bus_probe_device+0x1e1/0x280 drivers/base/bus.c:491
[<000000005bd7adef>] device_add+0x131d/0x1c40 drivers/base/core.c:2504
[<00000000a0937814>] usb_set_configuration+0xe84/0x1ab0
drivers/usb/core/message.c:2030
[<00000000e3934741>] generic_probe+0x6a/0xe0 drivers/usb/core/generic.c:210
[<0000000098ade0f1>] usb_probe_device+0x90/0xd0
drivers/usb/core/driver.c:266
[<000000007806c118>] really_probe+0x48d/0x8f0 drivers/base/dd.c:551
[<00000000a3308c3e>] driver_probe_device+0xfc/0x2a0 drivers/base/dd.c:724--- drivers/usb/misc/usbtest.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/misc/usbtest.c +1 -0
@@ -2873,6 +2873,7 @@ static void usbtest_disconnect(struct usb_interface *intf)usb_set_intfdata (intf,NULL );dev_dbg (&intf->dev,"disconnect\n" ); +kfree (dev->buf);kfree (dev); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 10/65 tools lib traceevent: Add append() function helper for appending strings
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (VMware) <[email protected]>
[ Upstream commit 27d4d336f2872193e90ee5450559e1699fae0f6d ]
There's several locations that open code realloc and strcat() to append text to strings. Add an append() function that takes a delimiter and a string to append to another string.
--- tools/lib/traceevent/event-parse.c | 98 ++++++++++++------------------ 1 file changed, 40 insertions(+), 58 deletions(-)
tools/lib/traceevent/event-parse.c +40 -58
@@ -1425,6 +1425,19 @@ static unsigned int type_size(const char *name)return 0 ; } +static int append (char **buf,const char *delim,const char *str) +{ +char *new_buf; + + new_buf =realloc (*buf,strlen (*buf) +strlen (delim) +strlen (str) +1 ); +if (!new_buf) +return -1 ; +strcat (new_buf, delim); +strcat (new_buf, str); + *buf = new_buf; +return 0 ; +} +static int event_read_fields (struct tep_event *event,struct tep_format_field **fields) {struct tep_format_field *field =NULL ;
@@ -1432,6 +1445,7 @@ static int event_read_fields(struct tep_event *event, struct tep_format_field **char *token;char *last_token;int count =0 ; +int ret; do { unsigned int size_dynamic = 0;
@@ -1490,24 +1504,15 @@ static int event_read_fields(struct tep_event *event, struct tep_format_field ** field->flags |=TEP_FIELD_IS_POINTER ;if (field->type) { -char *new_type; - new_type =realloc (field->type, -strlen (field->type) + -strlen (last_token) +2 ); -if (!new_type) { -free (last_token); - goto fail; - } - field->type = new_type; -strcat (field->type," " ); -strcat (field->type, last_token); + ret =append (&field->type," " , last_token);free (last_token); +if (ret <0 ) + goto fail; }else field->type = last_token; last_token = token;continue ; } -break ; }
@@ -1523,8 +1528,6 @@ static int event_read_fields(struct tep_event *event, struct tep_format_field **if (strcmp (token,"[" ) ==0 ) {enum tep_event_type last_type = type;char *brackets = token; -char *new_brackets; -int len; field->flags |=TEP_FIELD_IS_ARRAY ;
@@ -1536,29 +1539,27 @@ static int event_read_fields(struct tep_event *event, struct tep_format_field ** field->arraylen =0 ;while (strcmp (token,"]" ) !=0 ) { +const char *delim; +if (last_type ==TEP_EVENT_ITEM && type ==TEP_EVENT_ITEM ) - len =2 ; + delim =" " ;else - len =1 ; + delim ="" ; + last_type = type; - new_brackets =realloc (brackets, -strlen (brackets) + -strlen (token) + len); -if (!new_brackets) { + ret =append (&brackets, delim, token); +if (ret <0 ) {free (brackets); goto fail; } - brackets = new_brackets; -if (len ==2 ) -strcat (brackets," " ); -strcat (brackets, token);/* We only care about the last token */ field->arraylen =strtoul (token,NULL ,0 );free_token (token); type =read_token (&token);if (type ==TEP_EVENT_NONE ) { +free (brackets);do_warning_event (event,"failed to find token" ); goto fail; }
@@ -1566,13 +1567,11 @@ static int event_read_fields(struct tep_event *event, struct tep_format_field **free_token (token); - new_brackets =realloc (brackets,strlen (brackets) +2 ); -if (!new_brackets) { + ret =append (&brackets,"" ,"]" ); +if (ret <0 ) {free (brackets); goto fail; } - brackets = new_brackets; -strcat (brackets,"]" );/* add brackets to type */
@@ -1582,34 +1581,23 @@ static int event_read_fields(struct tep_event *event, struct tep_format_field *** the format: type [] item; */ if (type ==TEP_EVENT_ITEM ) { -char *new_type; - new_type =realloc (field->type, -strlen (field->type) + -strlen (field->name) + -strlen (brackets) +2 ); -if (!new_type) { + ret =append (&field->type," " , field->name); +if (ret <0 ) {free (brackets); goto fail; } - field->type = new_type; -strcat (field->type," " ); -strcat (field->type, field->name); + ret =append (&field->type,"" , brackets); + size_dynamic =type_size (field->name);free_token (field->name); -strcat (field->type, brackets); field->name = field->alias = token; type =read_token (&token); }else { -char *new_type; - new_type =realloc (field->type, -strlen (field->type) + -strlen (brackets) +1 ); -if (!new_type) { + ret =append (&field->type,"" , brackets); +if (ret <0 ) {free (brackets); goto fail; } - field->type = new_type; -strcat (field->type, brackets); }free (brackets); }
@@ -2046,19 +2034,16 @@ process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok)/* could just be a type pointer */ if ((strcmp (arg->op.op,"*" ) ==0 ) && type ==TEP_EVENT_DELIM && (strcmp (token,")" ) ==0 )) { -char *new_atom; +int ret;if (left->type !=TEP_PRINT_ATOM ) {do_warning_event (event,"bad pointer type" ); goto out_free; } - new_atom =realloc (left->atom.atom, -strlen (left->atom.atom) +3 ); -if (!new_atom) + ret =append (&left->atom.atom," " ,"*" ); +if (ret <0 ) goto out_warn_free; - left->atom.atom = new_atom; -strcat (left->atom.atom," *" );free (arg->op.op); *arg = *left;free (left);
@@ -3151,18 +3136,15 @@ process_arg_token(struct tep_event *event, struct tep_print_arg *arg, }/* atoms can be more than one token long */ while (type ==TEP_EVENT_ITEM ) { -char *new_atom; - new_atom =realloc (atom, -strlen (atom) +strlen (token) +2 ); -if (!new_atom) { +int ret; + + ret =append (&atom," " , token); +if (ret <0 ) {free (atom); *tok =NULL ;free_token (token);return TEP_EVENT_ERROR ; } - atom = new_atom; -strcat (atom," " ); -strcat (atom, token);free_token (token); type =read_token_item (&token); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 11/65 tools lib traceevent: Handle __attribute__((user)) in field names
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (VMware) <[email protected]>
[ Upstream commit 74621d929d944529a5e2878a84f48bfa6fb69a66 ]
Commit c61f13eaa1ee1 ("gcc-plugins: Add structleak for more stack initialization") added "__attribute__((user))" to the user when stackleak detector is enabled. This now appears in the field format of system call trace events for system calls that have user buffers. The "__attribute__((user))" breaks the parsing in libtraceevent. That needs to be handled.
--- tools/lib/traceevent/event-parse.c | 39 +++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-)
tools/lib/traceevent/event-parse.c +38 -1
@@ -1444,6 +1444,7 @@ static int event_read_fields(struct tep_event *event, struct tep_format_field **enum tep_event_type type;char *token;char *last_token; +char *delim =" " ;int count =0 ;int ret;
@@ -1504,13 +1505,49 @@ static int event_read_fields(struct tep_event *event, struct tep_format_field ** field->flags |=TEP_FIELD_IS_POINTER ;if (field->type) { - ret =append (&field->type," " , last_token); + ret =append (&field->type, delim, last_token);free (last_token);if (ret <0 ) goto fail; }else field->type = last_token; last_token = token; + delim =" " ; +continue ; + } + +/* Handle __attribute__((user)) */ +if ((type ==TEP_EVENT_DELIM ) && +strcmp ("__attribute__" , last_token) ==0 && + token[0 ] =='(' ) { +int depth =1 ; +int ret; + + ret =append (&field->type," " , last_token); + ret |=append (&field->type,"" ,"(" ); +if (ret <0 ) + goto fail; + + delim =" " ; +while ((type =read_token (&token)) !=TEP_EVENT_NONE ) { +if (type ==TEP_EVENT_DELIM ) { +if (token[0 ] =='(' ) + depth++; +else if (token[0 ] ==')' ) + depth--; +if (!depth) +break ; + ret =append (&field->type,"" , token); + delim ="" ; + }else { + ret =append (&field->type, delim, token); + delim =" " ; + } +if (ret <0 ) + goto fail; +free (last_token); + last_token = token; + }continue ; }break ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 12/65 s390/debug: avoid kernel warning on too large number of pages
In reply to Greg Kroah-HartmanFrom: Christian Borntraeger <[email protected]>
[ Upstream commit 827c4913923e0b441ba07ba4cc41e01181102303 ]
When specifying insanely large debug buffers a kernel warning is printed. The debug code does handle the error gracefully, though. Instead of duplicating the check let us silence the warning to avoid crashes when panic_on_warn is used.
--- arch/s390/kernel/debug.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/s390/kernel/debug.c +2 -1
@@ -198,9 +198,10 @@ static debug_entry_t ***debug_areas_alloc(int pages_per_area, int nr_areas)if (!areas) goto fail_malloc_areas;for (i =0 ; i < nr_areas; i++) { +/* GFP_NOWARN to avoid user triggerable WARN, we handle fails */ areas[i] =kmalloc_array (pages_per_area,sizeof (debug_entry_t *), -GFP_KERNEL ); +GFP_KERNEL | __GFP_NOWARN);if (!areas[i]) goto fail_malloc_areas2;for (j =0 ; j < pages_per_area; j++) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 13/65 nvme-multipath: set bdi capabilities once
In reply to Greg Kroah-HartmanFrom: Keith Busch <[email protected]>
[ Upstream commit b2ce4d90690bd29ce5b554e203cd03682dd59697 ]
The queues' backing device info capabilities don't change with each namespace revalidation. Set it only when each path's request_queue is initially added to a multipath queue.
--- drivers/nvme/host/multipath.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/nvme/host/multipath.c +8 -0
@@ -3,6 +3,7 @@* Copyright (c) 2017-2018 Christoph Hellwig. */ +#include <linux/backing-dev.h> #include <linux/moduleparam.h> #include <trace/events/block.h> #include "nvme.h"
@@ -662,6 +663,13 @@ void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id) ns->ana_state =NVME_ANA_OPTIMIZED ;nvme_mpath_set_live (ns); } + +if (bdi_cap_stable_pages_required (ns->queue->backing_dev_info)) { +struct backing_dev_info *info = + ns->head->disk->queue->backing_dev_info; + + info->capabilities |=BDI_CAP_STABLE_WRITES ; + } }void nvme_mpath_remove_disk (struct nvme_ns_head *head)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 14/65 nvme: fix possible deadlock when I/O is blocked
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit 3b4b19721ec652ad2c4fe51dfbe5124212b5f581 ]
Revert fab7772bfbcf ("nvme-multipath: revalidate nvme_ns_head gendisk in nvme_validate_ns")
When adding a new namespace to the head disk (via nvme_mpath_set_live) we will see partition scan which triggers I/O on the mpath device node. This process will usually be triggered from the scan_work which holds the scan_lock. If I/O blocks (if we got ana change currently have only available paths but none are accessible) this can deadlock on the head disk bd_mutex as both partition scan I/O takes it, and head disk revalidation takes it to check for resize (also triggered from scan_work on a different path). See trace [1].
The mpath disk revalidation was originally added to detect online disk size change, but this is no longer needed since commit cb224c3af4df ("nvme: Convert to use set_capacity_revalidate_and_notify") which already updates resize info without unnecessarily revalidating the disk (the mpath disk doesn't even implement .revalidate_disk fop).
[1]:
--
kernel: INFO: task kworker/u65:9:494 blocked for more than 241 seconds. kernel: Tainted: G OE 5.3.5-050305-generic #201910071830 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. kernel: kworker/u65:9 D 0 494 2 0x80004000 kernel: Workqueue: nvme-wq nvme_scan_work [nvme_core] kernel: Call Trace: kernel: __schedule+0x2b9/0x6c0 kernel: schedule+0x42/0xb0 kernel: schedule_preempt_disabled+0xe/0x10 kernel: __mutex_lock.isra.0+0x182/0x4f0 kernel: __mutex_lock_slowpath+0x13/0x20 kernel: mutex_lock+0x2e/0x40 kernel: revalidate_disk+0x63/0xa0 kernel: __nvme_revalidate_disk+0xfe/0x110 [nvme_core] kernel: nvme_revalidate_disk+0xa4/0x160 [nvme_core] kernel: ? evict+0x14c/0x1b0 kernel: revalidate_disk+0x2b/0xa0 kernel: nvme_validate_ns+0x49/0x940 [nvme_core] kernel: ? blk_mq_free_request+0xd2/0x100 kernel: ? __nvme_submit_sync_cmd+0xbe/0x1e0 [nvme_core] kernel: nvme_scan_work+0x24f/0x380 [nvme_core] kernel: process_one_work+0x1db/0x380 kernel: worker_thread+0x249/0x400 kernel: kthread+0x104/0x140 kernel: ? process_one_work+0x380/0x380 kernel: ? kthread_park+0x80/0x80 kernel: ret_from_fork+0x1f/0x40 ... kernel: INFO: task kworker/u65:1:2630 blocked for more than 241 seconds. kernel: Tainted: G OE 5.3.5-050305-generic #201910071830 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. kernel: kworker/u65:1 D 0 2630 2 0x80004000 kernel: Workqueue: nvme-wq nvme_scan_work [nvme_core] kernel: Call Trace: kernel: __schedule+0x2b9/0x6c0 kernel: schedule+0x42/0xb0 kernel: io_schedule+0x16/0x40 kernel: do_read_cache_page+0x438/0x830 kernel: ? __switch_to_asm+0x34/0x70 kernel: ? file_fdatawait_range+0x30/0x30 kernel: read_cache_page+0x12/0x20 kernel: read_dev_sector+0x27/0xc0 kernel: read_lba+0xc1/0x220 kernel: ? kmem_cache_alloc_trace+0x19c/0x230 kernel: efi_partition+0x1e6/0x708 kernel: ? vsnprintf+0x39e/0x4e0 kernel: ? snprintf+0x49/0x60 kernel: check_partition+0x154/0x244 kernel: rescan_partitions+0xae/0x280 kernel: __blkdev_get+0x40f/0x560 kernel: blkdev_get+0x3d/0x140 kernel: __device_add_disk+0x388/0x480 kernel: device_add_disk+0x13/0x20 kernel: nvme_mpath_set_live+0x119/0x140 [nvme_core] kernel: nvme_update_ns_ana_state+0x5c/0x60 [nvme_core] kernel: nvme_set_ns_ana_state+0x1e/0x30 [nvme_core] kernel: nvme_parse_ana_log+0xa1/0x180 [nvme_core] kernel: ? nvme_update_ns_ana_state+0x60/0x60 [nvme_core] kernel: nvme_mpath_add_disk+0x47/0x90 [nvme_core] kernel: nvme_validate_ns+0x396/0x940 [nvme_core] kernel: ? blk_mq_free_request+0xd2/0x100 kernel: nvme_scan_work+0x24f/0x380 [nvme_core] kernel: process_one_work+0x1db/0x380 kernel: worker_thread+0x249/0x400 kernel: kthread+0x104/0x140 kernel: ? process_one_work+0x380/0x380 kernel: ? kthread_park+0x80/0x80 kernel: ret_from_fork+0x1f/0x40
--
in nvme_validate_ns")
--- drivers/nvme/host/core.c | 1 - 1 file changed, 1 deletion(-)
drivers/nvme/host/core.c +0 -1
@@ -1870,7 +1870,6 @@ static void __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id)if (ns->head->disk) {nvme_update_disk_info (ns->head->disk, ns, id);blk_queue_stack_limits (ns->head->disk->queue, ns->queue); -revalidate_disk (ns->head->disk); }#endif }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 15/65 nvme-multipath: fix deadlock between ana_work and scan_work
In reply to Greg Kroah-HartmanFrom: Anton Eidelman <[email protected]>
[ Upstream commit 489dd102a2c7c94d783a35f9412eb085b8da1aa4 ]
When scan_work calls nvme_mpath_add_disk() this holds ana_lock and invokes nvme_parse_ana_log(), which may issue IO
in device_add_disk() and hang waiting for an accessible path. While nvme_mpath_set_live() only called when nvme_state_is_live(), a transition may cause NVME_SC_ANA_TRANSITION and requeue the IO.
In order to recover and complete the IO ana_work on the same ctrl should be able to update the path state and remove NVME_NS_ANA_PENDING.
The deadlock occurs because scan_work keeps holding ana_lock, so ana_work hangs [1].
Fix:
Now nvme_mpath_add_disk() uses nvme_parse_ana_log() to obtain a copy of the ANA group desc, and then calls nvme_update_ns_ana_state() without holding ana_lock.
[1]:
kernel: Workqueue: nvme-wq nvme_scan_work [nvme_core] kernel: Call Trace: kernel: __schedule+0x2b9/0x6c0 kernel: schedule+0x42/0xb0 kernel: io_schedule+0x16/0x40 kernel: do_read_cache_page+0x438/0x830 kernel: read_cache_page+0x12/0x20 kernel: read_dev_sector+0x27/0xc0 kernel: read_lba+0xc1/0x220 kernel: efi_partition+0x1e6/0x708 kernel: check_partition+0x154/0x244 kernel: rescan_partitions+0xae/0x280 kernel: __blkdev_get+0x40f/0x560 kernel: blkdev_get+0x3d/0x140 kernel: __device_add_disk+0x388/0x480 kernel: device_add_disk+0x13/0x20 kernel: nvme_mpath_set_live+0x119/0x140 [nvme_core] kernel: nvme_update_ns_ana_state+0x5c/0x60 [nvme_core] kernel: nvme_set_ns_ana_state+0x1e/0x30 [nvme_core] kernel: nvme_parse_ana_log+0xa1/0x180 [nvme_core] kernel: nvme_mpath_add_disk+0x47/0x90 [nvme_core] kernel: nvme_validate_ns+0x396/0x940 [nvme_core] kernel: nvme_scan_work+0x24f/0x380 [nvme_core] kernel: process_one_work+0x1db/0x380 kernel: worker_thread+0x249/0x400 kernel: kthread+0x104/0x140
kernel: Workqueue: nvme-wq nvme_ana_work [nvme_core] kernel: Call Trace: kernel: __schedule+0x2b9/0x6c0 kernel: schedule+0x42/0xb0 kernel: schedule_preempt_disabled+0xe/0x10 kernel: __mutex_lock.isra.0+0x182/0x4f0 kernel: ? __switch_to_asm+0x34/0x70 kernel: ? select_task_rq_fair+0x1aa/0x5c0 kernel: ? kvm_sched_clock_read+0x11/0x20 kernel: ? sched_clock+0x9/0x10 kernel: __mutex_lock_slowpath+0x13/0x20 kernel: mutex_lock+0x2e/0x40 kernel: nvme_read_ana_log+0x3a/0x100 [nvme_core] kernel: nvme_ana_work+0x15/0x20 [nvme_core] kernel: process_one_work+0x1db/0x380 kernel: worker_thread+0x4d/0x400 kernel: kthread+0x104/0x140 kernel: ? process_one_work+0x380/0x380 kernel: ? kthread_park+0x80/0x80 kernel: ret_from_fork+0x35/0x40
--- drivers/nvme/host/multipath.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-)
drivers/nvme/host/multipath.c +16 -8
@@ -639,26 +639,34 @@ static ssize_t ana_state_show(struct device *dev, struct device_attribute *attr, }DEVICE_ATTR_RO (ana_state); -static int nvme_set_ns_ana_state (struct nvme_ctrl *ctrl, +static int nvme_lookup_ana_group_desc (struct nvme_ctrl *ctrl,struct nvme_ana_group_desc *desc,void *data) { -struct nvme_ns *ns = data; +struct nvme_ana_group_desc *dst = data; -if (ns->ana_grpid ==le32_to_cpu (desc->grpid)) { -nvme_update_ns_ana_state (desc, ns); -return -ENXIO ;/* just break out of the loop */ - } +if (desc->grpid != dst->grpid) +return 0 ; -return 0 ; + *dst = *desc; +return -ENXIO ;/* just break out of the loop */ }void nvme_mpath_add_disk (struct nvme_ns *ns,struct nvme_id_ns *id) {if (nvme_ctrl_use_ana (ns->ctrl)) { +struct nvme_ana_group_desc desc = { + .grpid = id->anagrpid, + .state =0 , + }; +mutex_lock (&ns->ctrl->ana_lock); ns->ana_grpid =le32_to_cpu (id->anagrpid); -nvme_parse_ana_log (ns->ctrl, ns, nvme_set_ns_ana_state); +nvme_parse_ana_log (ns->ctrl, &desc, nvme_lookup_ana_group_desc);mutex_unlock (&ns->ctrl->ana_lock); +if (desc.state) { +/* found the group desc: update */ +nvme_update_ns_ana_state (&desc, ns); + } }else { ns->ana_state =NVME_ANA_OPTIMIZED ;nvme_mpath_set_live (ns);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 16/65 nvme-multipath: fix deadlock due to head->lock
In reply to Greg Kroah-HartmanFrom: Anton Eidelman <[email protected]>
[ Upstream commit d8a22f85609fadb46ba699e0136cc3ebdeebff79 ]
In the following scenario scan_work and ana_work will deadlock:
When scan_work calls nvme_mpath_add_disk() this holds ana_lock and invokes nvme_parse_ana_log(), which may issue IO in device_add_disk() and hang waiting for an accessible path.
While nvme_mpath_set_live() only called when nvme_state_is_live(), a transition may cause NVME_SC_ANA_TRANSITION and requeue the IO.
Since nvme_mpath_set_live() holds ns->head->lock, an ana_work on ANY ctrl will not be able to complete nvme_mpath_set_live() on the same ns->head, which is required in order to update the new accessible path and remove NVME_NS_ANA_PENDING.. Therefore IO never completes: deadlock [1].
Fix:
Move device_add_disk out of the head->lock and protect it with an atomic test_and_set for a new NVME_NS_HEAD_HAS_DISK bit.
[1]:
kernel: INFO: task kworker/u8:2:160 blocked for more than 120 seconds. kernel: Tainted: G OE 5.3.5-050305-generic #201910071830 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. kernel: kworker/u8:2 D 0 160 2 0x80004000 kernel: Workqueue: nvme-wq nvme_ana_work [nvme_core] kernel: Call Trace: kernel: __schedule+0x2b9/0x6c0 kernel: schedule+0x42/0xb0 kernel: schedule_preempt_disabled+0xe/0x10 kernel: __mutex_lock.isra.0+0x182/0x4f0 kernel: __mutex_lock_slowpath+0x13/0x20 kernel: mutex_lock+0x2e/0x40 kernel: nvme_update_ns_ana_state+0x22/0x60 [nvme_core] kernel: nvme_update_ana_state+0xca/0xe0 [nvme_core] kernel: nvme_parse_ana_log+0xa1/0x180 [nvme_core] kernel: nvme_read_ana_log+0x76/0x100 [nvme_core] kernel: nvme_ana_work+0x15/0x20 [nvme_core] kernel: process_one_work+0x1db/0x380 kernel: worker_thread+0x4d/0x400 kernel: kthread+0x104/0x140 kernel: ret_from_fork+0x35/0x40 kernel: INFO: task kworker/u8:4:439 blocked for more than 120 seconds. kernel: Tainted: G OE 5.3.5-050305-generic #201910071830 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. kernel: kworker/u8:4 D 0 439 2 0x80004000 kernel: Workqueue: nvme-wq nvme_scan_work [nvme_core] kernel: Call Trace: kernel: __schedule+0x2b9/0x6c0 kernel: schedule+0x42/0xb0 kernel: io_schedule+0x16/0x40 kernel: do_read_cache_page+0x438/0x830 kernel: read_cache_page+0x12/0x20 kernel: read_dev_sector+0x27/0xc0 kernel: read_lba+0xc1/0x220 kernel: efi_partition+0x1e6/0x708 kernel: check_partition+0x154/0x244 kernel: rescan_partitions+0xae/0x280 kernel: __blkdev_get+0x40f/0x560 kernel: blkdev_get+0x3d/0x140 kernel: __device_add_disk+0x388/0x480 kernel: device_add_disk+0x13/0x20 kernel: nvme_mpath_set_live+0x119/0x140 [nvme_core] kernel: nvme_update_ns_ana_state+0x5c/0x60 [nvme_core] kernel: nvme_mpath_add_disk+0xbe/0x100 [nvme_core] kernel: nvme_validate_ns+0x396/0x940 [nvme_core] kernel: nvme_scan_work+0x256/0x390 [nvme_core] kernel: process_one_work+0x1db/0x380 kernel: worker_thread+0x4d/0x400 kernel: kthread+0x104/0x140 kernel: ret_from_fork+0x35/0x40
--- drivers/nvme/host/multipath.c | 4 ++-- drivers/nvme/host/nvme.h | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-)
drivers/nvme/host/multipath.c +2 -2
@@ -417,11 +417,11 @@ static void nvme_mpath_set_live(struct nvme_ns *ns)if (!head->disk)return ; -mutex_lock (&head->lock); -if (!(head->disk->flags &GENHD_FL_UP )) +if (!test_and_set_bit (NVME_NSHEAD_DISK_LIVE , &head->flags))device_add_disk (&head->subsys->dev, head->disk, nvme_ns_id_attr_groups); +mutex_lock (&head->lock);if (nvme_path_is_optimized (ns)) {int node, srcu_idx;
drivers/nvme/host/nvme.h +2 -0
@@ -345,6 +345,8 @@ struct nvme_ns_head {spinlock_t requeue_lock;struct work_struct requeue_work;struct mutex lock; +unsigned long flags; +#define NVME_NSHEAD_DISK_LIVE 0struct nvme_ns __rcu *current_path[];#endif };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 17/65 nvme-multipath: fix bogus request queue reference put
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit c31244669f57963b6ce133a5555b118fc50aec95 ]
The mpath disk node takes a reference on the request mpath request queue when adding live path to the mpath gendisk. However if we connected to an inaccessible path device_add_disk is not called, so if we disconnect and remove the mpath gendisk we endup putting an reference on the request queue that was never taken [1].
Fix that to check if we ever added a live path (using NVME_NS_HEAD_HAS_DISK flag) and if not, clear the disk->queue reference.
[1]:
------------[ cut here ]------------ refcount_t: underflow; use-after-free. WARNING: CPU: 1 PID: 1372 at lib/refcount.c:28 refcount_warn_saturate+0xa6/0xf0 CPU: 1 PID: 1372 Comm: nvme Tainted: G O 5.7.0-rc2+ #3 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-1ubuntu1 04/01/2014 RIP: 0010:refcount_warn_saturate+0xa6/0xf0 RSP: 0018:ffffb29e8053bdc0 EFLAGS: 00010282 RAX: 0000000000000000 RBX: ffff8b7a2f4fc060 RCX: 0000000000000007 RDX: 0000000000000007 RSI: 0000000000000092 RDI: ffff8b7a3ec99980 RBP: ffff8b7a2f4fc000 R08: 00000000000002e1 R09: 0000000000000004 R10: 0000000000000000 R11: 0000000000000001 R12: 0000000000000000 R13: fffffffffffffff2 R14: ffffb29e8053bf08 R15: ffff8b7a320e2da0 FS: 00007f135d4ca800(0000) GS:ffff8b7a3ec80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00005651178c0c30 CR3: 000000003b650005 CR4: 0000000000360ee0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: disk_release+0xa2/0xc0 device_release+0x28/0x80 kobject_put+0xa5/0x1b0 nvme_put_ns_head+0x26/0x70 [nvme_core] nvme_put_ns+0x30/0x60 [nvme_core] nvme_remove_namespaces+0x9b/0xe0 [nvme_core] nvme_do_delete_ctrl+0x43/0x5c [nvme_core] nvme_sysfs_delete.cold+0x8/0xd [nvme_core] kernfs_fop_write+0xc1/0x1a0 vfs_write+0xb6/0x1a0 ksys_write+0x5f/0xe0 do_syscall_64+0x52/0x1a0 entry_SYSCALL_64_after_hwframe+0x44/0xa9
--- drivers/nvme/host/multipath.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/nvme/host/multipath.c +8 -0
@@ -691,6 +691,14 @@ void nvme_mpath_remove_disk(struct nvme_ns_head *head)kblockd_schedule_work (&head->requeue_work);flush_work (&head->requeue_work);blk_cleanup_queue (head->disk->queue); +if (!test_bit (NVME_NSHEAD_DISK_LIVE , &head->flags)) { +/* +* if device_add_disk wasn't called, prevent +* disk release to put a bogus reference on the +* request queue +*/ + head->disk->queue =NULL ; + }put_disk (head->disk); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 18/65 kgdb: Avoid suspicious RCU usage warning
In reply to Greg Kroah-HartmanFrom: Douglas Anderson <[email protected]>
[ Upstream commit 440ab9e10e2e6e5fd677473ee6f9e3af0f6904d6 ]
At times when I'm using kgdb I see a splat on my console about suspicious RCU usage. I managed to come up with a case that could reproduce this that looked like this:
WARNING: suspicious RCU usage
5.7.0-rc4+ #609 Not tainted
-----------------------------
kernel/pid.c:395 find_task_by_pid_ns() needs rcu_read_lock() protection!
other info that might help us debug this:
rcu_scheduler_active = 2, debug_locks = 1
3 locks held by swapper/0/1:
#0: ffffff81b6b8e988 (&dev->mutex){....}-{3:3}, at: __device_attach+0x40/0x13c #1: ffffffd01109e9e8 (dbg_master_lock){....}-{2:2}, at: kgdb_cpu_enter+0x20c/0x7ac #2: ffffffd01109ea90 (dbg_slave_lock){....}-{2:2}, at: kgdb_cpu_enter+0x3ec/0x7ac
stack backtrace: CPU: 7 PID: 1 Comm: swapper/0 Not tainted 5.7.0-rc4+ #609 Hardware name: Google Cheza (rev3+) (DT) Call trace: dump_backtrace+0x0/0x1b8 show_stack+0x1c/0x24 dump_stack+0xd4/0x134 lockdep_rcu_suspicious+0xf0/0x100 find_task_by_pid_ns+0x5c/0x80 getthread+0x8c/0xb0 gdb_serial_stub+0x9d4/0xd04 kgdb_cpu_enter+0x284/0x7ac kgdb_handle_exception+0x174/0x20c kgdb_brk_fn+0x24/0x30 call_break_hook+0x6c/0x7c brk_handler+0x20/0x5c do_debug_exception+0x1c8/0x22c el1_sync_handler+0x3c/0xe4 el1_sync+0x7c/0x100 rpmh_rsc_probe+0x38/0x420 platform_drv_probe+0x94/0xb4 really_probe+0x134/0x300 driver_probe_device+0x68/0x100 __device_attach_driver+0x90/0xa8 bus_for_each_drv+0x84/0xcc __device_attach+0xb4/0x13c device_initial_probe+0x18/0x20 bus_probe_device+0x38/0x98 device_add+0x38c/0x420
If I understand properly we should just be able to blanket kgdb under one big RCU read lock and the problem should go away. We'll add it to the beast-of-a-function known as kgdb_cpu_enter().
With this I no longer get any splats and things seem to work fine.
--- kernel/debug/debug_core.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/debug/debug_core.c +4 -0
@@ -546,6 +546,7 @@ static int kgdb_cpu_enter(struct kgdb_state *ks, struct pt_regs *regs, arch_kgdb_ops.disable_hw_break (regs); acquirelock: +rcu_read_lock ();/* * Interrupts will be restored by the 'trap return' code, except when * single stepping.
@@ -602,6 +603,7 @@ return_normal:atomic_dec (&slaves_in_kgdb);dbg_touch_watchdogs ();local_irq_restore (flags); +rcu_read_unlock ();return 0 ; }cpu_relax ();
@@ -620,6 +622,7 @@ return_normal:raw_spin_unlock (&dbg_master_lock);dbg_touch_watchdogs ();local_irq_restore (flags); +rcu_read_unlock (); goto acquirelock; }
@@ -743,6 +746,7 @@ kgdb_restore:raw_spin_unlock (&dbg_master_lock);dbg_touch_watchdogs ();local_irq_restore (flags); +rcu_read_unlock ();return kgdb_info[cpu].ret_state; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 19/65 selftests: tpm: Use /bin/sh instead of /bin/bash
In reply to Greg Kroah-HartmanFrom: Jarkko Sakkinen <[email protected]>
commit 377ff83083c953dd58c5a030b3c9b5b85d8cc727 upstream.
It's better to use /bin/sh instead of /bin/bash in order to run the tests in the BusyBox shell.
--- tools/testing/selftests/tpm2/test_smoke.sh | 2 +- tools/testing/selftests/tpm2/test_space.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
tools/testing/selftests/tpm2/test_smoke.sh +1 -1
@@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) python -m unittest -v tpm2_tests.SmokeTest
tools/testing/selftests/tpm2/test_space.sh +1 -1
@@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) python -m unittest -v tpm2_tests.SpaceTest
Greg Kroah-Hartman
maintainerPATCH 20/65 tpm: Fix TIS locality timeout problems
In reply to Greg Kroah-HartmanFrom: James Bottomley <[email protected]>
commit 7862840219058436b80029a0263fd1ef065fb1b3 upstream.
It has been reported that some TIS based TPMs are giving unexpected errors when using the O_NONBLOCK path of the TPM device. The problem is that some TPMs don't like it when you get and then relinquish a locality (as the tpm_try_get_ops()/tpm_put_ops() pair does) without sending a command. This currently happens all the time in the O_NONBLOCK write path. Fix this by moving the tpm_try_get_ops() further down the code to after the O_NONBLOCK determination is made. This is safe because the priv->buffer_mutex still protects the priv state being modified.
--- drivers/char/tpm/tpm-dev-common.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)
drivers/char/tpm/tpm-dev-common.c +9 -10
@@ -189,15 +189,6 @@ ssize_t tpm_common_write(struct file *fi goto out; } -/* atomic tpm command send and result receive. We only hold the ops -* lock during this period so that the tpm can be unregistered even if -* the char dev is held open. -*/ -if (tpm_try_get_ops (priv->chip)) { - ret = -EPIPE ; - goto out; - } - priv->response_length =0 ; priv->response_read = false; *off =0 ;
@@ -211,11 +202,19 @@ ssize_t tpm_common_write(struct file *fiif (file->f_flags &O_NONBLOCK ) { priv->command_enqueued = true;queue_work (tpm_dev_wq, &priv->async_work); -tpm_put_ops (priv->chip);mutex_unlock (&priv->buffer_mutex);return size; } +/* atomic tpm command send and result receive. We only hold the ops +* lock during this period so that the tpm can be unregistered even if +* the char dev is held open. +*/ +if (tpm_try_get_ops (priv->chip)) { + ret = -EPIPE ; + goto out; + } + ret =tpm_dev_transmit (priv->chip, priv->space, priv->data_buffer,sizeof (priv->data_buffer));tpm_put_ops (priv->chip);
Greg Kroah-Hartman
maintainerPATCH 21/65 crypto: af_alg - fix use-after-free in af_alg_accept() due to bh_lock_sock()
In reply to Greg Kroah-HartmanFrom: Herbert Xu <[email protected]>
commit 34c86f4c4a7be3b3e35aa48bd18299d4c756064d upstream.
The locking in af_alg_release_parent is broken as the BH socket lock can only be taken if there is a code-path to handle the case where the lock is owned by process-context. Instead of adding such handling, we can fix this by changing the ref counts to atomic_t.
This patch also modifies the main refcnt to include both normal and nokey sockets. This way we don't have to fudge the nokey ref count when a socket changes from nokey to normal.
Credits go to Mauricio Faria de Oliveira who diagnosed this bug and sent a patch for it:
https://lore.kernel.org/linux-crypto/[email protected]/
--- crypto/af_alg.c | 26 +++++++++++--------------- crypto/algif_aead.c | 9 +++------ crypto/algif_hash.c | 9 +++------ crypto/algif_skcipher.c | 9 +++------ include/crypto/if_alg.h | 4 ++-- 5 files changed, 22 insertions(+), 35 deletions(-)
crypto/af_alg.c +11 -15
@@ -128,21 +128,15 @@ EXPORT_SYMBOL_GPL(af_alg_release);void af_alg_release_parent (struct sock *sk) {struct alg_sock *ask =alg_sk (sk); -unsigned int nokey = ask->nokey_refcnt; -bool last = nokey && !ask->refcnt; +unsigned int nokey =atomic_read (&ask->nokey_refcnt); sk = ask->parent; ask =alg_sk (sk); -local_bh_disable (); -bh_lock_sock (sk); - ask->nokey_refcnt -= nokey; -if (!last) - last = !--ask->refcnt; -bh_unlock_sock (sk); -local_bh_enable (); +if (nokey) +atomic_dec (&ask->nokey_refcnt); -if (last) +if (atomic_dec_and_test (&ask->refcnt))sock_put (sk); }EXPORT_SYMBOL_GPL (af_alg_release_parent);
@@ -187,7 +181,7 @@ static int alg_bind(struct socket *sock, err = -EBUSY ;lock_sock (sk); -if (ask->refcnt | ask->nokey_refcnt) +if (atomic_read (&ask->refcnt)) goto unlock;swap (ask->type, type);
@@ -236,7 +230,7 @@ static int alg_setsockopt(struct socketint err = -EBUSY ;lock_sock (sk); -if (ask->refcnt) +if (atomic_read (&ask->refcnt) !=atomic_read (&ask->nokey_refcnt)) goto unlock; type = ask->type;
@@ -301,12 +295,14 @@ int af_alg_accept(struct sock *sk, strucif (err) goto unlock; -if (nokey || !ask->refcnt++) +if (atomic_inc_return_relaxed (&ask->refcnt) ==1 )sock_hold (sk); - ask->nokey_refcnt += nokey; +if (nokey) { +atomic_inc (&ask->nokey_refcnt); +atomic_set (&alg_sk (sk2)->nokey_refcnt,1 ); + }alg_sk (sk2)->parent = sk;alg_sk (sk2)->type = type; -alg_sk (sk2)->nokey_refcnt = nokey; newsock->ops = type->ops; newsock->state =SS_CONNECTED ;
crypto/algif_aead.c +3 -6
@@ -384,7 +384,7 @@ static int aead_check_key(struct socketstruct alg_sock *ask =alg_sk (sk);lock_sock (sk); -if (ask->refcnt) +if (!atomic_read (&ask->nokey_refcnt)) goto unlock_child; psk = ask->parent;
@@ -396,11 +396,8 @@ static int aead_check_key(struct socketif (crypto_aead_get_flags (tfm->aead) &CRYPTO_TFM_NEED_KEY ) goto unlock; -if (!pask->refcnt++) -sock_hold (psk); - - ask->refcnt =1 ; -sock_put (psk); +atomic_dec (&pask->nokey_refcnt); +atomic_set (&ask->nokey_refcnt,0 ); err =0 ;
crypto/algif_hash.c +3 -6
@@ -301,7 +301,7 @@ static int hash_check_key(struct socketstruct alg_sock *ask =alg_sk (sk);lock_sock (sk); -if (ask->refcnt) +if (!atomic_read (&ask->nokey_refcnt)) goto unlock_child; psk = ask->parent;
@@ -313,11 +313,8 @@ static int hash_check_key(struct socketif (crypto_ahash_get_flags (tfm) &CRYPTO_TFM_NEED_KEY ) goto unlock; -if (!pask->refcnt++) -sock_hold (psk); - - ask->refcnt =1 ; -sock_put (psk); +atomic_dec (&pask->nokey_refcnt); +atomic_set (&ask->nokey_refcnt,0 ); err =0 ;
crypto/algif_skcipher.c +3 -6
@@ -211,7 +211,7 @@ static int skcipher_check_key(struct socstruct alg_sock *ask =alg_sk (sk);lock_sock (sk); -if (ask->refcnt) +if (!atomic_read (&ask->nokey_refcnt)) goto unlock_child; psk = ask->parent;
@@ -223,11 +223,8 @@ static int skcipher_check_key(struct socif (crypto_skcipher_get_flags (tfm) &CRYPTO_TFM_NEED_KEY ) goto unlock; -if (!pask->refcnt++) -sock_hold (psk); - - ask->refcnt =1 ; -sock_put (psk); +atomic_dec (&pask->nokey_refcnt); +atomic_set (&ask->nokey_refcnt,0 ); err =0 ;
include/crypto/if_alg.h +2 -2
@@ -29,8 +29,8 @@ struct alg_sock {struct sock *parent; -unsigned int refcnt; -unsigned int nokey_refcnt; +atomic_t refcnt; +atomic_t nokey_refcnt;const struct af_alg_type *type;void *private;
Greg Kroah-Hartman
maintainerPATCH 22/65 drm/msm/dpu: fix error return code in dpu_encoder_init
In reply to Greg Kroah-HartmanFrom: Chen Tao <[email protected]>
[ Upstream commit aa472721c8dbe1713cf510f56ffbc56ae9e14247 ]
Fix to return negative error code -ENOMEM with the use of ERR_PTR from dpu_encoder_init.
--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +1 -1
@@ -2232,7 +2232,7 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev, dpu_enc =devm_kzalloc (dev->dev,sizeof (*dpu_enc),GFP_KERNEL );if (!dpu_enc) -return ERR_PTR (ENOMEM ); +return ERR_PTR (-ENOMEM ); rc =drm_encoder_init (dev, &dpu_enc->base, &dpu_encoder_funcs, drm_enc_mode,NULL );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 23/65 rxrpc: Fix afs large storage transmission performance drop
In reply to Greg Kroah-HartmanFrom: David Howells <[email protected]>
[ Upstream commit 02c28dffb13abbaaedece1e4a6493b48ad3f913a ]
Commit 2ad6691d988c, which moved the modification of the status annotation for a packet in the Tx buffer prior to the retransmission moved the state clearance, but managed to lose the bit that set it to UNACK.
Consequently, if a retransmission occurs, the packet is accidentally changed to the ACK state (ie. 0) by masking it off, which means that the packet isn't counted towards the tally of newly-ACK'd packets if it gets hard-ACK'd. This then prevents the congestion control algorithm from recovering properly.
Fix by reinstating the change of state to UNACK.
Spotted by the generic/460 xfstest.
--- net/rxrpc/call_event.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/rxrpc/call_event.c +1 -1
@@ -253,7 +253,7 @@ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j)* confuse things */ annotation &= ~RXRPC_TX_ANNO_MASK ; - annotation |=RXRPC_TX_ANNO_RESENT ; + annotation |=RXRPC_TX_ANNO_UNACK |RXRPC_TX_ANNO_RESENT ; call->rxtx_annotations[ix] = annotation; skb = call->rxtx_buffer[ix];
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 24/65 RDMA/counter: Query a counter before release
In reply to Greg Kroah-HartmanFrom: Mark Zhang <[email protected]>
[ Upstream commit c1d869d64a1955817c4d6fff08ecbbe8e59d36f8 ]
Query a dynamically-allocated counter before release it, to update it's hwcounters and log all of them into history data. Otherwise all values of these hwcounters will be lost.
--- drivers/infiniband/core/counters.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/infiniband/core/counters.c +3 -1
@@ -195,7 +195,7 @@ static int __rdma_counter_unbind_qp(struct ib_qp *qp)return ret; } -static void counter_history_stat_update (const struct rdma_counter *counter) +static void counter_history_stat_update (struct rdma_counter *counter) {struct ib_device *dev = counter->device;struct rdma_port_counter *port_counter;
@@ -205,6 +205,8 @@ static void counter_history_stat_update(const struct rdma_counter *counter)if (!port_counter->hstats)return ; +rdma_counter_query_stats (counter); +for (i =0 ; i < counter->stats->num_counters; i++) port_counter->hstats->value[i] += counter->stats->value[i]; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 25/65 cxgb4: use unaligned conversion for fetching timestamp
In reply to Greg Kroah-HartmanFrom: Rahul Lakkireddy <[email protected]>
[ Upstream commit 589b1c9c166dce120e27b32a83a78f55464a7ef9 ]
Use get_unaligned_be64() to fetch the timestamp needed for ns_to_ktime() conversion.
Fixes following sparse warning:
sge.c:3282:43: warning: cast to restricted __be64
--- drivers/net/ethernet/chelsio/cxgb4/sge.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/chelsio/cxgb4/sge.c +1 -1
@@ -2816,7 +2816,7 @@ static noinline int t4_systim_to_hwstamp(struct adapter *adapter, hwtstamps =skb_hwtstamps (skb);memset (hwtstamps,0 ,sizeof (*hwtstamps)); - hwtstamps->hwtstamp =ns_to_ktime (be64_to_cpu (*((u64 *)data))); + hwtstamps->hwtstamp =ns_to_ktime (get_unaligned_be64 (data));return RX_PTP_PKT_SUC ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 26/65 cxgb4: parse TC-U32 key values and masks natively
In reply to Greg Kroah-HartmanFrom: Rahul Lakkireddy <[email protected]>
[ Upstream commit 27f78cb245abdb86735529c13b0a579f57829e71 ]
TC-U32 passes all keys values and masks in __be32 format. The parser already expects this and hence pass the value and masks in __be32 natively to the parser.
Fixes following sparse warnings in several places:
cxgb4_tc_u32.c:57:21: warning: incorrect type in assignment (different base types)
cxgb4_tc_u32.c:57:21: expected unsigned int [usertype] val
cxgb4_tc_u32.c:57:21: got restricted __be32 [usertype] val
cxgb4_tc_u32_parse.h:48:24: warning: cast to restricted __be32
--- .../net/ethernet/chelsio/cxgb4/cxgb4_tc_u32.c | 18 +-- .../chelsio/cxgb4/cxgb4_tc_u32_parse.h | 122 ++++++++++++------ 2 files changed, 91 insertions(+), 49 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32.c +9 -9
@@ -47,7 +47,7 @@ static int fill_match_fields(struct adapter *adap, bool next_header) {unsigned int i, j; -u32 val, mask; +__be32 val, mask;int off, err;bool found;
@@ -216,7 +216,7 @@ int cxgb4_config_knode(struct net_device *dev, struct tc_cls_u32_offload *cls)const struct cxgb4_next_header *next;bool found = false;unsigned int i, j; -u32 val, mask; +__be32 val, mask;int off;if (t->table[link_uhtid -1 ].link_handle) {
@@ -230,10 +230,10 @@ int cxgb4_config_knode(struct net_device *dev, struct tc_cls_u32_offload *cls)/* Try to find matches that allow jumps to next header. */ for (i =0 ; next[i].jump; i++) { -if (next[i].offoff != cls->knode.sel->offoff || - next[i].shift != cls->knode.sel->offshift || - next[i].mask != cls->knode.sel->offmask || - next[i].offset != cls->knode.sel->off) +if (next[i].sel.offoff != cls->knode.sel->offoff || + next[i].sel.offshift != cls->knode.sel->offshift || + next[i].sel.offmask != cls->knode.sel->offmask || + next[i].sel.off != cls->knode.sel->off)continue ;/* Found a possible candidate. Find a key that
@@ -245,9 +245,9 @@ int cxgb4_config_knode(struct net_device *dev, struct tc_cls_u32_offload *cls) val = cls->knode.sel->keys[j].val; mask = cls->knode.sel->keys[j].mask; -if (next[i].match_off == off && - next[i].match_val == val && - next[i].match_mask == mask) { +if (next[i].key.off == off && + next[i].key.val == val && + next[i].key.mask == mask) { found = true;break ; }
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_u32_parse.h +82 -40
244 lines not on this page · raw message
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 27/65 cxgb4: fix endian conversions for L4 ports in filters
In reply to Greg Kroah-HartmanFrom: Rahul Lakkireddy <[email protected]>
[ Upstream commit 63b53b0b99cd5f2d9754a21eda2ed8e706646cc9 ]
The source and destination L4 ports in filter offload need to be in CPU endian. They will finally be converted to Big Endian after all operations are done and before giving them to hardware. The L4 ports for NAT are expected to be passed as a byte stream TCB. So, treat them as such.
Fixes following sparse warnings in several places:
cxgb4_tc_flower.c:159:33: warning: cast from restricted __be16 cxgb4_tc_flower.c:159:33: warning: incorrect type in argument 1 (different base types)
cxgb4_tc_flower.c:159:33: expected unsigned short [usertype] val
cxgb4_tc_flower.c:159:33: got restricted __be16 [usertype] dst
--- .../net/ethernet/chelsio/cxgb4/cxgb4_filter.c | 15 +++++++--- .../net/ethernet/chelsio/cxgb4/cxgb4_main.c | 2 +- .../ethernet/chelsio/cxgb4/cxgb4_tc_flower.c | 30 +++++++------------ 3 files changed, 22 insertions(+), 25 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c +11 -4
@@ -165,6 +165,9 @@ static void set_nat_params(struct adapter *adap, struct filter_entry *f, unsigned int tid, bool dip, bool sip, bool dp, bool sp) { + u8 *nat_lp = (u8 *)&f->fs.nat_lport; +u8 *nat_fp = (u8 *)&f->fs.nat_fport; +if (dip) {if (f->fs.type) { set_tcb_field(adap, f, tid, TCB_SND_UNA_RAW_W,
@@ -236,8 +239,9 @@ static void set_nat_params(struct adapter *adap, struct filter_entry *f, }set_tcb_field (adap, f, tid,TCB_PDU_HDR_LEN_W ,WORD_MASK , - (dp ? f->fs.nat_lport :0 ) | - (sp ? f->fs.nat_fport <<16 :0 ),1 ); + (dp ? (nat_lp[1 ] | nat_lp[0 ] <<8 ) :0 ) | + (sp ? (nat_fp[1 ] <<16 | nat_fp[0 ] <<24 ) :0 ), +1 ); }/* Validate filter spec against configuration done on the card. */
@@ -656,6 +660,9 @@ int set_filter_wr(struct adapter *adapter, int fidx) fwr->fpm =htons (f->fs.mask.fport);if (adapter->params.filter2_wr_support) { +u8 *nat_lp = (u8 *)&f->fs.nat_lport; +u8 *nat_fp = (u8 *)&f->fs.nat_fport; + fwr->natmode_to_ulp_type = FW_FILTER2_WR_ULP_TYPE_V(f->fs.nat_mode ? ULP_MODE_TCPDDP :
@@ -663,8 +670,8 @@ int set_filter_wr(struct adapter *adapter, int fidx)FW_FILTER2_WR_NATMODE_V (f->fs.nat_mode);memcpy (fwr->newlip, f->fs.nat_lip,sizeof (fwr->newlip));memcpy (fwr->newfip, f->fs.nat_fip,sizeof (fwr->newfip)); - fwr->newlport =htons (f->fs.nat_lport); - fwr->newfport =htons (f->fs.nat_fport); + fwr->newlport =htons (nat_lp[1 ] | nat_lp[0 ] <<8 ); + fwr->newfport =htons (nat_fp[1 ] | nat_fp[0 ] <<8 ); }/* Mark the filter as "pending" and ship off the Filter Work Request.
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +1 -1
@@ -2504,7 +2504,7 @@ int cxgb4_create_server_filter(const struct net_device *dev, unsigned int stid,/* Clear out filter specifications */ memset (&f->fs,0 ,sizeof (struct ch_filter_specification )); - f->fs.val.lport =cpu_to_be16 (sport); + f->fs.val.lport =be16_to_cpu (sport); f->fs.mask.lport = ~0 ; val = (u8 *)&sip;if ((val[0 ] | val[1 ] | val[2 ] | val[3 ]) !=0 ) {
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c +10 -20
@@ -58,10 +58,6 @@ static struct ch_tc_pedit_fields pedits[] = {PEDIT_FIELDS (IP6_ ,DST_63_32 ,4 , nat_lip,4 ),PEDIT_FIELDS (IP6_ ,DST_95_64 ,4 , nat_lip,8 ), PEDIT_FIELDS(IP6_, DST_127_96, 4, nat_lip, 12), -PEDIT_FIELDS (TCP_ ,SPORT ,2 , nat_fport,0 ), -PEDIT_FIELDS (TCP_ ,DPORT ,2 , nat_lport,0 ), -PEDIT_FIELDS (UDP_ ,SPORT ,2 , nat_fport,0 ), - PEDIT_FIELDS(UDP_, DPORT, 2, nat_lport, 0), };static struct ch_tc_flower_entry *allocate_flower_entry (void )
@@ -156,14 +152,14 @@ static void cxgb4_process_flow_match(struct net_device *dev,struct flow_match_ports match;flow_rule_match_ports (rule, &match); - fs->val.lport =cpu_to_be16 (match.key->dst); - fs->mask.lport =cpu_to_be16 (match.mask->dst); - fs->val.fport =cpu_to_be16 (match.key->src); - fs->mask.fport =cpu_to_be16 (match.mask->src); + fs->val.lport =be16_to_cpu (match.key->dst); + fs->mask.lport =be16_to_cpu (match.mask->dst); + fs->val.fport =be16_to_cpu (match.key->src); + fs->mask.fport =be16_to_cpu (match.mask->src);/* also initialize nat_lport/fport to same values */ - fs->nat_lport =cpu_to_be16 (match.key->dst); - fs->nat_fport =cpu_to_be16 (match.key->src); + fs->nat_lport = fs->val.lport; + fs->nat_fport = fs->val.fport; }if (flow_rule_match_key (rule,FLOW_DISSECTOR_KEY_IP )) {
@@ -354,12 +350,9 @@ static void process_pedit_field(struct ch_filter_specification *fs, u32 val,switch (offset) {case PEDIT_TCP_SPORT_DPORT :if (~mask &PEDIT_TCP_UDP_SPORT_MASK ) -offload_pedit (fs,cpu_to_be32 (val) >>16 , -cpu_to_be32 (mask) >>16 , -TCP_SPORT ); + fs->nat_fport = val;else -offload_pedit (fs,cpu_to_be32 (val), -cpu_to_be32 (mask),TCP_DPORT ); + fs->nat_lport = val >>16 ; } fs->nat_mode =NAT_MODE_ALL ;break ;
@@ -367,12 +360,9 @@ static void process_pedit_field(struct ch_filter_specification *fs, u32 val,switch (offset) {case PEDIT_UDP_SPORT_DPORT :if (~mask &PEDIT_TCP_UDP_SPORT_MASK ) -offload_pedit (fs,cpu_to_be32 (val) >>16 , -cpu_to_be32 (mask) >>16 , -UDP_SPORT ); + fs->nat_fport = val;else -offload_pedit (fs,cpu_to_be32 (val), -cpu_to_be32 (mask),UDP_DPORT ); + fs->nat_lport = val >>16 ; } fs->nat_mode =NAT_MODE_ALL ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 28/65 cxgb4: use correct type for all-mask IP address comparison
In reply to Greg Kroah-HartmanFrom: Rahul Lakkireddy <[email protected]>
[ Upstream commit f286dd8eaad5a2758750f407ab079298e0bcc8a5 ]
Use correct type to check for all-mask exact match IP addresses.
Fixes following sparse warnings due to big endian value checks against 0xffffffff in is_addr_all_mask():
cxgb4_filter.c:977:25: warning: restricted __be32 degrades to integer cxgb4_filter.c:983:37: warning: restricted __be32 degrades to integer cxgb4_filter.c:984:37: warning: restricted __be32 degrades to integer cxgb4_filter.c:985:37: warning: restricted __be32 degrades to integer cxgb4_filter.c:986:37: warning: restricted __be32 degrades to integer
--- drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c +5 -5
@@ -839,16 +839,16 @@ static bool is_addr_all_mask(u8 *ipmask, int family)struct in_addr *addr; addr = (struct in_addr *)ipmask; -if (addr->s_addr ==0xffffffff ) +if (ntohl (addr->s_addr) ==0xffffffff )return true; }else if (family ==AF_INET6 ) {struct in6_addr *addr6; addr6 = (struct in6_addr *)ipmask; -if (addr6->s6_addr32[0 ] ==0xffffffff && - addr6->s6_addr32[1 ] ==0xffffffff && - addr6->s6_addr32[2 ] ==0xffffffff && - addr6->s6_addr32[3 ] ==0xffffffff ) +if (ntohl (addr6->s6_addr32[0 ]) ==0xffffffff && +ntohl (addr6->s6_addr32[1 ]) ==0xffffffff && +ntohl (addr6->s6_addr32[2 ]) ==0xffffffff && +ntohl (addr6->s6_addr32[3 ]) ==0xffffffff )return true; }return false;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 29/65 cxgb4: fix SGE queue dump destination buffer context
In reply to Greg Kroah-HartmanFrom: Rahul Lakkireddy <[email protected]>
[ Upstream commit 1992ded5d111997877a9a25205976d8d03c46814 ]
The data in destination buffer is expected to be be parsed in big endian. So, use the right context.
Fixes following sparse warning:
cudbg_lib.c:2041:44: warning: incorrect type in assignment (different base types)
cudbg_lib.c:2041:44: expected unsigned long long [usertype]
cudbg_lib.c:2041:44: got restricted __be64 [usertype]
--- drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c +4 -2
@@ -1980,7 +1980,6 @@ int cudbg_collect_dump_context(struct cudbg_init *pdbg_init,u8 mem_type[CTXT_INGRESS +1 ] = {0 };struct cudbg_buffer temp_buff = {0 };struct cudbg_ch_cntxt *buff; -u64 *dst_off, *src_off;u8 *ctx_buf;u8 i, k;int rc;
@@ -2049,8 +2048,11 @@ int cudbg_collect_dump_context(struct cudbg_init *pdbg_init, }for (j =0 ; j < max_ctx_qid; j++) { +__be64 *dst_off; +u64 *src_off; + src_off = (u64 *)(ctx_buf + j *SGE_CTXT_SIZE ); - dst_off = (u64 *)buff->data; + dst_off = (__be64 *)buff->data;/* The data is stored in 64-bit cpu order. Convert it * to big endian before parsing.
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 30/65 hwmon: (max6697) Make sure the OVERT mask is set correctly
In reply to Greg Kroah-HartmanFrom: Chu Lin <[email protected]>
[ Upstream commit 016983d138cbe99a5c0aaae0103ee88f5300beb3 ]
Per the datasheet for max6697, OVERT mask and ALERT mask are different. For example, the 7th bit of OVERT is the local channel but for alert mask, the 6th bit is the local channel. Therefore, we can't apply the same mask for both registers. In addition to that, the max6697 driver is supposed to be compatibale with different models. I manually went over all the listed chips and made sure all chip types have the same layout.
Testing;
mask value of 0x9 should map to 0x44 for ALERT and 0x84 for OVERT.
I used iotool to read the reg value back to verify. I only tested this
change on max6581.Reference:
https://datasheets.maximintegrated.com/en/ds/MAX6581.pdf
https://datasheets.maximintegrated.com/en/ds/MAX6697.pdf
https://datasheets.maximintegrated.com/en/ds/MAX6699.pdf
--- drivers/hwmon/max6697.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/hwmon/max6697.c +4 -3
@@ -38,8 +38,9 @@ static const u8 MAX6697_REG_CRIT[] = {* Map device tree / platform data register bit map to chip bit map. * Applies to alert register and over-temperature register. */ -#define MAX6697_MAP_BITS (reg) ((((reg) & 0x7e) >> 1) | \ +#define MAX6697_ALERT_MAP_BITS (reg) ((((reg) & 0x7e) >> 1) | \ (((reg) & 0x01) << 6) | ((reg) & 0x80)) +#define MAX6697_OVERT_MAP_BITS (reg) (((reg) >> 1) | (((reg) & 0x01) << 7))#define MAX6697_REG_STAT (n) (0x44 + (n))
@@ -562,12 +563,12 @@ static int max6697_init_chip(struct max6697_data *data,return ret; ret =i2c_smbus_write_byte_data (client,MAX6697_REG_ALERT_MASK , -MAX6697_MAP_BITS (pdata->alert_mask)); +MAX6697_ALERT_MAP_BITS (pdata->alert_mask));if (ret <0 )return ret; ret =i2c_smbus_write_byte_data (client,MAX6697_REG_OVERT_MASK , -MAX6697_MAP_BITS (pdata->over_temperature_mask)); +MAX6697_OVERT_MAP_BITS (pdata->over_temperature_mask));if (ret <0 )return ret;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 31/65 hwmon: (acpi_power_meter) Fix potential memory leak in acpi_power_meter_add()
In reply to Greg Kroah-HartmanFrom: Misono Tomohiro <[email protected]>
[ Upstream commit 8b97f9922211c44a739c5cbd9502ecbb9f17f6d1 ]
Although it rarely happens, we should call free_capabilities() if error happens after read_capabilities() to free allocated strings.
--- drivers/hwmon/acpi_power_meter.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/hwmon/acpi_power_meter.c +3 -1
@@ -883,7 +883,7 @@ static int acpi_power_meter_add(struct acpi_device *device) res =setup_attrs (resource);if (res) - goto exit_free; + goto exit_free_capability; resource->hwmon_dev =hwmon_device_register (&device->dev);if (IS_ERR (resource->hwmon_dev)) {
@@ -896,6 +896,8 @@ static int acpi_power_meter_add(struct acpi_device *device) exit_remove:remove_attrs (resource); +exit_free_capability: +free_capabilities (resource); exit_free:kfree (resource); exit:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 32/65 thermal/drivers/mediatek: Fix bank number settings on mt8183
In reply to Greg Kroah-HartmanFrom: Michael Kao <[email protected]>
[ Upstream commit 14533a5a6c12e8d7de79d309d4085bf186058fe1 ]
MT8183_NUM_ZONES should be set to 1
because MT8183 doesn't have multiple banks.
--- drivers/thermal/mtk_thermal.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/thermal/mtk_thermal.c +4 -1
@@ -211,6 +211,9 @@ enum {/* The total number of temperature sensors in the MT8183 */ #define MT8183_NUM_SENSORS 6 +/* The number of banks in the MT8183 */ +#define MT8183_NUM_ZONES 1 +/* The number of sensing points per bank */ #define MT8183_NUM_SENSORS_PER_ZONE 6
@@ -498,7 +501,7 @@ static const struct mtk_thermal_data mt7622_thermal_data = {static const struct mtk_thermal_data mt8183_thermal_data = { .auxadc_channel =MT8183_TEMP_AUXADC_CHANNEL , - .num_banks =MT8183_NUM_SENSORS_PER_ZONE , + .num_banks =MT8183_NUM_ZONES , .num_sensors =MT8183_NUM_SENSORS , .vts_index = mt8183_vts_index, .cali_val =MT8183_CALIBRATION ,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 33/65 thermal/drivers/rcar_gen3: Fix undefined temperature if negative
In reply to Greg Kroah-HartmanFrom: Dien Pham <[email protected]>
[ Upstream commit 5f8f06425a0dcdad7bedbb77e67f5c65ab4dacfc ]
As description for DIV_ROUND_CLOSEST in file include/linux/kernel.h.
"Result is undefined for negative divisors if the dividend variable
type is unsigned and for negative dividends if the divisor variable type is unsigned."
In current code, the FIXPT_DIV uses DIV_ROUND_CLOSEST but has not checked sign of divisor before using. It makes undefined temperature value in case the value is negative.
This patch fixes to satisfy DIV_ROUND_CLOSEST description and fix bug too. Note that the variable name "reg" is not good because it should be the same type as rcar_gen3_thermal_read(). However, it's better to rename the "reg" in a further patch as cleanup.
--- drivers/thermal/rcar_gen3_thermal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/thermal/rcar_gen3_thermal.c +1 -1
@@ -169,7 +169,7 @@ static int rcar_gen3_thermal_get_temp(void *devdata, int *temp) {struct rcar_gen3_thermal_tsc *tsc = devdata;int mcelsius, val; -u32 reg; +int reg;/* Read register and convert to mili Celsius */ reg =rcar_gen3_thermal_read (tsc,REG_GEN3_TEMP ) &CTEMP_MASK ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 34/65 kthread: save thread function
In reply to Greg Kroah-HartmanFrom: J. Bruce Fields <[email protected]>
[ Upstream commit 52782c92ac85c4e393eb4a903a62e6c24afa633f ]
It's handy to keep the kthread_fn just as a unique cookie to identify classes of kthreads. E.g. if you can verify that a given task is running your thread_fn, then you may know what sort of type kthread_data points to.
We'll use this in nfsd to pass some information into the vfs. Note it will need kthread_data() exported too.
--- include/linux/kthread.h | 1 + kernel/kthread.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+)
include/linux/kthread.h +1 -0
@@ -57,6 +57,7 @@ bool kthread_should_stop(void);bool kthread_should_park (void );bool __kthread_should_park (struct task_struct *k);bool kthread_freezable_should_stop (bool *was_frozen); +void *kthread_func (struct task_struct *k);void *kthread_data (struct task_struct *k);void *kthread_probe_data (struct task_struct *k);int kthread_park (struct task_struct *k);
kernel/kthread.c +17 -0
@@ -46,6 +46,7 @@ struct kthread_create_infostruct kthread {unsigned long flags;unsigned int cpu; +int (*threadfn)(void *);void *data;struct completion parked;struct completion exited;
@@ -152,6 +153,20 @@ bool kthread_freezable_should_stop(bool *was_frozen) }EXPORT_SYMBOL_GPL (kthread_freezable_should_stop); +/** +* kthread_func - return the function specified on kthread creation +* @task: kthread task in question +* +* Returns NULL if the task is not a kthread. +*/ +void *kthread_func (struct task_struct *task) +{ +if (task->flags &PF_KTHREAD ) +return to_kthread (task)->threadfn; +return NULL ; +} +EXPORT_SYMBOL_GPL (kthread_func); +/** * kthread_data - return data value specified on kthread creation * @task: kthread task in question
@@ -164,6 +179,7 @@ void *kthread_data(struct task_struct *task) {return to_kthread (task)->data; } +EXPORT_SYMBOL_GPL (kthread_data);/** * kthread_probe_data - speculative version of kthread_data()
@@ -237,6 +253,7 @@ static int kthread(void *_create)do_exit (-ENOMEM ); } + self->threadfn = threadfn; self->data = data;init_completion (&self->exited);init_completion (&self->parked);
Signature · 1 line
2.25.1
Re: [PATCH 5.4 34/65] kthread: save thread function
NACK.--b.
Quoted 86 lines · Greg Kroah-Hartman
From: J. Bruce Fields <[email protected]>
[ Upstream commit
52782c92ac85c4e393eb4a903a62e6c24afa633f]It's handy to keep the
kthread_fnjust as a unique cookie to identify classes of kthreads. E.g. if you can verify that a given task is running yourthread_fn, then you may know what sort of typekthread_datapoints to.We'll use this in nfsd to pass some information into the vfs. Note it will need
kthread_data()exported too.Original-patch-by Tejun Heo <[email protected]>Signed-off-by J. Bruce Fields <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- include/linux/kthread.h | 1 + kernel/kthread.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+)include/linux/kthread.h +1
-0@@ -57,6 +57,7 @@ bool kthread_should_stop(void);bool kthread_should_park (void );bool __kthread_should_park (struct task_struct *k);bool kthread_freezable_should_stop (bool *was_frozen); +void *kthread_func (struct task_struct *k);void *kthread_data (struct task_struct *k);void *kthread_probe_data (struct task_struct *k);int kthread_park (struct task_struct *k);kernel/kthread.c +17
-0@@ -46,6 +46,7 @@ struct kthread_create_infostruct kthread {unsigned long flags;unsigned int cpu; +int (*threadfn)(void *);void *data;struct completion parked;struct completion exited;@@ -152,6 +153,20 @@ bool kthread_freezable_should_stop(bool *was_frozen) }EXPORT_SYMBOL_GPL (kthread_freezable_should_stop); +/** +* kthread_func - return the function specified on kthread creation +* @task: kthread task in question +* +* Returns NULL if the task is not a kthread. +*/ +void *kthread_func (struct task_struct *task) +{ +if (task->flags &PF_KTHREAD ) +return to_kthread (task)->threadfn; +return NULL ; +} +EXPORT_SYMBOL_GPL (kthread_func); +/** * kthread_data - return data value specified on kthread creation * @task: kthread task in question @@ -164,6 +179,7 @@ void *kthread_data(struct task_struct *task) {return to_kthread (task)->data; } +EXPORT_SYMBOL_GPL (kthread_data);/** * kthread_probe_data - speculative version of kthread_data() @@ -237,6 +253,7 @@ static int kthread(void *_create)do_exit (-ENOMEM ); } + self->threadfn = threadfn; self->data = data;init_completion (&self->exited);init_completion (&self->parked);Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 35/65 nfsd: clients dont need to break their own delegations
In reply to Greg Kroah-HartmanFrom: J. Bruce Fields <[email protected]>
[ Upstream commit 28df3d1539de5090f7916f6fff03891b67f366f4 ]
We currently revoke read delegations on any write open or any operation that modifies file data or metadata (including rename, link, and unlink). But if the delegation in question is the only read delegation and is held by the client performing the operation, that's not really necessary.
It's not always possible to prevent this in the NFSv4.0 case, because there's not always a way to determine which client an NFSv4.0 delegation came from. (In theory we could try to guess this from the transport layer, e.g., by assuming all traffic on a given TCP connection comes from the same client. But that's not really correct.)
In the NFSv4.1 case the session layer always tells us the client.
This patch should remove such self-conflicts in all cases where we can reliably determine the client from the compound.
To do that we need to track "who" is performing a given (possibly lease-breaking) file operation. We're doing that by storing the information in the svc_rqst and using kthread_data() to map the current task back to a svc_rqst.
--- Documentation/filesystems/locking.rst | 2 ++ fs/locks.c | 3 +++ fs/nfsd/nfs4proc.c | 2 ++ fs/nfsd/nfs4state.c | 14 ++++++++++++++ fs/nfsd/nfsd.h | 2 ++ fs/nfsd/nfssvc.c | 6 ++++++ include/linux/fs.h | 1 + include/linux/sunrpc/svc.h | 1 + 8 files changed, 31 insertions(+)
Documentation/filesystems/locking.rst +2 -0
@@ -425,6 +425,7 @@ prototypes:: int (*lm_grant)(struct file_lock *, struct file_lock *, int); void (*lm_break)(struct file_lock *); /* break_lease callback */ int (*lm_change)(struct file_lock **, int); + bool (*lm_breaker_owns_lease)(struct file_lock *); locking rules:
@@ -435,6 +436,7 @@ lm_notify: yes yes no lm_grant: no no no lm_break: yes no no lm_change yes no no +lm_breaker_owns_lease: no no no ========== ============= ================= ========= buffer_head
fs/locks.c +3 -0
@@ -1557,6 +1557,9 @@ static bool leases_conflict(struct file_lock *lease, struct file_lock *breaker) {bool rc; +if (lease->fl_lmops->lm_breaker_owns_lease + && lease->fl_lmops->lm_breaker_owns_lease (lease)) +return false;if ((breaker->fl_flags &FL_LAYOUT ) != (lease->fl_flags &FL_LAYOUT )) { rc = false; goto trace;
fs/nfsd/nfs4proc.c +2 -0
@@ -1961,6 +1961,8 @@ nfsd4_proc_compound(struct svc_rqst *rqstp) goto encode_op; } + rqstp->rq_lease_breaker = (void **)&cstate->clp; +trace_nfsd_compound (rqstp, args->opcnt);while (!status && resp->opcnt < args->opcnt) { op = &args->ops[resp->opcnt++];
fs/nfsd/nfs4state.c +14 -0
@@ -4464,6 +4464,19 @@ nfsd_break_deleg_cb(struct file_lock *fl)return ret; } +static bool nfsd_breaker_owns_lease (struct file_lock *fl) +{ +struct nfs4_delegation *dl = fl->fl_owner; +struct svc_rqst *rqst; +struct nfs4_client *clp; + +if (!i_am_nfsd ()) +return NULL ; + rqst =kthread_data (current); + clp = *(rqst->rq_lease_breaker); +return dl->dl_stid.sc_client == clp; +} +static int nfsd_change_deleg_cb (struct file_lock *onlist,int arg,struct list_head *dispose)
@@ -4475,6 +4488,7 @@ nfsd_change_deleg_cb(struct file_lock *onlist, int arg, }static const struct lock_manager_operations nfsd_lease_mng_ops = { + .lm_breaker_owns_lease = nfsd_breaker_owns_lease, .lm_break = nfsd_break_deleg_cb, .lm_change = nfsd_change_deleg_cb, };
fs/nfsd/nfsd.h +2 -0
@@ -87,6 +87,8 @@ int nfsd_pool_stats_release(struct inode *, struct file *);void nfsd_destroy (struct net *net); +bool i_am_nfsd (void ); +struct nfsdfs_client {struct kref cl_ref;void (*cl_release)(struct kref *kref);
fs/nfsd/nfssvc.c +6 -0
@@ -590,6 +590,11 @@ static const struct svc_serv_ops nfsd_thread_sv_ops = { .svo_module = THIS_MODULE, }; +bool i_am_nfsd () +{ +return kthread_func (current) == nfsd; +} +int nfsd_create_serv (struct net *net) {int error;
@@ -997,6 +1002,7 @@ nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp) *statp = rpc_garbage_args;return 1 ; } + rqstp->rq_lease_breaker =NULL ;/* * Give the xdr decoder a chance to change this if it wants * (necessary in the NFSv4.0 compound case)
include/linux/fs.h +1 -0
@@ -1040,6 +1040,7 @@ struct lock_manager_operations {bool (*lm_break)(struct file_lock *);int (*lm_change)(struct file_lock *,int ,struct list_head *);void (*lm_setup)(struct file_lock *,void **); +bool (*lm_breaker_owns_lease)(struct file_lock *); };struct lock_manager {
include/linux/sunrpc/svc.h +1 -0
@@ -299,6 +299,7 @@ struct svc_rqst {struct net *rq_bc_net;/* pointer to backchannel's * net namespace */ +void ** rq_lease_breaker;/* The v4 client breaking a lease */ };#define SVC_NET (rqst) (rqst->rq_xprt ? rqst->rq_xprt->xpt_net : rqst->rq_bc_net)
Signature · 1 line
2.25.1
J. Bruce Fields
NAKRe: [PATCH 5.4 35/65] nfsd: clients dont need to break their own delegations
NACK.
(How did this one even end up headed for stable? It wasn't cc'd to stable, it's not a bugfix, and it's not a small patch.)
--b.
Quoted 184 lines · Greg Kroah-Hartman
From: J. Bruce Fields <[email protected]>
[ Upstream commit
28df3d1539de5090f7916f6fff03891b67f366f4]We currently revoke read delegations on any write open or any operation that modifies file data or metadata (including rename, link, and unlink). But if the delegation in question is the only read delegation and is held by the client performing the operation, that's not really necessary.
It's not always possible to prevent this in the NFSv4.0 case, because there's not always a way to determine which client an NFSv4.0 delegation came from. (In theory we could try to guess this from the transport layer, e.g., by assuming all traffic on a given TCP connection comes from the same client. But that's not really correct.)
In the NFSv4.1 case the session layer always tells us the client.
This patch should remove such self-conflicts in all cases where we can reliably determine the client from the compound.
To do that we need to track "who" is performing a given (possibly lease-breaking) file operation. We're doing that by storing the information in the
svc_rqstand usingkthread_data()to map the current task back to asvc_rqst.Signed-off-by J. Bruce Fields <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- Documentation/filesystems/locking.rst | 2 ++ fs/locks.c | 3 +++ fs/nfsd/nfs4proc.c | 2 ++ fs/nfsd/nfs4state.c | 14 ++++++++++++++ fs/nfsd/nfsd.h | 2 ++ fs/nfsd/nfssvc.c | 6 ++++++ include/linux/fs.h | 1 + include/linux/sunrpc/svc.h | 1 + 8 files changed, 31 insertions(+)Documentation/filesystems/locking.rst +2
-0@@ -425,6 +425,7 @@ prototypes:: int (*lm_grant)(struct file_lock *, struct file_lock *, int); void (*lm_break)(struct file_lock *); /* break_lease callback */ int (*lm_change)(struct file_lock **, int); + bool (*lm_breaker_owns_lease)(struct file_lock *); locking rules:@@ -435,6 +436,7 @@ lm_notify: yes yes no lm_grant: no no no lm_break: yes no no lm_change yes no no +lm_breaker_owns_lease: no no no ========== ============= ================= ========= buffer_headfs/locks.c +3
-0@@ -1557,6 +1557,9 @@ static bool leases_conflict(struct file_lock *lease, struct file_lock *breaker) {bool rc; +if (lease->fl_lmops->lm_breaker_owns_lease + && lease->fl_lmops->lm_breaker_owns_lease (lease)) +return false;if ((breaker->fl_flags &FL_LAYOUT ) != (lease->fl_flags &FL_LAYOUT )) { rc = false; goto trace;fs/nfsd/nfs4proc.c +2
-0@@ -1961,6 +1961,8 @@ nfsd4_proc_compound(struct svc_rqst *rqstp) goto encode_op; } + rqstp->rq_lease_breaker = (void **)&cstate->clp; +trace_nfsd_compound (rqstp, args->opcnt);while (!status && resp->opcnt < args->opcnt) { op = &args->ops[resp->opcnt++];fs/nfsd/nfs4state.c +14
-0@@ -4464,6 +4464,19 @@ nfsd_break_deleg_cb(struct file_lock *fl)return ret; } +static bool nfsd_breaker_owns_lease (struct file_lock *fl) +{ +struct nfs4_delegation *dl = fl->fl_owner; +struct svc_rqst *rqst; +struct nfs4_client *clp; + +if (!i_am_nfsd ()) +return NULL ; + rqst =kthread_data (current); + clp = *(rqst->rq_lease_breaker); +return dl->dl_stid.sc_client == clp; +} +static int nfsd_change_deleg_cb (struct file_lock *onlist,int arg,struct list_head *dispose)@@ -4475,6 +4488,7 @@ nfsd_change_deleg_cb(struct file_lock *onlist, int arg, }static const struct lock_manager_operations nfsd_lease_mng_ops = { + .lm_breaker_owns_lease = nfsd_breaker_owns_lease, .lm_break = nfsd_break_deleg_cb, .lm_change = nfsd_change_deleg_cb, };fs/nfsd/nfsd.h +2
-0@@ -87,6 +87,8 @@ int nfsd_pool_stats_release(struct inode *, struct file *);void nfsd_destroy (struct net *net); +bool i_am_nfsd (void ); +struct nfsdfs_client {struct kref cl_ref;void (*cl_release)(struct kref *kref);fs/nfsd/nfssvc.c +6
-0@@ -590,6 +590,11 @@ static const struct svc_serv_ops nfsd_thread_sv_ops = { .svo_module = THIS_MODULE, }; +bool i_am_nfsd () +{ +return kthread_func (current) == nfsd; +} +int nfsd_create_serv (struct net *net) {int error;@@ -997,6 +1002,7 @@ nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp) *statp = rpc_garbage_args;return 1 ; } + rqstp->rq_lease_breaker =NULL ;/* * Give the xdr decoder a chance to change this if it wants * (necessary in the NFSv4.0 compound case) include/linux/fs.h +1
-0@@ -1040,6 +1040,7 @@ struct lock_manager_operations {bool (*lm_break)(struct file_lock *);int (*lm_change)(struct file_lock *,int ,struct list_head *);void (*lm_setup)(struct file_lock *,void **); +bool (*lm_breaker_owns_lease)(struct file_lock *); };struct lock_manager {include/linux/sunrpc/svc.h +1
-0@@ -299,6 +299,7 @@ struct svc_rqst {struct net *rq_bc_net;/* pointer to backchannel's * net namespace */ +void ** rq_lease_breaker;/* The v4 client breaking a lease */ };#define SVC_NET (rqst) (rqst->rq_xprt ? rqst->rq_xprt->xpt_net : rqst->rq_bc_net)Signature · 1 line
2.25.1
Sasha Levin
maintainerRe: [PATCH 5.4 35/65] nfsd: clients dont need to break their own delegations
Quoted 3 lines · J. Bruce Fields
NACK.
(How did this one even end up headed for stable? It wasn't cc'd to
It came in when I was looking at the later nfs patches in this series and figured it is a fix on its own.
Quoted 1 line
stable, it's not a bugfix, and it's not a small patch.)
If its not a bugfix, why did it go in -rc4 rather than waiting for the merge window?
Signature · 2 lines
Thanks, Sasha
Sasha Levin
maintainerRe: [PATCH 5.4 35/65] nfsd: clients dont need to break their own delegations
Quoted 5 lines · Sasha Levin
Quoted 3 lines · J. Bruce Fields
NACK.
(How did this one even end up headed for stable? It wasn't cc'd to
Quoted 7 lines
It came in when I was looking at the later nfs patches in this series and figured it is a fix on its own.
Quoted 1 line
stable, it's not a bugfix, and it's not a small patch.)
If its not a bugfix, why did it go in -rc4 rather than waiting for the merge window?
Sorry, my bad, I failed at shuffling patches around. I'll drop these.
Signature · 2 lines
Thanks, Sasha
Re: [PATCH 5.4 35/65] nfsd: clients dont need to break their own delegations
Quoted 6 lines · Sasha Levin
Quoted 5 lines · Sasha Levin
Quoted 3 lines · J. Bruce Fields
NACK.
(How did this one even end up headed for stable? It wasn't cc'd to
Quoted 7 lines
Quoted 7 lines
It came in when I was looking at the later nfs patches in this series and figured it is a fix on its own.
Quoted 1 line
stable, it's not a bugfix, and it's not a small patch.)
If its not a bugfix, why did it go in -rc4 rather than waiting for the merge window?
They went in during the merge window, unless I'm very confused.
Quoted 1 line
Sorry, my bad, I failed at shuffling patches around. I'll drop these.
OK, thanks.
--b.
Greg Kroah-Hartman
maintainerPATCH 36/65 nfsd4: fix nfsdfs reference count loop
In reply to Greg Kroah-HartmanFrom: J. Bruce Fields <[email protected]>
[ Upstream commit 681370f4b00af0fcc65bbfb9f82de526ab7ceb0a ]
We don't drop the reference on the nfsdfs filesystem with mntput(nn->nfsd_mnt) until nfsd_exit_net(), but that won't be called until the nfsd module's unloaded, and we can't unload the module as long as there's a reference on nfsdfs. So this prevents module unloading.
--- fs/nfsd/nfs4state.c | 8 +++++++- fs/nfsd/nfsctl.c | 22 ++++++++++++---------- fs/nfsd/nfsd.h | 3 +++ 3 files changed, 22 insertions(+), 11 deletions(-)
fs/nfsd/nfs4state.c +7 -1
@@ -7719,9 +7719,14 @@ nfs4_state_start_net(struct net *net)struct nfsd_net *nn =net_generic (net, nfsd_net_id);int ret; - ret =nfs4_state_create_net (net); + ret =get_nfsdfs (net);if (ret)return ret; + ret =nfs4_state_create_net (net); +if (ret) { +mntput (nn->nfsd_mnt); +return ret; + }locks_start_grace (net, &nn->nfsd4_manager);nfsd4_client_tracking_init (net);if (nn->track_reclaim_completes && nn->reclaim_str_hashtbl_size ==0 )
@@ -7790,6 +7795,7 @@ nfs4_state_shutdown_net(struct net *net)nfsd4_client_tracking_exit (net);nfs4_state_destroy_net (net); +mntput (nn->nfsd_mnt); }void
fs/nfsd/nfsctl.c +12 -10
@@ -1424,6 +1424,18 @@ static struct file_system_type nfsd_fs_type = { };MODULE_ALIAS_FS ("nfsd" ); +int get_nfsdfs (struct net *net) +{ +struct nfsd_net *nn =net_generic (net, nfsd_net_id); +struct vfsmount *mnt; + + mnt =vfs_kern_mount (&nfsd_fs_type,SB_KERNMOUNT ,"nfsd" ,NULL ); +if (IS_ERR (mnt)) +return PTR_ERR (mnt); + nn->nfsd_mnt = mnt; +return 0 ; +} +#ifdef CONFIG_PROC_FS static int create_proc_exports_entry (void ) {
@@ -1452,7 +1464,6 @@ unsigned int nfsd_net_id;static __net_init int nfsd_init_net (struct net *net) {int retval; -struct vfsmount *mnt;struct nfsd_net *nn =net_generic (net, nfsd_net_id); retval =nfsd_export_init (net);
@@ -1479,16 +1490,8 @@ static __net_init int nfsd_init_net(struct net *net)init_waitqueue_head (&nn->ntf_wq);seqlock_init (&nn->boot_lock); - mnt =vfs_kern_mount (&nfsd_fs_type,SB_KERNMOUNT ,"nfsd" ,NULL ); -if (IS_ERR (mnt)) { - retval =PTR_ERR (mnt); - goto out_mount_err; - } - nn->nfsd_mnt = mnt;return 0 ; -out_mount_err: -nfsd_reply_cache_shutdown (nn); out_drc_error:nfsd_idmap_shutdown (net); out_idmap_error:
@@ -1501,7 +1504,6 @@ static __net_exit void nfsd_exit_net(struct net *net) {struct nfsd_net *nn =net_generic (net, nfsd_net_id); -mntput (nn->nfsd_mnt);nfsd_reply_cache_shutdown (nn);nfsd_idmap_shutdown (net);nfsd_export_shutdown (net);
fs/nfsd/nfsd.h +3 -0
@@ -89,6 +89,8 @@ void nfsd_destroy(struct net *net);bool i_am_nfsd (void ); +int get_nfsdfs (struct net *); +struct nfsdfs_client {struct kref cl_ref;void (*cl_release)(struct kref *kref);
@@ -99,6 +101,7 @@ struct dentry *nfsd_client_mkdir(struct nfsd_net *nn, struct nfsdfs_client *ncl, u32 id, const struct tree_descr *);void nfsd_client_rmdir (struct dentry *dentry); +#if defined(CONFIG_NFSD_V2_ACL ) || defined(CONFIG_NFSD_V3_ACL )#ifdef CONFIG_NFSD_V2_ACL extern const struct svc_version nfsd_acl_version2;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 37/65 nfsd: fix nfsdfs inode reference count leak
In reply to Greg Kroah-HartmanFrom: J. Bruce Fields <[email protected]>
[ Upstream commit bf2654017e0268cc83dc88d56f0e67ff4406631d ]
I don't understand this code well, but I'm seeing a warning about a still-referenced inode on unmount, and every other similar filesystem does a dput() here.
--- fs/nfsd/nfsctl.c | 1 + 1 file changed, 1 insertion(+)
fs/nfsd/nfsctl.c +1 -0
@@ -1335,6 +1335,7 @@ void nfsd_client_rmdir(struct dentry *dentry)WARN_ON_ONCE (ret);fsnotify_rmdir (dir, dentry);d_delete (dentry); +dput (dentry);inode_unlock (dir); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 38/65 drm: sun4i: hdmi: Remove extra HPD polling
In reply to Greg Kroah-HartmanFrom: Chen-Yu Tsai <[email protected]>
[ Upstream commit bda8eaa6dee7525f4dac950810a85a88bf6c2ba0 ]
The HPD sense mechanism in Allwinner's old HDMI encoder hardware is more or less an input-only GPIO. Other GPIO-based HPD implementations directly return the current state, instead of polling for a specific state and returning the other if that times out.
Remove the I/O polling from sun4i_hdmi_connector_detect() and directly return a known state based on the current reading. This also gets rid of excessive CPU usage by kworker as reported on Stack Exchange [1] and Armbian forums [2].
[1] https://superuser.com/questions/1515001/debian-10-buster-on-cubietruck-with-bug-in-sun4i-drm-hdmi
[2] https://forum.armbian.com/topic/14282-headless-systems-and-sun4i_drm_hdmi-a10a20/
--- drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c +2 -3
@@ -262,9 +262,8 @@ sun4i_hdmi_connector_detect(struct drm_connector *connector, bool force)struct sun4i_hdmi *hdmi =drm_connector_to_sun4i_hdmi (connector);unsigned long reg; -if (readl_poll_timeout (hdmi->base +SUN4I_HDMI_HPD_REG , reg, - reg &SUN4I_HDMI_HPD_HIGH , -0 ,500000 )) { + reg =readl (hdmi->base +SUN4I_HDMI_HPD_REG ); +if (reg &SUN4I_HDMI_HPD_HIGH ) {cec_phys_addr_invalidate (hdmi->cec_adap);return connector_status_disconnected; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 39/65 virtio-blk: free vblk-vqs in error path of virtblk_probe()
In reply to Greg Kroah-HartmanFrom: Hou Tao <[email protected]>
[ Upstream commit e7eea44eefbdd5f0345a0a8b80a3ca1c21030d06 ]
Else there will be memory leak if alloc_disk() fails.
--- drivers/block/virtio_blk.c | 1 + 1 file changed, 1 insertion(+)
drivers/block/virtio_blk.c +1 -0
@@ -990,6 +990,7 @@ static int virtblk_probe(struct virtio_device *vdev)put_disk (vblk->disk); out_free_vq: vdev->config->del_vqs (vdev); +kfree (vblk->vqs); out_free_vblk:kfree (vblk); out_free_index:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 40/65 SMB3: Honor posix flag for multiuser mounts
In reply to Greg Kroah-HartmanFrom: Paul Aurich <[email protected]>
[ Upstream commit 5391b8e1b7b7e5cfa2dd4ffdc4b8c6b64dfd1866 ]
The flag from the primary tcon needs to be copied into the volume info so that cifs_get_tcon will try to enable extensions on the per-user tcon. At that point, since posix extensions must have already been enabled on the superblock, don't try to needlessly adjust the mount flags.
--- fs/cifs/connect.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
fs/cifs/connect.c +1 -4
@@ -5282,6 +5282,7 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid) vol_info->nohandlecache = master_tcon->nohandlecache; vol_info->local_lease = master_tcon->local_lease; vol_info->no_linux_ext = !master_tcon->unix_ext; + vol_info->linux_ext = master_tcon->posix_extensions; vol_info->sectype = master_tcon->ses->sectype; vol_info->sign = master_tcon->ses->sign;
@@ -5309,10 +5310,6 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, kuid_t fsuid) goto out; } -/* if new SMB3.11 POSIX extensions are supported do not remap / and \ */ -if (tcon->posix_extensions) - cifs_sb->mnt_cifs_flags |=CIFS_MOUNT_POSIX_PATHS ; -if (cap_unix (ses))reset_cifs_unix_caps (0 , tcon,NULL , vol_info);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 41/65 nvme: fix identify error status silent ignore
In reply to Greg Kroah-HartmanFrom: Sagi Grimberg <[email protected]>
[ Upstream commit ea43d9709f727e728e933a8157a7a7ca1a868281 ]
Commit 59c7c3caaaf8 intended to only silently ignore non retry-able errors (DNR bit set) such that we can still identify misbehaving controllers, and in the other hand propagate retry-able errors (DNR bit cleared) so we don't wrongly abandon a namespace just because it happens to be temporarily inaccessible.
The goal remains the same as the original commit where this was introduced but unfortunately had the logic backwards.
--- drivers/nvme/host/core.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/nvme/host/core.c +9 -3
@@ -1088,10 +1088,16 @@ static int nvme_identify_ns_descs(struct nvme_ctrl *ctrl, unsigned nsid,dev_warn (ctrl->device,"Identify Descriptors failed (%d)\n" , status);/* -* Don't treat an error as fatal, as we potentially already -* have a NGUID or EUI-64. +* Don't treat non-retryable errors as fatal, as we potentially +* already have a NGUID or EUI-64. If we failed with DNR set, +* we want to silently ignore the error as we can still +* identify the device, but if the status has DNR set, we want +* to propagate the error back specifically for the disk +* revalidation flow to make sure we don't abandon the +* device just because of a temporal retry-able error (such +* as path of transport errors). */ -if (status >0 && !(status &NVME_SC_DNR )) +if (status >0 && (status &NVME_SC_DNR )) status =0 ; goto free_data; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 42/65 nvme: fix a crash in nvme_mpath_add_disk
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
[ Upstream commit 72d447113bb751ded97b2e2c38f886e4a4139082 ]
For private namespaces ns->head_disk is NULL, so add a NULL check before updating the BDI capabilities.
--- drivers/nvme/host/multipath.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/nvme/host/multipath.c +4 -3
@@ -673,10 +673,11 @@ void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id) }if (bdi_cap_stable_pages_required (ns->queue->backing_dev_info)) { -struct backing_dev_info *info = - ns->head->disk->queue->backing_dev_info; +struct gendisk *disk = ns->head->disk; - info->capabilities |=BDI_CAP_STABLE_WRITES ; +if (disk) + disk->queue->backing_dev_info->capabilities |= +BDI_CAP_STABLE_WRITES ; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 43/65 samples/vfs: avoid warning in statx override
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
[ Upstream commit c3eeaae9fd736b7f2afbda8d3cbb1cbae06decf3 ]
Something changed recently to uncover this warning:
samples/vfs/test-statx.c:24:15: warning: `struct foo' declared inside parameter list will not be visible outside of this definition or declaration
24 | #define statx foo
| ^~~
Which is due the use of "struct statx" (here, "struct foo") in a function prototype argument list before it has been defined:
int
# 56 "/usr/include/x86_64-linux-gnu/bits/statx-generic.h"
foo
# 56 "/usr/include/x86_64-linux-gnu/bits/statx-generic.h" 3 4
(int __dirfd, const char *__restrict __path, int __flags,
unsigned int __mask, struct
# 57 "/usr/include/x86_64-linux-gnu/bits/statx-generic.h"
foo
# 57 "/usr/include/x86_64-linux-gnu/bits/statx-generic.h" 3 4
*__restrict __buf)
__attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (2, 5)));
Add explicit struct before #include to avoid warning.
--- samples/vfs/test-statx.c | 2 ++ 1 file changed, 2 insertions(+)
samples/vfs/test-statx.c +2 -0
@@ -23,6 +23,8 @@#include <linux/fcntl.h> #define statx foo#define statx_timestamp foo_timestamp +struct statx ; +struct statx_timestamp ;#include <sys/stat.h> #undef statx#undef statx_timestamp
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 44/65 i2c: algo-pca: Add 0x78 as SCL stuck low status for PCA9665
In reply to Greg Kroah-HartmanFrom: Chris Packham <[email protected]>
[ Upstream commit cd217f2300793a106b49c7dfcbfb26e348bc7593 ]
The PCA9665 datasheet says that I2CSTA = 78h indicates that SCL is stuck low, this differs to the PCA9564 which uses 90h for this indication. Treat either 0x78 or 0x90 as an indication that the SCL line is stuck.
Based on looking through the PCA9564 and PCA9665 datasheets this should be safe for both chips. The PCA9564 should not return 0x78 for any valid state and the PCA9665 should not return 0x90.
--- drivers/i2c/algos/i2c-algo-pca.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/i2c/algos/i2c-algo-pca.c +2 -1
@@ -314,7 +314,8 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,DEB2 ("BUS ERROR - SDA Stuck low\n" );pca_reset (adap); goto out; -case 0x90 :/* Bus error - SCL stuck low */ +case 0x78 :/* Bus error - SCL stuck low (PCA9665) */ +case 0x90 :/* Bus error - SCL stuck low (PCA9564) */ DEB2 ("BUS ERROR - SCL Stuck low\n" );pca_reset (adap); goto out;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 45/65 i2c: mlxcpld: check correct size of maximum RECV_LEN packet
In reply to Greg Kroah-HartmanFrom: Wolfram Sang <[email protected]>
[ Upstream commit 597911287fcd13c3a4b4aa3e0a52b33d431e0a8e ]
I2C_SMBUS_BLOCK_MAX defines already the maximum number as defined in the SMBus 2.0 specs. I don't see a reason to add 1 here. Also, fix the errno to what is suggested for this error.
--- drivers/i2c/busses/i2c-mlxcpld.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-mlxcpld.c +2 -2
@@ -337,9 +337,9 @@ static int mlxcpld_i2c_wait_for_tc(struct mlxcpld_i2c_priv *priv)if (priv->smbus_block && (val &MLXCPLD_I2C_SMBUS_BLK_BIT )) {mlxcpld_i2c_read_comm (priv,MLXCPLD_LPCI2C_NUM_DAT_REG , &datalen,1 ); -if (unlikely (datalen > (I2C_SMBUS_BLOCK_MAX +1 ))) { +if (unlikely (datalen >I2C_SMBUS_BLOCK_MAX )) {dev_err (priv->dev,"Incorrect smbus block read message len\n" ); -return -E2BIG ; +return -EPROTO ; } }else { datalen = priv->xfer.data_len;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 46/65 spi: spi-fsl-dspi: Fix external abort on interrupt in resume or exit paths
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
commit 3d87b613d6a3c6f0980e877ab0895785a2dde581 upstream.
If shared interrupt comes late, during probe error path or device remove (could be triggered with CONFIG_DEBUG_SHIRQ), the interrupt handler dspi_interrupt() will access registers with the clock being disabled. This leads to external abort on non-linefetch on Toradex Colibri VF50 module (with Vybrid VF5xx):
$ echo 4002d000.spi > /sys/devices/platform/soc/40000000.bus/4002d000.spi/driver/unbind
Unhandled fault: external abort on non-linefetch (0x1008) at 0x8887f02c
Internal error: : 1008 [#1] ARM
Hardware name: Freescale Vybrid VF5xx/VF6xx (Device Tree)
Backtrace:
(regmap_mmio_read32le)
(regmap_mmio_read)
(_regmap_bus_reg_read)
(_regmap_read)
(regmap_read)
(dspi_interrupt)
(free_irq)
(devm_irq_release)
(release_nodes)
(devres_release_all)
(device_release_driver_internal)The resource-managed framework should not be used for shared interrupt handling, because the interrupt handler might be called after releasing other resources and disabling clocks.
Similar bug could happen during suspend - the shared interrupt handler could be invoked after suspending the device. Each device sharing this interrupt line should disable the IRQ during suspend so handler will be invoked only in following cases:
1. None suspended,
2. All devices resumed.
--- drivers/spi/spi-fsl-dspi.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/spi/spi-fsl-dspi.c +13 -4
@@ -901,6 +901,8 @@ static int dspi_suspend(struct device *dstruct spi_controller *ctlr =dev_get_drvdata (dev);struct fsl_dspi *dspi =spi_controller_get_devdata (ctlr); +if (dspi->irq) +disable_irq (dspi->irq);spi_controller_suspend (ctlr);clk_disable_unprepare (dspi->clk);
@@ -921,6 +923,8 @@ static int dspi_resume(struct device *deif (ret)return ret;spi_controller_resume (ctlr); +if (dspi->irq) +enable_irq (dspi->irq);return 0 ; }
@@ -1108,8 +1112,8 @@ static int dspi_probe(struct platform_de goto poll_mode; } - ret =devm_request_irq (&pdev->dev, dspi->irq, dspi_interrupt, -IRQF_SHARED , pdev->name, dspi); + ret =request_threaded_irq (dspi->irq, dspi_interrupt,NULL , +IRQF_SHARED , pdev->name, dspi);if (ret <0 ) {dev_err (&pdev->dev,"Unable to attach DSPI interrupt\n" ); goto out_clk_put;
@@ -1122,7 +1126,7 @@ poll_mode: ret =dspi_request_dma (dspi, res->start);if (ret <0 ) {dev_err (&pdev->dev,"can't get dma channels\n" ); - goto out_clk_put; + goto out_free_irq; } }
@@ -1134,11 +1138,14 @@ poll_mode: ret =spi_register_controller (ctlr);if (ret !=0 ) {dev_err (&pdev->dev,"Problem registering DSPI ctlr\n" ); - goto out_clk_put; + goto out_free_irq; }return ret; +out_free_irq: +if (dspi->irq) +free_irq (dspi->irq, dspi); out_clk_put:clk_disable_unprepare (dspi->clk); out_ctlr_put:
@@ -1154,6 +1161,8 @@ static int dspi_remove(struct platform_d/* Disconnect from the SPI framework */ dspi_release_dma (dspi); +if (dspi->irq) +free_irq (dspi->irq, dspi);clk_disable_unprepare (dspi->clk);spi_unregister_controller (dspi->ctlr);
Greg Kroah-Hartman
maintainerPATCH 47/65 nfsd: apply umask on fs without ACL support
In reply to Greg Kroah-HartmanFrom: J. Bruce Fields <[email protected]>
commit 22cf8419f1319ff87ec759d0ebdff4cbafaee832 upstream.
The server is failing to apply the umask when creating new objects on filesystems without ACL support.
To reproduce this, you need to use NFSv4.2 and a client and server recent enough to support umask, and you need to export a filesystem that lacks ACL support (for example, ext4 with the "noacl" mount option).
Filesystems with ACL support are expected to take care of the umask themselves (usually by calling posix_acl_create).
For filesystems without ACL support, this is up to the caller of vfs_create(), vfs_mknod(), or vfs_mkdir().
--- fs/nfsd/vfs.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/nfsd/vfs.c +6 -0
@@ -1184,6 +1184,9 @@ nfsd_create_locked(struct svc_rqst *rqst iap->ia_mode =0 ; iap->ia_mode = (iap->ia_mode &S_IALLUGO ) | type; +if (!IS_POSIXACL (dirp)) + iap->ia_mode &= ~current_umask (); + err =0 ; host_err =0 ;switch (type) {
@@ -1416,6 +1419,9 @@ do_nfsd_create(struct svc_rqst *rqstp, s goto out; } +if (!IS_POSIXACL (dirp)) + iap->ia_mode &= ~current_umask (); + host_err =vfs_create (dirp, dchild, iap->ia_mode, true);if (host_err <0 ) {fh_drop_write (fhp);
Greg Kroah-Hartman
maintainerPATCH 48/65 Revert "ALSA: usb-audio: Improve frames size computation"
In reply to Greg Kroah-HartmanFrom: Greg Kroah-Hartman <[email protected]>
This reverts commit aba41867dd66939d336fdf604e4d73b805d8039f which is commit f0bd62b64016508938df9babe47f65c2c727d25c upstream.
It causes a number of reported issues and a fix for it has not hit Linus's tree yet. Revert this to resolve those problems.
--- sound/usb/card.h | 4 ---- sound/usb/endpoint.c | 43 +++++-------------------------------------- sound/usb/endpoint.h | 1 - sound/usb/pcm.c | 2 -- 4 files changed, 5 insertions(+), 45 deletions(-)
sound/usb/card.h +0 -4
@@ -84,10 +84,6 @@ struct snd_usb_endpoint {dma_addr_t sync_dma;/* DMA address of syncbuf */ unsigned int pipe;/* the data i/o pipe */ -unsigned int framesize[2 ];/* small/large frame sizes in samples */ -unsigned int sample_rem;/* remainder from division fs/fps */ -unsigned int sample_accum;/* sample accumulator */ -unsigned int fps;/* frames per second */ unsigned int freqn;/* nominal sampling rate in fs/fps in Q16.16 format */ unsigned int freqm;/* momentary sampling rate in fs/fps in Q16.16 format */ int freqshift;/* how much to shift the feedback value to get Q16.16 */
sound/usb/endpoint.c +5 -38
78 lines not on this page · raw message
sound/usb/endpoint.h +0 -1
@@ -28,7 +28,6 @@ void snd_usb_endpoint_release(struct sndvoid snd_usb_endpoint_free (struct snd_usb_endpoint *ep);int snd_usb_endpoint_implicit_feedback_sink (struct snd_usb_endpoint *ep); -int snd_usb_endpoint_slave_next_packet_size (struct snd_usb_endpoint *ep);int snd_usb_endpoint_next_packet_size (struct snd_usb_endpoint *ep); void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
sound/usb/pcm.c +0 -2
@@ -1581,8 +1581,6 @@ static void prepare_playback_urb(structfor (i =0 ; i < ctx->packets; i++) {if (ctx->packet_size[i]) counts = ctx->packet_size[i]; -else if (ep->sync_master) - counts =snd_usb_endpoint_slave_next_packet_size (ep);else counts =snd_usb_endpoint_next_packet_size (ep);
Greg Kroah-Hartman
maintainerPATCH 49/65 SMB3: Honor seal flag for multiuser mounts
In reply to Greg Kroah-HartmanFrom: Paul Aurich <[email protected]>
commit cc15461c73d7d044d56c47e869a215e49bd429c8 upstream.
Ensure multiuser SMB3 mounts use encryption for all users' tcons if the mount options are configured to require encryption. Without this, only the primary tcon and IPC tcons are guaranteed to be encrypted. Per-user tcons would only be encrypted if the server was configured to require encryption.
--- fs/cifs/connect.c | 1 + 1 file changed, 1 insertion(+)
fs/cifs/connect.c +1 -0
@@ -5285,6 +5285,7 @@ cifs_construct_tcon(struct cifs_sb_info vol_info->linux_ext = master_tcon->posix_extensions; vol_info->sectype = master_tcon->ses->sectype; vol_info->sign = master_tcon->ses->sign; + vol_info->seal = master_tcon->seal; rc =cifs_set_vol_auth (vol_info, master_tcon->ses);if (rc) {
Greg Kroah-Hartman
maintainerPATCH 50/65 SMB3: Honor persistent/resilient handle flags for multiuser mounts
In reply to Greg Kroah-HartmanFrom: Paul Aurich <[email protected]>
commit 00dfbc2f9c61185a2e662f27c45a0bb29b2a134f upstream.
Without this:
- persistent handles will only be enabled for per-user tcons if the server advertises the 'Continuous Availabity' capability
- resilient handles would never be enabled for per-user tcons
--- fs/cifs/connect.c | 2 ++ 1 file changed, 2 insertions(+)
fs/cifs/connect.c +2 -0
@@ -5281,6 +5281,8 @@ cifs_construct_tcon(struct cifs_sb_info vol_info->nocase = master_tcon->nocase; vol_info->nohandlecache = master_tcon->nohandlecache; vol_info->local_lease = master_tcon->local_lease; + vol_info->resilient = master_tcon->use_resilient; + vol_info->persistent = master_tcon->use_persistent; vol_info->no_linux_ext = !master_tcon->unix_ext; vol_info->linux_ext = master_tcon->posix_extensions; vol_info->sectype = master_tcon->ses->sectype;
Greg Kroah-Hartman
maintainerPATCH 51/65 SMB3: Honor lease disabling for multiuser mounts
In reply to Greg Kroah-HartmanFrom: Paul Aurich <[email protected]>
commit ad35f169db6cd5a4c5c0a5a42fb0cad3efeccb83 upstream.
--- fs/cifs/connect.c | 1 + 1 file changed, 1 insertion(+)
fs/cifs/connect.c +1 -0
@@ -5281,6 +5281,7 @@ cifs_construct_tcon(struct cifs_sb_info vol_info->nocase = master_tcon->nocase; vol_info->nohandlecache = master_tcon->nohandlecache; vol_info->local_lease = master_tcon->local_lease; + vol_info->no_lease = master_tcon->no_lease; vol_info->resilient = master_tcon->use_resilient; vol_info->persistent = master_tcon->use_persistent; vol_info->no_linux_ext = !master_tcon->unix_ext;
Greg Kroah-Hartman
maintainerPATCH 52/65 SMB3: Honor handletimeout flag for multiuser mounts
In reply to Greg Kroah-HartmanFrom: Paul Aurich <[email protected]>
commit 6b356f6cf941d5054d7fab072cae4a5f8658e3db upstream.
--- fs/cifs/connect.c | 1 + 1 file changed, 1 insertion(+)
fs/cifs/connect.c +1 -0
@@ -5284,6 +5284,7 @@ cifs_construct_tcon(struct cifs_sb_info vol_info->no_lease = master_tcon->no_lease; vol_info->resilient = master_tcon->use_resilient; vol_info->persistent = master_tcon->use_persistent; + vol_info->handle_timeout = master_tcon->handle_timeout; vol_info->no_linux_ext = !master_tcon->unix_ext; vol_info->linux_ext = master_tcon->posix_extensions; vol_info->sectype = master_tcon->ses->sectype;
Greg Kroah-Hartman
maintainerPATCH 53/65 cifs: Fix the target file was deleted when rename failed.
In reply to Greg Kroah-HartmanFrom: Zhang Xiaoxu <[email protected]>
commit 9ffad9263b467efd8f8dc7ae1941a0a655a2bab2 upstream.
When xfstest generic/035, we found the target file was deleted if the rename return -EACESS.
In cifs_rename2, we unlink the positive target dentry if rename failed with EACESS or EEXIST, even if the target dentry is positived before rename. Then the existing file was deleted.
We should just delete the target file which created during the rename.
--- fs/cifs/inode.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
fs/cifs/inode.c +8 -2
@@ -1791,6 +1791,7 @@ cifs_rename2(struct inode *source_dir, sFILE_UNIX_BASIC_INFO *info_buf_target;unsigned int xid;int rc, tmprc; +bool new_target =d_really_is_negative (target_dentry);if (flags & ~RENAME_NOREPLACE )return -EINVAL ;
@@ -1867,8 +1868,13 @@ cifs_rename2(struct inode *source_dir, s*/ unlink_target: -/* Try unlinking the target dentry if it's not negative */ -if (d_really_is_positive (target_dentry) && (rc == -EACCES || rc == -EEXIST )) { +/* +* If the target dentry was created during the rename, try +* unlinking it if it's not negative +*/ +if (new_target && +d_really_is_positive (target_dentry) && + (rc == -EACCES || rc == -EEXIST )) {if (d_is_dir (target_dentry)) tmprc =cifs_rmdir (target_dir, target_dentry);else
Greg Kroah-Hartman
maintainerPATCH 54/65 MIPS: lantiq: xway: sysctrl: fix the GPHY clock alias names
In reply to Greg Kroah-HartmanFrom: Martin Blumenstingl <[email protected]>
commit 03e62fd67d3ab33f39573fc8787d89dc9b4d7255 upstream.
The dt-bindings for the GSWIP describe that the node should be named "switch". Use the same name in sysctrl.c so the GSWIP driver can actually find the "gphy0" and "gphy1" clocks.
--- arch/mips/lantiq/xway/sysctrl.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/mips/lantiq/xway/sysctrl.c +4 -4
@@ -514,8 +514,8 @@ void __init ltq_soc_init(void)clkdev_add_pmu ("1e10b308.eth" ,NULL ,0 ,0 ,PMU_SWITCH |PMU_PPE_DP |PMU_PPE_TC );clkdev_add_pmu ("1da00000.usif" ,"NULL" ,1 ,0 ,PMU_USIF ); -clkdev_add_pmu ("1e108000.gswip" ,"gphy0" ,0 ,0 ,PMU_GPHY ); -clkdev_add_pmu ("1e108000.gswip" ,"gphy1" ,0 ,0 ,PMU_GPHY ); +clkdev_add_pmu ("1e108000.switch" ,"gphy0" ,0 ,0 ,PMU_GPHY ); +clkdev_add_pmu ("1e108000.switch" ,"gphy1" ,0 ,0 ,PMU_GPHY );clkdev_add_pmu ("1e103100.deu" ,NULL ,1 ,0 ,PMU_DEU );clkdev_add_pmu ("1e116000.mei" ,"afe" ,1 ,2 ,PMU_ANALOG_DSL_AFE );clkdev_add_pmu ("1e116000.mei" ,"dfe" ,1 ,0 ,PMU_DFE );
@@ -538,8 +538,8 @@ void __init ltq_soc_init(void)PMU_SWITCH |PMU_PPE_DPLUS |PMU_PPE_DPLUM |PMU_PPE_EMA |PMU_PPE_TC |PMU_PPE_SLL01 | PMU_PPE_QSB | PMU_PPE_TOP); -clkdev_add_pmu ("1e108000.gswip" ,"gphy0" ,0 ,0 ,PMU_GPHY ); -clkdev_add_pmu ("1e108000.gswip" ,"gphy1" ,0 ,0 ,PMU_GPHY ); +clkdev_add_pmu ("1e108000.switch" ,"gphy0" ,0 ,0 ,PMU_GPHY ); +clkdev_add_pmu ("1e108000.switch" ,"gphy1" ,0 ,0 ,PMU_GPHY );clkdev_add_pmu ("1e103000.sdio" ,NULL ,1 ,0 ,PMU_SDIO );clkdev_add_pmu ("1e103100.deu" ,NULL ,1 ,0 ,PMU_DEU );clkdev_add_pmu ("1e116000.mei" ,"dfe" ,1 ,0 ,PMU_DFE );
Greg Kroah-Hartman
maintainerPATCH 55/65 MIPS: Add missing EHB in mtc0 -> mfc0 sequence for DSPen
In reply to Greg Kroah-HartmanFrom: Hauke Mehrtens <[email protected]>
commit fcec538ef8cca0ad0b84432235dccd9059c8e6f8 upstream.
This resolves the hazard between the mtc0 in the change_c0_status() and the mfc0 in configure_exception_vector(). Without resolving this hazard configure_exception_vector() could read an old value and would restore this old value again. This would revert the changes change_c0_status() did. I checked this by printing out the read_c0_status() at the end of per_cpu_trap_init() and the ST0_MX is not set without this patch.
The hazard is documented in the MIPS Architecture Reference Manual Vol.
III: MIPS32/microMIPS32 Privileged Resource Architecture (MD00088), rev 6.03 table 8.1 which includes:
Producer | Consumer | Hazard ----------|----------|---------------------------- mtc0 | mfc0 | any coprocessor 0 register
I saw this hazard on an Atheros AR9344 rev 2 SoC with a MIPS 74Kc CPU. There the change_c0_status() function would activate the DSPen by setting ST0_MX in the c0_status register. This was reverted and then the system got a DSP exception when the DSP registers were saved in save_dsp() in the first process switch. The crash looks like this:
[ 0.089999] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear) [ 0.097796] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear) [ 0.107070] Kernel panic - not syncing: Unexpected DSP exception [ 0.113470] Rebooting in 1 seconds..
We saw this problem in OpenWrt only on the MIPS 74Kc based Atheros SoCs, not on the 24Kc based SoCs. We only saw it with kernel 5.4 not with kernel 4.19, in addition we had to use GCC 8.4 or 9.X, with GCC 8.3 it did not happen.
In the kernel I bisected this problem to commit 9012d011660e ("compiler:
allow all arches to enable CONFIG_OPTIMIZE_INLINING"), but when this was reverted it also happened after commit 172dcd935c34b ("MIPS: Always allocate exception vector for MIPSr2+").
Commit 0b24cae4d535 ("MIPS: Add missing EHB in mtc0 -> mfc0 sequence.") does similar changes to a different file. I am not sure if there are more places affected by this problem.
--- arch/mips/kernel/traps.c | 1 + 1 file changed, 1 insertion(+)
arch/mips/kernel/traps.c +1 -0
@@ -2126,6 +2126,7 @@ static void configure_status(void)change_c0_status (ST0_CU |ST0_MX |ST0_RE |ST0_FR |ST0_BEV |ST0_TS |ST0_KX |ST0_SX |ST0_UX , status_set); +back_to_back_c0_hazard (); }unsigned int hwrena;
Greg Kroah-Hartman
maintainerPATCH 56/65 drm/amd/display: Only revalidate bandwidth on medium and fast updates
In reply to Greg Kroah-HartmanFrom: Nicholas Kazlauskas <[email protected]>
commit 6eb3cf2e06d22b2b08e6b0ab48cb9c05a8e1a107 upstream.
[Why]
Changes that are fast don't require updating DLG parameters making this call unnecessary. Considering this is an expensive call it should not be done on every flip.
DML touches clocks, p-state support, DLG params and a few other DC internal flags and these aren't expected during fast. A hang has been reported with this change when called on every flip which suggests that modifying these fields is not recommended behavior on fast updates.
[How]
Guard the validation to only happen if update type isn't FAST.
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +6 -4
@@ -2226,10 +2226,12 @@ void dc_commit_updates_for_stream(structcopy_stream_update_to_stream (dc, context, stream, stream_update); -if (!dc->res_pool->funcs->validate_bandwidth (dc, context, false)) { -DC_ERROR ("Mode validation failed for stream update!\n" ); -dc_release_state (context); -return ; +if (update_type >UPDATE_TYPE_FAST ) { +if (!dc->res_pool->funcs->validate_bandwidth (dc, context, false)) { +DC_ERROR ("Mode validation failed for stream update!\n" ); +dc_release_state (context); +return ; + } } commit_planes_for_stream(
Greg Kroah-Hartman
maintainerPATCH 57/65 drm/amdgpu: use %u rather than %d for sclk/mclk
In reply to Greg Kroah-HartmanFrom: Alex Deucher <[email protected]>
commit beaf10efca64ac824240838ab1f054dfbefab5e6 upstream.
Large clock values may overflow and show up as negative.
Reported by prOMiNd on IRC.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +2 -2
@@ -2101,7 +2101,7 @@ static ssize_t amdgpu_hwmon_show_sclk(stif (r)return r; -return snprintf (buf,PAGE_SIZE ,"%d\n" , sclk *10 *1000 ); +return snprintf (buf,PAGE_SIZE ,"%u\n" , sclk *10 *1000 ); } static ssize_t amdgpu_hwmon_show_sclk_label(struct device *dev,
@@ -2131,7 +2131,7 @@ static ssize_t amdgpu_hwmon_show_mclk(stif (r)return r; -return snprintf (buf,PAGE_SIZE ,"%d\n" , mclk *10 *1000 ); +return snprintf (buf,PAGE_SIZE ,"%u\n" , mclk *10 *1000 ); } static ssize_t amdgpu_hwmon_show_mclk_label(struct device *dev,
Greg Kroah-Hartman
maintainerPATCH 58/65 drm/amdgpu/atomfirmware: fix vram_info fetching for renoir
In reply to Greg Kroah-HartmanFrom: Alex Deucher <[email protected]>
commit d7a6634a4cfba073ff6a526cb4265d6e58ece234 upstream.
Renoir uses integrated_system_info table v12. The table has the same layout as v11 with respect to this data. Just reuse the existing code for v12 for stable.
Fixes incorrectly reported vram info in the driver output.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +1 -0
@@ -150,6 +150,7 @@ int amdgpu_atomfirmware_get_vram_width(s (mode_info->atom_context->bios + data_offset);switch (crev) {case 11 : +case 12 : mem_channel_number = igp_info->v11.umachannelnumber;/* channel width is 64 */ return mem_channel_number *64 ;
Greg Kroah-Hartman
maintainerPATCH 59/65 dma-buf: Move dma_buf_release() from fops to dentry_ops
In reply to Greg Kroah-HartmanFrom: Sumit Semwal <[email protected]>
commit 4ab59c3c638c6c8952bf07739805d20eb6358a4d upstream.
Charan Teja reported a 'use-after-free' in dmabuffs_dname [1], which happens if the dma_buf_release() is called while the userspace is accessing the dma_buf pseudo fs's dmabuffs_dname() in another process, and dma_buf_release() releases the dmabuf object when the last reference to the struct file goes away.
I discussed with Arnd Bergmann, and he suggested that rather than tying the dma_buf_release() to the file_operations' release(), we can tie it to the dentry_operations' d_release(), which will be called when the last ref to the dentry is removed.
The path exercised by __fput() calls f_op->release() first, and then calls dput, which eventually calls d_op->d_release().
In the 'normal' case, when no userspace access is happening via dma_buf pseudo fs, there should be exactly one fd, file, dentry and inode, so closing the fd will kill of everything right away.
In the presented case, the dentry's d_release() will be called only when the dentry's last ref is released.
Therefore, lets move dma_buf_release() from fops->release() to d_ops->d_release()
Many thanks to Arnd for his FS insights :)
[1]: https://lore.kernel.org/patchwork/patch/1238278/
--- drivers/dma-buf/dma-buf.c | 54 +++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 29 deletions(-)
drivers/dma-buf/dma-buf.c +25 -29
@@ -54,37 +54,11 @@ static char *dmabuffs_dname(struct dentr dentry->d_name.name, ret > 0 ? name : ""); } -static const struct dentry_operations dma_buf_dentry_ops = { - .d_dname = dmabuffs_dname, -}; - -static struct vfsmount *dma_buf_mnt; - -static int dma_buf_fs_init_context (struct fs_context *fc) -{ -struct pseudo_fs_context *ctx; - - ctx =init_pseudo (fc,DMA_BUF_MAGIC ); -if (!ctx) -return -ENOMEM ; - ctx->dops = &dma_buf_dentry_ops; -return 0 ; -} - -static struct file_system_type dma_buf_fs_type = { - .name ="dmabuf" , - .init_fs_context = dma_buf_fs_init_context, - .kill_sb = kill_anon_super, -}; - -static int dma_buf_release (struct inode *inode,struct file *file) +static void dma_buf_release (struct dentry *dentry) {struct dma_buf *dmabuf; -if (!is_dma_buf_file (file)) -return -EINVAL ; - - dmabuf = file->private_data; + dmabuf = dentry->d_fsdata;BUG_ON (dmabuf->vmapping_counter);
@@ -110,9 +84,32 @@ static int dma_buf_release(struct inodemodule_put (dmabuf->owner);kfree (dmabuf->name);kfree (dmabuf); +} + +static const struct dentry_operations dma_buf_dentry_ops = { + .d_dname = dmabuffs_dname, + .d_release = dma_buf_release, +}; + +static struct vfsmount *dma_buf_mnt; + +static int dma_buf_fs_init_context (struct fs_context *fc) +{ +struct pseudo_fs_context *ctx; + + ctx =init_pseudo (fc,DMA_BUF_MAGIC ); +if (!ctx) +return -ENOMEM ; + ctx->dops = &dma_buf_dentry_ops;return 0 ; } +static struct file_system_type dma_buf_fs_type = { + .name ="dmabuf" , + .init_fs_context = dma_buf_fs_init_context, + .kill_sb = kill_anon_super, +}; +static int dma_buf_mmap_internal (struct file *file,struct vm_area_struct *vma) {struct dma_buf *dmabuf;
@@ -412,7 +409,6 @@ static void dma_buf_show_fdinfo(struct s }static const struct file_operations dma_buf_fops = { - .release = dma_buf_release, .mmap = dma_buf_mmap_internal, .llseek = dma_buf_llseek, .poll = dma_buf_poll,
Greg Kroah-Hartman
maintainerPATCH 60/65 irqchip/gic: Atomically update affinity
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
commit 005c34ae4b44f085120d7f371121ec7ded677761 upstream.
The GIC driver uses a RMW sequence to update the affinity, and relies on the gic_lock_irqsave/gic_unlock_irqrestore sequences to update it atomically.
But these sequences only expand into anything meaningful if the BL_SWITCHER option is selected, which almost never happens.
It also turns out that using a RMW and locks is just as silly, as the GIC distributor supports byte accesses for the GICD_TARGETRn registers, which when used make the update atomic by definition.
Drop the terminally broken code and replace it by a byte write.
--- drivers/irqchip/irq-gic.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-)
drivers/irqchip/irq-gic.c +3 -11
@@ -329,10 +329,8 @@ static int gic_irq_set_vcpu_affinity(strstatic int gic_set_affinity (struct irq_data *d,const struct cpumask *mask_val,bool force) { -void __iomem *reg =gic_dist_base (d) +GIC_DIST_TARGET + (gic_irq (d) & ~3 ); -unsigned int cpu, shift = (gic_irq (d) %4 ) *8 ; -u32 val, mask, bit; -unsigned long flags; +void __iomem *reg =gic_dist_base (d) +GIC_DIST_TARGET +gic_irq (d); +unsigned int cpu;if (!force) cpu =cpumask_any_and (mask_val, cpu_online_mask);
@@ -342,13 +340,7 @@ static int gic_set_affinity(struct irq_dif (cpu >=NR_GIC_CPU_IF || cpu >= nr_cpu_ids)return -EINVAL ; -gic_lock_irqsave (flags); - mask =0xff << shift; - bit = gic_cpu_map[cpu] << shift; - val =readl_relaxed (reg) & ~mask; -writel_relaxed (val | bit, reg); -gic_unlock_irqrestore (flags); - +writeb_relaxed (gic_cpu_map[cpu], reg);irq_data_update_effective_affinity (d,cpumask_of (cpu));return IRQ_SET_MASK_OK_DONE ;
Greg Kroah-Hartman
maintainerPATCH 61/65 mm, compaction: fully assume capture is not NULL in compact_zone_order()
In reply to Greg Kroah-HartmanFrom: Vlastimil Babka <[email protected]>
commit 6467552ca64c4ddd2b83ed73192107d7145f533b upstream.
Dan reports:
The patch 5e1f0f098b46: "mm, compaction: capture a page under direct compaction" from Mar 5, 2019, leads to the following Smatch complaint:
mm/compaction.c:2321 compact_zone_order()
error: we previously assumed 'capture' could be null (see line 2313)
mm/compaction.c
2288 static enum compact_result compact_zone_order(struct zone *zone, int order,
2289 gfp_t gfp_mask, enum compact_priority prio,
2290 unsigned int alloc_flags, int classzone_idx,
2291 struct page **capture)
^^^^^^^2313 if (capture)
^^^^^^^
Check for NULL
2314 current->capture_control = &capc;
2315
2316 ret = compact_zone(&cc, &capc);
2317
2318 VM_BUG_ON(!list_empty(&cc.freepages));
2319 VM_BUG_ON(!list_empty(&cc.migratepages));
2320
2321 *capture = capc.page;
^^^^^^^^Unchecked dereference.
2322 current->capture_control = NULL; 2323
In practice this is not an issue, as the only caller path passes non-NULL capture:
__alloc_pages_direct_compact()
struct page *page = NULL;
try_to_compact_pages(capture = &page);
compact_zone_order(capture = capture);So let's remove the unnecessary check, which should also make Smatch happy.
--- mm/compaction.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
mm/compaction.c +2 -2
@@ -2310,8 +2310,7 @@ static enum compact_result compact_zone_ .page = NULL, }; -if (capture) - current->capture_control = &capc; + current->capture_control = &capc; ret =compact_zone (&cc, &capc);
@@ -2333,6 +2332,7 @@ int sysctl_extfrag_threshold = 500;* @alloc_flags: The allocation flags of the current allocation * @ac: The context of current allocation * @prio: Determines how hard direct compaction should try to succeed +* @capture: Pointer to free page created by compaction will be stored here * * This is the main entry point for direct page compaction. */
Greg Kroah-Hartman
maintainerPATCH 62/65 mm, compaction: make capture control handling safe wrt interrupts
In reply to Greg Kroah-HartmanFrom: Vlastimil Babka <[email protected]>
commit b9e20f0da1f5c9c68689450a8cb436c9486434c8 upstream.
Hugh reports:
"While stressing compaction, one run oopsed on NULL capc->cc in
__free_one_page()'s task_capc(zone): compact_zone_order() had been interrupted, and a page was being freed in the return from interrupt.
Though you would not expect it from the source, both gccs I was using (4.8.1 and 7.5.0) had chosen to compile compact_zone_order() with the ".cc = &cc" implemented by mov %rbx,-0xb0(%rbp) immediately before callq compact_zone - long after the "current->capture_control = &capc". An interrupt in between those finds capc->cc NULL (zeroed by an earlier rep stos).
This could presumably be fixed by a barrier() before setting current->capture_control in compact_zone_order(); but would also need more care on return from compact_zone(), in order not to risk leaking a page captured by interrupt just before capture_control is reset.
Maybe that is the preferable fix, but I felt safer for task_capc() to exclude the rather surprising possibility of capture at interrupt time"
I have checked that gcc10 also behaves the same.
The advantage of fix in compact_zone_order() is that we don't add another test in the page freeing hot path, and that it might prevent future problems if we stop exposing pointers to uninitialized structures in current task.
So this patch implements the suggestion for compact_zone_order() with barrier() (and WRITE_ONCE() to prevent store tearing) for setting current->capture_control, and prevents page leaking with WRITE_ONCE/READ_ONCE in the proper order.
--- mm/compaction.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
mm/compaction.c +14 -3
@@ -2310,15 +2310,26 @@ static enum compact_result compact_zone_ .page = NULL, }; - current->capture_control = &capc; +/* +* Make sure the structs are really initialized before we expose the +* capture control, in case we are interrupted and the interrupt handler +* frees a page. +*/ +barrier (); +WRITE_ONCE (current->capture_control, &capc); ret =compact_zone (&cc, &capc);VM_BUG_ON (!list_empty (&cc.freepages));VM_BUG_ON (!list_empty (&cc.migratepages)); - *capture = capc.page; - current->capture_control =NULL ; +/* +* Make sure we hide capture control first before we read the captured +* page pointer, otherwise an interrupt could free and capture a page +* and we would leak it. +*/ +WRITE_ONCE (current->capture_control,NULL ); + *capture =READ_ONCE (capc.page);return ret; }
Greg Kroah-Hartman
maintainerPATCH 63/65 x86/resctrl: Fix memory bandwidth counter width for AMD
In reply to Greg Kroah-HartmanFrom: Babu Moger <[email protected]>
commit 2c18bd525c47f882f033b0a813ecd09c93e1ecdf upstream.
Memory bandwidth is calculated reading the monitoring counter at two intervals and calculating the delta. It is the software’s responsibility to read the count often enough to avoid having the count roll over _twice_ between reads.
The current code hardcodes the bandwidth monitoring counter's width to 24 bits for AMD. This is due to default base counter width which is 24. Currently, AMD does not implement the CPUID 0xF.[ECX=1]:EAX to adjust the counter width. But, the AMD hardware supports much wider bandwidth counter with the default width of 44 bits.
Kernel reads these monitoring counters every 1 second and adjusts the counter value for overflow. With 24 bits and scale value of 64 for AMD, it can only measure up to 1GB/s without overflowing. For the rates above 1GB/s this will fail to measure the bandwidth.
Fix the issue setting the default width to 44 bits by adjusting the offset.
AMD future products will implement CPUID 0xF.[ECX=1]:EAX.
[ bp: Let the line stick out and drop {}-brackets around a single
statement. ]
--- arch/x86/kernel/cpu/resctrl/core.c | 2 ++ arch/x86/kernel/cpu/resctrl/internal.h | 3 +++ arch/x86/kernel/cpu/resctrl/monitor.c | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-)
arch/x86/kernel/cpu/resctrl/core.c +2 -0
@@ -260,6 +260,7 @@ static bool __get_mem_config_intel(struc r->num_closid = edx.split.cos_max +1 ; r->membw.max_delay = eax.split.max_delay +1 ; r->default_ctrl =MAX_MBA_BW ; + r->membw.mbm_width =MBM_CNTR_WIDTH ;if (ecx &MBA_IS_LINEAR ) { r->membw.delay_linear = true; r->membw.min_bw =MAX_MBA_BW - r->membw.max_delay;
@@ -289,6 +290,7 @@ static bool __rdt_get_mem_config_amd(str/* AMD does not use delay */ r->membw.delay_linear = false; + r->membw.mbm_width =MBM_CNTR_WIDTH_AMD ; r->membw.min_bw =0 ; r->membw.bw_gran =1 ;/* Max value is 2048, Data width should be 4 in decimal */
arch/x86/kernel/cpu/resctrl/internal.h +3 -0
@@ -32,6 +32,7 @@#define CQM_LIMBOCHECK_INTERVAL 1000#define MBM_CNTR_WIDTH 24 +#define MBM_CNTR_WIDTH_AMD 44#define MBM_OVERFLOW_INTERVAL 1000#define MAX_MBA_BW 100u#define MBA_IS_LINEAR 0x4
@@ -368,6 +369,7 @@ struct rdt_cache {* @min_bw: Minimum memory bandwidth percentage user can request * @bw_gran: Granularity at which the memory bandwidth is allocated * @delay_linear: True if memory B/W delay is in linear scale +* @mbm_width: memory B/W monitor counter width * @mba_sc: True if MBA software controller(mba_sc) is enabled * @mb_map: Mapping of memory B/W percentage to memory B/W delay */
@@ -376,6 +378,7 @@ struct rdt_membw {u32 min_bw;u32 bw_gran;u32 delay_linear; +u32 mbm_width;bool mba_sc;u32 *mb_map; };
arch/x86/kernel/cpu/resctrl/monitor.c +2 -1
@@ -216,8 +216,9 @@ void free_rmid(u32 rmid)static u64 mbm_overflow_count (u64 prev_msr,u64 cur_msr) { -u64 shift =64 -MBM_CNTR_WIDTH , chunks; +u64 shift, chunks; + shift =64 - rdt_resources_all[RDT_RESOURCE_MBA ].membw.mbm_width; chunks = (cur_msr << shift) - (prev_msr << shift);return chunks >>= shift; }
Greg Kroah-Hartman
maintainerPATCH 64/65 dm zoned: assign max_io_len correctly
In reply to Greg Kroah-HartmanFrom: Hou Tao <[email protected]>
commit 7b2377486767503d47265e4d487a63c651f6b55d upstream.
The unit of max_io_len is sector instead of byte (spotted through code review), so fix it.
--- drivers/md/dm-zoned-target.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/dm-zoned-target.c +1 -1
@@ -790,7 +790,7 @@ static int dmz_ctr(struct dm_target *ti, }/* Set target (no write same support) */ - ti->max_io_len = dev->zone_nr_sectors <<9 ; + ti->max_io_len = dev->zone_nr_sectors; ti->num_flush_bios =1 ; ti->num_discard_bios =1 ; ti->num_write_zeroes_bios =1 ;
Greg Kroah-Hartman
maintainerPATCH 65/65 efi: Make it possible to disable efivar_ssdt entirely
In reply to Greg Kroah-HartmanFrom: Peter Jones <[email protected]>
commit 435d1a471598752446a72ad1201b3c980526d869 upstream.
In most cases, such as CONFIG_ACPI_CUSTOM_DSDT and CONFIG_ACPI_TABLE_UPGRADE, boot-time modifications to firmware tables are tied to specific Kconfig options. Currently this is not the case for modifying the ACPI SSDT via the efivar_ssdt kernel command line option and associated EFI variable.
This patch adds CONFIG_EFI_CUSTOM_SSDT_OVERLAYS, which defaults disabled, in order to allow enabling or disabling that feature during the build.
--- drivers/firmware/efi/Kconfig | 11 +++++++++++ drivers/firmware/efi/efi.c | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-)
drivers/firmware/efi/Kconfig +11 -0
@@ -219,3 +219,14 @@ config EFI_EARLYCON depends on SERIAL_EARLYCON && !ARM && !IA64 select FONT_SUPPORT select ARCH_USE_MEMREMAP_PROT + +config EFI_CUSTOM_SSDT_OVERLAYS + bool "Load custom ACPI SSDT overlay from an EFI variable" + depends on EFI_VARS && ACPI + default ACPI_TABLE_UPGRADE + help + Allow loading of an ACPI SSDT overlay from an EFI variable specified + by a kernel command line option. + + See Documentation/admin-guide/acpi/ssdt-overlays.rst for more + information.
drivers/firmware/efi/efi.c +1 -1
@@ -217,7 +217,7 @@ static void generic_ops_unregister(void)efivars_unregister (&generic_efivars); } -#if IS_ENABLED (CONFIG_ACPI ) +#ifdef CONFIG_EFI_CUSTOM_SSDT_OVERLAYS #define EFIVAR_SSDT_NAME_MAX 16static char efivar_ssdt[EFIVAR_SSDT_NAME_MAX ]__initdata ;static int __init efivar_ssdt_setup (char *str)
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.51 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 09 Jul 2020 14:57:34 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.51-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
Summary
------------------------------------------------------------------------
kernel: 5.4.51-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-5.4.y
git commit: 47d410b54275a08dfc16b90353866ac1f783c0aa
git describe: v5.4.49-240-g47d410b54275
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-5.4-oe/build/v5.4.49-240-g47d410b54275
No regressions (compared to build v5.4.49)
No fixes (compared to build v5.4.49)
Ran 35614 total tests in the following environments and test suites.
Environments
--------------
- dragonboard-410c
- hi6220-hikey
- i386
- juno-r2
- juno-r2-compat
- juno-r2-kasan
- nxp-ls2088
- qemu_arm
- qemu_arm64
- qemu_i386
- qemu_x86_64
- x15
- x86
- x86-kasan
Test Suites
-----------
* install-android-platform-tools-r2800
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-cve-tests
* ltp-hugetlb-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-sched-tests
* v4l2-compliance
* kvm-unit-tests
* ltp-containers-tests
* ltp-controllers-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* network-basic-tests
* ltp-open-posix-tests
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Jon Hunter
maintainerQuoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.51 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 09 Jul 2020 14:57:34 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.51-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests are passing for Tegra ...
Test results for stable-v5.4:
11 builds: 11 pass, 0 fail
26 boots: 26 pass, 0 fail
56 tests: 56 pass, 0 failLinux version: 5.4.51-rc1-g47d410b54275
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Cheers
Jon
Signature · 1 line
nvpublic
Greg Kroah-Hartman
maintainerQuoted 27 lines · Jon Hunter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.51 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 09 Jul 2020 14:57:34 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.51-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests are passing for Tegra ...
Test results for stable-v5.4:
11 builds: 11 pass, 0 fail 26 boots: 26 pass, 0 fail 56 tests: 56 pass, 0 fail
Quoted 5 lines
Linux version: 5.4.51-rc1-g47d410b54275
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,tegra194-p2972-0000, tegra20-ventana, tegra210-p2371-2180, tegra210-p3450-0000, tegra30-cardhu-a04
Thanks for testing all of these and letting me know.
greg k-h
Jon Hunter
maintainerQuoted 28 lines · Greg Kroah-Hartman
Quoted 27 lines · Jon Hunter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.51 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 09 Jul 2020 14:57:34 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.51-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests are passing for Tegra ...
Test results for stable-v5.4:
11 builds: 11 pass, 0 fail 26 boots: 26 pass, 0 fail 56 tests: 56 pass, 0 fail
Quoted 7 lines
Quoted 5 lines
Linux version: 5.4.51-rc1-g47d410b54275
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,tegra194-p2972-0000, tegra20-ventana, tegra210-p2371-2180, tegra210-p3450-0000, tegra30-cardhu-a04Thanks for testing all of these and letting me know.
No problem. For some reason the v5.7 review email never made it to my inbox AFAICT. Who knows if it will show up tomorrow, but anyway it all looks good to Tegra ...
Test results for stable-v5.7:
11 builds: 11 pass, 0 fail
26 boots: 26 pass, 0 fail
56 tests: 56 pass, 0 failLinux version: 5.7.8-rc1-gb371afd12a48
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Cheers
Jon
Signature · 1 line
nvpublic
Greg Kroah-Hartman
maintainerQuoted 47 lines · Jon Hunter
Quoted 28 lines · Greg Kroah-Hartman
Quoted 27 lines · Jon Hunter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.51 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 09 Jul 2020 14:57:34 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.51-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests are passing for Tegra ...
Test results for stable-v5.4:
11 builds: 11 pass, 0 fail 26 boots: 26 pass, 0 fail 56 tests: 56 pass, 0 failQuoted 7 lines
Quoted 5 lines
Linux version: 5.4.51-rc1-g47d410b54275
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,tegra194-p2972-0000, tegra20-ventana, tegra210-p2371-2180, tegra210-p3450-0000, tegra30-cardhu-a04Thanks for testing all of these and letting me know.
No problem. For some reason the v5.7 review email never made it to my inbox AFAICT. Who knows if it will show up tomorrow, but anyway it all looks good to Tegra ...
Test results for stable-v5.7:
11 builds: 11 pass, 0 fail 26 boots: 26 pass, 0 fail 56 tests: 56 pass, 0 fail
Quoted 5 lines
Linux version: 5.7.8-rc1-gb371afd12a48
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,tegra194-p2972-0000, tegra20-ventana, tegra210-p2371-2180, tegra210-p3450-0000, tegra30-cardhu-a04
Oh, nice, I was wondering why you didn't respond for that.
thanks for letting me know.
greg k-h
Shuah Khan
maintainerQuoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.51 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 09 Jul 2020 14:57:34 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.51-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.51 release. There are 65 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 09 Jul 2020 14:57:34 +0000. Anything received after that time might be too late.
Build results:
total: 157 pass: 157 fail: 0 Qemu test results: total: 430 pass: 430 fail: 0
Guenter