5.4.69-rc1 review
Subsystems (10)
Greg Kroah-Hartman
maintainerPATCH 260/388 drm/exynos: dsi: Remove bridge node reference in error handling path in probe function
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 547a7348633b1f9923551f94ac3157a613d2c9f2 ]
'exynos_dsi_parse_dt()' takes a reference to 'dsi->in_bridge_node'. This must be released in the error handling path.
In order to do that, add an error handling path and move the 'exynos_dsi_parse_dt()' call from the beginning to the end of the probe function to ease the error handling path.
This function only sets some variables which are used only in the 'transfer' function.
The call chain is:
.transfer
--> exynos_dsi_host_transfer
--> exynos_dsi_init
--> exynos_dsi_enable_clock (use burst_clk_rate and esc_clk_rate)
--> exynos_dsi_set_pll (use pll_clk_rate)While at it, also handle cases where 'component_add()' fails.
This patch is similar to commit 70505c2ef94b ("drm/exynos: dsi: Remove bridge node reference in removal") which fixed the issue in the remove function.
--- drivers/gpu/drm/exynos/exynos_drm_dsi.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
drivers/gpu/drm/exynos/exynos_drm_dsi.c +15 -5
@@ -1741,10 +1741,6 @@ static int exynos_dsi_probe(struct platform_device *pdev) dsi->dev = dev; dsi->driver_data =of_device_get_match_data (dev); - ret =exynos_dsi_parse_dt (dsi); -if (ret) -return ret; - dsi->supplies[0 ].supply ="vddcore" ; dsi->supplies[1 ].supply ="vddio" ; ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies),
@@ -1805,11 +1801,25 @@ static int exynos_dsi_probe(struct platform_device *pdev)return ret; } + ret =exynos_dsi_parse_dt (dsi); +if (ret) +return ret; +platform_set_drvdata (pdev, &dsi->encoder);pm_runtime_enable (dev); -return component_add (dev, &exynos_dsi_component_ops); + ret =component_add (dev, &exynos_dsi_component_ops); +if (ret) + goto err_disable_runtime; + +return 0 ; + +err_disable_runtime: +pm_runtime_disable (dev); +of_node_put (dsi->in_bridge_node); + +return ret; }static int exynos_dsi_remove (struct platform_device *pdev)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 261/388 ipmi:bt-bmc: Fix error handling and status check
In reply to Greg Kroah-HartmanFrom: Tang Bin <[email protected]>
[ Upstream commit 49826937e7c7917140515aaf10c17bedcc4acaad ]
If the function platform_get_irq() failed, the negative value returned will not be detected here. So fix error handling in bt_bmc_config_irq(). And in the function bt_bmc_probe(), when get irq failed, it will print error message. So use platform_get_irq_optional() to simplify code. Finally in the function bt_bmc_remove() should make the right status check if get irq failed.
Message-Id: <[email protected]>
--- drivers/char/ipmi/bt-bmc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/char/ipmi/bt-bmc.c +6 -6
@@ -399,15 +399,15 @@ static int bt_bmc_config_irq(struct bt_bmc *bt_bmc,struct device *dev = &pdev->dev;int rc; - bt_bmc->irq =platform_get_irq (pdev,0 ); -if (!bt_bmc->irq) -return -ENODEV ; + bt_bmc->irq =platform_get_irq_optional (pdev,0 ); +if (bt_bmc->irq <0 ) +return bt_bmc->irq; rc =devm_request_irq (dev, bt_bmc->irq, bt_bmc_irq,IRQF_SHARED ,DEVICE_NAME , bt_bmc);if (rc <0 ) {dev_warn (dev,"Unable to request IRQ %d\n" , bt_bmc->irq); - bt_bmc->irq =0 ; + bt_bmc->irq = rc;return rc; }
@@ -479,7 +479,7 @@ static int bt_bmc_probe(struct platform_device *pdev)bt_bmc_config_irq (bt_bmc, pdev); -if (bt_bmc->irq) { +if (bt_bmc->irq >=0 ) {dev_info (dev,"Using IRQ %d\n" , bt_bmc->irq); }else {dev_info (dev,"No IRQ; using timer\n" );
@@ -505,7 +505,7 @@ static int bt_bmc_remove(struct platform_device *pdev)struct bt_bmc *bt_bmc =dev_get_drvdata (&pdev->dev);misc_deregister (&bt_bmc->miscdev); -if (!bt_bmc->irq) +if (bt_bmc->irq <0 )del_timer_sync (&bt_bmc->poll_timer);return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 262/388 powerpc/traps: Make unrecoverable NMIs die instead of panic
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
[ Upstream commit 265d6e588d87194c2fe2d6c240247f0264e0c19b ]
System Reset and Machine Check interrupts that are not recoverable due to being nested or interrupting when RI=0 currently panic. This is not necessary, and can often just kill the current context and recover.
--- arch/powerpc/kernel/traps.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/powerpc/kernel/traps.c +3 -3
@@ -510,11 +510,11 @@ out:#ifdef CONFIG_PPC_BOOK3S_64 BUG_ON (get_paca ()->in_nmi ==0 );if (get_paca ()->in_nmi >1 ) -nmi_panic (regs,"Unrecoverable nested System Reset" ); +die ("Unrecoverable nested System Reset" , regs,SIGABRT );#endif /* Must die if the interrupt is not recoverable */ if (!(regs->msr &MSR_RI )) -nmi_panic (regs,"Unrecoverable System Reset" ); +die ("Unrecoverable System Reset" , regs,SIGABRT );if (saved_hsrrs) {mtspr (SPRN_HSRR0 , hsrr0);
@@ -858,7 +858,7 @@ void machine_check_exception(struct pt_regs *regs)/* Must die if the interrupt is not recoverable */ if (!(regs->msr &MSR_RI )) -nmi_panic (regs,"Unrecoverable Machine check" ); +die ("Unrecoverable Machine check" , regs,SIGBUS );return ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 263/388 svcrdma: Fix backchannel return code
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit ea740bd5f58e2912e74f401fd01a9d6aa985ca05 ]
Way back when I was writing the RPC/RDMA server-side backchannel code, I misread the TCP backchannel reply handler logic. When svc_tcp_recvfrom() successfully receives a backchannel reply, it does not return -EAGAIN. It sets XPT_DATA and returns zero.
Update svc_rdma_recvfrom() to return zero. Here, XPT_DATA doesn't need to be set again: it is set whenever a new message is received, behind a spin lock in a single threaded context.
Also, if handling the cb reply is not successful, the message is simply dropped. There's no special message framing to deal with as there is in the TCP case.
Now that the handle_bc_reply() return value is ignored, I've removed the dprintk call sites in the error exit of handle_bc_reply() in favor of trace points in other areas that already report the error cases.
--- include/linux/sunrpc/svc_rdma.h | 5 ++- net/sunrpc/xprtrdma/svc_rdma_backchannel.c | 38 ++++++---------------- net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 11 +++---- 3 files changed, 17 insertions(+), 37 deletions(-)
include/linux/sunrpc/svc_rdma.h +2 -3
@@ -154,9 +154,8 @@ struct svc_rdma_send_ctxt { };/* svc_rdma_backchannel.c */ -extern int svc_rdma_handle_bc_reply (struct rpc_xprt *xprt, -__be32 *rdma_resp, -struct xdr_buf *rcvbuf); +extern void svc_rdma_handle_bc_reply (struct svc_rqst *rqstp, +struct svc_rdma_recv_ctxt *rctxt);/* svc_rdma_recvfrom.c */ extern void svc_rdma_recv_ctxts_destroy (struct svcxprt_rdma *rdma);
net/sunrpc/xprtrdma/svc_rdma_backchannel.c +10 -28
@@ -15,26 +15,25 @@#undef SVCRDMA_BACKCHANNEL_DEBUG/** -* svc_rdma_handle_bc_reply - Process incoming backchannel reply -* @xprt: controlling backchannel transport -* @rdma_resp: pointer to incoming transport header -* @rcvbuf: XDR buffer into which to decode the reply +* svc_rdma_handle_bc_reply - Process incoming backchannel Reply +* @rqstp: resources for handling the Reply +* @rctxt: Received message * -* Returns: -* %0 if @rcvbuf is filled in, xprt_complete_rqst called, -* %-EAGAIN if server should call ->recvfrom again. */ -int svc_rdma_handle_bc_reply (struct rpc_xprt *xprt,__be32 *rdma_resp, -struct xdr_buf *rcvbuf) +void svc_rdma_handle_bc_reply (struct svc_rqst *rqstp, +struct svc_rdma_recv_ctxt *rctxt) { +struct svc_xprt *sxprt = rqstp->rq_xprt; +struct rpc_xprt *xprt = sxprt->xpt_bc_xprt;struct rpcrdma_xprt *r_xprt =rpcx_to_rdmax (xprt); +struct xdr_buf *rcvbuf = &rqstp->rq_arg;struct kvec *dst, *src = &rcvbuf->head[0 ]; +__be32 *rdma_resp = rctxt->rc_recv_buf;struct rpc_rqst *req;u32 credits;size_t len;__be32 xid;__be32 *p; -int ret; p = (__be32 *)src->iov_base; len = src->iov_len;
@@ -49,14 +48,10 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, __be32 *rdma_resp, __func__, (int)len, p);#endif - ret = -EAGAIN ; -if (src->iov_len <24 ) - goto out_shortreply; -spin_lock (&xprt->queue_lock); req =xprt_lookup_rqst (xprt, xid);if (!req) - goto out_notfound; + goto out_unlock; dst = &req->rq_private_buf.head[0 ];memcpy (&req->rq_private_buf, &req->rq_rcv_buf,sizeof (struct xdr_buf ));
@@ -77,25 +72,12 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, __be32 *rdma_resp,spin_unlock (&xprt->transport_lock);spin_lock (&xprt->queue_lock); - ret =0 ;xprt_complete_rqst (req->rq_task, rcvbuf->len);xprt_unpin_rqst (req); rcvbuf->len =0 ; out_unlock:spin_unlock (&xprt->queue_lock); -out: -return ret; - -out_shortreply: -dprintk ("svcrdma: short bc reply: xprt=%p, len=%zu\n" , - xprt, src->iov_len); - goto out; - -out_notfound: -dprintk ("svcrdma: unrecognized bc reply: xprt=%p, xid=%08x\n" , - xprt,be32_to_cpu (xid)); - goto out_unlock; }/* Send a backwards direction RPC call.
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +5 -6
@@ -817,12 +817,9 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp) goto out_drop; rqstp->rq_xprt_hlen = ret; -if (svc_rdma_is_backchannel_reply (xprt, p)) { - ret =svc_rdma_handle_bc_reply (xprt->xpt_bc_xprt, p, - &rqstp->rq_arg); -svc_rdma_recv_ctxt_put (rdma_xprt, ctxt); -return ret; - } +if (svc_rdma_is_backchannel_reply (xprt, p)) + goto out_backchannel; +svc_rdma_get_inv_rkey (rdma_xprt, ctxt); p += rpcrdma_fixed_maxsz;
@@ -852,6 +849,8 @@ out_postfail:svc_rdma_recv_ctxt_put (rdma_xprt, ctxt);return ret; +out_backchannel: +svc_rdma_handle_bc_reply (rqstp, ctxt); out_drop:svc_rdma_recv_ctxt_put (rdma_xprt, ctxt);return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 264/388 fuse: dont check refcount after stealing page
In reply to Greg Kroah-HartmanFrom: Miklos Szeredi <[email protected]>
[ Upstream commit 32f98877c57bee6bc27f443a96f49678a2cd6a50 ]
page_count() is unstable. Unless there has been an RCU grace period between when the page was removed from the page cache and now, a speculative reference may exist from the page cache.
--- fs/fuse/dev.c | 1 - 1 file changed, 1 deletion(-)
fs/fuse/dev.c +0 -1
@@ -764,7 +764,6 @@ static int fuse_check_page(struct page *page) { if (page_mapcount(page) || page->mapping != NULL || - page_count(page) != 1 || (page->flags & PAGE_FLAGS_CHECK_AT_PREP & ~(1 << PG_locked | 1 << PG_referenced |
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 265/388 fuse: update attr_version counter on fuse_notify_inval_inode()
In reply to Greg Kroah-HartmanFrom: Miklos Szeredi <[email protected]>
[ Upstream commit 5ddd9ced9aef6cfa76af27d384c17c9e2d610ce8 ]
A GETATTR request can race with FUSE_NOTIFY_INVAL_INODE, resulting in the attribute cache being updated with stale information after the invalidation.
Fix this by bumping the attribute version in fuse_reverse_inval_inode().
--- fs/fuse/inode.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/fuse/inode.c +7 -0
@@ -323,6 +323,8 @@ struct inode *fuse_iget(struct super_block *sb, u64 nodeid,int fuse_reverse_inval_inode (struct super_block *sb,u64 nodeid,loff_t offset,loff_t len) { +struct fuse_conn *fc =get_fuse_conn_super (sb); +struct fuse_inode *fi;struct inode *inode;pgoff_t pg_start;pgoff_t pg_end;
@@ -331,6 +333,11 @@ int fuse_reverse_inval_inode(struct super_block *sb, u64 nodeid,if (!inode)return -ENOENT ; + fi =get_fuse_inode (inode); +spin_lock (&fi->lock); + fi->attr_version =atomic64_inc_return (&fc->attr_version); +spin_unlock (&fi->lock); +fuse_invalidate_attr (inode);forget_all_cached_acls (inode);if (offset >=0 ) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 266/388 USB: EHCI: ehci-mv: fix less than zero comparison of an unsigned int
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit a7f40c233a6b0540d28743267560df9cfb571ca9 ]
The comparison of hcd->irq to less than zero for an error check will never be true because hcd->irq is an unsigned int. Fix this by assigning the int retval to the return of platform_get_irq and checking this for the -ve error condition and assigning hcd->irq to retval.
Addresses-Coverity: ("Unsigned compared against 0")
--- drivers/usb/host/ehci-mv.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/usb/host/ehci-mv.c +3 -4
@@ -156,11 +156,10 @@ static int mv_ehci_probe(struct platform_device *pdev) hcd->rsrc_len =resource_size (r); hcd->regs = ehci_mv->op_regs; - hcd->irq =platform_get_irq (pdev,0 ); -if (hcd->irq <0 ) { - retval = hcd->irq; + retval =platform_get_irq (pdev,0 ); +if (retval <0 ) goto err_disable_clk; - } + hcd->irq = retval; ehci =hcd_to_ehci (hcd); ehci->caps = (struct ehci_caps *) ehci_mv->cap_regs;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 267/388 coresight: etm4x: Fix use-after-free of per-cpu etm drvdata
In reply to Greg Kroah-HartmanFrom: Suzuki K Poulose <[email protected]>
[ Upstream commit 3f4943d422c5febbb3c764670011a00eb2a86238 ]
etm probe could be deferred due to the dependency in the trace path chain and may be retried. We need to clear the per-cpu etmdrvdata entry for the etm in case of a failure to avoid use-after-free cases as reported below:
KASAN use-after-free bug in etm4_cpu_pm_notify():
[ 8.574566] coresight etm0: CPU0: ETM v4.2 initialized [ 8.581920] BUG: KASAN: use-after-free in etm4_cpu_pm_notify+0x580/0x2024 [ 8.581925] Read of size 8 at addr ffffff813304f8c8 by task swapper/3/0 [ 8.581927] [ 8.581934] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G S W 5.4.28 #314 [ 8.587775] coresight etm1: CPU1: ETM v4.2 initialized [ 8.594195] Call trace: [ 8.594205] dump_backtrace+0x0/0x188 [ 8.594209] show_stack+0x20/0x2c [ 8.594216] dump_stack+0xdc/0x144 [ 8.594227] print_address_description+0x3c/0x494 [ 8.594232] __kasan_report+0x144/0x168 [ 8.601598] coresight etm2: CPU2: ETM v4.2 initialized [ 8.602563] kasan_report+0x10/0x18 [ 8.602568] check_memory_region+0x1a4/0x1b4 [ 8.602572] __kasan_check_read+0x18/0x24 [ 8.602577] etm4_cpu_pm_notify+0x580/0x2024 [ 8.665945] notifier_call_chain+0x5c/0x90 [ 8.670166] __atomic_notifier_call_chain+0x90/0xf8 [ 8.675182] cpu_pm_notify+0x40/0x6c [ 8.678858] cpu_pm_enter+0x38/0x80 [ 8.682451] psci_enter_idle_state+0x34/0x70 [ 8.686844] cpuidle_enter_state+0xb8/0x20c [ 8.691143] cpuidle_enter+0x38/0x4c [ 8.694820] call_cpuidle+0x3c/0x68 [ 8.698408] do_idle+0x1a0/0x280 [ 8.701729] cpu_startup_entry+0x24/0x28 [ 8.705768] secondary_start_kernel+0x15c/0x170 [ 8.710423] [ 8.711972] Allocated by task 242: [ 8.715473] __kasan_kmalloc+0xf0/0x1ac [ 8.719426] kasan_slab_alloc+0x14/0x1c [ 8.723375] __kmalloc_track_caller+0x23c/0x388 [ 8.728040] devm_kmalloc+0x38/0x94 [ 8.731632] etm4_probe+0x48/0x3c8 [ 8.735140] amba_probe+0xbc/0x158 [ 8.738645] really_probe+0x144/0x408 [ 8.742412] driver_probe_device+0x70/0x140 [ 8.746716] __device_attach_driver+0x9c/0x110 [ 8.751287] bus_for_each_drv+0x90/0xd8 [ 8.755236] __device_attach+0xb4/0x164 [ 8.759188] device_initial_probe+0x20/0x2c [ 8.763490] bus_probe_device+0x34/0x94 [ 8.767436] device_add+0x34c/0x3e0 [ 8.771029] amba_device_try_add+0x68/0x440 [ 8.775332] amba_deferred_retry_func+0x48/0xc8 [ 8.779997] process_one_work+0x344/0x648 [ 8.784127] worker_thread+0x2ac/0x47c [ 8.787987] kthread+0x128/0x138 [ 8.791313] ret_from_fork+0x10/0x18 [ 8.794993] [ 8.796532] Freed by task 242: [ 8.799684] __kasan_slab_free+0x15c/0x22c [ 8.803897] kasan_slab_free+0x10/0x1c [ 8.807761] kfree+0x25c/0x4bc [ 8.810913] release_nodes+0x240/0x2b0 [ 8.814767] devres_release_all+0x3c/0x54 [ 8.818887] really_probe+0x178/0x408 [ 8.822661] driver_probe_device+0x70/0x140 [ 8.826963] __device_attach_driver+0x9c/0x110 [ 8.831539] bus_for_each_drv+0x90/0xd8 [ 8.835487] __device_attach+0xb4/0x164 [ 8.839431] device_initial_probe+0x20/0x2c [ 8.843732] bus_probe_device+0x34/0x94 [ 8.847678] device_add+0x34c/0x3e0 [ 8.851274] amba_device_try_add+0x68/0x440 [ 8.855576] amba_deferred_retry_func+0x48/0xc8 [ 8.860240] process_one_work+0x344/0x648 [ 8.864366] worker_thread+0x2ac/0x47c [ 8.868228] kthread+0x128/0x138 [ 8.871557] ret_from_fork+0x10/0x18 [ 8.875231] [ 8.876782] The buggy address belongs to the object at ffffff813304f800 [ 8.876782] which belongs to the cache kmalloc-1k of size 1024 [ 8.889632] The buggy address is located 200 bytes inside of [ 8.889632] 1024-byte region [ffffff813304f800, ffffff813304fc00) [ 8.901761] The buggy address belongs to the page: [ 8.906695] page:ffffffff04ac1200 refcount:1 mapcount:0 mapping:ffffff8146c03800 index:0x0 compound_mapcount: 0 [ 8.917047] flags: 0x4000000000010200(slab|head) [ 8.921799] raw: 4000000000010200 dead000000000100 dead000000000122 ffffff8146c03800 [ 8.929753] raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000 [ 8.937703] page dumped because: kasan: bad access detected [ 8.943433] [ 8.944974] Memory state around the buggy address: [ 8.949903] ffffff813304f780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc [ 8.957320] ffffff813304f800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb [ 8.964742] >ffffff813304f880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb [ 8.972157] ^ [ 8.977886] ffffff813304f900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb [ 8.985298] ffffff813304f980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb [ 8.992713] ==================================================================
--- drivers/hwtracing/coresight/coresight-etm4x.c | 1 + 1 file changed, 1 insertion(+)
drivers/hwtracing/coresight/coresight-etm4x.c +1 -0
@@ -1184,6 +1184,7 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)return 0 ; err_arch_supported: + etmdrvdata[drvdata->cpu] =NULL ;if (--etm4_count ==0 ) {cpuhp_remove_state_nocalls (CPUHP_AP_ARM_CORESIGHT_STARTING );if (hp_online)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 268/388 arm64: acpi: Make apei_claim_sea() synchronise with APEIs irq work
In reply to Greg Kroah-HartmanFrom: James Morse <[email protected]>
[ Upstream commit 8fcc4ae6faf8b455eeef00bc9ae70744e3b0f462 ]
APEI is unable to do all of its error handling work in nmi-context, so it defers non-fatal work onto the irq_work queue. arch_irq_work_raise() sends an IPI to the calling cpu, but this is not guaranteed to be taken before returning to user-space.
Unless the exception interrupted a context with irqs-masked, irq_work_run() can run immediately. Otherwise return -EINPROGRESS to indicate ghes_notify_sea() found some work to do, but it hasn't finished yet.
With this apei_claim_sea() returning '0' means this external-abort was also notification of a firmware-first RAS error, and that APEI has processed the CPER records.
--- arch/arm64/kernel/acpi.c | 25 +++++++++++++++++++++++++ arch/arm64/mm/fault.c | 12 +++++++----- 2 files changed, 32 insertions(+), 5 deletions(-)
arch/arm64/kernel/acpi.c +25 -0
@@ -19,6 +19,7 @@#include <linux/init.h> #include <linux/irq.h> #include <linux/irqdomain.h> +#include <linux/irq_work.h> #include <linux/memblock.h> #include <linux/of_fdt.h> #include <linux/smp.h>
@@ -269,6 +270,7 @@ pgprot_t __acpi_get_mem_attribute(phys_addr_t addr)int apei_claim_sea (struct pt_regs *regs) {int err = -ENOENT ; +bool return_to_irqs_enabled;unsigned long current_flags;if (!IS_ENABLED (CONFIG_ACPI_APEI_GHES ))
@@ -276,6 +278,12 @@ int apei_claim_sea(struct pt_regs *regs) current_flags =local_daif_save_flags (); +/* current_flags isn't useful here as daif doesn't tell us about pNMI */ + return_to_irqs_enabled = !irqs_disabled_flags (arch_local_save_flags ()); + +if (regs) + return_to_irqs_enabled =interrupts_enabled (regs); +/* * SEA can interrupt SError, mask it and describe this as an NMI so * that APEI defers the handling.
@@ -284,6 +292,23 @@ int apei_claim_sea(struct pt_regs *regs)nmi_enter (); err =ghes_notify_sea ();nmi_exit (); + +/* +* APEI NMI-like notifications are deferred to irq_work. Unless +* we interrupted irqs-masked code, we can do that now. +*/ +if (!err) { +if (return_to_irqs_enabled) { +local_daif_restore (DAIF_PROCCTX_NOIRQ ); +__irq_enter (); +irq_work_run (); +__irq_exit (); + }else { +pr_warn_ratelimited ("APEI work queued but not completed" ); + err = -EINPROGRESS ; + } + } +local_daif_restore (current_flags);return err;
arch/arm64/mm/fault.c +7 -5
@@ -654,11 +654,13 @@ static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs) inf =esr_to_fault_info (esr); -/* -* Return value ignored as we rely on signal merging. -* Future patches will make this more robust. -*/ -apei_claim_sea (regs); +if (user_mode (regs) &&apei_claim_sea (regs) ==0 ) { +/* +* APEI claimed this as a firmware-first notification. +* Some processing deferred to task_work before ret_to_user(). +*/ +return 0 ; + }if (esr & ESR_ELx_FnV) siaddr =NULL ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 269/388 scsi: cxlflash: Fix error return code in cxlflash_probe()
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
[ Upstream commit d0b1e4a638d670a09f42017a3e567dc846931ba8 ]
Fix to return negative error code -ENOMEM from create_afu error handling case instead of 0, as done elsewhere in this function.
--- drivers/scsi/cxlflash/main.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/cxlflash/main.c +1 -0
@@ -3746,6 +3746,7 @@ static int cxlflash_probe(struct pci_dev *pdev, cfg->afu_cookie = cfg->ops->create_afu (pdev);if (unlikely (!cfg->afu_cookie)) {dev_err (dev,"%s: create_afu failed\n" , __func__); + rc = -ENOMEM ; goto out_remove; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 270/388 arm64/cpufeature: Drop TraceFilt feature exposure from ID_DFR0 register
In reply to Greg Kroah-HartmanFrom: Anshuman Khandual <[email protected]>
[ Upstream commit 1ed1b90a0594c8c9d31e8bb8be25a2b37717dc9e ]
ID_DFR0 based TraceFilt feature should not be exposed to guests. Hence lets drop it.
--- arch/arm64/kernel/cpufeature.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/kernel/cpufeature.c +1 -1
@@ -319,7 +319,7 @@ static const struct arm64_ftr_bits ftr_id_pfr0[] = { };static const struct arm64_ftr_bits ftr_id_dfr0[] = { -ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_LOWER_SAFE ,28 ,4 ,0 ), +/* [31:28] TraceFilt */ S_ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_LOWER_SAFE ,24 ,4 ,0xf ),/* PerfMon */ ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_LOWER_SAFE ,20 ,4 ,0 ),ARM64_FTR_BITS (FTR_HIDDEN ,FTR_STRICT ,FTR_LOWER_SAFE ,16 ,4 ,0 ),
Signature · 9 lines
2.25.1 _______________________________________________ linux-arm-kernel mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Greg Kroah-Hartman
maintainerPATCH 271/388 drm/amdkfd: fix restore worker race condition
In reply to Greg Kroah-HartmanFrom: Philip Yang <[email protected]>
[ Upstream commit f7646585a30ed8ef5ab300d4dc3b0c1d6afbe71d ]
In free memory of gpu path, remove bo from validate_list to make sure restore worker don't access the BO any more, then unregister bo MMU interval notifier. Otherwise, the restore worker will crash in the middle of validating BO user pages if MMU interval notifer is gone.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +3 -3
@@ -1247,15 +1247,15 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(* be freed anyway */ -/* No more MMU notifiers */ -amdgpu_mn_unregister (mem->bo); -/* Make sure restore workers don't access the BO any more */ bo_list_entry = &mem->validate_list;mutex_lock (&process_info->lock);list_del (&bo_list_entry->head);mutex_unlock (&process_info->lock); +/* No more MMU notifiers */ +amdgpu_mn_unregister (mem->bo); + ret =reserve_bo_and_cond_vms (mem,NULL ,BO_VM_ALL , &ctx);if (unlikely (ret))return ret;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 272/388 e1000: Do not perform reset in reset_task if we are already down
In reply to Greg Kroah-HartmanFrom: Alexander Duyck <[email protected]>
[ Upstream commit 49ee3c2ab5234757bfb56a0b3a3cb422f427e3a3 ]
We are seeing a deadlock in e1000 down when NAPI is being disabled. Looking over the kernel function trace of the system it appears that the interface is being closed and then a reset is hitting which deadlocks the interface as the NAPI interface is already disabled.
To prevent this from happening I am disabling the reset task when __E1000_DOWN is already set. In addition code has been added so that we set the __E1000_DOWN while holding the __E1000_RESET flag in e1000_close in order to guarantee that the reset task will not run after we have started the close call.
--- drivers/net/ethernet/intel/e1000/e1000_main.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/e1000/e1000_main.c +14 -4
@@ -542,8 +542,13 @@ void e1000_reinit_locked(struct e1000_adapter *adapter)WARN_ON (in_interrupt ());while (test_and_set_bit (__E1000_RESETTING, &adapter->flags))msleep (1 ); -e1000_down (adapter); -e1000_up (adapter); + +/* only run the task if not already down */ +if (!test_bit (__E1000_DOWN, &adapter->flags)) { +e1000_down (adapter); +e1000_up (adapter); + } +clear_bit (__E1000_RESETTING, &adapter->flags); }
@@ -1433,10 +1438,15 @@ int e1000_close(struct net_device *netdev)struct e1000_hw *hw = &adapter->hw;int count =E1000_CHECK_RESET_COUNT ; -while (test_bit (__E1000_RESETTING, &adapter->flags) && count--) +while (test_and_set_bit (__E1000_RESETTING, &adapter->flags) && count--)usleep_range (10000 ,20000 ); -WARN_ON (test_bit (__E1000_RESETTING, &adapter->flags)); +WARN_ON (count <0 ); + +/* signal that we're down so that the reset task will no longer run */ +set_bit (__E1000_DOWN, &adapter->flags); +clear_bit (__E1000_RESETTING, &adapter->flags); +e1000_down (adapter);e1000_power_down_phy (adapter);e1000_free_irq (adapter);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 273/388 drm/nouveau/debugfs: fix runtime pm imbalance on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 00583fbe8031f69bba8b0a9a861efb75fb7131af ]
pm_runtime_get_sync() increments the runtime PM usage counter even the call returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced.
--- drivers/gpu/drm/nouveau/nouveau_debugfs.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nouveau_debugfs.c +4 -1
@@ -183,8 +183,11 @@ nouveau_debugfs_pstate_set(struct file *file, const char __user *ubuf, } ret =pm_runtime_get_sync (drm->dev); -if (ret <0 && ret != -EACCES ) +if (ret <0 && ret != -EACCES ) { +pm_runtime_put_autosuspend (drm->dev);return ret; + } + ret =nvif_mthd (ctrl,NVIF_CONTROL_PSTATE_USER , &args,sizeof (args));pm_runtime_put_autosuspend (drm->dev);if (ret <0 )
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 274/388 drm/nouveau: fix runtime pm imbalance on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit d7372dfb3f7f1602b87e0663e8b8646da23ebca7 ]
pm_runtime_get_sync() increments the runtime PM usage counter even the call returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced.
--- drivers/gpu/drm/nouveau/nouveau_gem.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nouveau_gem.c +3 -1
@@ -78,8 +78,10 @@ nouveau_gem_object_open(struct drm_gem_object *gem, struct drm_file *file_priv)return ret; ret =pm_runtime_get_sync (dev); -if (ret <0 && ret != -EACCES ) +if (ret <0 && ret != -EACCES ) { +pm_runtime_put_autosuspend (dev); goto out; + } ret =nouveau_vma_new (nvbo, vmm, &vma);pm_runtime_mark_last_busy (dev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 275/388 drm/nouveau/dispnv50: fix runtime pm imbalance on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit dc455f4c888365595c0a13da445e092422d55b8d ]
pm_runtime_get_sync() increments the runtime PM usage counter even the call returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced.
--- drivers/gpu/drm/nouveau/dispnv50/disp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/nouveau/dispnv50/disp.c +3 -1
@@ -1032,8 +1032,10 @@ nv50_mstc_detect(struct drm_connector *connector, bool force)return connector_status_disconnected; ret =pm_runtime_get_sync (connector->dev->dev); -if (ret <0 && ret != -EACCES ) +if (ret <0 && ret != -EACCES ) { +pm_runtime_put_autosuspend (connector->dev->dev);return connector_status_disconnected; + } conn_status =drm_dp_mst_detect_port (connector, mstc->port->mgr, mstc->port);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 276/388 printk: handle blank console arguments passed in.
In reply to Greg Kroah-HartmanFrom: Shreyas Joshi <[email protected]>
[ Upstream commit 48021f98130880dd74286459a1ef48b5e9bc374f ]
If uboot passes a blank string to console_setup then it results in a trashed memory. Ultimately, the kernel crashes during freeing up the memory.
This fix checks if there is a blank parameter being passed to console_setup from uboot. In case it detects that the console parameter is blank then it doesn't setup the serial device and it gracefully exits.
--- kernel/printk/printk.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/printk/printk.c +3 -0
@@ -2193,6 +2193,9 @@ static int __init console_setup(char *str)char *s, *options, *brl_options =NULL ;int idx; +if (str[0 ] ==0 ) +return 1 ; +if (_braille_console_setup (&str, &brl_options))return 1 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 277/388 usb: dwc3: Increase timeout for CmdAct cleared by device controller
In reply to Greg Kroah-HartmanFrom: Yu Chen <[email protected]>
[ Upstream commit 1c0e69ae1b9f9004fd72978612ae3463791edc56 ]
If the SS PHY is in P3, there is no pipe_clk, HW may use suspend_clk for function, as suspend_clk is slow so EP command need more time to complete, e.g, imx8M suspend_clk is 32K, set ep configuration will take about 380us per below trace time stamp(44.286278 - 44.285897 = 0.000381):
configfs_acm.sh-822 [000] d..1 44.285896: dwc3_writel: addr000000006d59aae1 value 00000401
configfs_acm.sh-822 [000] d..1 44.285897: dwc3_readl: addr000000006d59aae1 value 00000401
... ...
configfs_acm.sh-822 [000] d..1 44.286278: dwc3_readl: addr000000006d59aae1 value 00000001
configfs_acm.sh-822 [000] d..1 44.286279: dwc3_gadget_ep_cmd:
ep0out: cmd 'Set Endpoint Configuration' [401] params 00001000 00000500 00000000 --> status: Successful
This was originally found on Hisilicon Kirin Soc that need more time for the device controller to clear the CmdAct of DEPCMD.
--- drivers/usb/dwc3/gadget.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/dwc3/gadget.c +1 -1
@@ -270,7 +270,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned cmd, {const struct usb_endpoint_descriptor *desc = dep->endpoint.desc;struct dwc3 *dwc = dep->dwc; -u32 timeout =1000 ; +u32 timeout =5000 ;u32 saved_config =0 ;u32 reg;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 278/388 btrfs: dont force read-only after error in drop snapshot
In reply to Greg Kroah-HartmanFrom: David Sterba <[email protected]>
[ Upstream commit 7c09c03091ac562ddca2b393e5d65c1d37da79f1 ]
Deleting a subvolume on a full filesystem leads to ENOSPC followed by a forced read-only. This is not a transaction abort and the filesystem is otherwise ok, so the error should be just propagated to the callers.
This is caused by unnecessary call to btrfs_handle_fs_error for all errors, except EAGAIN. This does not make sense as the standard transaction abort mechanism is in btrfs_drop_snapshot so all relevant failures are handled.
Originally in commit cb1b69f4508a ("Btrfs: forced readonly when btrfs_drop_snapshot() fails") there was no return value at all, so the btrfs_std_error made some sense but once the error handling and propagation has been implemented we don't need it anymore.
--- fs/btrfs/extent-tree.c | 2 -- 1 file changed, 2 deletions(-)
fs/btrfs/extent-tree.c +0 -2
@@ -5428,8 +5428,6 @@ out:*/ if (!for_reloc && !root_dropped)btrfs_add_dead_root (root); -if (err && err != -EAGAIN ) -btrfs_handle_fs_error (fs_info, err,NULL );return err; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 279/388 btrfs: fix double __endio_write_update_ordered in direct I/O
In reply to Greg Kroah-HartmanFrom: Omar Sandoval <[email protected]>
[ Upstream commit c36cac28cb94e58f7e21ff43bdc6064346dab32c ]
In btrfs_submit_direct(), if we fail to allocate the btrfs_dio_private, we complete the ordered extent range. However, we don't mark that the range doesn't need to be cleaned up from btrfs_direct_IO() until later. Therefore, if we fail to allocate the btrfs_dio_private, we complete the ordered extent range twice. We could fix this by updating unsubmitted_oe_range earlier, but it's cleaner to reorganize the code so that creating the btrfs_dio_private and submitting the bios are separate, and once the btrfs_dio_private is created, cleanup always happens through the btrfs_dio_private.
The logic around unsubmitted_oe_range_end and unsubmitted_oe_range_start is really subtle. We have the following:
1. btrfs_direct_IO sets those two to the same value.
2. When we call __blockdev_direct_IO unless btrfs_get_blocks_direct->btrfs_get_blocks_direct_write is called to modify unsubmitted_oe_range_start so that start < end. Cleanup won't happen.
3. We come into btrfs_submit_direct - if it dip allocation fails we'd return with oe_range_end now modified so cleanup will happen.
4. If we manage to allocate the dip we reset the unsubmitted range members to be equal so that cleanup happens from btrfs_endio_direct_write.
This 4-step logic is not really obvious, especially given it's scattered across 3 functions.
--- fs/btrfs/inode.c | 178 +++++++++++++++++++---------------------------- 1 file changed, 70 insertions(+), 108 deletions(-)
fs/btrfs/inode.c +70 -108
@@ -8586,14 +8586,64 @@ err:return ret; } -static int btrfs_submit_direct_hook (struct btrfs_dio_private *dip) +/* +* If this succeeds, the btrfs_dio_private is responsible for cleaning up locked +* or ordered extents whether or not we submit any bios. +*/ +static struct btrfs_dio_private *btrfs_create_dio_private (struct bio *dio_bio, +struct inode *inode, +loff_t file_offset) { -struct inode *inode = dip->inode; +const bool write = (bio_op (dio_bio) ==REQ_OP_WRITE ); +struct btrfs_dio_private *dip; +struct bio *bio; + + dip =kzalloc (sizeof (*dip),GFP_NOFS ); +if (!dip) +return NULL ; + + bio =btrfs_bio_clone (dio_bio); + bio->bi_private = dip; +btrfs_io_bio (bio)->logical = file_offset; + + dip->private = dio_bio->bi_private; + dip->inode = inode; + dip->logical_offset = file_offset; + dip->bytes = dio_bio->bi_iter.bi_size; + dip->disk_bytenr = (u64 )dio_bio->bi_iter.bi_sector <<9 ; + dip->orig_bio = bio; + dip->dio_bio = dio_bio; +atomic_set (&dip->pending_bios,1 ); + +if (write) { +struct btrfs_dio_data *dio_data = current->journal_info; + +/* +* Setting range start and end to the same value means that +* no cleanup will happen in btrfs_direct_IO +*/ + dio_data->unsubmitted_oe_range_end = dip->logical_offset + + dip->bytes; + dio_data->unsubmitted_oe_range_start = + dio_data->unsubmitted_oe_range_end; + + bio->bi_end_io = btrfs_endio_direct_write; + }else { + bio->bi_end_io = btrfs_endio_direct_read; + dip->subio_endio = btrfs_subio_endio_read; + } +return dip; +} + +static void btrfs_submit_direct (struct bio *dio_bio,struct inode *inode, +loff_t file_offset) +{ +const bool write = (bio_op (dio_bio) ==REQ_OP_WRITE );struct btrfs_fs_info *fs_info =btrfs_sb (inode->i_sb); +struct btrfs_dio_private *dip;struct bio *bio; -struct bio *orig_bio = dip->orig_bio; -u64 start_sector = orig_bio->bi_iter.bi_sector; -u64 file_offset = dip->logical_offset; +struct bio *orig_bio; +u64 start_sector;int async_submit =0 ;u64 submit_len;int clone_offset =0 ;
@@ -8602,11 +8652,24 @@ static int btrfs_submit_direct_hook(struct btrfs_dio_private *dip)blk_status_t status;struct btrfs_io_geometry geom; + dip =btrfs_create_dio_private (dio_bio, inode, file_offset); +if (!dip) { +if (!write) { +unlock_extent (&BTRFS_I (inode)->io_tree, file_offset, + file_offset + dio_bio->bi_iter.bi_size -1 ); + } + dio_bio->bi_status =BLK_STS_RESOURCE ; +dio_end_io (dio_bio); +return ; + } + + orig_bio = dip->orig_bio; + start_sector = orig_bio->bi_iter.bi_sector; submit_len = orig_bio->bi_iter.bi_size; ret =btrfs_get_io_geometry (fs_info,btrfs_op (orig_bio), start_sector <<9 , submit_len, &geom);if (ret) -return -EIO ; + goto out_err;if (geom.len >= submit_len) { bio = orig_bio;
@@ -8669,7 +8732,7 @@ static int btrfs_submit_direct_hook(struct btrfs_dio_private *dip) submit: status =btrfs_submit_dio_bio (bio, inode, file_offset, async_submit);if (!status) -return 0 ; +return ;if (bio != orig_bio)bio_put (bio);
@@ -8683,107 +8746,6 @@ out_err:*/ if (atomic_dec_and_test (&dip->pending_bios))bio_io_error (dip->orig_bio); - -/* bio_end_io() will handle error, so we needn't return it */ -return 0 ; -} - -static void btrfs_submit_direct (struct bio *dio_bio,struct inode *inode, -loff_t file_offset) -{ -struct btrfs_dio_private *dip =NULL ; -struct bio *bio =NULL ; -struct btrfs_io_bio *io_bio; -bool write = (bio_op (dio_bio) ==REQ_OP_WRITE ); -int ret =0 ; - - bio =btrfs_bio_clone (dio_bio); - - dip =kzalloc (sizeof (*dip),GFP_NOFS ); -if (!dip) { - ret = -ENOMEM ; - goto free_ordered; - } - - dip->private = dio_bio->bi_private; - dip->inode = inode; - dip->logical_offset = file_offset; - dip->bytes = dio_bio->bi_iter.bi_size; - dip->disk_bytenr = (u64 )dio_bio->bi_iter.bi_sector <<9 ; - bio->bi_private = dip; - dip->orig_bio = bio; - dip->dio_bio = dio_bio; -atomic_set (&dip->pending_bios,1 ); - io_bio =btrfs_io_bio (bio); - io_bio->logical = file_offset; - -if (write) { - bio->bi_end_io = btrfs_endio_direct_write; - }else { - bio->bi_end_io = btrfs_endio_direct_read; - dip->subio_endio = btrfs_subio_endio_read; - } - -/* -* Reset the range for unsubmitted ordered extents (to a 0 length range) -* even if we fail to submit a bio, because in such case we do the -* corresponding error handling below and it must not be done a second -* time by btrfs_direct_IO(). -*/ -if (write) { -struct btrfs_dio_data *dio_data = current->journal_info; - - dio_data->unsubmitted_oe_range_end = dip->logical_offset + - dip->bytes; - dio_data->unsubmitted_oe_range_start = - dio_data->unsubmitted_oe_range_end; - } - - ret =btrfs_submit_direct_hook (dip); -if (!ret) -return ; - -btrfs_io_bio_free_csum (io_bio); - -free_ordered: -/* -* If we arrived here it means either we failed to submit the dip -* or we either failed to clone the dio_bio or failed to allocate the -* dip. If we cloned the dio_bio and allocated the dip, we can just -* call bio_endio against our io_bio so that we get proper resource -* cleanup if we fail to submit the dip, otherwise, we must do the -* same as btrfs_endio_direct_[write|read] because we can't call these -* callbacks - they require an allocated dip and a clone of dio_bio. -*/ -if (bio && dip) { -bio_io_error (bio); -/* -* The end io callbacks free our dip, do the final put on bio -* and all the cleanup and final put for dio_bio (through -* dio_end_io()). -*/ - dip =NULL ; - bio =NULL ; - }else { -if (write) -__endio_write_update_ordered (inode, - file_offset, - dio_bio->bi_iter.bi_size, - false); -else -unlock_extent (&BTRFS_I (inode)->io_tree, file_offset, - file_offset + dio_bio->bi_iter.bi_size -1 ); - - dio_bio->bi_status =BLK_STS_IOERR ; -/* -* Releases and cleans up our dio_bio, no need to bio_put() -* nor bio_endio()/bio_io_error() against dio_bio. -*/ -dio_end_io (dio_bio); - } -if (bio) -bio_put (bio); -kfree (dip); } static ssize_t check_direct_IO(struct btrfs_fs_info *fs_info,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 280/388 gpio: rcar: Fix runtime PM imbalance on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 6f8cd246411575703d9312888b70705c396b53a9 ]
pm_runtime_get_sync() increments the runtime PM usage counter even when it returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced.
--- drivers/gpio/gpio-rcar.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpio/gpio-rcar.c +3 -1
@@ -250,8 +250,10 @@ static int gpio_rcar_request(struct gpio_chip *chip, unsigned offset)int error; error =pm_runtime_get_sync (p->dev); -if (error <0 ) +if (error <0 ) { +pm_runtime_put (p->dev);return error; + } error =pinctrl_gpio_request (chip->base + offset);if (error)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 281/388 vfio/pci: fix memory leaks of eventfd ctx
In reply to Greg Kroah-HartmanFrom: Qian Cai <[email protected]>
[ Upstream commit 1518ac272e789cae8c555d69951b032a275b7602 ]
Finished a qemu-kvm (-device vfio-pci,host=0001:01:00.0) triggers a few memory leaks after a while because vfio_pci_set_ctx_trigger_single() calls eventfd_ctx_fdget() without the matching eventfd_ctx_put() later. Fix it by calling eventfd_ctx_put() for those memory in vfio_pci_release() before vfio_device_release().
unreferenced object 0xebff008981cc2b00 (size 128):
comm "qemu-kvm", pid 4043, jiffies 4294994816 (age 9796.310s) hex dump (first 32 bytes):
01 00 00 00 6b 6b 6b 6b 00 00 00 00 ad 4e ad de ....kkkk.....N.. ff ff ff ff 6b 6b 6b 6b ff ff ff ff ff ff ff ff ....kkkk........
backtrace:
[<00000000917e8f8d>] slab_post_alloc_hook+0x74/0x9c
[<00000000df0f2aa2>] kmem_cache_alloc_trace+0x2b4/0x3d4
[<000000005fcec025>] do_eventfd+0x54/0x1ac
[<0000000082791a69>] __arm64_sys_eventfd2+0x34/0x44
[<00000000b819758c>] do_el0_svc+0x128/0x1dc
[<00000000b244e810>] el0_sync_handler+0xd0/0x268
[<00000000d495ef94>] el0_sync+0x164/0x180unreferenced object 0x29ff008981cc4180 (size 128):
comm "qemu-kvm", pid 4043, jiffies 4294994818 (age 9796.290s) hex dump (first 32 bytes):
01 00 00 00 6b 6b 6b 6b 00 00 00 00 ad 4e ad de ....kkkk.....N.. ff ff ff ff 6b 6b 6b 6b ff ff ff ff ff ff ff ff ....kkkk........
backtrace:
[<00000000917e8f8d>] slab_post_alloc_hook+0x74/0x9c
[<00000000df0f2aa2>] kmem_cache_alloc_trace+0x2b4/0x3d4
[<000000005fcec025>] do_eventfd+0x54/0x1ac
[<0000000082791a69>] __arm64_sys_eventfd2+0x34/0x44
[<00000000b819758c>] do_el0_svc+0x128/0x1dc
[<00000000b244e810>] el0_sync_handler+0xd0/0x268
[<00000000d495ef94>] el0_sync+0x164/0x180--- drivers/vfio/pci/vfio_pci.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/vfio/pci/vfio_pci.c +4 -0
@@ -474,6 +474,10 @@ static void vfio_pci_release(void *device_data)if (!(--vdev->refcnt)) {vfio_spapr_pci_eeh_release (vdev->pdev);vfio_pci_disable (vdev); +if (vdev->err_trigger) +eventfd_ctx_put (vdev->err_trigger); +if (vdev->req_trigger) +eventfd_ctx_put (vdev->req_trigger); }mutex_unlock (&vdev->reflck->lock);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 282/388 KVM: PPC: Book3S HV: Close race with page faults around memslot flushes
In reply to Greg Kroah-HartmanFrom: Paul Mackerras <[email protected]>
[ Upstream commit 11362b1befeadaae4d159a8cddcdaf6b8afe08f9 ]
There is a potential race condition between hypervisor page faults and flushing a memslot. It is possible for a page fault to read the memslot before a memslot is updated and then write a PTE to the partition-scoped page tables after kvmppc_radix_flush_memslot has completed. (Note that this race has never been explicitly observed.)
To close this race, it is sufficient to increment the MMU sequence number while the kvm->mmu_lock is held. That will cause mmu_notifier_retry() to return true, and the page fault will then return to the guest without inserting a PTE.
--- arch/powerpc/kvm/book3s_64_mmu_radix.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/powerpc/kvm/book3s_64_mmu_radix.c +5 -0
@@ -1104,6 +1104,11 @@ void kvmppc_radix_flush_memslot(struct kvm *kvm, kvm->arch.lpid); gpa +=PAGE_SIZE ; } +/* +* Increase the mmu notifier sequence number to prevent any page +* fault that read the memslot earlier from writing a PTE. +*/ + kvm->mmu_notifier_seq++;spin_unlock (&kvm->mmu_lock); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 283/388 perf evsel: Fix 2 memory leaks
In reply to Greg Kroah-HartmanFrom: Ian Rogers <[email protected]>
[ Upstream commit 3efc899d9afb3d03604f191a0be9669eabbfc4aa ]
If allocated, perf_pkg_mask and metric_events need freeing.
--- tools/perf/util/evsel.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/evsel.c +2 -0
@@ -1255,6 +1255,8 @@ void perf_evsel__exit(struct evsel *evsel)zfree (&evsel->group_name);zfree (&evsel->name);zfree (&evsel->pmu_name); +zfree (&evsel->per_pkg_mask); +zfree (&evsel->metric_events); perf_evsel__object.fini (evsel); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 284/388 perf trace: Fix the selection for architectures to generate the errno name tables
In reply to Greg Kroah-HartmanFrom: Ian Rogers <[email protected]>
[ Upstream commit 7597ce89b3ed239f7a3408b930d2a6c7a4c938a1 ]
Make the architecture test directory agree with the code comment.
Committer notes:
This was split from a larger patch.
The code was assuming the developer always worked from tools/perf/, so make sure we do the test -d having $toolsdir/perf/arch/$arch, to match the intent expressed in the comment, just above that loop.
--- tools/perf/trace/beauty/arch_errno_names.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/trace/beauty/arch_errno_names.sh +1 -1
@@ -91,7 +91,7 @@ EoHEADER # in tools/perf/arch archlist="" for arch in $(find $toolsdir/arch -maxdepth 1 -mindepth 1 -type d -printf "%f\n" | grep -v x86 | sort); do - test -d arch/$arch && archlist="$archlist $arch" + test -d $toolsdir/perf/arch/$arch && archlist="$archlist $arch" done for arch in x86 $archlist generic; do
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 285/388 perf stat: Fix duration_time value for higher intervals
In reply to Greg Kroah-HartmanFrom: Jiri Olsa <[email protected]>
[ Upstream commit ea9eb1f456a08c18feb485894185f7a4e31cc8a4 ]
Joakim reported wrong duration_time value for interval bigger than 4000 [1].
The problem is in the interval value we pass to update_stats function, which is typed as 'unsigned int' and overflows when we get over 2^32 (happens between intervals 4000 and 5000).
Retyping the passed value to unsigned long long.
[1] https://www.spinics.net/lists/linux-perf-users/msg11777.html
--- tools/perf/builtin-stat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-stat.c +1 -1
@@ -351,7 +351,7 @@ static void process_interval(void) }init_stats (&walltime_nsecs_stats); -update_stats (&walltime_nsecs_stats, stat_config.interval *1000000 ); +update_stats (&walltime_nsecs_stats, stat_config.interval *1000000ULL );print_counters (&rs,0 ,NULL ); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 286/388 perf util: Fix memory leak of prefix_if_not_in
In reply to Greg Kroah-HartmanFrom: Xie XiuQi <[email protected]>
[ Upstream commit 07e9a6f538cbeecaf5c55b6f2991416f873cdcbd ]
Need to free "str" before return when asprintf() failed to avoid memory leak.
--- tools/perf/util/sort.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/sort.c +1 -1
@@ -2788,7 +2788,7 @@ static char *prefix_if_not_in(const char *pre, char *str)return str;if (asprintf (&n,"%s,%s" , pre, str) <0 ) -return NULL ; + n =NULL ;free (str);return n;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 287/388 perf metricgroup: Free metric_events on error
In reply to Greg Kroah-HartmanFrom: Ian Rogers <[email protected]>
[ Upstream commit a159e2fe89b4d1f9fb54b0ae418b961e239bf617 ]
Avoid a simple memory leak.
--- tools/perf/util/metricgroup.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/util/metricgroup.c +3 -0
@@ -174,6 +174,7 @@ static int metricgroup__setup_events(struct list_head *groups,if (!evsel) {pr_debug ("Cannot resolve %s: %s\n" , eg->metric_name, eg->metric_expr); +free (metric_events);continue ; }for (i =0 ; i < eg->idnum; i++)
@@ -181,11 +182,13 @@ static int metricgroup__setup_events(struct list_head *groups, me =metricgroup__lookup (metric_events_list, evsel, true);if (!me) { ret = -ENOMEM ; +free (metric_events);break ; } expr =malloc (sizeof (struct metric_expr ));if (!expr) { ret = -ENOMEM ; +free (metric_events);break ; } expr->metric_expr = eg->metric_expr;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 288/388 perf kcore_copy: Fix module map when there are no modules loaded
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
[ Upstream commit 61f82e3fb697a8e85f22fdec786528af73dc36d1 ]
In the absence of any modules, no "modules" map is created, but there are other executable pages to map, due to eBPF JIT, kprobe or ftrace. Map them by recognizing that the first "module" symbol is not necessarily from a module, and adjust the map accordingly.
--- tools/perf/util/symbol-elf.c | 7 +++++++ 1 file changed, 7 insertions(+)
tools/perf/util/symbol-elf.c +7 -0
@@ -1449,6 +1449,7 @@ struct kcore_copy_info {u64 first_symbol;u64 last_symbol;u64 first_module; +u64 first_module_symbol;u64 last_module_symbol;size_t phnum;struct list_head phdrs;
@@ -1525,6 +1526,8 @@ static int kcore_copy__process_kallsyms(void *arg, const char *name, char type,return 0 ;if (strchr (name,'[' )) { +if (!kci->first_module_symbol || start < kci->first_module_symbol) + kci->first_module_symbol = start;if (start > kci->last_module_symbol) kci->last_module_symbol = start;return 0 ;
@@ -1722,6 +1725,10 @@ static int kcore_copy__calc_maps(struct kcore_copy_info *kci, const char *dir, kci->etext += page_size; } +if (kci->first_module_symbol && + (!kci->first_module || kci->first_module_symbol < kci->first_module)) + kci->first_module = kci->first_module_symbol; + kci->first_module =round_down (kci->first_module, page_size);if (kci->last_module_symbol) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 289/388 PCI: tegra194: Fix runtime PM imbalance on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 1c1dbb2c02623db18a50c61b175f19aead800b4e ]
pm_runtime_get_sync() increments the runtime PM usage counter even when it returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/pci/controller/dwc/pcie-tegra194.c +2 -3
@@ -1395,7 +1395,7 @@ static int tegra_pcie_config_rp(struct tegra_pcie_dw *pcie) ret =pinctrl_pm_select_default_state (dev);if (ret <0 ) {dev_err (dev,"Failed to configure sideband pins: %d\n" , ret); - goto fail_pinctrl; + goto fail_pm_get_sync; }tegra_pcie_init_controller (pcie);
@@ -1422,9 +1422,8 @@ static int tegra_pcie_config_rp(struct tegra_pcie_dw *pcie) fail_host_init:tegra_pcie_deinit_controller (pcie); -fail_pinctrl: -pm_runtime_put_sync (dev); fail_pm_get_sync: +pm_runtime_put_sync (dev);pm_runtime_disable (dev);return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 290/388 ASoC: img-i2s-out: Fix runtime PM imbalance on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 65bd91dd6957390c42a0491b9622cf31a2cdb140 ]
pm_runtime_get_sync() increments the runtime PM usage counter even the call returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced.
--- sound/soc/img/img-i2s-out.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
sound/soc/img/img-i2s-out.c +6 -2
@@ -347,8 +347,10 @@ static int img_i2s_out_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) chan_control_mask =IMG_I2S_OUT_CHAN_CTL_CLKT_MASK ; ret =pm_runtime_get_sync (i2s->dev); -if (ret <0 ) +if (ret <0 ) { +pm_runtime_put_noidle (i2s->dev);return ret; + }img_i2s_out_disable (i2s);
@@ -488,8 +490,10 @@ static int img_i2s_out_probe(struct platform_device *pdev) goto err_pm_disable; } ret =pm_runtime_get_sync (&pdev->dev); -if (ret <0 ) +if (ret <0 ) { +pm_runtime_put_noidle (&pdev->dev); goto err_suspend; + } reg =IMG_I2S_OUT_CTL_FRM_SIZE_MASK ;img_i2s_out_writel (i2s, reg,IMG_I2S_OUT_CTL );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 291/388 wlcore: fix runtime pm imbalance in wl1271_tx_work
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 9604617e998b49f7695fea1479ed82421ef8c9f0 ]
There are two error handling paths in this functon. When wlcore_tx_work_locked() returns an error code, we should decrease the runtime PM usage counter the same way as the error handling path beginning from pm_runtime_get_sync().
--- drivers/net/wireless/ti/wlcore/tx.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/ti/wlcore/tx.c +1 -0
@@ -863,6 +863,7 @@ void wl1271_tx_work(struct work_struct *work) ret =wlcore_tx_work_locked (wl);if (ret <0 ) { +pm_runtime_put_noidle (wl->dev);wl12xx_queue_recovery_work (wl); goto out; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 292/388 wlcore: fix runtime pm imbalance in wlcore_regdomain_config
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 282a04bf1d8029eb98585cb5db3fd70fe8bc91f7 ]
pm_runtime_get_sync() increments the runtime PM usage counter even the call returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced.
--- drivers/net/wireless/ti/wlcore/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/ti/wlcore/main.c +3 -1
@@ -3658,8 +3658,10 @@ void wlcore_regdomain_config(struct wl1271 *wl) goto out; ret =pm_runtime_get_sync (wl->dev); -if (ret <0 ) +if (ret <0 ) { +pm_runtime_put_autosuspend (wl->dev); goto out; + } ret =wlcore_cmd_regdomain_config_locked (wl);if (ret <0 ) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 293/388 mtd: rawnand: gpmi: Fix runtime PM imbalance on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 550e68ea36a6671a96576c0531685ce6e6c0d19d ]
pm_runtime_get_sync() increments the runtime PM usage counter even when it returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced.
--- drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +3 -1
@@ -540,8 +540,10 @@ static int bch_set_geometry(struct gpmi_nand_data *this)return ret; ret =pm_runtime_get_sync (this->dev); -if (ret <0 ) +if (ret <0 ) { +pm_runtime_put_autosuspend (this->dev);return ret; + }/* * Due to erratum #2847 of the MX23, the BCH cannot be soft reset on this
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 294/388 mtd: rawnand: omap_elm: Fix runtime PM imbalance on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 37f7212148cf1d796135cdf8d0c7fee13067674b ]
pm_runtime_get_sync() increments the runtime PM usage counter even when it returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced.
--- drivers/mtd/nand/raw/omap_elm.c | 1 + 1 file changed, 1 insertion(+)
drivers/mtd/nand/raw/omap_elm.c +1 -0
@@ -411,6 +411,7 @@ static int elm_probe(struct platform_device *pdev)pm_runtime_enable (&pdev->dev);if (pm_runtime_get_sync (&pdev->dev) <0 ) { ret = -EINVAL ; +pm_runtime_put_sync (&pdev->dev);pm_runtime_disable (&pdev->dev);dev_err (&pdev->dev,"can't enable clock\n" );return ret;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 295/388 PCI: tegra: Fix runtime PM imbalance on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit fcee90cdf6f3a3a371add04d41528d5ba9c3b411 ]
pm_runtime_get_sync() increments the runtime PM usage counter even when it returns an error code. Thus a pairing decrement is needed on the error handling path to keep the counter balanced.
Also, call pm_runtime_disable() when pm_runtime_get_sync() returns an error code.
--- drivers/pci/controller/pci-tegra.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/pci/controller/pci-tegra.c +1 -2
@@ -2768,7 +2768,7 @@ static int tegra_pcie_probe(struct platform_device *pdev) err =pm_runtime_get_sync (pcie->dev);if (err <0 ) {dev_err (dev,"fail to enable pcie controller: %d\n" , err); - goto teardown_msi; + goto pm_runtime_put; } err =tegra_pcie_request_resources (pcie);
@@ -2808,7 +2808,6 @@ free_resources: pm_runtime_put:pm_runtime_put_sync (pcie->dev);pm_runtime_disable (pcie->dev); -teardown_msi:tegra_pcie_msi_teardown (pcie); put_resources:tegra_pcie_put_resources (pcie);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 296/388 ceph: fix potential race in ceph_check_caps
In reply to Greg Kroah-HartmanFrom: Jeff Layton <[email protected]>
[ Upstream commit dc3da0461cc4b76f2d0c5b12247fcb3b520edbbf ]
Nothing ensures that session will still be valid by the time we dereference the pointer. Take and put a reference.
In principle, we should always be able to get a reference here, but throw a warning if that's ever not the case.
--- fs/ceph/caps.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
fs/ceph/caps.c +13 -1
@@ -2013,12 +2013,24 @@ ack:if (mutex_trylock (&session->s_mutex) ==0 ) {dout ("inverting session/ino locks on %p\n" , session); + session =ceph_get_mds_session (session);spin_unlock (&ci->i_ceph_lock);if (took_snap_rwsem) {up_read (&mdsc->snap_rwsem); took_snap_rwsem =0 ; } -mutex_lock (&session->s_mutex); +if (session) { +mutex_lock (&session->s_mutex); +ceph_put_mds_session (session); + }else { +/* +* Because we take the reference while +* holding the i_ceph_lock, it should +* never be NULL. Throw a warning if it +* ever is. +*/ +WARN_ON_ONCE (true); + } goto retry; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 297/388 mm/swap_state: fix a data race in swapin_nr_pages
In reply to Greg Kroah-HartmanFrom: Qian Cai <[email protected]>
[ Upstream commit d6c1f098f2a7ba62627c9bc17cda28f534ef9e4a ]
"prev_offset" is a static variable in swapin_nr_pages() that can be accessed concurrently with only mmap_sem held in read mode as noticed by KCSAN,
BUG: KCSAN: data-race in swap_cluster_readahead / swap_cluster_readahead
write to 0xffffffff92763830 of 8 bytes by task 14795 on cpu 17:
swap_cluster_readahead+0x2a6/0x5e0 swapin_readahead+0x92/0x8dc do_swap_page+0x49b/0xf20 __handle_mm_fault+0xcfb/0xd70 handle_mm_fault+0xfc/0x2f0 do_page_fault+0x263/0x715 page_fault+0x34/0x40
1 lock held by (dnf)/14795:
#0: ffff897bd2e98858 (&mm->mmap_sem#2){++++}-{3:3}, at: do_page_fault+0x143/0x715 do_user_addr_fault at arch/x86/mm/fault.c:1405
(inlined by) do_page_fault at arch/x86/mm/fault.c:1535
irq event stamp: 83493 count_memcg_event_mm+0x1a6/0x270 count_memcg_event_mm+0x119/0x270 __do_softirq+0x365/0x589 irq_exit+0xa2/0xc0
read to 0xffffffff92763830 of 8 bytes by task 1 on cpu 22:
swap_cluster_readahead+0xfd/0x5e0 swapin_readahead+0x92/0x8dc do_swap_page+0x49b/0xf20 __handle_mm_fault+0xcfb/0xd70 handle_mm_fault+0xfc/0x2f0 do_page_fault+0x263/0x715 page_fault+0x34/0x40
1 lock held by systemd/1:
#0: ffff897c38f14858 (&mm->mmap_sem#2){++++}-{3:3}, at: do_page_fault+0x143/0x715
irq event stamp: 43530289 count_memcg_event_mm+0x1a6/0x270 count_memcg_event_mm+0x119/0x270 __do_softirq+0x365/0x589 irq_exit+0xa2/0xc0
--- mm/swap_state.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
mm/swap_state.c +3 -2
@@ -511,10 +511,11 @@ static unsigned long swapin_nr_pages(unsigned long offset)return 1 ; hits =atomic_xchg (&swapin_readahead_hits,0 ); - pages =__swapin_nr_pages (prev_offset, offset, hits, max_pages, + pages =__swapin_nr_pages (READ_ONCE (prev_offset), offset, hits, + max_pages,atomic_read (&last_readahead_pages));if (!hits) - prev_offset = offset; +WRITE_ONCE (prev_offset, offset);atomic_set (&last_readahead_pages, pages);return pages;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 298/388 mm: memcontrol: fix stat-corrupting race in charge moving
In reply to Greg Kroah-HartmanFrom: Johannes Weiner <[email protected]>
[ Upstream commit abb242f57196dbaa108271575353a0453f6834ef ]
The move_lock is a per-memcg lock, but the VM accounting code that needs to acquire it comes from the page and follows page->mem_cgroup under RCU protection. That means that the page becomes unlocked not when we drop the move_lock, but when we update page->mem_cgroup. And that assignment doesn't imply any memory ordering. If that pointer write gets reordered against the reads of the page state - page_mapped, PageDirty etc. the state may change while we rely on it being stable and we can end up corrupting the counters.
Place an SMP memory barrier to make sure we're done with all page state by the time the new page->mem_cgroup becomes visible.
Also replace the open-coded move_lock with a lock_page_memcg() to make it more obvious what we're serializing against.
--- mm/memcontrol.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-)
mm/memcontrol.c +14 -12
@@ -5489,7 +5489,6 @@ static int mem_cgroup_move_account(struct page *page, {struct lruvec *from_vec, *to_vec;struct pglist_data *pgdat; -unsigned long flags;unsigned int nr_pages = compound ?hpage_nr_pages (page) :1 ;int ret;bool anon;
@@ -5516,18 +5515,13 @@ static int mem_cgroup_move_account(struct page *page, from_vec =mem_cgroup_lruvec (pgdat, from); to_vec =mem_cgroup_lruvec (pgdat, to); -spin_lock_irqsave (&from->move_lock, flags); +lock_page_memcg (page);if (!anon &&page_mapped (page)) {__mod_lruvec_state (from_vec,NR_FILE_MAPPED , -nr_pages);__mod_lruvec_state (to_vec,NR_FILE_MAPPED , nr_pages); } -/* -* move_lock grabbed above and caller set from->moving_account, so -* mod_memcg_page_state will serialize updates to PageDirty. -* So mapping should be stable for dirty pages. -*/ if (!anon &&PageDirty (page)) {struct address_space *mapping =page_mapping (page);
@@ -5543,15 +5537,23 @@ static int mem_cgroup_move_account(struct page *page, }/* +* All state has been migrated, let's switch to the new memcg. +* * It is safe to change page->mem_cgroup here because the page -* is referenced, charged, and isolated - we can't race with -* uncharging, charging, migration, or LRU putback. +* is referenced, charged, isolated, and locked: we can't race +* with (un)charging, migration, LRU putback, or anything else +* that would rely on a stable page->mem_cgroup. +* +* Note that lock_page_memcg is a memcg lock, not a page lock, +* to save space. As soon as we switch page->mem_cgroup to a +* new memcg that isn't locked, the above state can change +* concurrently again. Make sure we're truly done with it. */ +smp_mb (); -/* caller should have done css_get */ - page->mem_cgroup = to; + page->mem_cgroup = to;/* caller should have done css_get */ -spin_unlock_irqrestore (&from->move_lock, flags); +__unlock_page_memcg (from); ret =0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 299/388 rapidio: avoid data race between file operation callbacks and mport_cdev_add().
In reply to Greg Kroah-HartmanFrom: Madhuparna Bhowmik <[email protected]>
[ Upstream commit e1c3cdb26ab881b77486dc50370356a349077c74 ]
Fields of md(mport_dev) are set after cdev_device_add(). However, the file operation callbacks can be called after cdev_device_add() and therefore accesses to fields of md in the callbacks can race with the rest of the mport_cdev_add() function.
One such example is INIT_LIST_HEAD(&md->portwrites) in mport_cdev_add(), the list is initialised after cdev_device_add(). This can race with list_add_tail(&pw_filter->md_node,&md->portwrites) in rio_mport_add_pw_filter() which is called by unlocked_ioctl.
To avoid such data races use cdev_device_add() after initializing md.
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/rapidio/devices/rio_mport_cdev.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/rapidio/devices/rio_mport_cdev.c +7 -7
@@ -2384,13 +2384,6 @@ static struct mport_dev *mport_cdev_add(struct rio_mport *mport)cdev_init (&md->cdev, &mport_fops); md->cdev.owner =THIS_MODULE ; - ret =cdev_device_add (&md->cdev, &md->dev); -if (ret) { -rmcd_error ("Failed to register mport %d (err=%d)" , - mport->id, ret); - goto err_cdev; - } -INIT_LIST_HEAD (&md->doorbells);spin_lock_init (&md->db_lock);INIT_LIST_HEAD (&md->portwrites);
@@ -2410,6 +2403,13 @@ static struct mport_dev *mport_cdev_add(struct rio_mport *mport)#else md->properties.transfer_mode |=RIO_TRANSFER_MODE_TRANSFER ;#endif + + ret =cdev_device_add (&md->cdev, &md->dev); +if (ret) { +rmcd_error ("Failed to register mport %d (err=%d)" , + mport->id, ret); + goto err_cdev; + } ret =rio_query_mport (mport, &attr);if (!ret) { md->properties.flags = attr.flags;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 300/388 mtd: parser: cmdline: Support MTD names containing one or more colons
In reply to Greg Kroah-HartmanFrom: Boris Brezillon <[email protected]>
[ Upstream commit eb13fa0227417e84aecc3bd9c029d376e33474d3 ]
Looks like some drivers define MTD names with a colon in it, thus making mtdpart= parsing impossible. Let's fix the parser to gracefully handle that case: the last ':' in a partition definition sequence is considered instead of the first one.
--- drivers/mtd/parsers/cmdlinepart.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
drivers/mtd/parsers/cmdlinepart.c +20 -3
@@ -218,12 +218,29 @@ static int mtdpart_setup_real(char *s)struct cmdline_mtd_partition *this_mtd;struct mtd_partition *parts;int mtd_id_len, num_parts; -char *p, *mtd_id; +char *p, *mtd_id, *semicol; + +/* +* Replace the first ';' by a NULL char so strrchr can work +* properly. +*/ + semicol =strchr (s,';' ); +if (semicol) + *semicol ='\0' ; mtd_id = s; -/* fetch <mtd-id> */ - p =strchr (s,':' ); +/* +* fetch <mtd-id>. We use strrchr to ignore all ':' that could +* be present in the MTD name, only the last one is interpreted +* as an <mtd-id>/<part-definition> separator. +*/ + p =strrchr (s,':' ); + +/* Restore the ';' now. */ +if (semicol) + *semicol =';' ; +if (!p) {pr_err ("no mtd-id\n" );return -EINVAL ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 301/388 x86/speculation/mds: Mark mds_user_clear_cpu_buffers() __always_inline
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit a7ef9ba986b5fae9d80f8a7b31db0423687efe4e ]
Prevent the compiler from uninlining and creating traceable/probable functions as this is invoked _after_ context tracking switched to CONTEXT_USER and rcu idle.
--- arch/x86/include/asm/nospec-branch.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/include/asm/nospec-branch.h +2 -2
@@ -320,7 +320,7 @@ DECLARE_STATIC_KEY_FALSE(mds_idle_clear);* combination with microcode which triggers a CPU buffer flush when the * instruction is executed. */ -static inline void mds_clear_cpu_buffers (void ) +static __always_inline void mds_clear_cpu_buffers(void) {static const u16 ds = __KERNEL_DS;
@@ -341,7 +341,7 @@ static inline void mds_clear_cpu_buffers(void)* * Clear CPU buffers if the corresponding static key is enabled */ -static inline void mds_user_clear_cpu_buffers (void ) +static __always_inline void mds_user_clear_cpu_buffers(void) {if (static_branch_likely (&mds_user_clear))mds_clear_cpu_buffers ();
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 302/388 NFS: nfs_xdr_status should record the procedure name
In reply to Greg Kroah-HartmanFrom: Chuck Lever <[email protected]>
[ Upstream commit 5be5945864ea143fda628e8179c8474457af1f43 ]
When sunrpc trace points are not enabled, the recorded task ID information alone is not helpful.
--- fs/nfs/nfstrace.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
fs/nfs/nfstrace.h +13 -2
@@ -1147,7 +1147,12 @@ TRACE_EVENT(nfs_xdr_status, __field(unsigned int, task_id) __field(unsigned int, client_id) __field(u32, xid) + __field(int, version) __field(unsigned long, error) + __string(program, + xdr->rqst->rq_task->tk_client->cl_program->name) + __string(procedure, + xdr->rqst->rq_task->tk_msg.rpc_proc->p_name) ), TP_fast_assign(
@@ -1157,13 +1162,19 @@ TRACE_EVENT(nfs_xdr_status, __entry->task_id = task->tk_pid; __entry->client_id = task->tk_client->cl_clid; __entry->xid =be32_to_cpu (rqstp->rq_xid); + __entry->version = task->tk_client->cl_vers; __entry->error = error; +__assign_str (program, + task->tk_client->cl_program->name) +__assign_str (procedure, task->tk_msg.rpc_proc->p_name) ),TP_printk ( -"task:%u@%d xid=0x%08x error=%ld (%s)" , +"task:%u@%d xid=0x%08x %sv%d %s error=%ld (%s)" , __entry->task_id, __entry->client_id, __entry->xid, - -__entry->error,nfs_show_status (__entry->error) +__get_str (program), __entry->version, +__get_str (procedure), -__entry->error, +nfs_show_status (__entry->error) ) );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 303/388 vfio/pci: Clear error and request eventfd ctx after releasing
In reply to Greg Kroah-HartmanFrom: Alex Williamson <[email protected]>
[ Upstream commit 5c5866c593bbd444d0339ede6a8fb5f14ff66d72 ]
The next use of the device will generate an underflow from the stale reference.
--- drivers/vfio/pci/vfio_pci.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/vfio/pci/vfio_pci.c +6 -2
@@ -474,10 +474,14 @@ static void vfio_pci_release(void *device_data)if (!(--vdev->refcnt)) {vfio_spapr_pci_eeh_release (vdev->pdev);vfio_pci_disable (vdev); -if (vdev->err_trigger) +if (vdev->err_trigger) {eventfd_ctx_put (vdev->err_trigger); -if (vdev->req_trigger) + vdev->err_trigger =NULL ; + } +if (vdev->req_trigger) {eventfd_ctx_put (vdev->req_trigger); + vdev->req_trigger =NULL ; + } }mutex_unlock (&vdev->reflck->lock);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 304/388 cifs: Fix double add page to memcg when cifs_readpages
In reply to Greg Kroah-HartmanFrom: Zhang Xiaoxu <[email protected]>
[ Upstream commit 95a3d8f3af9b0d63b43f221b630beaab9739d13a ]
When xfstests generic/451, there is an BUG at mm/memcontrol.c:
page:ffffea000560f2c0 refcount:2 mapcount:0 mapping:000000008544e0ea
index:0xf
mapping->aops:cifs_addr_ops dentry name:"tst-aio-dio-cycle-write.451"
flags: 0x2fffff80000001(locked)
raw: 002fffff80000001 ffffc90002023c50 ffffea0005280088 ffff88815cda0210
raw: 000000000000000f 0000000000000000 00000002ffffffff ffff88817287d000
page dumped because: VM_BUG_ON_PAGE(page->mem_cgroup)
page->mem_cgroup:ffff88817287d000
------------[ cut here ]------------
kernel BUG at mm/memcontrol.c:2659!
invalid opcode: 0000 [#1] SMP
CPU: 2 PID: 2038 Comm: xfs_io Not tainted 5.8.0-rc1 #44
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS ?-20190727_
073836-buildvm-ppc64le-16.ppc.4
RIP: 0010:commit_charge+0x35/0x50
Code: 0d 48 83 05 54 b2 02 05 01 48 89 77 38 c3 48 c7
c6 78 4a ea ba 48 83 05 38 b2 02 05 01 e8 63 0d9
RSP: 0018:ffffc90002023a50 EFLAGS: 00010202
RAX: 0000000000000000 RBX: ffff88817287d000 RCX: 0000000000000000
RDX: 0000000000000000 RSI: ffff88817ac97ea0 RDI: ffff88817ac97ea0
RBP: ffffea000560f2c0 R08: 0000000000000203 R09: 0000000000000005
R10: 0000000000000030 R11: ffffc900020237a8 R12: 0000000000000000
R13: 0000000000000001 R14: 0000000000000001 R15: ffff88815a1272c0
FS: 00007f5071ab0800(0000) GS:ffff88817ac80000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 000055efcd5ca000 CR3: 000000015d312000 CR4: 00000000000006e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
mem_cgroup_charge+0x166/0x4f0
__add_to_page_cache_locked+0x4a9/0x710
add_to_page_cache_locked+0x15/0x20
cifs_readpages+0x217/0x1270
read_pages+0x29a/0x670
page_cache_readahead_unbounded+0x24f/0x390
__do_page_cache_readahead+0x3f/0x60
ondemand_readahead+0x1f1/0x470
page_cache_async_readahead+0x14c/0x170
generic_file_buffered_read+0x5df/0x1100
generic_file_read_iter+0x10c/0x1d0
cifs_strict_readv+0x139/0x170
new_sync_read+0x164/0x250
__vfs_read+0x39/0x60
vfs_read+0xb5/0x1e0
ksys_pread64+0x85/0xf0
__x64_sys_pread64+0x22/0x30
do_syscall_64+0x69/0x150
entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x7f5071fcb1af
Code: Bad RIP value.
RSP: 002b:00007ffde2cdb8e0 EFLAGS: 00000293 ORIG_RAX: 0000000000000011
RAX: ffffffffffffffda RBX: 00007ffde2cdb990 RCX: 00007f5071fcb1af
RDX: 0000000000001000 RSI: 000055efcd5ca000 RDI: 0000000000000003
RBP: 0000000000000003 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000001000 R11: 0000000000000293 R12: 0000000000000001
R13: 000000000009f000 R14: 0000000000000000 R15: 0000000000001000
Modules linked in:
---[ end trace 725fa14a3e1af65c ]---Since commit 3fea5a499d57 ("mm: memcontrol: convert page cache to a new mem_cgroup_charge() API") not cancel the page charge, the pages maybe double add to pagecache:
thread1 | thread2cifs_readpagesreadpages_get_pages
add_to_page_cache_locked(head,index=n)=0
| readpages_get_pages
| add_to_page_cache_locked(head,index=n+1)=0 add_to_page_cache_locked(head, index=n+1)=-EEXIST then, will next loop with list head page's index=n+1 and the page->mapping not NULLreadpages_get_pages add_to_page_cache_locked(head, index=n+1)
commit_charge
VM_BUG_ON_PAGE
So, we should not do the next loop when any page add to page cache failed.
--- fs/cifs/file.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
fs/cifs/file.c +7 -4
@@ -4269,7 +4269,8 @@ readpages_get_pages(struct address_space *mapping, struct list_head *page_list,break ;__SetPageLocked (page); -if (add_to_page_cache_locked (page, mapping, page->index, gfp)) { + rc =add_to_page_cache_locked (page, mapping, page->index, gfp); +if (rc) {__ClearPageLocked (page);break ; }
@@ -4285,6 +4286,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, struct list_head *page_list, unsigned num_pages) { int rc; +int err =0 ;struct list_head tmplist;struct cifsFileInfo *open_file = file->private_data;struct cifs_sb_info *cifs_sb =CIFS_FILE_SB (file);
@@ -4329,7 +4331,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,* the order of declining indexes. When we put the pages in * the rdata->pages, then we want them in increasing order. */ -while (!list_empty (page_list)) { +while (!list_empty (page_list) && !err) {unsigned int i, nr_pages, bytes, rsize;loff_t offset;struct page *page, *tpage;
@@ -4362,9 +4364,10 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,return 0 ; } - rc =readpages_get_pages (mapping, page_list, rsize, &tmplist, + nr_pages =0 ; + err =readpages_get_pages (mapping, page_list, rsize, &tmplist, &nr_pages, &offset, &bytes); -if (rc) { +if (!nr_pages) {add_credits_and_wake_if (server, credits,0 );break ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 305/388 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
@@ -1864,7 +1864,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 306/388 mac80211: skip mpath lookup also for control port tx
In reply to Greg Kroah-HartmanFrom: Markus Theil <[email protected]>
[ Upstream commit 5af7fef39d7952c0f5551afa7b821ee7b6c9dd3d ]
When using 802.1X over mesh networks, at first an ordinary mesh peering is established, then the 802.1X EAPOL dialog happens, afterwards an authenticated mesh peering exchange (AMPE) happens, finally the peering is complete and we can set the STA authorized flag.
As 802.1X is an intermediate step here and key material is not yet exchanged for stations we have to skip mesh path lookup for these EAPOL frames. Otherwise the already configure mesh group encryption key would be used to send a mesh path request which no one can decipher, because we didn't already establish key material on both peers, like with SAE and directly using AMPE.
[remove pointless braces, remove unnecessary local variable,
the list can only process one such frame (or its fragments)]
--- net/mac80211/tx.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/mac80211/tx.c +5 -1
@@ -3913,6 +3913,9 @@ void __ieee80211_subif_start_xmit(struct sk_buff *skb, skb->prev =NULL ; skb->next =NULL ; +if (skb->protocol == sdata->control_port_protocol) + ctrl_flags |=IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP ; + skb =ieee80211_build_hdr (sdata, skb, info_flags, sta, ctrl_flags);if (IS_ERR (skb))
@@ -5096,7 +5099,8 @@ int ieee80211_tx_control_port(struct wiphy *wiphy, struct net_device *dev,return -EINVAL ;if (proto == sdata->control_port_protocol) - ctrl_flags |=IEEE80211_TX_CTRL_PORT_CTRL_PROTO ; + ctrl_flags |=IEEE80211_TX_CTRL_PORT_CTRL_PROTO | +IEEE80211_TX_CTRL_SKIP_MPATH_LOOKUP ;if (unencrypted) flags =IEEE80211_TX_INTFL_DONT_ENCRYPT ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 307/388 scsi: libfc: Handling of extra kref
In reply to Greg Kroah-HartmanFrom: Javed Hasan <[email protected]>
[ Upstream commit 71f2bf85e90d938d4a9ef9dd9bfa8d9b0b6a03f7 ]
Handling of extra kref which is done by lookup table in case rdata is already present in list.
This issue was leading to memory leak. Trace from KMEMLEAK tool:
unreferenced object 0xffff8888259e8780 (size 512):
comm "kworker/2:1", pid 182614, jiffies 4433237386 (age 113021.971s)
hex dump (first 32 bytes):
58 0a ec cf 83 88 ff ff 00 00 00 00 00 00 00 00
01 00 00 00 08 00 00 00 13 7d f0 1e 0e 00 00 10
backtrace:
[<000000006b25760f>] fc_rport_recv_req+0x3c6/0x18f0 [libfc]
[<00000000f208d994>] fc_lport_recv_els_req+0x120/0x8a0 [libfc]
[<00000000a9c437b8>] fc_lport_recv+0xb9/0x130 [libfc]
[<00000000ad5be37b>] qedf_ll2_process_skb+0x73d/0xad0 [qedf]
[<00000000e0eb6893>] process_one_work+0x382/0x6c0
[<000000002dfd9e21>] worker_thread+0x57/0x5c0
[<00000000b648204f>] kthread+0x1a0/0x1c0
[<0000000072f5ab20>] ret_from_fork+0x35/0x40
[<000000001d5c05d8>] 0xffffffffffffffffBelow is the log sequence which leads to memory leak. Here we get the nested "Received PLOGI request" for same port and this request leads to call the fc_rport_create() twice for the same rport.
kernel: host1: rport fffce5: Received PLOGI request
kernel: host1: rport fffce5: Received PLOGI in INIT state
kernel: host1: rport fffce5: Port is Ready
kernel: host1: rport fffce5: Received PRLI request while in state Ready
kernel: host1: rport fffce5: PRLI rspp type 8 active 1 passive 0
kernel: host1: rport fffce5: Received LOGO request while in state Ready
kernel: host1: rport fffce5: Delete port
kernel: host1: rport fffce5: Received PLOGI request
kernel: host1: rport fffce5: Received PLOGI in state Delete - send busy
--- drivers/scsi/libfc/fc_rport.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/scsi/libfc/fc_rport.c +3 -1
@@ -133,8 +133,10 @@ struct fc_rport_priv *fc_rport_create(struct fc_lport *lport, u32 port_id)lockdep_assert_held (&lport->disc.disc_mutex); rdata =fc_rport_lookup (lport, port_id); -if (rdata) +if (rdata) { +kref_put (&rdata->kref, fc_rport_destroy);return rdata; + }if (lport->rport_priv_size >0 ) rport_priv_size = lport->rport_priv_size;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 308/388 scsi: libfc: Skip additional kref updating work event
In reply to Greg Kroah-HartmanFrom: Javed Hasan <[email protected]>
[ Upstream commit 823a65409c8990f64c5693af98ce0e7819975cba ]
When an rport event (RPORT_EV_READY) is updated without work being queued, avoid taking an additional reference.
This issue was leading to memory leak. Trace from KMEMLEAK tool:
unreferenced object 0xffff8888259e8780 (size 512):
comm "kworker/2:1", jiffies 4433237386 (age 113021.971s)
hex dump (first 32 bytes): 58 0a ec cf 83 88 ff ff 00 00 00 00 00 00 00 00 01 00 00 00 08 00 00 00 13 7d f0 1e 0e 00 00 10 backtrace: [<000000006b25760f>] fc_rport_recv_req+0x3c6/0x18f0 [libfc] [<00000000f208d994>] fc_lport_recv_els_req+0x120/0x8a0 [libfc] [<00000000a9c437b8>] fc_lport_recv+0xb9/0x130 [libfc] [<00000000a9c437b8>] fc_lport_recv+0xb9/0x130 [libfc] [<00000000ad5be37b>] qedf_ll2_process_skb+0x73d/0xad0 [qedf] [<00000000e0eb6893>] process_one_work+0x382/0x6c0 [<000000002dfd9e21>] worker_thread+0x57/0x5c0 [<00000000b648204f>] kthread+0x1a0/0x1c0 [<0000000072f5ab20>] ret_from_fork+0x35/0x40 [<000000001d5c05d8>] 0xffffffffffffffff
Below is the log sequence which leads to memory leak. Here we get the RPORT_EV_READY and RPORT_EV_STOP back to back, which lead to overwrite the event RPORT_EV_READY by event RPORT_EV_STOP. Because of this, kref_count gets incremented by 1.
kernel: host0: rport fffce5: Received PLOGI request
kernel: host0: rport fffce5: Received PLOGI in INIT state
kernel: host0: rport fffce5: Port is Ready
kernel: host0: rport fffce5: Received PRLI request while in state Ready
kernel: host0: rport fffce5: PRLI rspp type 8 active 1 passive 0
kernel: host0: rport fffce5: Received LOGO request while in state Ready
kernel: host0: rport fffce5: Delete port
kernel: host0: rport fffce5: Received PLOGI request
kernel: host0: rport fffce5: Received PLOGI in state Delete - send busy
kernel: host0: rport fffce5: work event 3
kernel: host0: rport fffce5: lld callback ev 3
kernel: host0: rport fffce5: work delete
--- drivers/scsi/libfc/fc_rport.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/scsi/libfc/fc_rport.c +5 -4
@@ -483,10 +483,11 @@ static void fc_rport_enter_delete(struct fc_rport_priv *rdata,fc_rport_state_enter (rdata,RPORT_ST_DELETE ); -kref_get (&rdata->kref); -if (rdata->event ==RPORT_EV_NONE && - !queue_work (rport_event_queue, &rdata->event_work)) -kref_put (&rdata->kref, fc_rport_destroy); +if (rdata->event ==RPORT_EV_NONE ) { +kref_get (&rdata->kref); +if (!queue_work (rport_event_queue, &rdata->event_work)) +kref_put (&rdata->kref, fc_rport_destroy); + } rdata->event = event; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 309/388 selftests/x86/syscall_nt: Clear weird flags after each test
In reply to Greg Kroah-HartmanFrom: Andy Lutomirski <[email protected]>
[ Upstream commit a61fa2799ef9bf6c4f54cf7295036577cececc72 ]
Clear the weird flags before logging to improve strace output -- logging results while, say, TF is set does no one any favors.
--- tools/testing/selftests/x86/syscall_nt.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/x86/syscall_nt.c +1 -0
@@ -59,6 +59,7 @@ static void do_it(unsigned long extraflags)set_eflags (get_eflags () | extraflags);syscall (SYS_getpid); flags =get_eflags (); +set_eflags (X86_EFLAGS_IF |X86_EFLAGS_FIXED );if ((flags & extraflags) == extraflags) {printf ("[OK]\tThe syscall worked and flags are still set\n" ); }else {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 310/388 vfio/pci: fix racy on error and request eventfd ctx
In reply to Greg Kroah-HartmanFrom: Zeng Tao <[email protected]>
[ Upstream commit b872d0640840018669032b20b6375a478ed1f923 ]
The vfio_pci_release call will free and clear the error and request eventfd ctx while these ctx could be in use at the same time in the function like vfio_pci_request, and it's expected to protect them under the vdev->igate mutex, which is missing in vfio_pci_release.
This issue is introduced since commit 1518ac272e78 ("vfio/pci: fix memory leaks of eventfd ctx"),and since commit 5c5866c593bb ("vfio/pci: Clear error and request eventfd ctx after releasing"), it's very easily to trigger the kernel panic like this:
[ 9513.904346] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008 [ 9513.913091] Mem abort info: [ 9513.915871] ESR = 0x96000006 [ 9513.918912] EC = 0x25: DABT (current EL), IL = 32 bits [ 9513.924198] SET = 0, FnV = 0 [ 9513.927238] EA = 0, S1PTW = 0 [ 9513.930364] Data abort info: [ 9513.933231] ISV = 0, ISS = 0x00000006 [ 9513.937048] CM = 0, WnR = 0 [ 9513.940003] user pgtable: 4k pages, 48-bit VAs, pgdp=0000007ec7d12000 [ 9513.946414] [0000000000000008] pgd=0000007ec7d13003, p4d=0000007ec7d13003, pud=0000007ec728c003, pmd=0000000000000000 [ 9513.956975] Internal error: Oops: 96000006 [#1] PREEMPT SMP [ 9513.962521] Modules linked in: vfio_pci vfio_virqfd vfio_iommu_type1 vfio hclge hns3 hnae3 [last unloaded: vfio_pci] [ 9513.972998] CPU: 4 PID: 1327 Comm: bash Tainted: G W 5.8.0-rc4+ #3 [ 9513.980443] Hardware name: Huawei TaiShan 2280 V2/BC82AMDC, BIOS 2280-V2 CS V3.B270.01 05/08/2020 [ 9513.989274] pstate: 80400089 (Nzcv daIf +PAN -UAO BTYPE=--) [ 9513.994827] pc : _raw_spin_lock_irqsave+0x48/0x88 [ 9513.999515] lr : eventfd_signal+0x6c/0x1b0 [ 9514.003591] sp : ffff800038a0b960 [ 9514.006889] x29: ffff800038a0b960 x28: ffff007ef7f4da10 [ 9514.012175] x27: ffff207eefbbfc80 x26: ffffbb7903457000 [ 9514.017462] x25: ffffbb7912191000 x24: ffff007ef7f4d400 [ 9514.022747] x23: ffff20be6e0e4c00 x22: 0000000000000008 [ 9514.028033] x21: 0000000000000000 x20: 0000000000000000 [ 9514.033321] x19: 0000000000000008 x18: 0000000000000000 [ 9514.038606] x17: 0000000000000000 x16: ffffbb7910029328 [ 9514.043893] x15: 0000000000000000 x14: 0000000000000001 [ 9514.049179] x13: 0000000000000000 x12: 0000000000000002 [ 9514.054466] x11: 0000000000000000 x10: 0000000000000a00 [ 9514.059752] x9 : ffff800038a0b840 x8 : ffff007ef7f4de60 [ 9514.065038] x7 : ffff007fffc96690 x6 : fffffe01faffb748 [ 9514.070324] x5 : 0000000000000000 x4 : 0000000000000000 [ 9514.075609] x3 : 0000000000000000 x2 : 0000000000000001 [ 9514.080895] x1 : ffff007ef7f4d400 x0 : 0000000000000000 [ 9514.086181] Call trace: [ 9514.088618] _raw_spin_lock_irqsave+0x48/0x88 [ 9514.092954] eventfd_signal+0x6c/0x1b0 [ 9514.096691] vfio_pci_request+0x84/0xd0 [vfio_pci] [ 9514.101464] vfio_del_group_dev+0x150/0x290 [vfio] [ 9514.106234] vfio_pci_remove+0x30/0x128 [vfio_pci] [ 9514.111007] pci_device_remove+0x48/0x108 [ 9514.115001] device_release_driver_internal+0x100/0x1b8 [ 9514.120200] device_release_driver+0x28/0x38 [ 9514.124452] pci_stop_bus_device+0x68/0xa8 [ 9514.128528] pci_stop_and_remove_bus_device+0x20/0x38 [ 9514.133557] pci_iov_remove_virtfn+0xb4/0x128 [ 9514.137893] sriov_disable+0x3c/0x108 [ 9514.141538] pci_disable_sriov+0x28/0x38 [ 9514.145445] hns3_pci_sriov_configure+0x48/0xb8 [hns3] [ 9514.150558] sriov_numvfs_store+0x110/0x198 [ 9514.154724] dev_attr_store+0x44/0x60 [ 9514.158373] sysfs_kf_write+0x5c/0x78 [ 9514.162018] kernfs_fop_write+0x104/0x210 [ 9514.166010] __vfs_write+0x48/0x90 [ 9514.169395] vfs_write+0xbc/0x1c0 [ 9514.172694] ksys_write+0x74/0x100 [ 9514.176079] __arm64_sys_write+0x24/0x30 [ 9514.179987] el0_svc_common.constprop.4+0x110/0x200 [ 9514.184842] do_el0_svc+0x34/0x98 [ 9514.188144] el0_svc+0x14/0x40 [ 9514.191185] el0_sync_handler+0xb0/0x2d0 [ 9514.195088] el0_sync+0x140/0x180 [ 9514.198389] Code: b9001020 d2800000 52800022 f9800271 (885ffe61) [ 9514.204455] ---[ end trace 648de00c8406465f ]--- [ 9514.212308] note: bash[1327] exited with preempt_count 1
--- drivers/vfio/pci/vfio_pci.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/vfio/pci/vfio_pci.c +5 -0
@@ -474,14 +474,19 @@ static void vfio_pci_release(void *device_data)if (!(--vdev->refcnt)) {vfio_spapr_pci_eeh_release (vdev->pdev);vfio_pci_disable (vdev); +mutex_lock (&vdev->igate);if (vdev->err_trigger) {eventfd_ctx_put (vdev->err_trigger); vdev->err_trigger =NULL ; } +mutex_unlock (&vdev->igate); + +mutex_lock (&vdev->igate);if (vdev->req_trigger) {eventfd_ctx_put (vdev->req_trigger); vdev->req_trigger =NULL ; } +mutex_unlock (&vdev->igate); }mutex_unlock (&vdev->reflck->lock);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 311/388 btrfs: qgroup: fix data leak caused by race between writeback and truncate
In reply to Greg Kroah-HartmanFrom: Qu Wenruo <[email protected]>
[ Upstream commit fa91e4aa1716004ea8096d5185ec0451e206aea0 ]
[BUG]
When running tests like generic/013 on test device with btrfs quota enabled, it can normally lead to data leak, detected at unmount time:
BTRFS warning (device dm-3): qgroup 0/5 has unreleased space, type 0 rsv 4096
------------[ cut here ]------------ WARNING: CPU: 11 PID: 16386 at fs/btrfs/disk-io.c:4142 close_ctree+0x1dc/0x323 [btrfs] RIP: 0010:close_ctree+0x1dc/0x323 [btrfs] Call Trace: btrfs_put_super+0x15/0x17 [btrfs] generic_shutdown_super+0x72/0x110 kill_anon_super+0x18/0x30 btrfs_kill_super+0x17/0x30 [btrfs] deactivate_locked_super+0x3b/0xa0 deactivate_super+0x40/0x50 cleanup_mnt+0x135/0x190 __cleanup_mnt+0x12/0x20 task_work_run+0x64/0xb0 __prepare_exit_to_usermode+0x1bc/0x1c0 __syscall_return_slowpath+0x47/0x230 do_syscall_64+0x64/0xb0 entry_SYSCALL_64_after_hwframe+0x44/0xa9 ---[ end trace caf08beafeca2392 ]--- BTRFS error (device dm-3): qgroup reserved space leaked
[CAUSE]
In the offending case, the offending operations are:
2/6: writev f2X[269 1 0 0 0 0] [1006997,67,288] 0 2/7: truncate f2X[269 1 0 0 48 1026293] 18388 0
The following sequence of events could happen after the writev():
CPU1 (writeback) | CPU2 (truncate)
-----------------------------------------------------------------
btrfs_writepages() |
|- extent_write_cache_pages() |
|- Got page for 1003520 |
| 1003520 is Dirty, no writeback |
| So (!clear_page_dirty_for_io()) |
| gets called for it |
|- Now page 1003520 is Clean. |
| | btrfs_setattr()
| | |- btrfs_setsize()
| | |- truncate_setsize()
| | New i_size is 18388
|- __extent_writepage() |
| |- page_offset() > i_size |
|- btrfs_invalidatepage() |
|- Page is clean, so no qgroup |callback executed
This means, the qgroup reserved data space is not properly released in btrfs_invalidatepage() as the page is Clean.
[FIX]
Instead of checking the dirty bit of a page, call btrfs_qgroup_free_data() unconditionally in btrfs_invalidatepage().
As qgroup rsv are completely bound to the QGROUP_RESERVED bit of io_tree, not bound to page status, thus we won't cause double freeing anyway.
--- fs/btrfs/inode.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-)
fs/btrfs/inode.c +10 -13
@@ -9044,20 +9044,17 @@ again:/* * Qgroup reserved space handler * Page here will be either -* 1) Already written to disk -* In this case, its reserved space is released from data rsv map -* and will be freed by delayed_ref handler finally. -* So even we call qgroup_free_data(), it won't decrease reserved -* space. -* 2) Not written to disk -* This means the reserved space should be freed here. However, -* if a truncate invalidates the page (by clearing PageDirty) -* and the page is accounted for while allocating extent -* in btrfs_check_data_free_space() we let delayed_ref to -* free the entire extent. +* 1) Already written to disk or ordered extent already submitted +* Then its QGROUP_RESERVED bit in io_tree is already cleaned. +* Qgroup will be handled by its qgroup_record then. +* btrfs_qgroup_free_data() call will do nothing here. +* +* 2) Not written to disk yet +* Then btrfs_qgroup_free_data() call will clear the QGROUP_RESERVED +* bit of its io_tree, and free the qgroup reserved data space. +* Since the IO will never happen for this page. */ -if (PageDirty (page)) -btrfs_qgroup_free_data (inode,NULL , page_start,PAGE_SIZE ); +btrfs_qgroup_free_data (inode,NULL , page_start,PAGE_SIZE );if (!inode_evicting) { clear_extent_bit(tree, page_start, page_end, EXTENT_LOCKED | EXTENT_DELALLOC | EXTENT_DELALLOC_NEW |
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 312/388 perf tests: Fix test 68 zstd compression for s390
In reply to Greg Kroah-HartmanFrom: Thomas Richter <[email protected]>
[ Upstream commit 463538a383a27337cb83ae195e432a839a52d639 ]
Commit 5aa98879efe7 ("s390/cpum_sf: prohibit callchain data collection") prohibits call graph sampling for hardware events on s390. The information recorded is out of context and does not match.
On s390 this commit now breaks test case 68 Zstd perf.data compression/decompression.
Therefore omit call graph sampling on s390 in this test.
Output before:
[root@t35lp46 perf]# ./perf test -Fv 68
68: Zstd perf.data compression/decompression :
--- start ---
Collecting compressed record file:
Error:
cycles: PMU Hardware doesn't support sampling/overflow-interrupts.
Try 'perf stat'
---- end ----
Zstd perf.data compression/decompression: FAILED! [root@t35lp46 perf]#
Output after:
[root@t35lp46 perf]# ./perf test -Fv 68
68: Zstd perf.data compression/decompression :
--- start ---
Collecting compressed record file:
500+0 records in
500+0 records out
256000 bytes (256 kB, 250 KiB) copied, 0.00615638 s, 41.6 MB/s [ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.004 MB /tmp/perf.data.X3M,
compressed (original 0.002 MB, ratio is 3.609) ]
Checking compressed events stats:
# compressed : Zstd, level = 1, ratio = 4
COMPRESSED events: 1
2ELIFREPh---- end ----
Zstd perf.data compression/decompression: Ok
[root@t35lp46 perf]#--- tools/perf/tests/shell/record+zstd_comp_decomp.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/tests/shell/record+zstd_comp_decomp.sh +2 -1
@@ -12,7 +12,8 @@ skip_if_no_z_record() { collect_z_record() { echo "Collecting compressed record file:" - $perf_tool record -o $trace_file -g -z -F 5000 -- \ + [[ "$(uname -m)" != s390x ]] && gflag='-g' + $perf_tool record -o $trace_file $gflag -z -F 5000 -- \ dd count=500 if=/dev/urandom of=/dev/null }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 313/388 scsi: qla2xxx: Retry PLOGI on FC-NVMe PRLI failure
In reply to Greg Kroah-HartmanFrom: Quinn Tran <[email protected]>
[ Upstream commit 983f127603fac650fa34ee69db363e4615eaf9e7 ]
Current code will send PRLI with FC-NVMe bit set for the targets which support only FCP. This may result into issue with targets which do not understand NVMe and will go into a strange state. This patch would restart the login process by going back to PLOGI state. The PLOGI state will force the target to respond to correct PRLI request.
--- drivers/scsi/qla2xxx/qla_init.c | 28 ++++------------------------ drivers/scsi/qla2xxx/qla_iocb.c | 6 +++++- 2 files changed, 9 insertions(+), 25 deletions(-)
drivers/scsi/qla2xxx/qla_init.c +4 -24
@@ -1911,33 +1911,13 @@ qla24xx_handle_prli_done_event(struct scsi_qla_host *vha, struct event_arg *ea)"%s %d %8phC post fc4 prli\n" , __func__, __LINE__, ea->fcport->port_name); ea->fcport->fc4f_nvme =0 ; -qla24xx_post_prli_work (vha, ea->fcport);return ; } -/* at this point both PRLI NVME & PRLI FCP failed */ -if (N2N_TOPO (vha->hw)) { -if (ea->fcport->n2n_link_reset_cnt <3 ) { - ea->fcport->n2n_link_reset_cnt++; -/* -* remote port is not sending Plogi. Reset -* link to kick start his state machine -*/ -set_bit (N2N_LINK_RESET , &vha->dpc_flags); - }else { -ql_log (ql_log_warn, vha,0x2119 , -"%s %d %8phC Unable to reconnect\n" , - __func__, __LINE__, ea->fcport->port_name); - } - }else { -/* -* switch connect. login failed. Take connection -* down and allow relogin to retrigger -*/ - ea->fcport->flags &= ~FCF_ASYNC_SENT ; - ea->fcport->keep_nport_handle =0 ; -qlt_schedule_sess_for_deletion (ea->fcport); - } + ea->fcport->flags &= ~FCF_ASYNC_SENT ; + ea->fcport->keep_nport_handle =0 ; + ea->fcport->logout_on_delete =1 ; +qlt_schedule_sess_for_deletion (ea->fcport);break ; } }
drivers/scsi/qla2xxx/qla_iocb.c +5 -1
@@ -2773,6 +2773,7 @@ static void qla2x00_els_dcmd2_sp_done(srb_t *sp, int res) ea.sp = sp;qla24xx_handle_plogi_done_event (vha, &ea);break ; +case CS_IOCB_ERROR :switch (fw_status[1 ]) {case LSC_SCODE_PORTID_USED :
@@ -2843,6 +2844,7 @@ static void qla2x00_els_dcmd2_sp_done(srb_t *sp, int res) fw_status[0], fw_status[1], fw_status[2]); fcport->flags &= ~FCF_ASYNC_SENT ; + fcport->disc_state =DSC_LOGIN_FAILED ;set_bit (RELOGIN_NEEDED , &vha->dpc_flags);break ; }
@@ -2855,6 +2857,7 @@ static void qla2x00_els_dcmd2_sp_done(srb_t *sp, int res) fw_status[0], fw_status[1], fw_status[2]); sp->fcport->flags &= ~FCF_ASYNC_SENT ; + sp->fcport->disc_state =DSC_LOGIN_FAILED ;set_bit (RELOGIN_NEEDED , &vha->dpc_flags);break ; }
@@ -2890,11 +2893,12 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode,return -ENOMEM ; } + fcport->flags |=FCF_ASYNC_SENT ; + fcport->disc_state =DSC_LOGIN_PEND ; elsio = &sp->u.iocb_cmd;ql_dbg (ql_dbg_io, vha,0x3073 ,"Enter: PLOGI portid=%06x\n" , fcport->d_id.b24); - fcport->flags |=FCF_ASYNC_SENT ; sp->type =SRB_ELS_DCMD ; sp->name ="ELS_DCMD" ; sp->fcport = fcport;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 314/388 ubi: fastmap: Free unused fastmap anchor peb during detach
In reply to Greg Kroah-HartmanFrom: Hou Tao <[email protected]>
[ Upstream commit c16f39d14a7e0ec59881fbdb22ae494907534384 ]
When CONFIG_MTD_UBI_FASTMAP is enabled, fm_anchor will be assigned a free PEB during ubi_wl_init() or ubi_update_fastmap(). However if fastmap is not used or disabled on the MTD device, ubi_wl_entry related with the PEB will not be freed during detach.
So Fix it by freeing the unused fastmap anchor during detach.
--- drivers/mtd/ubi/fastmap-wl.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
drivers/mtd/ubi/fastmap-wl.c +13 -2
@@ -39,6 +39,13 @@ static struct ubi_wl_entry *find_anchor_wl_entry(struct rb_root *root)return victim; } +static inline void return_unused_peb (struct ubi_device *ubi, +struct ubi_wl_entry *e) +{ +wl_tree_add (e, &ubi->free); + ubi->free_count++; +} +/** * return_unused_pool_pebs - returns unused PEB to the free tree. * @ubi: UBI device description object
@@ -52,8 +59,7 @@ static void return_unused_pool_pebs(struct ubi_device *ubi,for (i = pool->used; i < pool->size; i++) { e = ubi->lookuptbl[pool->pebs[i]]; -wl_tree_add (e, &ubi->free); - ubi->free_count++; +return_unused_peb (ubi, e); } }
@@ -361,6 +367,11 @@ static void ubi_fastmap_close(struct ubi_device *ubi)return_unused_pool_pebs (ubi, &ubi->fm_pool);return_unused_pool_pebs (ubi, &ubi->fm_wl_pool); +if (ubi->fm_anchor) { +return_unused_peb (ubi, ubi->fm_anchor); + ubi->fm_anchor =NULL ; + } +if (ubi->fm) {for (i =0 ; i < ubi->fm->used_blocks; i++)kfree (ubi->fm->e[i]);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 315/388 mt76: fix LED link time failure
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit d68f4e43a46ff1f772ff73085f96d44eb4163e9d ]
The mt76_led_cleanup() function is called unconditionally, which leads to a link error when CONFIG_LEDS is a loadable module or disabled but mt76 is built-in:
drivers/net/wireless/mediatek/mt76/mac80211.o: In function `mt76_unregister_device':
mac80211.c:(.text+0x2ac): undefined reference to `led_classdev_unregister'
Use the same trick that is guarding the registration, using an IS_ENABLED() check for the CONFIG_MT76_LEDS symbol that indicates whether LEDs can be used or not.
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +2 -1
@@ -368,7 +368,8 @@ void mt76_unregister_device(struct mt76_dev *dev) {struct ieee80211_hw *hw = dev->hw; -mt76_led_cleanup (dev); +if (IS_ENABLED (CONFIG_MT76_LEDS )) +mt76_led_cleanup (dev);mt76_tx_status_check (dev,NULL , true);ieee80211_unregister_hw (hw); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 316/388 opp: Increase parsed_static_opps in _of_add_opp_table_v1()
In reply to Greg Kroah-HartmanFrom: Walter Lozano <[email protected]>
[ Upstream commit 6544abc520f0fff701e9da382110dc29676c683a ]
Currently, when using _of_add_opp_table_v2 parsed_static_opps is increased and this value is used in _opp_remove_all_static() to check if there are static opp entries that need to be freed. Unfortunately this does not happen when using _of_add_opp_table_v1(), which leads to warnings.
This patch increases parsed_static_opps in _of_add_opp_table_v1() in a similar way as in _of_add_opp_table_v2().
[ Viresh: Do the operation with lock held and set the value to 1 instead
of incrementing it ]
--- drivers/opp/of.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/opp/of.c +4 -0
@@ -733,6 +733,10 @@ static int _of_add_opp_table_v1(struct device *dev, struct opp_table *opp_table)return -EINVAL ; } +mutex_lock (&opp_table->lock); + opp_table->parsed_static_opps =1 ; +mutex_unlock (&opp_table->lock); + val = prop->value;while (nr) {unsigned long freq =be32_to_cpup (val++) *1000 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 317/388 perf parse-events: Use strcmp() to compare the PMU name
In reply to Greg Kroah-HartmanFrom: Jin Yao <[email protected]>
[ Upstream commit 8510895bafdbf7c4dd24c22946d925691135c2b2 ]
A big uncore event group is split into multiple small groups which only include the uncore events from the same PMU. This has been supported in the commit 3cdc5c2cb924a ("perf parse-events: Handle uncore event aliases in small groups properly").
If the event's PMU name starts to repeat, it must be a new event. That can be used to distinguish the leader from other members. But now it only compares the pointer of pmu_name (leader->pmu_name == evsel->pmu_name).
If we use "perf stat -M LLC_MISSES.PCIE_WRITE -a" on cascadelakex, the event list is:
evsel->name evsel->pmu_name
---------------------------------------------------------------
unc_iio_data_req_of_cpu.mem_write.part0 uncore_iio_4 (as leader)
unc_iio_data_req_of_cpu.mem_write.part0 uncore_iio_2
unc_iio_data_req_of_cpu.mem_write.part0 uncore_iio_0
unc_iio_data_req_of_cpu.mem_write.part0 uncore_iio_5
unc_iio_data_req_of_cpu.mem_write.part0 uncore_iio_3
unc_iio_data_req_of_cpu.mem_write.part0 uncore_iio_1
unc_iio_data_req_of_cpu.mem_write.part1 uncore_iio_4
......
For the event "unc_iio_data_req_of_cpu.mem_write.part1" with "uncore_iio_4", it should be the event from PMU "uncore_iio_4". It's not a new leader for this PMU.
But if we use "(leader->pmu_name == evsel->pmu_name)", the check would be failed and the event is stored to leaders[] as a new PMU leader.
So this patch uses strcmp to compare the PMU name between events.
--- tools/perf/util/parse-events.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
tools/perf/util/parse-events.c +2 -3
@@ -1505,12 +1505,11 @@ parse_events__set_leader_for_uncore_alia* event. That can be used to distinguish the leader from * other members, even they have the same event name. */ -if ((leader != evsel) && (leader->pmu_name == evsel->pmu_name)) { +if ((leader != evsel) && + !strcmp (leader->pmu_name, evsel->pmu_name)) { is_leader = false;continue ; } -/* The name is always alias name */ -WARN_ON (strcmp (leader->name, evsel->name));/* Store the leader event for each PMU */ leaders[nr_pmu++] = (uintptr_t ) evsel;
Greg Kroah-Hartman
maintainerPATCH 318/388 ALSA: hda: Always use jackpoll helper for jack update after resume
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit 8d6762af302d69f76fa788a277a56a9d9cd275d5 ]
HD-audio codec driver applies a tricky procedure to forcibly perform the runtime resume by mimicking the usage count even if the device has been runtime-suspended beforehand. This was needed to assure to trigger the jack detection update after the system resume.
And recently we also applied the similar logic to the HD-audio controller side. However this seems leading to some inconsistency, and eventually PCI controller gets screwed up.
This patch is an attempt to fix and clean up those behavior: instead of the tricky runtime resume procedure, the existing jackpoll work is scheduled when such a forced codec resume is required. The jackpoll work will power up the codec, and this alone should suffice for the jack status update in usual cases. If the extra polling is requested (by checking codec->jackpoll_interval), the manual update is invoked after that, and the codec is powered down again.
Also, we filter the spurious wake up of the codec from the controller runtime resume by checking codec->relaxed_resume flag. If this flag is set, basically we don't need to wake up explicitly, but it's supposed to be done via the audio component notifier.
--- sound/pci/hda/hda_codec.c | 28 +++++++++++++++++----------- sound/pci/hda/hda_intel.c | 17 ++--------------- 2 files changed, 19 insertions(+), 26 deletions(-)
sound/pci/hda/hda_codec.c +17 -11
@@ -641,8 +641,18 @@ static void hda_jackpoll_work(struct work_struct *work)struct hda_codec *codec = container_of(work, struct hda_codec, jackpoll_work.work); -snd_hda_jack_set_dirty_all (codec); -snd_hda_jack_poll_all (codec); +/* for non-polling trigger: we need nothing if already powered on */ +if (!codec->jackpoll_interval &&snd_hdac_is_power_on (&codec->core)) +return ; + +/* the power-up/down sequence triggers the runtime resume */ +snd_hda_power_up_pm (codec); +/* update jacks manually if polling is required, too */ +if (codec->jackpoll_interval) { +snd_hda_jack_set_dirty_all (codec); +snd_hda_jack_poll_all (codec); + } +snd_hda_power_down_pm (codec);if (!codec->jackpoll_interval)return ;
@@ -2958,18 +2968,14 @@ static int hda_codec_runtime_resume(struct device *dev)static int hda_codec_force_resume (struct device *dev) {struct hda_codec *codec =dev_to_hda_codec (dev); -bool forced_resume =hda_codec_need_resume (codec);int ret; -/* The get/put pair below enforces the runtime resume even if the -* device hasn't been used at suspend time. This trick is needed to -* update the jack state change during the sleep. -*/ -if (forced_resume) -pm_runtime_get_noresume (dev); ret =pm_runtime_force_resume (dev); -if (forced_resume) -pm_runtime_put (dev); +/* schedule jackpoll work for jack detection update */ +if (codec->jackpoll_interval || + (pm_runtime_suspended (dev) &&hda_codec_need_resume (codec))) +schedule_delayed_work (&codec->jackpoll_work, + codec->jackpoll_interval);return ret; }
sound/pci/hda/hda_intel.c +2 -15
@@ -1002,7 +1002,8 @@ static void __azx_runtime_resume(struct azx *chip, bool from_rt)if (status && from_rt) {list_for_each_codec (codec, &chip->bus) -if (status & (1 << codec->addr)) +if (!codec->relaxed_resume && + (status & (1 << codec->addr)))schedule_delayed_work (&codec->jackpoll_work, codec->jackpoll_interval); }
@@ -1041,9 +1042,7 @@ static int azx_suspend(struct device *dev)static int azx_resume (struct device *dev) {struct snd_card *card =dev_get_drvdata (dev); -struct hda_codec *codec;struct azx *chip; -bool forced_resume = false;if (!azx_is_pm_ready (card))return 0 ;
@@ -1055,19 +1054,7 @@ static int azx_resume(struct device *dev)if (azx_acquire_irq (chip,1 ) <0 )return -EIO ; -/* check for the forced resume */ -list_for_each_codec (codec, &chip->bus) { -if (hda_codec_need_resume (codec)) { - forced_resume = true; -break ; - } - } - -if (forced_resume) -pm_runtime_get_noresume (dev);pm_runtime_force_resume (dev); -if (forced_resume) -pm_runtime_put (dev);snd_power_change_state (card,SNDRV_CTL_POWER_D0 );trace_azx_resume (chip);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 319/388 ALSA: hda: Workaround for spurious wakeups on some Intel platforms
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit a6630529aecb5a3e84370c376ed658e892e6261e ]
We've received a regression report on Intel HD-audio controller that wakes up immediately after S3 suspend. The bisection leads to the commit c4c8dd6ef807 ("ALSA: hda: Skip controller resume if not needed"). This commit replaces the system-suspend to use pm_runtime_force_suspend() instead of the direct call of __azx_runtime_suspend(). However, by some really mysterious reason, pm_runtime_force_suspend() causes a spurious wakeup (although it calls the same __azx_runtime_suspend() internally).
As an ugly workaround for now, revert the behavior to call __azx_runtime_suspend() and __azx_runtime_resume() for those old Intel platforms that may exhibit such a problem, while keeping the new standard pm_runtime_force_suspend() and pm_runtime_force_resume() pair for the remaining chips.
--- sound/pci/hda/hda_controller.h | 2 +- sound/pci/hda/hda_intel.c | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-)
sound/pci/hda/hda_controller.h +1 -1
@@ -41,7 +41,7 @@/* 24 unused */ #define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25)/* Take LPIB as delay */ #define AZX_DCAPS_PM_RUNTIME (1 << 26)/* runtime PM support */ -/* 27 unused */ +#define AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP (1 << 27)/* Workaround for spurious wakeups after suspend */ #define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28)/* CORBRP clears itself after reset */ #define AZX_DCAPS_NO_MSI64 (1 << 29)/* Stick to 32-bit MSIs */ #define AZX_DCAPS_SEPARATE_STREAM_TAG (1 << 30)/* capture and playback use separate stream tag */
sound/pci/hda/hda_intel.c +14 -3
@@ -295,7 +295,8 @@ enum {/* PCH for HSW/BDW; with runtime PM */ /* no i915 binding for this as HSW/BDW has another controller for HDMI */ #define AZX_DCAPS_INTEL_PCH \ - (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME) + (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME |\ + AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP)/* HSW HDMI */ #define AZX_DCAPS_INTEL_HASWELL \
@@ -1026,7 +1027,14 @@ static int azx_suspend(struct device *dev) chip = card->private_data; bus =azx_bus (chip);snd_power_change_state (card, SNDRV_CTL_POWER_D3hot); -pm_runtime_force_suspend (dev); +/* An ugly workaround: direct call of __azx_runtime_suspend() and +* __azx_runtime_resume() for old Intel platforms that suffer from +* spurious wakeups after S3 suspend +*/ +if (chip->driver_caps &AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP ) +__azx_runtime_suspend (chip); +else +pm_runtime_force_suspend (dev);if (bus->irq >=0 ) {free_irq (bus->irq, chip); bus->irq =-1 ;
@@ -1054,7 +1062,10 @@ static int azx_resume(struct device *dev)if (azx_acquire_irq (chip,1 ) <0 )return -EIO ; -pm_runtime_force_resume (dev); +if (chip->driver_caps &AZX_DCAPS_SUSPEND_SPURIOUS_WAKEUP ) +__azx_runtime_resume (chip, false); +else +pm_runtime_force_resume (dev);snd_power_change_state (card,SNDRV_CTL_POWER_D0 );trace_azx_resume (chip);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 320/388 net: openvswitch: use div_u64() for 64-by-32 divisions
In reply to Greg Kroah-HartmanFrom: Tonghao Zhang <[email protected]>
[ Upstream commit 659d4587fe7233bfdff303744b20d6f41ad04362 ]
Compile the kernel for arm 32 platform, the build warning found. To fix that, should use div_u64() for divisions.
| net/openvswitch/meter.c:396: undefined reference to `__udivdi3'
[add more commit msg, change reported tag, and use div_u64 instead of do_div by Tonghao]
--- net/openvswitch/meter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/openvswitch/meter.c +1 -1
@@ -252,7 +252,7 @@ static struct dp_meter *dp_meter_create(struct nlattr **a)* Start with a full bucket. */ band->bucket = (band->burst_size + band->rate) *1000ULL ; - band_max_delta_t = band->bucket / band->rate; + band_max_delta_t =div_u64 (band->bucket, band->rate);if (band_max_delta_t > meter->max_delta_t) meter->max_delta_t = band_max_delta_t; band++;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 321/388 nvme: explicitly update mpath disk capacity on revalidation
In reply to Greg Kroah-HartmanFrom: Anthony Iliopoulos <[email protected]>
[ Upstream commit 05b29021fba5e725dd385151ef00b6340229b500 ]
Commit 3b4b19721ec652 ("nvme: fix possible deadlock when I/O is blocked") reverted multipath head disk revalidation due to deadlocks caused by holding the bd_mutex during revalidate.
Updating the multipath disk blockdev size is still required though for userspace to be able to observe any resizing while the device is mounted. Directly update the bdev inode size to avoid unnecessarily holding the bdev->bd_mutex.
blocked")
--- drivers/nvme/host/core.c | 1 + drivers/nvme/host/nvme.h | 13 +++++++++++++ 2 files changed, 14 insertions(+)
drivers/nvme/host/core.c +1 -0
@@ -1864,6 +1864,7 @@ 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); +nvme_mpath_update_disk_size (ns->head->disk); }#endif }
drivers/nvme/host/nvme.h +13 -0
@@ -561,6 +561,16 @@ static inline void nvme_trace_bio_complete(struct request *req, req->bio, status); } +static inline void nvme_mpath_update_disk_size (struct gendisk *disk) +{ +struct block_device *bdev =bdget_disk (disk,0 ); + +if (bdev) { +bd_set_size (bdev,get_capacity (disk) <<SECTOR_SHIFT ); +bdput (bdev); + } +} +extern struct device_attribute dev_attr_ana_grpid;extern struct device_attribute dev_attr_ana_state;extern struct device_attribute subsys_attr_iopolicy;
@@ -636,6 +646,9 @@ static inline void nvme_mpath_wait_freeze(struct nvme_subsystem *subsys)static inline void nvme_mpath_start_freeze (struct nvme_subsystem *subsys) { } +static inline void nvme_mpath_update_disk_size (struct gendisk *disk) +{ +}#endif /* CONFIG_NVME_MULTIPATH */ #ifdef CONFIG_NVM
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 322/388 device_cgroup: Fix RCU list debugging warning
In reply to Greg Kroah-HartmanFrom: Amol Grover <[email protected]>
[ Upstream commit bc62d68e2a0a69fcdcf28aca8edb01abf306b698 ]
exceptions may be traversed using list_for_each_entry_rcu() outside of an RCU read side critical section BUT under the protection of decgroup_mutex. Hence add the corresponding lockdep expression to fix the following false-positive warning:
[ 2.304417] ============================= [ 2.304418] WARNING: suspicious RCU usage [ 2.304420] 5.5.4-stable #17 Tainted: G E [ 2.304422] ----------------------------- [ 2.304424] security/device_cgroup.c:355 RCU-list traversed in non-reader section!!
--- security/device_cgroup.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
security/device_cgroup.c +2 -1
@@ -352,7 +352,8 @@ static bool match_exception_partial(struct list_head *exceptions, short type, {struct dev_exception_item *ex; -list_for_each_entry_rcu (ex, exceptions, list) { +list_for_each_entry_rcu (ex, exceptions, list, +lockdep_is_held (&devcgroup_mutex)) {if ((type &DEVCG_DEV_BLOCK ) && !(ex->type &DEVCG_DEV_BLOCK ))continue ;if ((type &DEVCG_DEV_CHAR ) && !(ex->type &DEVCG_DEV_CHAR ))
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 323/388 ASoC: pcm3168a: ignore 0 Hz settings
In reply to Greg Kroah-HartmanFrom: Kuninori Morimoto <[email protected]>
[ Upstream commit 7ad26d6671db758c959d7e1d100b138a38483612 ]
Some sound card try to set 0 Hz as reset, but it is impossible. This patch ignores it to avoid error return.
--- sound/soc/codecs/pcm3168a.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/soc/codecs/pcm3168a.c +7 -0
@@ -302,6 +302,13 @@ static int pcm3168a_set_dai_sysclk(struct snd_soc_dai *dai,struct pcm3168a_priv *pcm3168a =snd_soc_component_get_drvdata (dai->component);int ret; +/* +* Some sound card sets 0 Hz as reset, +* but it is impossible to set. Ignore it here +*/ +if (freq ==0 ) +return 0 ; +if (freq >PCM3168A_MAX_SYSCLK )return -EINVAL ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 324/388 ASoC: wm8994: Skip setting of the WM8994_MICBIAS register for WM1811
In reply to Greg Kroah-HartmanFrom: Sylwester Nawrocki <[email protected]>
[ Upstream commit 811c5494436789e7149487c06e0602b507ce274b ]
The WM8994_MICBIAS register is not available in the WM1811 CODEC so skip initialization of that register for that device.
This suppresses an error during boot:
"wm8994-codec: ASoC: error at snd_soc_component_update_bits on wm8994-codec"
--- sound/soc/codecs/wm8994.c | 2 ++ sound/soc/codecs/wm_hubs.c | 3 +++ sound/soc/codecs/wm_hubs.h | 1 + 3 files changed, 6 insertions(+)
sound/soc/codecs/wm8994.c +2 -0
@@ -4047,11 +4047,13 @@ static int wm8994_component_probe(struct snd_soc_component *component) wm8994->hubs.dcs_readback_mode =2 ;break ; } + wm8994->hubs.micd_scthr = true;break ;case WM8958 : wm8994->hubs.dcs_readback_mode =1 ; wm8994->hubs.hp_startup_mode =1 ; + wm8994->hubs.micd_scthr = true;switch (control->revision) {case 0 :
sound/soc/codecs/wm_hubs.c +3 -0
@@ -1223,6 +1223,9 @@ int wm_hubs_handle_analogue_pdata(struct snd_soc_component *component,snd_soc_component_update_bits (component,WM8993_ADDITIONAL_CONTROL ,WM8993_LINEOUT2_FB ,WM8993_LINEOUT2_FB ); +if (!hubs->micd_scthr) +return 0 ; + snd_soc_component_update_bits(component, WM8993_MICBIAS, WM8993_JD_SCTHR_MASK | WM8993_JD_THR_MASK | WM8993_MICB1_LVL | WM8993_MICB2_LVL,
sound/soc/codecs/wm_hubs.h +1 -0
@@ -27,6 +27,7 @@ struct wm_hubs_data {int hp_startup_mode;int series_startup;int no_series_update; +bool micd_scthr;bool no_cache_dac_hp_direct;struct list_head dcs_cache;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 325/388 ASoC: wm8994: Ensure the device is resumed in wm89xx_mic_detect functions
In reply to Greg Kroah-HartmanFrom: Sylwester Nawrocki <[email protected]>
[ Upstream commit f5a2cda4f1db89776b64c4f0f2c2ac609527ac70 ]
When the wm8958_mic_detect, wm8994_mic_detect functions get called from the machine driver, e.g. from the card's late_probe() callback, the CODEC device may be PM runtime suspended and any regmap writes have no effect. Add PM runtime calls to these functions to ensure the device registers are updated as expected.
This suppresses an error during boot
"wm8994-codec: ASoC: error at snd_soc_component_update_bits on wm8994-codec" caused by the regmap access error due to the cache_only flag being set.
--- sound/soc/codecs/wm8994.c | 8 ++++++++ 1 file changed, 8 insertions(+)
sound/soc/codecs/wm8994.c +8 -0
@@ -3372,6 +3372,8 @@ int wm8994_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *return -EINVAL ; } +pm_runtime_get_sync (component->dev); +switch (micbias) {case 1 : micdet = &wm8994->micdet[0 ];
@@ -3419,6 +3421,8 @@ int wm8994_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *snd_soc_dapm_sync (dapm); +pm_runtime_put (component->dev); +return 0 ; }EXPORT_SYMBOL_GPL (wm8994_mic_detect);
@@ -3786,6 +3790,8 @@ int wm8958_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *return -EINVAL ; } +pm_runtime_get_sync (component->dev); +if (jack) {snd_soc_dapm_force_enable_pin (dapm,"CLK_SYS" );snd_soc_dapm_sync (dapm);
@@ -3854,6 +3860,8 @@ int wm8958_mic_detect(struct snd_soc_component *component, struct snd_soc_jack *snd_soc_dapm_sync (dapm); } +pm_runtime_put (component->dev); +return 0 ; }EXPORT_SYMBOL_GPL (wm8958_mic_detect);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 326/388 ASoC: Intel: bytcr_rt5640: Add quirk for MPMAN Converter9 2-in-1
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 6a0137101f47301fff2da6ba4b9048383d569909 ]
The MPMAN Converter9 2-in-1 almost fully works with out default settings. The only problem is that it has only 1 speaker so any sounds only playing on the right channel get lost.
Add a quirk for this model using the default settings + MONO_SPEAKER.
--- sound/soc/intel/boards/bytcr_rt5640.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
sound/soc/intel/boards/bytcr_rt5640.c +10 -0
@@ -591,6 +591,16 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {BYT_RT5640_SSP0_AIF1 | BYT_RT5640_MCLK_EN), }, + { /* MPMAN Converter 9, similar hw as the I.T.Works TW891 2-in-1 */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"MPMAN" ), + DMI_MATCH(DMI_PRODUCT_NAME, "Converter9"), + }, + .driver_data = (void *)(BYTCR_INPUT_DEFAULTS | +BYT_RT5640_MONO_SPEAKER | +BYT_RT5640_SSP0_AIF1 | + BYT_RT5640_MCLK_EN), + }, {/* MPMAN MPWIN895CL */ .matches = {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 327/388 RISC-V: Take text_mutex in ftrace_init_nop()
In reply to Greg Kroah-HartmanFrom: Palmer Dabbelt <[email protected]>
[ Upstream commit 66d18dbda8469a944dfec6c49d26d5946efba218 ]
Without this we get lockdep failures. They're spurious failures as SMP isn't up when ftrace_init_nop() is called. As far as I can tell the easiest fix is to just take the lock, which also seems like the safest fix.
--- arch/riscv/include/asm/ftrace.h | 7 +++++++ arch/riscv/kernel/ftrace.c | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+)
arch/riscv/include/asm/ftrace.h +7 -0
@@ -63,4 +63,11 @@ do { \* Let auipc+jalr be the basic *mcount unit*, so we make it 8 bytes here. */ #define MCOUNT_INSN_SIZE 8 + +#ifndef __ASSEMBLY__ +struct dyn_ftrace ; +int ftrace_init_nop (struct module *mod,struct dyn_ftrace *rec); +#define ftrace_init_nop ftrace_init_nop +#endif +#endif
arch/riscv/kernel/ftrace.c +19 -0
@@ -88,6 +88,25 @@ int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec,return __ftrace_modify_call (rec->ip, addr, false); } + +/* +* This is called early on, and isn't wrapped by +* ftrace_arch_code_modify_{prepare,post_process}() and therefor doesn't hold +* text_mutex, which triggers a lockdep failure. SMP isn't running so we could +* just directly poke the text, but it's simpler to just take the lock +* ourselves. +*/ +int ftrace_init_nop (struct module *mod,struct dyn_ftrace *rec) +{ +int out; + +ftrace_arch_code_modify_prepare (); + out =ftrace_make_nop (mod, rec,MCOUNT_ADDR ); +ftrace_arch_code_modify_post_process (); + +return out; +} +int ftrace_update_ftrace_func (ftrace_func_t func) { int ret = __ftrace_modify_call((unsigned long)&ftrace_call,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 328/388 i2c: aspeed: Mask IRQ status to relevant bits
In reply to Greg Kroah-HartmanFrom: Eddie James <[email protected]>
[ Upstream commit 1a1d6db23ddacde0b15ea589e9103373e05af8de ]
Mask the IRQ status to only the bits that the driver checks. This prevents excessive driver warnings when operating in slave mode when additional bits are set that the driver doesn't handle.
--- drivers/i2c/busses/i2c-aspeed.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/i2c/busses/i2c-aspeed.c +2 -0
@@ -69,6 +69,7 @@* These share bit definitions, so use the same values for the enable & * status bits. */ +#define ASPEED_I2CD_INTR_RECV_MASK 0xf000ffff#define ASPEED_I2CD_INTR_SDA_DL_TIMEOUT BIT(14)#define ASPEED_I2CD_INTR_BUS_RECOVER_DONE BIT(13)#define ASPEED_I2CD_INTR_SLAVE_MATCH BIT(7)
@@ -604,6 +605,7 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id)writel (irq_received & ~ASPEED_I2CD_INTR_RX_DONE , bus->base +ASPEED_I2C_INTR_STS_REG );readl (bus->base +ASPEED_I2C_INTR_STS_REG ); + irq_received &=ASPEED_I2CD_INTR_RECV_MASK ; irq_remaining = irq_received;#if IS_ENABLED (CONFIG_I2C_SLAVE )
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 329/388 s390/init: add missing __init annotations
In reply to Greg Kroah-HartmanFrom: Ilya Leoshkevich <[email protected]>
[ Upstream commit fcb2b70cdb194157678fb1a75f9ff499aeba3d2a ]
Add __init to reserve_memory_end, reserve_oldmem and remove_oldmem. Sometimes these functions are not inlined, and then the build complains about section mismatch.
--- arch/s390/kernel/setup.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/s390/kernel/setup.c +3 -3
@@ -627,7 +627,7 @@ static struct notifier_block kdump_mem_nb = {/* * Make sure that the area behind memory_end is protected */ -static void reserve_memory_end (void ) +static void __init reserve_memory_end (void ) {if (memory_end_set)memblock_reserve (memory_end,ULONG_MAX );
@@ -636,7 +636,7 @@ static void reserve_memory_end(void)/* * Make sure that oldmem, where the dump is stored, is protected */ -static void reserve_oldmem (void ) +static void __init reserve_oldmem (void ) {#ifdef CONFIG_CRASH_DUMP if (OLDMEM_BASE )
@@ -648,7 +648,7 @@ static void reserve_oldmem(void)/* * Make sure that oldmem, where the dump is stored, is protected */ -static void remove_oldmem (void ) +static void __init remove_oldmem (void ) {#ifdef CONFIG_CRASH_DUMP if (OLDMEM_BASE )
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 330/388 lockdep: fix order in trace_hardirqs_off_caller()
In reply to Greg Kroah-HartmanFrom: Sven Schnelle <[email protected]>
[ Upstream commit 73ac74c7d489756d2313219a108809921dbfaea1 ]
Switch order so that locking state is consistent even if the IRQ tracer calls into lockdep again.
--- kernel/trace/trace_preemptirq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/trace/trace_preemptirq.c +2 -2
@@ -63,14 +63,14 @@ NOKPROBE_SYMBOL(trace_hardirqs_on_caller); __visible void trace_hardirqs_off_caller(unsigned long caller_addr) { +lockdep_hardirqs_off (CALLER_ADDR0 ); +if (!this_cpu_read (tracing_irq_cpu)) {this_cpu_write (tracing_irq_cpu,1 );tracer_hardirqs_off (CALLER_ADDR0 , caller_addr);if (!in_nmi ())trace_irq_disable_rcuidle (CALLER_ADDR0 , caller_addr); } - -lockdep_hardirqs_off (CALLER_ADDR0 ); }EXPORT_SYMBOL (trace_hardirqs_off_caller);NOKPROBE_SYMBOL (trace_hardirqs_off_caller);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 331/388 EDAC/ghes: Check whether the driver is on the safe list correctly
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
[ Upstream commit 251c54ea26fa6029b01a76161a37a12fde5124e4 ]
With CONFIG_DEBUG_TEST_DRIVER_REMOVE=y, a system would try to probe, unregister and probe again a driver.
When ghes_edac is attempted to be loaded on a system which is not on the safe platforms list, ghes_edac_register() would return early. The unregister counterpart ghes_edac_unregister() would still attempt to unregister and exit early at the refcount test, leading to the refcount underflow below.
In order to not do *anything* on the unregister path too, reuse the force_load parameter and check it on that path too, before fumbling with the refcount.
ghes_edac: ghes_edac_register: entry
ghes_edac: ghes_edac_register: return -ENODEV
------------[ cut here ]------------ refcount_t: underflow; use-after-free. WARNING: CPU: 10 PID: 1 at lib/refcount.c:28 refcount_warn_saturate+0xb9/0x100 Modules linked in: CPU: 10 PID: 1 Comm: swapper/0 Not tainted 5.9.0-rc4+ #12 Hardware name: GIGABYTE MZ01-CE1-00/MZ01-CE1-00, BIOS F02 08/29/2018 RIP: 0010:refcount_warn_saturate+0xb9/0x100 Code: 82 e8 fb 8f 4d 00 90 0f 0b 90 90 c3 80 3d 55 4c f5 00 00 75 88 c6 05 4c 4c f5 00 01 90 48 c7 c7 d0 8a 10 82 e8 d8 8f 4d 00 90 <0f> 0b 90 90 c3 80 3d 30 4c f5 00 00 0f 85 61 ff ff ff c6 05 23 4c RSP: 0018:ffffc90000037d58 EFLAGS: 00010292 RAX: 0000000000000026 RBX: ffff88840b8da000 RCX: 0000000000000000 RDX: 0000000000000001 RSI: ffffffff8216b24f RDI: 00000000ffffffff RBP: ffff88840c662e00 R08: 0000000000000001 R09: 0000000000000001 R10: 0000000000000001 R11: 0000000000000046 R12: 0000000000000000 R13: 0000000000000001 R14: 0000000000000000 R15: 0000000000000000 FS: 0000000000000000(0000) GS:ffff88840ee80000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000000 CR3: 0000800002211000 CR4: 00000000003506e0 Call Trace: ghes_edac_unregister ghes_remove platform_drv_remove really_probe driver_probe_device device_driver_attach __driver_attach ? device_driver_attach ? device_driver_attach bus_for_each_dev bus_add_driver driver_register ? bert_init ghes_init do_one_initcall ? rcu_read_lock_sched_held kernel_init_freeable ? rest_init kernel_init ret_from_fork ... ghes_edac: ghes_edac_unregister: FALSE, refcount: -1073741824
--- drivers/edac/ghes_edac.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/edac/ghes_edac.c +4 -0
@@ -488,6 +488,7 @@ int ghes_edac_register(struct ghes *ghes, struct device *dev)if (!force_load && idx <0 )return -ENODEV ; }else { + force_load = true; idx =0 ; }
@@ -586,6 +587,9 @@ void ghes_edac_unregister(struct ghes *ghes)struct mem_ctl_info *mci;unsigned long flags; +if (!force_load) +return ; +mutex_lock (&ghes_reg_mutex);if (!refcount_dec_and_test (&ghes_refcount))
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 332/388 drm/amdkfd: fix a memory leak issue
In reply to Greg Kroah-HartmanFrom: Dennis Li <[email protected]>
[ Upstream commit 087d764159996ae378b08c0fdd557537adfd6899 ]
In the resume stage of GPU recovery, start_cpsch will call pm_init which set pm->allocated as false, cause the next pm_release_ib has no chance to release ib memory.
Add pm_release_ib in stop_cpsch which will be called in the suspend stage of GPU recovery.
--- drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +2 -0
@@ -1075,6 +1075,8 @@ static int stop_cpsch(struct device_queue_manager *dqm)unmap_queues_cpsch (dqm,KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES ,0 );dqm_unlock (dqm); +pm_release_ib (&dqm->packets); +kfd_gtt_sa_free (dqm->dev, dqm->fence_mem);pm_uninit (&dqm->packets);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 333/388 drm/amd/display: update nv1x stutter latencies
In reply to Greg Kroah-HartmanFrom: Jun Lei <[email protected]>
[ Upstream commit c4790a8894232f39c25c7c546c06efe074e63384 ]
[why]
Recent characterization shows increased stutter latencies on some SKUs, leading to underflow.
[how]
Update SOC params to account for this worst case latency.
--- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +2 -2
@@ -340,8 +340,8 @@ struct _vcs_dpi_soc_bounding_box_st dcn2_0_nv14_soc = { }, }, .num_states = 5, - .sr_exit_time_us = 8.6, - .sr_enter_plus_exit_time_us = 10.9, + .sr_exit_time_us = 11.6, + .sr_enter_plus_exit_time_us = 13.9, .urgent_latency_us = 4.0, .urgent_latency_pixel_data_only_us = 4.0, .urgent_latency_pixel_mixed_with_vm_data_us = 4.0,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 334/388 drm/amdgpu/dc: Require primary plane to be enabled whenever the CRTC is
In reply to Greg Kroah-HartmanFrom: Michel Dänzer <[email protected]>
[ Upstream commit 2f228aab21bbc74e90e267a721215ec8be51daf7 ]
Don't check drm_crtc_state::active for this either, per its documentation in include/drm/drm_crtc.h:
* Hence drivers must not consult @active in their various
* &drm_mode_config_funcs.atomic_check callback to reject an atomic
* commit.
atomic_remove_fb disables the CRTC as needed for disabling the primary plane.
This prevents at least the following problems if the primary plane gets disabled (e.g. due to destroying the FB assigned to the primary plane, as happens e.g. with mutter in Wayland mode):
* The legacy cursor ioctl returned EINVAL for a non-0 cursor FB ID (which enables the cursor plane).
* If the cursor plane was enabled, changing the legacy DPMS property value from off to on returned EINVAL.
v2:
* Minor changes to code comment and commit log, per review feedback.
GitLab: https://gitlab.gnome.org/GNOME/mutter/-/issues/1108
GitLab: https://gitlab.gnome.org/GNOME/mutter/-/issues/1165
GitLab: https://gitlab.gnome.org/GNOME/mutter/-/issues/1344
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 32 ++++++------------- 1 file changed, 10 insertions(+), 22 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +10 -22
@@ -4299,19 +4299,6 @@ static void dm_crtc_helper_disable(struct drm_crtc *crtc) { } -static bool does_crtc_have_active_cursor (struct drm_crtc_state *new_crtc_state) -{ -struct drm_device *dev = new_crtc_state->crtc->dev; -struct drm_plane *plane; - -drm_for_each_plane_mask (plane, dev, new_crtc_state->plane_mask) { -if (plane->type ==DRM_PLANE_TYPE_CURSOR ) -return true; - } - -return false; -} -static int count_crtc_active_planes (struct drm_crtc_state *new_crtc_state) {struct drm_atomic_state *state = new_crtc_state->state;
@@ -4391,19 +4378,20 @@ static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc,return ret; } -/* In some use cases, like reset, no stream is attached */ -if (!dm_crtc_state->stream) -return 0 ; -/* -* We want at least one hardware plane enabled to use -* the stream with a cursor enabled. +* We require the primary plane to be enabled whenever the CRTC is, otherwise +* drm_mode_cursor_universal may end up trying to enable the cursor plane while all other +* planes are disabled, which is not supported by the hardware. And there is legacy +* userspace which stops using the HW cursor altogether in response to the resulting EINVAL. */ -if (state->enable && state->active && -does_crtc_have_active_cursor (state) && - dm_crtc_state->active_planes ==0 ) +if (state->enable && + !(state->plane_mask &drm_plane_mask (crtc->primary)))return -EINVAL ; +/* In some use cases, like reset, no stream is attached */ +if (!dm_crtc_state->stream) +return 0 ; +if (dc_validate_stream (dc, dm_crtc_state->stream) ==DC_OK )return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 335/388 i2c: core: Call i2c_acpi_install_space_handler() before i2c_acpi_register_devices()
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 21653a4181ff292480599dad996a2b759ccf050f ]
Some ACPI i2c-devices _STA method (which is used to detect if the device is present) use autodetection code which probes which device is present over i2c. This requires the I2C ACPI OpRegion handler to be registered before we enumerate i2c-clients under the i2c-adapter.
This fixes the i2c touchpad on the Lenovo ThinkBook 14-IIL and ThinkBook 15 IIL not getting an i2c-client instantiated and thus not working.
--- drivers/i2c/i2c-core-base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/i2c-core-base.c +1 -1
@@ -1385,8 +1385,8 @@ static int i2c_register_adapter(struct i2c_adapter *adap)/* create pre-declared device nodes */ of_i2c_register_devices (adap); -i2c_acpi_register_devices (adap);i2c_acpi_install_space_handler (adap); +i2c_acpi_register_devices (adap);if (adap->nr < __i2c_first_dynamic_bus_num)i2c_scan_static_board_info (adap);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 336/388 objtool: Fix noreturn detection for ignored functions
In reply to Greg Kroah-HartmanFrom: Josh Poimboeuf <[email protected]>
[ Upstream commit db6c6a0df840e3f52c84cc302cc1a08ba11a4416 ]
When a function is annotated with STACK_FRAME_NON_STANDARD, objtool doesn't validate its code paths. It also skips sibling call detection within the function.
But sibling call detection is actually needed for the case where the ignored function doesn't have any return instructions. Otherwise objtool naively marks the function as implicit static noreturn, which affects the reachability of its callers, resulting in "unreachable instruction" warnings.
Fix it by just enabling sibling call detection for ignored functions. The 'insn->ignore' check in add_jump_destinations() is no longer needed after
e6da9567959e ("objtool: Don't use ignore flag for fake jumps").
Fixes the following warning:
arch/x86/kvm/vmx/vmx.o: warning: objtool: vmx_handle_exit_irqoff()+0x142: unreachable instruction
which triggers on an allmodconfig with CONFIG_GCOV_KERNEL unset.
--- tools/objtool/check.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/objtool/check.c +1 -1
@@ -556,7 +556,7 @@ static int add_jump_destinations(struct objtool_file *file) insn->type != INSN_JUMP_UNCONDITIONAL)continue ; -if (insn->ignore || insn->offset ==FAKE_JUMP_OFFSET ) +if (insn->offset ==FAKE_JUMP_OFFSET )continue ; rela = find_rela_by_dest_range(insn->sec, insn->offset,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 337/388 ieee802154: fix one possible memleak in ca8210_dev_com_init
In reply to Greg Kroah-HartmanFrom: Liu Jian <[email protected]>
[ Upstream commit 88f46b3fe2ac41c381770ebad9f2ee49346b57a2 ]
We should call destroy_workqueue to destroy mlme_workqueue in error branch.
--- drivers/net/ieee802154/ca8210.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ieee802154/ca8210.c +1 -0
@@ -2924,6 +2924,7 @@ static int ca8210_dev_com_init(struct ca8210_priv *priv) );if (!priv->irq_workqueue) {dev_crit (&priv->spi->dev,"alloc of irq_workqueue failed!\n" ); +destroy_workqueue (priv->mlme_workqueue);return -ENOMEM ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 338/388 ieee802154/adf7242: check status of adf7242_read_reg
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
[ Upstream commit e3914ed6cf44bfe1f169e26241f8314556fd1ac1 ]
Clang static analysis reports this error
adf7242.c:887:6: warning: Assigned value is garbage or undefined
len = len_u8;
^ ~~~~~~len_u8 is set in
adf7242_read_reg(lp, 0, &len_u8);
When this call fails, len_u8 is not set.
So check the return code.
--- drivers/net/ieee802154/adf7242.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ieee802154/adf7242.c +3 -1
@@ -882,7 +882,9 @@ static int adf7242_rx(struct adf7242_local *lp)int ret;u8 lqi, len_u8, *data; -adf7242_read_reg (lp,0 , &len_u8); + ret =adf7242_read_reg (lp,0 , &len_u8); +if (ret) +return ret; len = len_u8;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 339/388 clocksource/drivers/h8300_timer8: Fix wrong return value in h8300_8timer_init()
In reply to Greg Kroah-HartmanFrom: Tianjia Zhang <[email protected]>
[ Upstream commit 400d033f5a599120089b5f0c54d14d198499af5a ]
In the init function, if the call to of_iomap() fails, the return value is ENXIO instead of -ENXIO.
Change to the right negative errno.
--- drivers/clocksource/h8300_timer8.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clocksource/h8300_timer8.c +1 -1
@@ -169,7 +169,7 @@ static int __init h8300_8timer_init(struct device_node *node)return PTR_ERR (clk); } - ret =ENXIO ; + ret = -ENXIO ; base =of_iomap (node,0 );if (!base) {pr_err ("failed to map registers for clockevent\n" );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 340/388 mwifiex: Increase AES key storage size to 256 bits
In reply to Greg Kroah-HartmanFrom: Maximilian Luz <[email protected]>
[ Upstream commit 4afc850e2e9e781976fb2c7852ce7bac374af938 ]
Following commit e18696786548 ("mwifiex: Prevent memory corruption handling keys") the mwifiex driver fails to authenticate with certain networks, specifically networks with 256 bit keys, and repeatedly asks for the password. The kernel log repeats the following lines (id and bssid redacted):
mwifiex_pcie 0000:01:00.0: info: trying to associate to '<id>' bssid <bssid> mwifiex_pcie 0000:01:00.0: info: associated to bssid <bssid> successfully mwifiex_pcie 0000:01:00.0: crypto keys added
mwifiex_pcie 0000:01:00.0: info: successfully disconnected from <bssid>: reason code 3
Tracking down this problem lead to the overflow check introduced by the aforementioned commit into mwifiex_ret_802_11_key_material_v2(). This check fails on networks with 256 bit keys due to the current storage size for AES keys in struct mwifiex_aes_param being only 128 bit.
To fix this issue, increase the storage size for AES keys to 256 bit.
--- drivers/net/wireless/marvell/mwifiex/fw.h | 2 +- drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
drivers/net/wireless/marvell/mwifiex/fw.h +1 -1
@@ -953,7 +953,7 @@ struct mwifiex_tkip_param {struct mwifiex_aes_param {u8 pn[WPA_PN_SIZE ];__le16 key_len; -u8 key[WLAN_KEY_LEN_CCMP ]; +u8 key[WLAN_KEY_LEN_CCMP_256 ]; } __packed;struct mwifiex_wapi_param {
drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c +2 -2
@@ -619,7 +619,7 @@ static int mwifiex_ret_802_11_key_material_v2(struct mwifiex_private *priv, key_v2 = &resp->params.key_material_v2; len =le16_to_cpu (key_v2->key_param_set.key_params.aes.key_len); -if (len >WLAN_KEY_LEN_CCMP ) +if (len >sizeof (key_v2->key_param_set.key_params.aes.key))return -EINVAL ;if (le16_to_cpu (key_v2->action) == HostCmd_ACT_GEN_SET) {
@@ -635,7 +635,7 @@ static int mwifiex_ret_802_11_key_material_v2(struct mwifiex_private *priv,return 0 ;memset (priv->aes_key_v2.key_param_set.key_params.aes.key,0 , -WLAN_KEY_LEN_CCMP ); +sizeof (key_v2->key_param_set.key_params.aes.key)); priv->aes_key_v2.key_param_set.key_params.aes.key_len =cpu_to_le16 (len); memcpy(priv->aes_key_v2.key_param_set.key_params.aes.key,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 341/388 batman-adv: bla: fix type misuse for backbone_gw hash indexing
In reply to Greg Kroah-HartmanFrom: Linus Lüssing <[email protected]>
[ Upstream commit 097930e85f90f252c44dc0d084598265dd44ca48 ]
It seems that due to a copy & paste error the void pointer in batadv_choose_backbone_gw() is cast to the wrong type.
Fixing this by using "struct batadv_bla_backbone_gw" instead of "struct batadv_bla_claim" which better matches the caller's side.
For now it seems that we were lucky because the two structs both have their orig/vid and addr/vid in the beginning. However I stumbled over this issue when I was trying to add some debug variables in front of "orig" in batadv_backbone_gw, which caused hash lookups to fail.
--- net/batman-adv/bridge_loop_avoidance.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/batman-adv/bridge_loop_avoidance.c +4 -3
@@ -83,11 +83,12 @@ static inline u32 batadv_choose_claim(const void *data, u32 size)*/ static inline u32 batadv_choose_backbone_gw (const void *data,u32 size) { -const struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data; +const struct batadv_bla_backbone_gw *gw;u32 hash =0 ; - hash =jhash (&claim->addr,sizeof (claim->addr), hash); - hash =jhash (&claim->vid,sizeof (claim->vid), hash); + gw = (struct batadv_bla_backbone_gw *)data; + hash =jhash (&gw->orig,sizeof (gw->orig), hash); + hash =jhash (&gw->vid,sizeof (gw->vid), hash);return hash % size; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 342/388 atm: eni: fix the missed pci_disable_device() for eni_init_one()
In reply to Greg Kroah-HartmanFrom: Jing Xiangfeng <[email protected]>
[ Upstream commit c2b947879ca320ac5505c6c29a731ff17da5e805 ]
eni_init_one() misses to call pci_disable_device() in an error path. Jump to err_disable to fix it.
--- drivers/atm/eni.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/atm/eni.c +1 -1
@@ -2245,7 +2245,7 @@ static int eni_init_one(struct pci_dev *pci_dev, rc =dma_set_mask_and_coherent (&pci_dev->dev,DMA_BIT_MASK (32 ));if (rc <0 ) - goto out; + goto err_disable; rc = -ENOMEM ; eni_dev =kmalloc (sizeof (struct eni_dev ),GFP_KERNEL );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 343/388 batman-adv: mcast/TT: fix wrongly dropped or rerouted packets
In reply to Greg Kroah-HartmanFrom: Linus Lüssing <[email protected]>
[ Upstream commit 7dda5b3384121181c4e79f6eaeac2b94c0622c8d ]
The unicast packet rerouting code makes several assumptions. For instance it assumes that there is always exactly one destination in the TT. This breaks for multicast frames in a unicast packets in several ways:
For one thing if there is actually no TT entry and the destination node was selected due to the multicast tvlv flags it announced. Then an intermediate node will wrongly drop the packet.
For another thing if there is a TT entry but the TTVN of this entry is newer than the originally addressed destination node: Then the intermediate node will wrongly redirect the packet, leading to duplicated multicast packets at a multicast listener and missing packets at other multicast listeners or multicast routers.
Fixing this by not applying the unicast packet rerouting to batman-adv unicast packets with a multicast payload. We are not able to detect a roaming multicast listener at the moment and will just continue to send the multicast frame to both the new and old destination for a while in case of such a roaming multicast listener.
--- net/batman-adv/routing.c | 4 ++++ 1 file changed, 4 insertions(+)
net/batman-adv/routing.c +4 -0
@@ -826,6 +826,10 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv, vid =batadv_get_vid (skb, hdr_len); ethhdr = (struct ethhdr *)(skb->data + hdr_len); +/* do not reroute multicast frames in a unicast header */ +if (is_multicast_ether_addr (ethhdr->h_dest)) +return true; +/* check if the destination client was served by this node and it is now * roaming. In this case, it means that the node has got a ROAM_ADV * message and that it knows the new destination in the mesh to re-route
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 344/388 netfilter: conntrack: nf_conncount_init is failing with IPv6 disabled
In reply to Greg Kroah-HartmanFrom: Eelco Chaudron <[email protected]>
[ Upstream commit 526e81b990e53e31ba40ba304a2285ffd098721f ]
The openvswitch module fails initialization when used in a kernel without IPv6 enabled. nf_conncount_init() fails because the ct code unconditionally tries to initialize the netns IPv6 related bit, regardless of the build option. The change below ignores the IPv6 part if not enabled.
Note that the corresponding _put() function already has this IPv6 configuration check.
--- net/netfilter/nf_conntrack_proto.c | 2 ++ 1 file changed, 2 insertions(+)
net/netfilter/nf_conntrack_proto.c +2 -0
@@ -565,6 +565,7 @@ static int nf_ct_netns_inet_get(struct net *net)int err; err =nf_ct_netns_do_get (net,NFPROTO_IPV4 ); +#if IS_ENABLED (CONFIG_IPV6 )if (err <0 ) goto err1; err =nf_ct_netns_do_get (net,NFPROTO_IPV6 );
@@ -575,6 +576,7 @@ static int nf_ct_netns_inet_get(struct net *net) err2:nf_ct_netns_put (net,NFPROTO_IPV4 ); err1: +#endif return err; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 345/388 mac802154: tx: fix use-after-free
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 0ff4628f4c6c1ab87eef9f16b25355cadc426d64 ]
syzbot reported a bug in ieee802154_tx() [1]
A similar issue in ieee802154_xmit_worker() is also fixed in this patch.
[1]
BUG: KASAN: use-after-free in ieee802154_tx+0x3d2/0x480 net/mac802154/tx.c:88
Read of size 4 at addr ffff8880251a8c70 by task syz-executor.3/928
CPU: 0 PID: 928 Comm: syz-executor.3 Not tainted 5.9.0-rc3-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Call Trace:
__dump_stack lib/dump_stack.c:77 [inline]
dump_stack+0x198/0x1fd lib/dump_stack.c:118
print_address_description.constprop.0.cold+0xae/0x497 mm/kasan/report.c:383
__kasan_report mm/kasan/report.c:513 [inline]
kasan_report.cold+0x1f/0x37 mm/kasan/report.c:530
ieee802154_tx+0x3d2/0x480 net/mac802154/tx.c:88
ieee802154_subif_start_xmit+0xbe/0xe4 net/mac802154/tx.c:130
__netdev_start_xmit include/linux/netdevice.h:4634 [inline]
netdev_start_xmit include/linux/netdevice.h:4648 [inline]
dev_direct_xmit+0x4e9/0x6e0 net/core/dev.c:4203
packet_snd net/packet/af_packet.c:2989 [inline]
packet_sendmsg+0x2413/0x5290 net/packet/af_packet.c:3014
sock_sendmsg_nosec net/socket.c:651 [inline]
sock_sendmsg+0xcf/0x120 net/socket.c:671
____sys_sendmsg+0x6e8/0x810 net/socket.c:2353
___sys_sendmsg+0xf3/0x170 net/socket.c:2407
__sys_sendmsg+0xe5/0x1b0 net/socket.c:2440
do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x44/0xa9
RIP: 0033:0x45d5b9
Code: 5d b4 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 2b b4 fb ff c3 66 2e 0f 1f 84 00 00 00 00
RSP: 002b:00007fc98e749c78 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
RAX: ffffffffffffffda RBX: 000000000002ccc0 RCX: 000000000045d5b9
RDX: 0000000000000000 RSI: 0000000020007780 RDI: 000000000000000b
RBP: 000000000118d020 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 000000000118cfec
R13: 00007fff690c720f R14: 00007fc98e74a9c0 R15: 000000000118cfec
Allocated by task 928:
kasan_save_stack+0x1b/0x40 mm/kasan/common.c:48
kasan_set_track mm/kasan/common.c:56 [inline]
__kasan_kmalloc.constprop.0+0xbf/0xd0 mm/kasan/common.c:461
slab_post_alloc_hook mm/slab.h:518 [inline]
slab_alloc_node mm/slab.c:3254 [inline]
kmem_cache_alloc_node+0x136/0x3e0 mm/slab.c:3574
__alloc_skb+0x71/0x550 net/core/skbuff.c:198
alloc_skb include/linux/skbuff.h:1094 [inline]
alloc_skb_with_frags+0x92/0x570 net/core/skbuff.c:5771
sock_alloc_send_pskb+0x72a/0x880 net/core/sock.c:2348
packet_alloc_skb net/packet/af_packet.c:2837 [inline]
packet_snd net/packet/af_packet.c:2932 [inline]
packet_sendmsg+0x19fb/0x5290 net/packet/af_packet.c:3014
sock_sendmsg_nosec net/socket.c:651 [inline]
sock_sendmsg+0xcf/0x120 net/socket.c:671
____sys_sendmsg+0x6e8/0x810 net/socket.c:2353
___sys_sendmsg+0xf3/0x170 net/socket.c:2407
__sys_sendmsg+0xe5/0x1b0 net/socket.c:2440
do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x44/0xa9
Freed by task 928:
kasan_save_stack+0x1b/0x40 mm/kasan/common.c:48
kasan_set_track+0x1c/0x30 mm/kasan/common.c:56
kasan_set_free_info+0x1b/0x30 mm/kasan/generic.c:355
__kasan_slab_free+0xd8/0x120 mm/kasan/common.c:422
__cache_free mm/slab.c:3418 [inline]
kmem_cache_free.part.0+0x74/0x1e0 mm/slab.c:3693
kfree_skbmem+0xef/0x1b0 net/core/skbuff.c:622
__kfree_skb net/core/skbuff.c:679 [inline]
consume_skb net/core/skbuff.c:838 [inline]
consume_skb+0xcf/0x160 net/core/skbuff.c:832
__dev_kfree_skb_any+0x9c/0xc0 net/core/dev.c:3107
fakelb_hw_xmit+0x20e/0x2a0 drivers/net/ieee802154/fakelb.c:81
drv_xmit_async net/mac802154/driver-ops.h:16 [inline]
ieee802154_tx+0x282/0x480 net/mac802154/tx.c:81
ieee802154_subif_start_xmit+0xbe/0xe4 net/mac802154/tx.c:130
__netdev_start_xmit include/linux/netdevice.h:4634 [inline]
netdev_start_xmit include/linux/netdevice.h:4648 [inline]
dev_direct_xmit+0x4e9/0x6e0 net/core/dev.c:4203
packet_snd net/packet/af_packet.c:2989 [inline]
packet_sendmsg+0x2413/0x5290 net/packet/af_packet.c:3014
sock_sendmsg_nosec net/socket.c:651 [inline]
sock_sendmsg+0xcf/0x120 net/socket.c:671
____sys_sendmsg+0x6e8/0x810 net/socket.c:2353
___sys_sendmsg+0xf3/0x170 net/socket.c:2407
__sys_sendmsg+0xe5/0x1b0 net/socket.c:2440
do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x44/0xa9
The buggy address belongs to the object at ffff8880251a8c00
which belongs to the cache skbuff_head_cache of size 224
The buggy address is located 112 bytes inside of
224-byte region [ffff8880251a8c00, ffff8880251a8ce0)
The buggy address belongs to the page:
page:0000000062b6a4f1 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x251a8
flags: 0xfffe0000000200(slab)
raw: 00fffe0000000200 ffffea0000435c88 ffffea00028b6c08 ffff8880a9055d00
raw: 0000000000000000 ffff8880251a80c0 000000010000000c 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff8880251a8b00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff8880251a8b80: fb fb fb fb fc fc fc fc fc fc fc fc fc fc fc fc
>ffff8880251a8c00: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff8880251a8c80: fb fb fb fb fb fb fb fb fb fb fb fb fc fc fc fc
ffff8880251a8d00: fc fc fc fc fc fc fc fc fa fb fb fb fb fb fb fb--- net/mac802154/tx.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/mac802154/tx.c +5 -3
@@ -34,11 +34,11 @@ void ieee802154_xmit_worker(struct work_struct *work)if (res) goto err_tx; -ieee802154_xmit_complete (&local->hw, skb, false); - dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; +ieee802154_xmit_complete (&local->hw, skb, false); +return ; err_tx:
@@ -78,6 +78,8 @@ ieee802154_tx(struct ieee802154_local *local, struct sk_buff *skb)/* async is priority, otherwise sync is fallback */ if (local->ops->xmit_async) { +unsigned int len = skb->len; + ret =drv_xmit_async (local, skb);if (ret) {ieee802154_wake_queue (&local->hw);
@@ -85,7 +87,7 @@ ieee802154_tx(struct ieee802154_local *local, struct sk_buff *skb) } dev->stats.tx_packets++; - dev->stats.tx_bytes += skb->len; + dev->stats.tx_bytes += len; }else { local->tx_skb = skb;queue_work (local->workqueue, &local->tx_work);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 346/388 bpf: Fix clobbering of r2 in bpf_gen_ld_abs
In reply to Greg Kroah-HartmanFrom: Daniel Borkmann <[email protected]>
[ Upstream commit e6a18d36118bea3bf497c9df4d9988b6df120689 ]
Bryce reported that he saw the following with:
0: r6 = r1 1: r1 = 12 2: r0 = *(u16 *)skb[r1]
The xlated sequence was incorrectly clobbering r2 with pointer value of r6 ...
0: (bf) r6 = r1
1: (b7) r1 = 12
2: (bf) r1 = r6
3: (bf) r2 = r1
4: (85) call bpf_skb_load_helper_16_no_cache#7692160
... and hence call to the load helper never succeeded given the offset was too high. Fix it by reordering the load of r6 to r1.
Other than that the insn has similar calling convention than BPF helpers, that is, r0 - r5 are scratch regs, so nothing else affected after the insn.
--- net/core/filter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/core/filter.c +2 -2
@@ -6791,8 +6791,6 @@ static int bpf_gen_ld_abs(const struct bpf_insn *orig,bool indirect =BPF_MODE (orig->code) ==BPF_IND ;struct bpf_insn *insn = insn_buf; -/* We're guaranteed here that CTX is in R6. */ - *insn++ =BPF_MOV64_REG (BPF_REG_1 ,BPF_REG_CTX );if (!indirect) { *insn++ =BPF_MOV64_IMM (BPF_REG_2 , orig->imm); }else {
@@ -6800,6 +6798,8 @@ static int bpf_gen_ld_abs(const struct bpf_insn *orig,if (orig->imm) *insn++ =BPF_ALU64_IMM (BPF_ADD ,BPF_REG_2 , orig->imm); } +/* We're guaranteed here that CTX is in R6. */ + *insn++ =BPF_MOV64_REG (BPF_REG_1 ,BPF_REG_CTX );switch (BPF_SIZE (orig->code)) {case BPF_B :
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 347/388 drm/vc4/vc4_hdmi: fill ASoC card owner
In reply to Greg Kroah-HartmanFrom: Marek Szyprowski <[email protected]>
[ Upstream commit ec653df2a0cbc306a4bfcb0e3484d318fa779002 ]
card->owner is a required property and since commit 81033c6b584b ("ALSA:
core: Warn on empty module") a warning is issued if it is empty. Fix lack of it. This fixes following warning observed on RaspberryPi 3B board with ARM 32bit kernel and multi_v7_defconfig:
------------[ cut here ]------------ WARNING: CPU: 1 PID: 210 at sound/core/init.c:207 snd_card_new+0x378/0x398 [snd] Modules linked in: vc4(+) snd_soc_core ac97_bus snd_pcm_dmaengine bluetooth snd_pcm snd_timer crc32_arm_ce raspberrypi_hwmon snd soundcore ecdh_generic ecc bcm2835_thermal phy_generic CPU: 1 PID: 210 Comm: systemd-udevd Not tainted 5.8.0-rc1-00027-g81033c6b584b #1087 Hardware name: BCM2835 [<c03113c0>] (unwind_backtrace) from [<c030bcb4>] (show_stack+0x10/0x14) [<c030bcb4>] (show_stack) from [<c071cef8>] (dump_stack+0xd4/0xe8) [<c071cef8>] (dump_stack) from [<c0345bfc>] (__warn+0xdc/0xf4) [<c0345bfc>] (__warn) from [<c0345cc4>] (warn_slowpath_fmt+0xb0/0xb8) [<c0345cc4>] (warn_slowpath_fmt) from [<bf02ff74>] (snd_card_new+0x378/0x398 [snd]) [<bf02ff74>] (snd_card_new [snd]) from [<bf11f0b4>] (snd_soc_bind_card+0x280/0x99c [snd_soc_core]) [<bf11f0b4>] (snd_soc_bind_card [snd_soc_core]) from [<bf12f000>] (devm_snd_soc_register_card+0x34/0x6c [snd_soc_core]) [<bf12f000>] (devm_snd_soc_register_card [snd_soc_core]) from [<bf165654>] (vc4_hdmi_bind+0x43c/0x5f4 [vc4]) [<bf165654>] (vc4_hdmi_bind [vc4]) from [<c09d660c>] (component_bind_all+0xec/0x24c) [<c09d660c>] (component_bind_all) from [<bf15c44c>] (vc4_drm_bind+0xd4/0x174 [vc4]) [<bf15c44c>] (vc4_drm_bind [vc4]) from [<c09d6ac0>] (try_to_bring_up_master+0x160/0x1b0) [<c09d6ac0>] (try_to_bring_up_master) from [<c09d6f38>] (component_master_add_with_match+0xd0/0x104) [<c09d6f38>] (component_master_add_with_match) from [<bf15c588>] (vc4_platform_drm_probe+0x9c/0xbc [vc4]) [<bf15c588>] (vc4_platform_drm_probe [vc4]) from [<c09df740>] (platform_drv_probe+0x6c/0xa4) [<c09df740>] (platform_drv_probe) from [<c09dd6f0>] (really_probe+0x210/0x350) [<c09dd6f0>] (really_probe) from [<c09dd940>] (driver_probe_device+0x5c/0xb4) [<c09dd940>] (driver_probe_device) from [<c09ddb38>] (device_driver_attach+0x58/0x60) [<c09ddb38>] (device_driver_attach) from [<c09ddbc0>] (__driver_attach+0x80/0xbc) [<c09ddbc0>] (__driver_attach) from [<c09db820>] (bus_for_each_dev+0x68/0xb4) [<c09db820>] (bus_for_each_dev) from [<c09dc9f8>] (bus_add_driver+0x130/0x1e8) [<c09dc9f8>] (bus_add_driver) from [<c09de648>] (driver_register+0x78/0x110) [<c09de648>] (driver_register) from [<c0302038>] (do_one_initcall+0x50/0x220) [<c0302038>] (do_one_initcall) from [<c03db544>] (do_init_module+0x60/0x210) [<c03db544>] (do_init_module) from [<c03da4f8>] (load_module+0x1e34/0x2338) [<c03da4f8>] (load_module) from [<c03dac00>] (sys_finit_module+0xac/0xbc) [<c03dac00>] (sys_finit_module) from [<c03000c0>] (ret_fast_syscall+0x0/0x54) Exception stack(0xeded9fa8 to 0xeded9ff0) ... ---[ end trace 6414689569c2bc08 ]---
--- drivers/gpu/drm/vc4/vc4_hdmi.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/vc4/vc4_hdmi.c +1 -0
@@ -1125,6 +1125,7 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *hdmi) card->num_links =1 ; card->name ="vc4-hdmi" ; card->dev = dev; + card->owner =THIS_MODULE ;/* * Be careful, snd_soc_register_card() calls dev_set_drvdata() and
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 348/388 net: qed: Disable aRFS for NPAR and 100G
In reply to Greg Kroah-HartmanFrom: Dmitry Bogdanov <[email protected]>
[ Upstream commit 2d2fe8433796603091ac8ea235b9165ac5a85f9a ]
In CMT and NPAR the PF is unknown when the GFS block processes the packet. Therefore cannot use searcher as it has a per PF database, and thus ARFS must be disabled.
--- drivers/net/ethernet/qlogic/qed/qed_dev.c | 11 ++++++++++- drivers/net/ethernet/qlogic/qed/qed_l2.c | 3 +++ drivers/net/ethernet/qlogic/qed/qed_main.c | 2 ++ include/linux/qed/qed_if.h | 1 + 4 files changed, 16 insertions(+), 1 deletion(-)
drivers/net/ethernet/qlogic/qed/qed_dev.c +10 -1
@@ -4142,7 +4142,8 @@ static int qed_hw_get_nvm_info(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) cdev->mf_bits =BIT (QED_MF_LLH_MAC_CLSS ) |BIT (QED_MF_LLH_PROTO_CLSS ) |BIT (QED_MF_LL2_NON_UNICAST ) | -BIT (QED_MF_INTER_PF_SWITCH ); +BIT (QED_MF_INTER_PF_SWITCH ) | +BIT (QED_MF_DISABLE_ARFS );break ;case NVM_CFG1_GLOB_MF_MODE_DEFAULT : cdev->mf_bits = BIT(QED_MF_LLH_MAC_CLSS) |
@@ -4155,6 +4156,14 @@ static int qed_hw_get_nvm_info(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)DP_INFO (p_hwfn,"Multi function mode is 0x%lx\n" , cdev->mf_bits); + +/* In CMT the PF is unknown when the GFS block processes the +* packet. Therefore cannot use searcher as it has a per PF +* database, and thus ARFS must be disabled. +* +*/ +if (QED_IS_CMT (cdev)) + cdev->mf_bits |=BIT (QED_MF_DISABLE_ARFS ); } DP_INFO(p_hwfn, "Multi function mode is 0x%lx\n",
drivers/net/ethernet/qlogic/qed/qed_l2.c +3 -0
@@ -2001,6 +2001,9 @@ void qed_arfs_mode_configure(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, struct qed_arfs_config_params *p_cfg_params) { + if (test_bit(QED_MF_DISABLE_ARFS, &p_hwfn->cdev->mf_bits)) + return; +if (p_cfg_params->mode !=QED_FILTER_CONFIG_MODE_DISABLE ) { qed_gft_config(p_hwfn, p_ptt, p_hwfn->rel_pf_id, p_cfg_params->tcp,
drivers/net/ethernet/qlogic/qed/qed_main.c +2 -0
@@ -280,6 +280,8 @@ int qed_fill_dev_info(struct qed_dev *cdev, dev_info->fw_eng =FW_ENGINEERING_VERSION ; dev_info->b_inter_pf_switch =test_bit (QED_MF_INTER_PF_SWITCH , &cdev->mf_bits); +if (!test_bit (QED_MF_DISABLE_ARFS , &cdev->mf_bits)) + dev_info->b_arfs_capable = true; dev_info->tx_switching = true;if (hw_info->b_wol_support ==QED_WOL_SUPPORT_PME )
include/linux/qed/qed_if.h +1 -0
@@ -637,6 +637,7 @@ struct qed_dev_info {#define QED_MFW_VERSION_3_OFFSET 24u32 flash_size; +bool b_arfs_capable;bool b_inter_pf_switch;bool tx_switching;bool rdma_supported;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 349/388 net: qede: Disable aRFS for NPAR and 100G
In reply to Greg Kroah-HartmanFrom: Dmitry Bogdanov <[email protected]>
[ Upstream commit 0367f05885b9f21d062447bd2ba1302ba3cc7392 ]
In some configurations ARFS cannot be used, so disable it if device is not capable.
--- drivers/net/ethernet/qlogic/qede/qede_filter.c | 3 +++ drivers/net/ethernet/qlogic/qede/qede_main.c | 11 +++++------ 2 files changed, 8 insertions(+), 6 deletions(-)
drivers/net/ethernet/qlogic/qede/qede_filter.c +3 -0
@@ -336,6 +336,9 @@ int qede_alloc_arfs(struct qede_dev *edev) {int i; +if (!edev->dev_info.common.b_arfs_capable) +return -EINVAL ; + edev->arfs =vzalloc (sizeof (*edev->arfs));if (!edev->arfs)return -ENOMEM ;
drivers/net/ethernet/qlogic/qede/qede_main.c +5 -6
@@ -770,7 +770,7 @@ static void qede_init_ndev(struct qede_dev *edev)NETIF_F_IP_CSUM |NETIF_F_IPV6_CSUM |NETIF_F_TSO |NETIF_F_TSO6 |NETIF_F_HW_TC ; -if (!IS_VF (edev) && edev->dev_info.common.num_hwfns ==1 ) +if (edev->dev_info.common.b_arfs_capable) hw_features |=NETIF_F_NTUPLE ; if (edev->dev_info.common.vxlan_enable ||
@@ -2211,7 +2211,7 @@ static void qede_unload(struct qede_dev *edev, enum qede_unload_mode mode,qede_vlan_mark_nonconfigured (edev); edev->ops->fastpath_stop (edev->cdev); -if (!IS_VF (edev) && edev->dev_info.common.num_hwfns ==1 ) { +if (edev->dev_info.common.b_arfs_capable) {qede_poll_for_freeing_arfs_filters (edev);qede_free_arfs (edev); }
@@ -2278,10 +2278,9 @@ static int qede_load(struct qede_dev *edev, enum qede_load_mode mode,if (rc) goto err2; -if (!IS_VF (edev) && edev->dev_info.common.num_hwfns ==1 ) { - rc =qede_alloc_arfs (edev); -if (rc) -DP_NOTICE (edev,"aRFS memory allocation failed\n" ); +if (qede_alloc_arfs (edev)) { + edev->ndev->features &= ~NETIF_F_NTUPLE ; + edev->dev_info.common.b_arfs_capable = false; }qede_napi_add_enable (edev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 350/388 net: qed: RDMA personality shouldnt fail VF load
In reply to Greg Kroah-HartmanFrom: Dmitry Bogdanov <[email protected]>
[ Upstream commit ce1cf9e5025f4e2d2198728391f1847b3e168bc6 ]
Fix the assert during VF driver installation when the personality is iWARP
--- drivers/net/ethernet/qlogic/qed/qed_sriov.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/qlogic/qed/qed_sriov.c +1 -0
@@ -96,6 +96,7 @@ static int qed_sp_vf_start(struct qed_hwfn *p_hwfn, struct qed_vf_info *p_vf) p_ramrod->personality =PERSONALITY_ETH ;break ;case QED_PCI_ETH_ROCE : +case QED_PCI_ETH_IWARP : p_ramrod->personality =PERSONALITY_RDMA_AND_ETH ;break ;default :
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 351/388 drm/sun4i: sun8i-csc: Secondary CSC register correction
In reply to Greg Kroah-HartmanFrom: Martin Cerveny <[email protected]>
[ Upstream commit cab4c03b4ba54c8d9378298cacb8bc0fd74ceece ]
"Allwinner V3s" has secondary video layer (VI). Decoded video is displayed in wrong colors until secondary CSC registers are programmed correctly.
--- drivers/gpu/drm/sun4i/sun8i_csc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/sun4i/sun8i_csc.h +1 -1
@@ -12,7 +12,7 @@ struct sun8i_mixer;/* VI channel CSC units offsets */ #define CCSC00_OFFSET 0xAA050 -#define CCSC01_OFFSET 0xFA000 +#define CCSC01_OFFSET 0xFA050#define CCSC10_OFFSET 0xA0000#define CCSC11_OFFSET 0xF0000
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 352/388 batman-adv: Add missing include for in_interrupt()
In reply to Greg Kroah-HartmanFrom: Sven Eckelmann <[email protected]>
[ Upstream commit 4bba9dab86b6ac15ca560ef1f2b5aa4529cbf784 ]
The fix for receiving (internally generated) bla packets outside the interrupt context introduced the usage of in_interrupt(). But this functionality is only defined in linux/preempt.h which was not included with the same patch.
--- net/batman-adv/bridge_loop_avoidance.c | 1 + 1 file changed, 1 insertion(+)
net/batman-adv/bridge_loop_avoidance.c +1 -0
@@ -25,6 +25,7 @@#include <linux/lockdep.h> #include <linux/netdevice.h> #include <linux/netlink.h> +#include <linux/preempt.h> #include <linux/rculist.h> #include <linux/rcupdate.h> #include <linux/seq_file.h>
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 353/388 nvme-tcp: fix kconfig dependency warning when !CRYPTO
In reply to Greg Kroah-HartmanFrom: Necip Fazil Yildiran <[email protected]>
[ Upstream commit af5ad17854f96a6d3c9775e776bd01ab262672a1 ]
When NVME_TCP is enabled and CRYPTO is disabled, it results in the following Kbuild warning:
WARNING: unmet direct dependencies detected for CRYPTO_CRC32C
Depends on [n]: CRYPTO [=n]
Selected by [y]:
- NVME_TCP [=y] && INET [=y] && BLK_DEV_NVME [=y]
The reason is that NVME_TCP selects CRYPTO_CRC32C without depending on or selecting CRYPTO while CRYPTO_CRC32C is subordinate to CRYPTO.
Honor the kconfig menu hierarchy to remove kconfig dependency warnings.
--- drivers/nvme/host/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/nvme/host/Kconfig +1 -0
@@ -64,6 +64,7 @@ config NVME_TCP depends on INET depends on BLK_DEV_NVME select NVME_FABRICS + select CRYPTO select CRYPTO_CRC32C help This provides support for the NVMe over Fabrics protocol using
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 354/388 batman-adv: mcast: fix duplicate mcast packets in BLA backbone from LAN
In reply to Greg Kroah-HartmanFrom: Linus Lüssing <[email protected]>
[ Upstream commit 3236d215ad38a3f5372e65cd1e0a52cf93d3c6a2 ]
Scenario:
* Multicast frame send from a BLA backbone (multiple nodes with their bat0 bridged together, with BLA enabled)
Issue:
* BLA backbone nodes receive the frame multiple times on bat0
For multicast frames received via batman-adv broadcast packets the originator of the broadcast packet is checked before decapsulating and forwarding the frame to bat0 (batadv_bla_is_backbone_gw()-> batadv_recv_bcast_packet()). If it came from a node which shares the same BLA backbone with us then it is not forwarded to bat0 to avoid a loop.
When sending a multicast frame in a non-4-address batman-adv unicast packet we are currently missing this check - and cannot do so because the batman-adv unicast packet has no originator address field.
However, we can simply fix this on the sender side by only sending the multicast frame via unicasts to interested nodes which do not share the same BLA backbone with us. This also nicely avoids some unnecessary transmissions on mesh side.
Note that no infinite loop was observed, probably because of dropping via batadv_interface_tx()->batadv_bla_tx(). However the duplicates still utterly confuse switches/bridges, ICMPv6 duplicate address detection and neighbor discovery and therefore leads to long delays before being able to establish TCP connections, for instance. And it also leads to the Linux bridge printing messages like:
"br-lan: received packet on eth1 with own address as source address ..."
--- net/batman-adv/multicast.c | 46 ++++++++++++++++++++++++++------- net/batman-adv/multicast.h | 15 +++++++++++ net/batman-adv/soft-interface.c | 5 ++-- 3 files changed, 53 insertions(+), 13 deletions(-)
net/batman-adv/multicast.c +36 -10
@@ -51,6 +51,7 @@#include <uapi/linux/batadv_packet.h> #include <uapi/linux/batman_adv.h> +#include "bridge_loop_avoidance.h" #include "hard-interface.h" #include "hash.h" #include "log.h"
@@ -1434,6 +1435,35 @@ batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,return BATADV_FORW_ALL ; } +/** +* batadv_mcast_forw_send_orig() - send a multicast packet to an originator +* @bat_priv: the bat priv with all the soft interface information +* @skb: the multicast packet to send +* @vid: the vlan identifier +* @orig_node: the originator to send the packet to +* +* Return: NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise. +*/ +int batadv_mcast_forw_send_orig (struct batadv_priv *bat_priv, +struct sk_buff *skb, +unsigned short vid, +struct batadv_orig_node *orig_node) +{ +/* Avoid sending multicast-in-unicast packets to other BLA +* gateways - they already got the frame from the LAN side +* we share with them. +* TODO: Refactor to take BLA into account earlier, to avoid +* reducing the mcast_fanout count. +*/ +if (batadv_bla_is_backbone_gw_orig (bat_priv, orig_node->orig, vid)) { +dev_kfree_skb (skb); +return NET_XMIT_SUCCESS ; + } + +return batadv_send_skb_unicast (bat_priv, skb,BATADV_UNICAST ,0 , + orig_node, vid); +} +/** * batadv_mcast_forw_tt() - forwards a packet to multicast listeners * @bat_priv: the bat priv with all the soft interface information
@@ -1471,8 +1501,8 @@ batadv_mcast_forw_tt(struct batadv_priv *bat_priv, struct sk_buff *skb,break ; } -batadv_send_skb_unicast (bat_priv, newskb,BATADV_UNICAST ,0 , - orig_entry->orig_node, vid); +batadv_mcast_forw_send_orig (bat_priv, newskb, vid, + orig_entry->orig_node); }rcu_read_unlock ();
@@ -1513,8 +1543,7 @@ batadv_mcast_forw_want_all_ipv4(struct batadv_priv *bat_priv,break ; } -batadv_send_skb_unicast (bat_priv, newskb,BATADV_UNICAST ,0 , - orig_node, vid); +batadv_mcast_forw_send_orig (bat_priv, newskb, vid, orig_node); }rcu_read_unlock ();return ret;
@@ -1551,8 +1580,7 @@ batadv_mcast_forw_want_all_ipv6(struct batadv_priv *bat_priv,break ; } -batadv_send_skb_unicast (bat_priv, newskb,BATADV_UNICAST ,0 , - orig_node, vid); +batadv_mcast_forw_send_orig (bat_priv, newskb, vid, orig_node); }rcu_read_unlock ();return ret;
@@ -1618,8 +1646,7 @@ batadv_mcast_forw_want_all_rtr4(struct batadv_priv *bat_priv,break ; } -batadv_send_skb_unicast (bat_priv, newskb,BATADV_UNICAST ,0 , - orig_node, vid); +batadv_mcast_forw_send_orig (bat_priv, newskb, vid, orig_node); }rcu_read_unlock ();return ret;
@@ -1656,8 +1683,7 @@ batadv_mcast_forw_want_all_rtr6(struct batadv_priv *bat_priv,break ; } -batadv_send_skb_unicast (bat_priv, newskb,BATADV_UNICAST ,0 , - orig_node, vid); +batadv_mcast_forw_send_orig (bat_priv, newskb, vid, orig_node); }rcu_read_unlock ();return ret;
net/batman-adv/multicast.h +15 -0
@@ -46,6 +46,11 @@ enum batadv_forw_mode batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb, struct batadv_orig_node **mcast_single_orig); +int batadv_mcast_forw_send_orig (struct batadv_priv *bat_priv, +struct sk_buff *skb, +unsigned short vid, +struct batadv_orig_node *orig_node); +int batadv_mcast_forw_send (struct batadv_priv *bat_priv,struct sk_buff *skb,unsigned short vid);
@@ -71,6 +76,16 @@ batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,return BATADV_FORW_ALL ; } +static inline int +batadv_mcast_forw_send_orig (struct batadv_priv *bat_priv, +struct sk_buff *skb, +unsigned short vid, +struct batadv_orig_node *orig_node) +{ +kfree_skb (skb); +return NET_XMIT_DROP ; +} +static inline int batadv_mcast_forw_send (struct batadv_priv *bat_priv,struct sk_buff *skb,unsigned short vid)
net/batman-adv/soft-interface.c +2 -3
@@ -364,9 +364,8 @@ static netdev_tx_t batadv_interface_tx(struct sk_buff *skb, goto dropped; ret =batadv_send_skb_via_gw (bat_priv, skb, vid); }else if (mcast_single_orig) { - ret =batadv_send_skb_unicast (bat_priv, skb, -BATADV_UNICAST ,0 , - mcast_single_orig, vid); + ret =batadv_mcast_forw_send_orig (bat_priv, skb, vid, + mcast_single_orig); }else if (forw_mode ==BATADV_FORW_SOME ) { ret =batadv_mcast_forw_send (bat_priv, skb, vid); }else {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 355/388 batman-adv: mcast: fix duplicate mcast packets in BLA backbone from mesh
In reply to Greg Kroah-HartmanFrom: Linus Lüssing <[email protected]>
[ Upstream commit 74c09b7275126da1b642b90c9cdc3ae8b729ad4b ]
Scenario:
* Multicast frame send from mesh to a BLA backbone (multiple nodes with their bat0 bridged together, with BLA enabled)
Issue:
* BLA backbone nodes receive the frame multiple times on bat0, once from mesh->bat0 and once from each backbone_gw from LAN
For unicast, a node will send only to the best backbone gateway according to the TQ. However for multicast we currently cannot determine if multiple destination nodes share the same backbone if they don't share the same backbone with us. So we need to keep sending the unicasts to all backbone gateways and let the backbone gateways decide which one will forward the frame. We can use the CLAIM mechanism to make this decision.
One catch: The batman-adv gateway feature for DHCP packets potentially sends multicast packets in the same batman-adv unicast header as the multicast optimizations code. And we are not allowed to drop those even if we did not claim the source address of the sender, as for such packets there is only this one multicast-in-unicast packet.
How can we distinguish the two cases?
The gateway feature uses a batman-adv unicast 4 address header. While the multicast-to-unicasts feature uses a simple, 3 address batman-adv unicast header. So let's use this to distinguish.
--- net/batman-adv/bridge_loop_avoidance.c | 34 +++++++++++++++++++------- net/batman-adv/bridge_loop_avoidance.h | 4 +-- net/batman-adv/soft-interface.c | 6 ++--- 3 files changed, 30 insertions(+), 14 deletions(-)
net/batman-adv/bridge_loop_avoidance.c +25 -9
@@ -1814,7 +1814,7 @@ batadv_bla_loopdetect_check(struct batadv_priv *bat_priv, struct sk_buff *skb,* @bat_priv: the bat priv with all the soft interface information * @skb: the frame to be checked * @vid: the VLAN ID of the frame -* @is_bcast: the packet came in a broadcast packet type. +* @packet_type: the batman packet type this frame came in * * batadv_bla_rx avoidance checks if: * * we have to race for a claim
@@ -1826,7 +1826,7 @@ batadv_bla_loopdetect_check(struct batadv_priv *bat_priv, struct sk_buff *skb,* further process the skb. */ bool batadv_bla_rx (struct batadv_priv *bat_priv,struct sk_buff *skb, -unsigned short vid,bool is_bcast) +unsigned short vid,int packet_type) {struct batadv_bla_backbone_gw *backbone_gw;struct ethhdr *ethhdr;
@@ -1848,9 +1848,24 @@ bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb, goto handled;if (unlikely (atomic_read (&bat_priv->bla.num_requests))) -/* don't allow broadcasts while requests are in flight */ -if (is_multicast_ether_addr (ethhdr->h_dest) && is_bcast) - goto handled; +/* don't allow multicast packets while requests are in flight */ +if (is_multicast_ether_addr (ethhdr->h_dest)) +/* Both broadcast flooding or multicast-via-unicasts +* delivery might send to multiple backbone gateways +* sharing the same LAN and therefore need to coordinate +* which backbone gateway forwards into the LAN, +* by claiming the payload source address. +* +* Broadcast flooding and multicast-via-unicasts +* delivery use the following two batman packet types. +* Note: explicitly exclude BATADV_UNICAST_4ADDR, +* as the DHCP gateway feature will send explicitly +* to only one BLA gateway, so the claiming process +* should be avoided there. +*/ +if (packet_type ==BATADV_BCAST || + packet_type ==BATADV_UNICAST ) + goto handled;ether_addr_copy (search_claim.addr, ethhdr->h_source); search_claim.vid = vid;
@@ -1885,13 +1900,14 @@ bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb, goto allow; } -/* if it is a broadcast ... */ -if (is_multicast_ether_addr (ethhdr->h_dest) && is_bcast) { +/* if it is a multicast ... */ +if (is_multicast_ether_addr (ethhdr->h_dest) && + (packet_type ==BATADV_BCAST || packet_type ==BATADV_UNICAST )) {/* ... drop it. the responsible gateway is in charge. * -* We need to check is_bcast because with the gateway +* We need to check packet type because with the gateway * feature, broadcasts (like DHCP requests) may be sent -* using a unicast packet type. +* using a unicast 4 address packet type. See comment above. */ goto handled; }else {
net/batman-adv/bridge_loop_avoidance.h +2 -2
@@ -35,7 +35,7 @@ static inline bool batadv_bla_is_loopdetect_mac(const uint8_t *mac)#ifdef CONFIG_BATMAN_ADV_BLA bool batadv_bla_rx (struct batadv_priv *bat_priv,struct sk_buff *skb, -unsigned short vid,bool is_bcast); +unsigned short vid,int packet_type);bool batadv_bla_tx (struct batadv_priv *bat_priv,struct sk_buff *skb,unsigned short vid); bool batadv_bla_is_backbone_gw(struct sk_buff *skb,
@@ -66,7 +66,7 @@ bool batadv_bla_check_claim(struct batadv_priv *bat_priv, u8 *addr,static inline bool batadv_bla_rx (struct batadv_priv *bat_priv,struct sk_buff *skb,unsigned short vid, -bool is_bcast) +int packet_type) {return false; }
net/batman-adv/soft-interface.c +3 -3
@@ -424,10 +424,10 @@ void batadv_interface_rx(struct net_device *soft_iface,struct vlan_ethhdr *vhdr;struct ethhdr *ethhdr;unsigned short vid; -bool is_bcast; +int packet_type; batadv_bcast_packet = (struct batadv_bcast_packet *)skb->data; - is_bcast = (batadv_bcast_packet->packet_type ==BATADV_BCAST ); + packet_type = batadv_bcast_packet->packet_type;skb_pull_rcsum (skb, hdr_size);skb_reset_mac_header (skb);
@@ -470,7 +470,7 @@ void batadv_interface_rx(struct net_device *soft_iface,/* Let the bridge loop avoidance check the packet. If will * not handle it, we can safely push it up. */ -if (batadv_bla_rx (bat_priv, skb, vid, is_bcast)) +if (batadv_bla_rx (bat_priv, skb, vid, packet_type)) goto out;if (orig_node)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 356/388 batman-adv: mcast: fix duplicate mcast packets from BLA backbone to mesh
In reply to Greg Kroah-HartmanFrom: Linus Lüssing <[email protected]>
[ Upstream commit 2369e827046920ef0599e6a36b975ac5c0a359c2 ]
Scenario:
* Multicast frame send from BLA backbone gateways (multiple nodes with their bat0 bridged together, with BLA enabled) sharing the same LAN to nodes in the mesh
Issue:
* Nodes receive the frame multiple times on bat0 from the mesh, once from each foreign BLA backbone gateway which shares the same LAN with another
For multicast frames via batman-adv broadcast packets coming from the same BLA backbone but from different backbone gateways duplicates are currently detected via a CRC history of previously received packets.
However this CRC so far was not performed for multicast frames received via batman-adv unicast packets. Fixing this by appyling the same check for such packets, too.
Room for improvements in the future: Ideally we would introduce the possibility to not only claim a client, but a complete originator, too. This would allow us to only send a multicast-in-unicast packet from a BLA backbone gateway claiming the node and by that avoid potential redundant transmissions in the first place.
--- net/batman-adv/bridge_loop_avoidance.c | 103 +++++++++++++++++++++---- 1 file changed, 87 insertions(+), 16 deletions(-)
net/batman-adv/bridge_loop_avoidance.c +87 -16
@@ -1581,13 +1581,16 @@ int batadv_bla_init(struct batadv_priv *bat_priv) }/** -* batadv_bla_check_bcast_duplist() - Check if a frame is in the broadcast dup. +* batadv_bla_check_duplist() - Check if a frame is in the broadcast dup. * @bat_priv: the bat priv with all the soft interface information -* @skb: contains the bcast_packet to be checked +* @skb: contains the multicast packet to be checked +* @payload_ptr: pointer to position inside the head buffer of the skb +* marking the start of the data to be CRC'ed +* @orig: originator mac address, NULL if unknown * -* check if it is on our broadcast list. Another gateway might -* have sent the same packet because it is connected to the same backbone, -* so we have to remove this duplicate. +* Check if it is on our broadcast list. Another gateway might have sent the +* same packet because it is connected to the same backbone, so we have to +* remove this duplicate. * * This is performed by checking the CRC, which will tell us * with a good chance that it is the same packet. If it is furthermore
@@ -1596,19 +1599,17 @@ int batadv_bla_init(struct batadv_priv *bat_priv)* * Return: true if a packet is in the duplicate list, false otherwise. */ -bool batadv_bla_check_bcast_duplist (struct batadv_priv *bat_priv, -struct sk_buff *skb) +static bool batadv_bla_check_duplist (struct batadv_priv *bat_priv, +struct sk_buff *skb,u8 *payload_ptr, +const u8 *orig) { -int i, curr; -__be32 crc; -struct batadv_bcast_packet *bcast_packet;struct batadv_bcast_duplist_entry *entry;bool ret = false; - - bcast_packet = (struct batadv_bcast_packet *)skb->data; +int i, curr; +__be32 crc;/* calculate the crc ... */ - crc =batadv_skb_crc32 (skb, (u8 *)(bcast_packet +1 )); + crc =batadv_skb_crc32 (skb, payload_ptr);spin_lock_bh (&bat_priv->bla.bcast_duplist_lock);
@@ -1627,8 +1628,21 @@ bool batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,if (entry->crc != crc)continue ; -if (batadv_compare_eth (entry->orig, bcast_packet->orig)) -continue ; +/* are the originators both known and not anonymous? */ +if (orig && !is_zero_ether_addr (orig) && + !is_zero_ether_addr (entry->orig)) { +/* If known, check if the new frame came from +* the same originator: +* We are safe to take identical frames from the +* same orig, if known, as multiplications in +* the mesh are detected via the (orig, seqno) pair. +* So we can be a bit more liberal here and allow +* identical frames from the same orig which the source +* host might have sent multiple times on purpose. +*/ +if (batadv_compare_eth (entry->orig, orig)) +continue ; + }/* this entry seems to match: same crc, not too old, * and from another gw. therefore return true to forbid it.
@@ -1644,7 +1658,14 @@ bool batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv, entry = &bat_priv->bla.bcast_duplist[curr]; entry->crc = crc; entry->entrytime = jiffies; -ether_addr_copy (entry->orig, bcast_packet->orig); + +/* known originator */ +if (orig) +ether_addr_copy (entry->orig, orig); +/* anonymous originator */ +else +eth_zero_addr (entry->orig); + bat_priv->bla.bcast_duplist_curr = curr; out:
@@ -1653,6 +1674,48 @@ bool batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,return ret; } +/** +* batadv_bla_check_ucast_duplist() - Check if a frame is in the broadcast dup. +* @bat_priv: the bat priv with all the soft interface information +* @skb: contains the multicast packet to be checked, decapsulated from a +* unicast_packet +* +* Check if it is on our broadcast list. Another gateway might have sent the +* same packet because it is connected to the same backbone, so we have to +* remove this duplicate. +* +* Return: true if a packet is in the duplicate list, false otherwise. +*/ +static bool batadv_bla_check_ucast_duplist (struct batadv_priv *bat_priv, +struct sk_buff *skb) +{ +return batadv_bla_check_duplist (bat_priv, skb, (u8 *)skb->data,NULL ); +} + +/** +* batadv_bla_check_bcast_duplist() - Check if a frame is in the broadcast dup. +* @bat_priv: the bat priv with all the soft interface information +* @skb: contains the bcast_packet to be checked +* +* Check if it is on our broadcast list. Another gateway might have sent the +* same packet because it is connected to the same backbone, so we have to +* remove this duplicate. +* +* Return: true if a packet is in the duplicate list, false otherwise. +*/ +bool batadv_bla_check_bcast_duplist (struct batadv_priv *bat_priv, +struct sk_buff *skb) +{ +struct batadv_bcast_packet *bcast_packet; +u8 *payload_ptr; + + bcast_packet = (struct batadv_bcast_packet *)skb->data; + payload_ptr = (u8 *)(bcast_packet +1 ); + +return batadv_bla_check_duplist (bat_priv, skb, payload_ptr, + bcast_packet->orig); +} +/** * batadv_bla_is_backbone_gw_orig() - Check if the originator is a gateway for * the VLAN identified by vid.
@@ -1867,6 +1930,14 @@ bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb, packet_type == BATADV_UNICAST) goto handled; +/* potential duplicates from foreign BLA backbone gateways via +* multicast-in-unicast packets +*/ +if (is_multicast_ether_addr (ethhdr->h_dest) && + packet_type ==BATADV_UNICAST && +batadv_bla_check_ucast_duplist (bat_priv, skb)) + goto handled; +ether_addr_copy (search_claim.addr, ethhdr->h_source); search_claim.vid = vid; claim =batadv_claim_hash_find (bat_priv, &search_claim);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 357/388 bpf: Fix a rcu warning for bpffs map pretty-print
In reply to Greg Kroah-HartmanFrom: Yonghong Song <[email protected]>
[ Upstream commit ce880cb825fcc22d4e39046a6c3a3a7f6603883d ]
Running selftest
./btf_btf -p
the kernel had the following warning:
[ 51.528185] WARNING: CPU: 3 PID: 1756 at kernel/bpf/hashtab.c:717 htab_map_get_next_key+0x2eb/0x300 [ 51.529217] Modules linked in: [ 51.529583] CPU: 3 PID: 1756 Comm: test_btf Not tainted 5.9.0-rc1+ #878 [ 51.530346] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.9.3-1.el7.centos 04/01/2014 [ 51.531410] RIP: 0010:htab_map_get_next_key+0x2eb/0x300 ... [ 51.542826] Call Trace: [ 51.543119] map_seq_next+0x53/0x80 [ 51.543528] seq_read+0x263/0x400 [ 51.543932] vfs_read+0xad/0x1c0 [ 51.544311] ksys_read+0x5f/0xe0 [ 51.544689] do_syscall_64+0x33/0x40 [ 51.545116] entry_SYSCALL_64_after_hwframe+0x44/0xa9
The related source code in kernel/bpf/hashtab.c:
709 static int htab_map_get_next_key(struct bpf_map *map, void *key, void *next_key) 710 {
711 struct bpf_htab *htab = container_of(map, struct bpf_htab, map); 712 struct hlist_nulls_head *head; 713 struct htab_elem *l, *next_l; 714 u32 hash, key_size; 715 int i = 0;
716
717 WARN_ON_ONCE(!rcu_read_lock_held());
In kernel/bpf/inode.c, bpffs map pretty print calls map->ops->map_get_next_key() without holding a rcu_read_lock(), hence causing the above warning.
To fix the issue, just surrounding map->ops->map_get_next_key() with rcu read lock.
--- kernel/bpf/inode.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/bpf/inode.c +3 -1
@@ -205,10 +205,12 @@ static void *map_seq_next(struct seq_file *m, void *v, loff_t *pos)else prev_key = key; +rcu_read_lock ();if (map->ops->map_get_next_key (map, prev_key, key)) {map_iter (m)->done = true; -return NULL ; + key =NULL ; } +rcu_read_unlock ();return key; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 358/388 lib80211: fix unmet direct dependendices config warning when !CRYPTO
In reply to Greg Kroah-HartmanFrom: Necip Fazil Yildiran <[email protected]>
[ Upstream commit b959ba9f468b1c581f40e92661ad58b093abaa03 ]
When LIB80211_CRYPT_CCMP is enabled and CRYPTO is disabled, it results in unmet direct dependencies config warning. The reason is that LIB80211_CRYPT_CCMP selects CRYPTO_AES and CRYPTO_CCM, which are subordinate to CRYPTO. This is reproducible with CRYPTO disabled and R8188EU enabled, where R8188EU selects LIB80211_CRYPT_CCMP but does not select or depend on CRYPTO.
Honor the kconfig menu hierarchy to remove kconfig dependency warnings.
--- net/wireless/Kconfig | 1 + 1 file changed, 1 insertion(+)
net/wireless/Kconfig +1 -0
@@ -217,6 +217,7 @@ config LIB80211_CRYPT_WEP config LIB80211_CRYPT_CCMP tristate + select CRYPTO select CRYPTO_AES select CRYPTO_CCM
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 359/388 ALSA: asihpi: fix iounmap in error handler
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
[ Upstream commit 472eb39103e885f302fd8fd6eff104fcf5503f1b ]
clang static analysis flags this problem hpioctl.c:513:7: warning: Branch condition evaluates to
a garbage value
if (pci.ap_mem_base[idx]) {
^~~~~~~~~~~~~~~~~~~~If there is a failure in the middle of the memory space loop, only some of the memory spaces need to be cleaned up.
At the error handler, idx holds the number of successful memory spaces mapped. So rework the handler loop to use the old idx.
There is a second problem, the memory space loop conditionally iomaps()/sets the mem_base so it is necessay to initize pci.
--- sound/pci/asihpi/hpioctl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/pci/asihpi/hpioctl.c +2 -2
@@ -343,7 +343,7 @@ int asihpi_adapter_probe(struct pci_dev *pci_dev,struct hpi_message hm;struct hpi_response hr;struct hpi_adapter adapter; -struct hpi_pci pci; +struct hpi_pci pci = {0 };memset (&adapter,0 ,sizeof (adapter));
@@ -499,7 +499,7 @@ int asihpi_adapter_probe(struct pci_dev *pci_dev,return 0 ; err: -for (idx =0 ; idx <HPI_MAX_ADAPTER_MEM_SPACES ; idx++) { +while (--idx >=0 ) {if (pci.ap_mem_base[idx]) {iounmap (pci.ap_mem_base[idx]); pci.ap_mem_base[idx] =NULL ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 360/388 regmap: fix page selection for noinc reads
In reply to Greg Kroah-HartmanFrom: Dmitry Baryshkov <[email protected]>
[ Upstream commit 4003324856311faebb46cbd56a1616bd3f3b67c2 ]
Non-incrementing reads can fail if register + length crosses page border. However for non-incrementing reads we should not check for page border crossing. Fix this by passing additional flag to _regmap_raw_read and passing length to _regmap_select_page basing on the flag.
--- drivers/base/regmap/regmap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/base/regmap/regmap.c +6 -6
@@ -2454,7 +2454,7 @@ int regmap_raw_write_async(struct regmap *map, unsigned int reg,EXPORT_SYMBOL_GPL (regmap_raw_write_async);static int _regmap_raw_read (struct regmap *map,unsigned int reg,void *val, -unsigned int val_len) +unsigned int val_len,bool noinc) {struct regmap_range_node *range;int ret;
@@ -2467,7 +2467,7 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val, range =_regmap_range_lookup (map, reg);if (range) { ret =_regmap_select_page (map, ®, range, - val_len / map->format.val_bytes); + noinc ?1 : val_len / map->format.val_bytes);if (ret !=0 )return ret; }
@@ -2505,7 +2505,7 @@ static int _regmap_bus_read(void *context, unsigned int reg,if (!map->format.parse_val)return -EINVAL ; - ret =_regmap_raw_read (map, reg, work_val, map->format.val_bytes); + ret =_regmap_raw_read (map, reg, work_val, map->format.val_bytes, false);if (ret ==0 ) *val = map->format.parse_val (work_val);
@@ -2621,7 +2621,7 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,/* Read bytes that fit into whole chunks */ for (i =0 ; i < chunk_count; i++) { - ret =_regmap_raw_read (map, reg, val, chunk_bytes); + ret =_regmap_raw_read (map, reg, val, chunk_bytes, false);if (ret !=0 ) goto out;
@@ -2632,7 +2632,7 @@ int regmap_raw_read(struct regmap *map, unsigned int reg, void *val,/* Read remaining bytes */ if (val_len) { - ret =_regmap_raw_read (map, reg, val, val_len); + ret =_regmap_raw_read (map, reg, val, val_len, false);if (ret !=0 ) goto out; }
@@ -2707,7 +2707,7 @@ int regmap_noinc_read(struct regmap *map, unsigned int reg, read_len = map->max_raw_read; else read_len = val_len; - ret =_regmap_raw_read (map, reg, val, read_len); + ret =_regmap_raw_read (map, reg, val, read_len, true);if (ret) goto out_unlock; val = ((u8 *)val) + read_len;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 361/388 regmap: fix page selection for noinc writes
In reply to Greg Kroah-HartmanFrom: Dmitry Baryshkov <[email protected]>
[ Upstream commit 05669b63170771d554854c0e465b76dc98fc7c84 ]
Non-incrementing writes can fail if register + length crosses page border. However for non-incrementing writes we should not check for page border crossing. Fix this by passing additional flag to _regmap_raw_write and passing length to _regmap_select_page basing on the flag.
--- drivers/base/regmap/internal.h | 2 +- drivers/base/regmap/regcache.c | 2 +- drivers/base/regmap/regmap.c | 21 +++++++++++---------- 3 files changed, 13 insertions(+), 12 deletions(-)
drivers/base/regmap/internal.h +1 -1
@@ -259,7 +259,7 @@ bool regcache_set_val(struct regmap *map, void *base, unsigned int idx,int regcache_lookup_reg (struct regmap *map,unsigned int reg);int _regmap_raw_write (struct regmap *map,unsigned int reg, -const void *val,size_t val_len); +const void *val,size_t val_len,bool noinc);void regmap_async_complete_cb (struct regmap_async *async,int ret);
drivers/base/regmap/regcache.c +1 -1
@@ -717,7 +717,7 @@ static int regcache_sync_block_raw_flush(struct regmap *map, const void **data, map->cache_bypass = true; - ret =_regmap_raw_write (map, base, *data, count * val_bytes); + ret =_regmap_raw_write (map, base, *data, count * val_bytes, false);if (ret)dev_err (map->dev,"Unable to sync registers %#x-%#x. %d\n" , base, cur - map->reg_stride, ret);
drivers/base/regmap/regmap.c +11 -10
@@ -1468,7 +1468,7 @@ static void regmap_set_work_buf_flag_mask(struct regmap *map, int max_bytes, }static int _regmap_raw_write_impl (struct regmap *map,unsigned int reg, -const void *val,size_t val_len) +const void *val,size_t val_len,bool noinc) {struct regmap_range_node *range;unsigned long flags;
@@ -1527,7 +1527,7 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg, win_residue, val_len / map->format.val_bytes); ret =_regmap_raw_write_impl (map, reg, val, win_residue * - map->format.val_bytes); + map->format.val_bytes, noinc);if (ret !=0 )return ret;
@@ -1541,7 +1541,7 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg, win_residue = range->window_len - win_offset; } - ret =_regmap_select_page (map, ®, range, val_num); + ret =_regmap_select_page (map, ®, range, noinc ?1 : val_num);if (ret !=0 )return ret; }
@@ -1749,7 +1749,8 @@ static int _regmap_bus_raw_write(void *context, unsigned int reg, map->work_buf + map->format.reg_bytes + map->format.pad_bytes, - map->format.val_bytes); + map->format.val_bytes, + false); }static inline void *_regmap_map_get_context (struct regmap *map)
@@ -1843,7 +1844,7 @@ int regmap_write_async(struct regmap *map, unsigned int reg, unsigned int val)EXPORT_SYMBOL_GPL (regmap_write_async);int _regmap_raw_write (struct regmap *map,unsigned int reg, -const void *val,size_t val_len) +const void *val,size_t val_len,bool noinc) {size_t val_bytes = map->format.val_bytes;size_t val_count = val_len / val_bytes;
@@ -1864,7 +1865,7 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,/* Write as many bytes as possible with chunk_size */ for (i =0 ; i < chunk_count; i++) { - ret =_regmap_raw_write_impl (map, reg, val, chunk_bytes); + ret =_regmap_raw_write_impl (map, reg, val, chunk_bytes, noinc);if (ret)return ret;
@@ -1875,7 +1876,7 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,/* Write remaining bytes */ if (val_len) - ret =_regmap_raw_write_impl (map, reg, val, val_len); + ret =_regmap_raw_write_impl (map, reg, val, val_len, noinc);return ret; }
@@ -1908,7 +1909,7 @@ int regmap_raw_write(struct regmap *map, unsigned int reg, map->lock (map->lock_arg); - ret =_regmap_raw_write (map, reg, val, val_len); + ret =_regmap_raw_write (map, reg, val, val_len, false); map->unlock (map->lock_arg);
@@ -1966,7 +1967,7 @@ int regmap_noinc_write(struct regmap *map, unsigned int reg, write_len = map->max_raw_write; else write_len = val_len; - ret =_regmap_raw_write (map, reg, val, write_len); + ret =_regmap_raw_write (map, reg, val, write_len, true);if (ret) goto out_unlock; val = ((u8 *)val) + write_len;
@@ -2443,7 +2444,7 @@ int regmap_raw_write_async(struct regmap *map, unsigned int reg, map->async = true; - ret =_regmap_raw_write (map, reg, val, val_len); + ret =_regmap_raw_write (map, reg, val, val_len, false); map->async = false;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 362/388 MIPS: Add the missing CPU_1074K into __get_cpu_type()
In reply to Greg Kroah-HartmanFrom: Wei Li <[email protected]>
[ Upstream commit e393fbe6fa27af23f78df6e16a8fd2963578a8c4 ]
Commit 442e14a2c55e ("MIPS: Add 1074K CPU support explicitly.") split 1074K from the 74K as an unique CPU type, while it missed to add the 'CPU_1074K' in __get_cpu_type(). So let's add it back.
--- arch/mips/include/asm/cpu-type.h | 1 + 1 file changed, 1 insertion(+)
arch/mips/include/asm/cpu-type.h +1 -0
@@ -47,6 +47,7 @@ static inline int __pure __get_cpu_type(const int cpu_type)case CPU_34K :case CPU_1004K :case CPU_74K : +case CPU_1074K :case CPU_M14KC :case CPU_M14KEC :case CPU_INTERAPTIV :
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 363/388 regulator: axp20x: fix LDO2/4 description
In reply to Greg Kroah-HartmanFrom: Icenowy Zheng <[email protected]>
[ Upstream commit fbb5a79d2fe7b01c6424fbbc04368373b1672d61 ]
Currently we wrongly set the mask of value of LDO2/4 both to the mask of LDO2, and the LDO4 voltage configuration is left untouched. This leads to conflict when LDO2/4 are both in use.
Fix this issue by setting different vsel_mask to both regulators.
--- drivers/regulator/axp20x-regulator.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/regulator/axp20x-regulator.c +4 -3
@@ -42,8 +42,9 @@#define AXP20X_DCDC2_V_OUT_MASK GENMASK(5, 0)#define AXP20X_DCDC3_V_OUT_MASK GENMASK(7, 0) -#define AXP20X_LDO24_V_OUT_MASK GENMASK(7, 4) +#define AXP20X_LDO2_V_OUT_MASK GENMASK(7, 4)#define AXP20X_LDO3_V_OUT_MASK GENMASK(6, 0) +#define AXP20X_LDO4_V_OUT_MASK GENMASK(3, 0)#define AXP20X_LDO5_V_OUT_MASK GENMASK(7, 4)#define AXP20X_PWR_OUT_EXTEN_MASK BIT_MASK(0)
@@ -544,14 +545,14 @@ static const struct regulator_desc axp20x_regulators[] = { AXP20X_PWR_OUT_CTRL, AXP20X_PWR_OUT_DCDC3_MASK),AXP_DESC_FIXED (AXP20X ,LDO1 ,"ldo1" ,"acin" ,1300 ),AXP_DESC (AXP20X ,LDO2 ,"ldo2" ,"ldo24in" ,1800 ,3300 ,100 , -AXP20X_LDO24_V_OUT ,AXP20X_LDO24_V_OUT_MASK , +AXP20X_LDO24_V_OUT ,AXP20X_LDO2_V_OUT_MASK ,AXP20X_PWR_OUT_CTRL ,AXP20X_PWR_OUT_LDO2_MASK ),AXP_DESC (AXP20X ,LDO3 ,"ldo3" ,"ldo3in" ,700 ,3500 ,25 ,AXP20X_LDO3_V_OUT ,AXP20X_LDO3_V_OUT_MASK ,AXP20X_PWR_OUT_CTRL ,AXP20X_PWR_OUT_LDO3_MASK ),AXP_DESC_RANGES (AXP20X ,LDO4 ,"ldo4" ,"ldo24in" , axp20x_ldo4_ranges,AXP20X_LDO4_V_OUT_NUM_VOLTAGES , -AXP20X_LDO24_V_OUT ,AXP20X_LDO24_V_OUT_MASK , +AXP20X_LDO24_V_OUT ,AXP20X_LDO4_V_OUT_MASK ,AXP20X_PWR_OUT_CTRL ,AXP20X_PWR_OUT_LDO4_MASK ), AXP_DESC_IO(AXP20X, LDO5, "ldo5", "ldo5in", 1800, 3300, 100, AXP20X_LDO5_V_OUT, AXP20X_LDO5_V_OUT_MASK,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 364/388 KVM: x86: Reset MMU context if guest toggles CR4.SMAP or CR4.PKE
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
[ Upstream commit 8d214c481611b29458a57913bd786f0ac06f0605 ]
Reset the MMU context during kvm_set_cr4() if SMAP or PKE is toggled. Recent commits to (correctly) not reload PDPTRs when SMAP/PKE are toggled inadvertantly skipped the MMU context reset due to the mask of bits that triggers PDPTR loads also being used to trigger MMU context resets.
Message-Id: <[email protected]>
--- arch/x86/kvm/x86.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/x86/kvm/x86.c +2 -1
@@ -973,6 +973,7 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)unsigned long old_cr4 =kvm_read_cr4 (vcpu);unsigned long pdptr_bits =X86_CR4_PGE |X86_CR4_PSE |X86_CR4_PAE |X86_CR4_SMEP ; +unsigned long mmu_role_bits = pdptr_bits |X86_CR4_SMAP |X86_CR4_PKE ;if (kvm_valid_cr4 (vcpu, cr4))return 1 ;
@@ -1000,7 +1001,7 @@ int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)if (kvm_x86_ops->set_cr4 (vcpu, cr4))return 1 ; -if (((cr4 ^ old_cr4) & pdptr_bits) || +if (((cr4 ^ old_cr4) & mmu_role_bits) || (!(cr4 &X86_CR4_PCIDE ) && (old_cr4 &X86_CR4_PCIDE )))kvm_mmu_reset_context (vcpu);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 365/388 KVM: SVM: Add a dedicated INVD intercept routine
In reply to Greg Kroah-HartmanFrom: Tom Lendacky <[email protected]>
[ Upstream commit 4bb05f30483fd21ea5413eaf1182768f251cf625 ]
The INVD instruction intercept performs emulation. Emulation can't be done on an SEV guest because the guest memory is encrypted.
Provide a dedicated intercept routine for the INVD intercept. And since the instruction is emulated as a NOP, just skip it instead.
Message-Id: <a0b9a19ffa7fef86a3cc700c7ea01cb2731e04e5.1600972918.git.thomas.lendacky@amd.com>
--- arch/x86/kvm/svm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
arch/x86/kvm/svm.c +7 -1
@@ -3967,6 +3967,12 @@ static int iret_interception(struct vcpu_svm *svm)return 1 ; } +static int invd_interception (struct vcpu_svm *svm) +{ +/* Treat an INVD instruction as a NOP and just skip it. */ +return kvm_skip_emulated_instruction (&svm->vcpu); +} +static int invlpg_interception (struct vcpu_svm *svm) {if (!static_cpu_has (X86_FEATURE_DECODEASSISTS ))
@@ -4819,7 +4825,7 @@ static int (*const svm_exit_handlers[])(struct vcpu_svm *svm) = { [SVM_EXIT_RDPMC] = rdpmc_interception, [SVM_EXIT_CPUID] = cpuid_interception, [SVM_EXIT_IRET] = iret_interception, - [SVM_EXIT_INVD] = emulate_on_interception, + [SVM_EXIT_INVD] = invd_interception, [SVM_EXIT_PAUSE] = pause_interception, [SVM_EXIT_HLT] = halt_interception, [SVM_EXIT_INVLPG] = invlpg_interception,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 366/388 mm: validate pmd after splitting
In reply to Greg Kroah-HartmanFrom: Minchan Kim <[email protected]>
[ Upstream commit ce2684254bd4818ca3995c0d021fb62c4cf10a19 ]
syzbot reported the following KASAN splat:
general protection fault, probably for non-canonical address 0xdffffc0000000003: 0000 [#1] PREEMPT SMP KASAN
KASAN: null-ptr-deref in range [0x0000000000000018-0x000000000000001f]
CPU: 1 PID: 6826 Comm: syz-executor142 Not tainted 5.9.0-rc4-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
RIP: 0010:__lock_acquire+0x84/0x2ae0 kernel/locking/lockdep.c:4296
Code: ff df 8a 04 30 84 c0 0f 85 e3 16 00 00 83 3d 56 58 35 08 00 0f 84 0e 17 00 00 83 3d 25 c7 f5 07 00 74 2c 4c 89 e8 48 c1 e8 03 <80> 3c 30 00 74 12 4c 89 ef e8 3e d1 5a 00 48 be 00 00 00 00 00 fc
RSP: 0018:ffffc90004b9f850 EFLAGS: 00010006
Call Trace:
lock_acquire+0x140/0x6f0 kernel/locking/lockdep.c:5006
__raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline]
_raw_spin_lock+0x2a/0x40 kernel/locking/spinlock.c:151
spin_lock include/linux/spinlock.h:354 [inline]
madvise_cold_or_pageout_pte_range+0x52f/0x25c0 mm/madvise.c:389
walk_pmd_range mm/pagewalk.c:89 [inline]
walk_pud_range mm/pagewalk.c:160 [inline]
walk_p4d_range mm/pagewalk.c:193 [inline]
walk_pgd_range mm/pagewalk.c:229 [inline]
__walk_page_range+0xe7b/0x1da0 mm/pagewalk.c:331
walk_page_range+0x2c3/0x5c0 mm/pagewalk.c:427
madvise_pageout_page_range mm/madvise.c:521 [inline]
madvise_pageout mm/madvise.c:557 [inline]
madvise_vma mm/madvise.c:946 [inline]
do_madvise+0x12d0/0x2090 mm/madvise.c:1145
__do_sys_madvise mm/madvise.c:1171 [inline]
__se_sys_madvise mm/madvise.c:1169 [inline]
__x64_sys_madvise+0x76/0x80 mm/madvise.c:1169
do_syscall_64+0x31/0x70 arch/x86/entry/common.c:46
entry_SYSCALL_64_after_hwframe+0x44/0xa9The backing vma was shmem.
In case of split page of file-backed THP, madvise zaps the pmd instead of remapping of sub-pages. So we need to check pmd validity after split.
--- mm/madvise.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/madvise.c +1 -1
@@ -380,9 +380,9 @@ static int madvise_cold_or_pageout_pte_range(pmd_t *pmd, return 0; } +regular_page:if (pmd_trans_unstable (pmd))return 0 ; -regular_page:#endif tlb_change_page_size (tlb,PAGE_SIZE ); orig_pte = pte =pte_offset_map_lock (vma->vm_mm, pmd, addr, &ptl);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 367/388 arch/x86/lib/usercopy_64.c: fix __copy_user_flushcache() cache writeback
In reply to Greg Kroah-HartmanFrom: Mikulas Patocka <[email protected]>
commit a1cd6c2ae47ee10ff21e62475685d5b399e2ed4a upstream.
If we copy less than 8 bytes and if the destination crosses a cache line, __copy_user_flushcache would invalidate only the first cache line.
This patch makes it invalidate the second cache line as well.
--- arch/x86/lib/usercopy_64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/lib/usercopy_64.c +1 -1
@@ -120,7 +120,7 @@ long __copy_user_flushcache(void *dst, c*/ if (size <8 ) {if (!IS_ALIGNED (dest,4 ) || size !=4 ) -clean_cache_range (dst,1 ); +clean_cache_range (dst, size); }else {if (!IS_ALIGNED (dest,8 )) { dest =ALIGN (dest, boot_cpu_data.x86_clflush_size);
Greg Kroah-Hartman
maintainerPATCH 368/388 x86/ioapic: Unbreak check_timer()
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
commit 86a82ae0b5095ea24c55898a3f025791e7958b21 upstream.
Several people reported in the kernel bugzilla that between v4.12 and v4.13 the magic which works around broken hardware and BIOSes to find the proper timer interrupt delivery mode stopped working for some older affected platforms which need to fall back to ExtINT delivery mode.
The reason is that the core code changed to keep track of the masked and disabled state of an interrupt line more accurately to avoid the expensive hardware operations.
That broke an assumption in i8259_make_irq() which invokes
disable_irq_nosync();
irq_set_chip_and_handler();
enable_irq();Up to v4.12 this worked because enable_irq() unconditionally unmasked the interrupt line, but after the state tracking improvements this is not longer the case because the IO/APIC uses lazy disabling. So the line state is unmasked which means that enable_irq() does not call into the new irq chip to unmask it.
In principle this is a shortcoming of the core code, but it's more than unclear whether the core code should try to reset state. At least this cannot be done unconditionally as that would break other existing use cases where the chip type is changed, e.g. when changing the trigger type, but the callers expect the state to be preserved.
As the way how check_timer() is switching the delivery modes is truly unique, the obvious fix is to simply unmask the i8259 manually after changing the mode to ExtINT delivery and switching the irq chip to the legacy PIC.
Note, that the fixes tag is not really precise, but identifies the commit which broke the assumptions in the IO/APIC and i8259 code and that's the kernel version to which this needs to be backported.
--- arch/x86/kernel/apic/io_apic.c | 1 + 1 file changed, 1 insertion(+)
arch/x86/kernel/apic/io_apic.c +1 -0
@@ -2256,6 +2256,7 @@ static inline void __init check_timer(vo legacy_pic->init (0 ); legacy_pic->make_irq (0 );apic_write (APIC_LVT0 ,APIC_DM_EXTINT ); + legacy_pic->unmask (0 );unlock_ExtINT_logic ();
Greg Kroah-Hartman
maintainerPATCH 369/388 scsi: lpfc: Fix initial FLOGI failure due to BBSCN not supported
In reply to Greg Kroah-HartmanFrom: James Smart <[email protected]>
commit 7f04839ec4483563f38062b4dd90253e45447198 upstream.
Initial FLOGIs are failing with the following message:
lpfc 0000:13:00.1: 1:(0):0820 FLOGI Failed (x300). BBCredit Not Supported
In a prior patch, the READ_SPARAM command was re-ordered to post after CONFIG_LINK as the driver is expected to update the driver's copy of the service parameters for the FLOGI payload. If the bb-credit recovery feature is enabled, this is fine. But on adapters were bb-credit recovery isn't enabled, it would cause the FLOGI to fail.
Fix by restoring the original command order (READ_SPARAM before CONFIG_LINK), and after issuing CONFIG_LINK, detect bb-credit recovery support and reissuing READ_SPARAM to obtain the updated service parameters (effectively adding in the fix command order).
[mkp: corrected SHA]
--- drivers/scsi/lpfc/lpfc_hbadisc.c | 76 ++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 24 deletions(-)
drivers/scsi/lpfc/lpfc_hbadisc.c +52 -24
@@ -73,6 +73,7 @@ static void lpfc_disc_timeout_handler(ststatic void lpfc_disc_flush_list (struct lpfc_vport *vport);static void lpfc_unregister_fcfi_cmpl (struct lpfc_hba *,LPFC_MBOXQ_t *);static int lpfc_fcf_inuse (struct lpfc_hba *); +static void lpfc_mbx_cmpl_read_sparam (struct lpfc_hba *,LPFC_MBOXQ_t *);void lpfc_terminate_rport_io (struct fc_rport *rport)
@@ -1134,11 +1135,13 @@ out:return ; } -void lpfc_mbx_cmpl_local_config_link (struct lpfc_hba *phba,LPFC_MBOXQ_t *pmb) {struct lpfc_vport *vport = pmb->vport; +LPFC_MBOXQ_t *sparam_mb; +struct lpfc_dmabuf *sparam_mp; +int rc;if (pmb->u.mb.mbxStatus) goto out;
@@ -1163,12 +1166,42 @@ lpfc_mbx_cmpl_local_config_link(struct l }/* Start discovery by sending a FLOGI. port_state is identically -* LPFC_FLOGI while waiting for FLOGI cmpl. Check if sending -* the FLOGI is being deferred till after MBX_READ_SPARAM completes. +* LPFC_FLOGI while waiting for FLOGI cmpl. */ if (vport->port_state !=LPFC_FLOGI ) { -if (!(phba->hba_flag &HBA_DEFER_FLOGI )) +/* Issue MBX_READ_SPARAM to update CSPs before FLOGI if +* bb-credit recovery is in place. +*/ +if (phba->bbcredit_support && phba->cfg_enable_bbcr && + !(phba->link_flag &LS_LOOPBACK_MODE )) { + sparam_mb =mempool_alloc (phba->mbox_mem_pool, +GFP_KERNEL ); +if (!sparam_mb) + goto sparam_out; + + rc =lpfc_read_sparam (phba, sparam_mb,0 ); +if (rc) { +mempool_free (sparam_mb, phba->mbox_mem_pool); + goto sparam_out; + } + sparam_mb->vport = vport; + sparam_mb->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; + rc =lpfc_sli_issue_mbox (phba, sparam_mb,MBX_NOWAIT ); +if (rc ==MBX_NOT_FINISHED ) { + sparam_mp = (struct lpfc_dmabuf *) + sparam_mb->ctx_buf; +lpfc_mbuf_free (phba, sparam_mp->virt, + sparam_mp->phys); +kfree (sparam_mp); + sparam_mb->ctx_buf =NULL ; +mempool_free (sparam_mb, phba->mbox_mem_pool); + goto sparam_out; + } + + phba->hba_flag |=HBA_DEFER_FLOGI ; + }else {lpfc_initial_flogi (vport); + } }else {if (vport->fc_flag &FC_PT2PT )lpfc_disc_start (vport);
@@ -1180,6 +1213,7 @@ out:"0306 CONFIG_LINK mbxStatus error x%x " "HBA state x%x\n" , pmb->u.mb.mbxStatus, vport->port_state); +sparam_out:mempool_free (pmb, phba->mbox_mem_pool);lpfc_linkdown (phba);
@@ -3237,21 +3271,6 @@ lpfc_mbx_process_link_up(struct lpfc_hbalpfc_linkup (phba); sparam_mbox =NULL ; -if (!(phba->hba_flag &HBA_FCOE_MODE )) { - cfglink_mbox =mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL ); -if (!cfglink_mbox) - goto out; - vport->port_state =LPFC_LOCAL_CFG_LINK ; -lpfc_config_link (phba, cfglink_mbox); - cfglink_mbox->vport = vport; - cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link; - rc =lpfc_sli_issue_mbox (phba, cfglink_mbox,MBX_NOWAIT ); -if (rc ==MBX_NOT_FINISHED ) { -mempool_free (cfglink_mbox, phba->mbox_mem_pool); - goto out; - } - } - sparam_mbox =mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL );if (!sparam_mbox) goto out;
@@ -3272,7 +3291,20 @@ lpfc_mbx_process_link_up(struct lpfc_hba goto out; } -if (phba->hba_flag &HBA_FCOE_MODE ) { +if (!(phba->hba_flag &HBA_FCOE_MODE )) { + cfglink_mbox =mempool_alloc (phba->mbox_mem_pool,GFP_KERNEL ); +if (!cfglink_mbox) + goto out; + vport->port_state =LPFC_LOCAL_CFG_LINK ; +lpfc_config_link (phba, cfglink_mbox); + cfglink_mbox->vport = vport; + cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link; + rc =lpfc_sli_issue_mbox (phba, cfglink_mbox,MBX_NOWAIT ); +if (rc ==MBX_NOT_FINISHED ) { +mempool_free (cfglink_mbox, phba->mbox_mem_pool); + goto out; + } + }else { vport->port_state =LPFC_VPORT_UNKNOWN ;/* * Add the driver's default FCF record at FCF index 0 now. This
@@ -3329,10 +3361,6 @@ lpfc_mbx_process_link_up(struct lpfc_hba }/* Reset FCF roundrobin bmask for new discovery */ lpfc_sli4_clear_fcf_rr_bmask (phba); - }else { -if (phba->bbcredit_support && phba->cfg_enable_bbcr && - !(phba->link_flag &LS_LOOPBACK_MODE )) - phba->hba_flag |=HBA_DEFER_FLOGI ; }/* Prepare for LINK up registrations */
Greg Kroah-Hartman
maintainerPATCH 370/388 ALSA: usb-audio: Add delay quirk for H570e USB headsets
In reply to Greg Kroah-HartmanFrom: Joakim Tjernlund <[email protected]>
commit 315c7ad7a701baba28c628c4c5426b3d9617ceed upstream.
Needs the same delay as H650e
--- sound/usb/quirks.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
sound/usb/quirks.c +4 -3
@@ -1604,12 +1604,13 @@ void snd_usb_ctl_msg_quirk(struct usb_de && (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)msleep (20 ); -/* Zoom R16/24, Logitech H650e, Jabra 550a, Kingston HyperX needs a tiny -* delay here, otherwise requests like get/set frequency return as -* failed despite actually succeeding. +/* Zoom R16/24, Logitech H650e/H570e, Jabra 550a, Kingston HyperX +* needs a tiny delay here, otherwise requests like get/set +* frequency return as failed despite actually succeeding. */ if ((chip->usb_id ==USB_ID (0x1686 ,0x00dd ) || chip->usb_id ==USB_ID (0x046d ,0x0a46 ) || + chip->usb_id ==USB_ID (0x046d ,0x0a56 ) || chip->usb_id ==USB_ID (0x0b0e ,0x0349 ) || chip->usb_id ==USB_ID (0x0951 ,0x16ad )) && (requesttype &USB_TYPE_MASK ) ==USB_TYPE_CLASS )
Greg Kroah-Hartman
maintainerPATCH 371/388 ALSA: hda/realtek - Couldnt detect Mic if booting with headset plugged
In reply to Greg Kroah-HartmanFrom: Hui Wang <[email protected]>
commit 3f74249057827c5f6676c41c18f6be12ce1469ce upstream.
We found a Mic detection issue on many Lenovo laptops, those laptops belong to differnt models and they have different audio design like internal mic connects to the codec or PCH, they all have this problem, the problem is if plugging a headset before powerup/reboot the machine, after booting up, the headphone could be detected but Mic couldn't. If we plug out and plug in the headset, both headphone and Mic could be detected then.
Through debugging we found the codec on those laptops are same, it is alc257, and if we don't disable the 3k pulldown in alc256_shutup(), the issue will be fixed. So far there is no pop noise or power consumption regression on those laptops after this change.
--- sound/pci/hda/patch_realtek.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
sound/pci/hda/patch_realtek.c +5 -1
@@ -3418,7 +3418,11 @@ static void alc256_shutup(struct hda_cod/* 3k pull low control for Headset jack. */ /* NOTE: call this before clearing the pin, otherwise codec stalls */ -alc_update_coef_idx (codec,0x46 ,0 ,3 <<12 ); +/* If disable 3k pulldown control for alc257, the Mic detection will not work correctly +* when booting with headset plugged. So skip setting it for the codec alc257 +*/ +if (codec->core.vendor_id !=0x10ec0257 ) +alc_update_coef_idx (codec,0x46 ,0 ,3 <<12 );if (!spec->no_shutup_pins) snd_hda_codec_write(codec, hp_pin, 0,
Greg Kroah-Hartman
maintainerPATCH 372/388 ALSA: hda/realtek: Enable front panel headset LED on Lenovo ThinkStation P520
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
commit f73bbf639b32acb6b409e188fdde5644b301978f upstream.
On Lenovo P520, the front panel headset LED isn't lit up right now.
Realtek states that the LED needs to be enabled by ALC233's GPIO2, so let's do it accordingly to light the LED up.
--- sound/pci/hda/patch_realtek.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/pci/hda/patch_realtek.c +7 -0
@@ -6036,6 +6036,7 @@ static void alc_fixup_thinkpad_acpi(stru#include "hp_x360_helper.c" enum { +ALC269_FIXUP_GPIO2 ,ALC269_FIXUP_SONY_VAIO ,ALC275_FIXUP_SONY_VAIO_GPIO2 ,ALC269_FIXUP_DELL_M101Z ,
@@ -6217,6 +6218,10 @@ enum { };static const struct hda_fixup alc269_fixups[] = { + [ALC269_FIXUP_GPIO2 ] = { + .type =HDA_FIXUP_FUNC , + .v.func = alc_fixup_gpio2, + }, [ALC269_FIXUP_SONY_VAIO ] = { .type =HDA_FIXUP_PINCTLS , .v.pins = (const struct hda_pintbl []) {
@@ -7036,6 +7041,8 @@ static const struct hda_fixup alc269_fix [ALC233_FIXUP_LENOVO_MULTI_CODECS] = { .type = HDA_FIXUP_FUNC, .v.func = alc233_alc662_fixup_lenovo_dual_codecs, + .chained = true, + .chain_id =ALC269_FIXUP_GPIO2 }, [ALC233_FIXUP_ACER_HEADSET_MIC] = { .type = HDA_FIXUP_VERBS,
Greg Kroah-Hartman
maintainerPATCH 373/388 lib/string.c: implement stpcpy
In reply to Greg Kroah-HartmanFrom: Nick Desaulniers <[email protected]>
commit 1e1b6d63d6340764e00356873e5794225a2a03ea upstream.
LLVM implemented a recent "libcall optimization" that lowers calls to sprintf(dest, "%s", str) where the return value is used to stpcpy(dest, str) - dest.
This generally avoids the machinery involved in parsing format strings. stpcpy is just like strcpy except it returns the pointer to the new tail of dest. This optimization was introduced into clang-12.
Implement this so that we don't observe linkage failures due to missing symbol definitions for stpcpy.
Similar to last year's fire drill with: commit 5f074f3e192f ("lib/string.c: implement a basic bcmp")
The kernel is somewhere between a "freestanding" environment (no full libc) and "hosted" environment (many symbols from libc exist with the same type, function signature, and semantics).
As Peter Anvin notes, there's not really a great way to inform the compiler that you're targeting a freestanding environment but would like to opt-in to some libcall optimizations (see pr/47280 below), rather than opt-out.
Arvind notes, -fno-builtin-* behaves slightly differently between GCC and Clang, and Clang is missing many __builtin_* definitions, which I consider a bug in Clang and am working on fixing.
Masahiro summarizes the subtle distinction between compilers justly:
To prevent transformation from foo() into bar(), there are two ways in Clang to do that; -fno-builtin-foo, and -fno-builtin-bar. There is only one in GCC; -fno-buitin-foo.
(Any difference in that behavior in Clang is likely a bug from a missing __builtin_* definition.)
Masahiro also notes:
We want to disable optimization from foo() to bar(),
but we may still benefit from the optimization from foo() into something else. If GCC implements the same transform, we would run into a problem because it is not -fno-builtin-bar, but -fno-builtin-foo that disables that optimization.
In this regard, -fno-builtin-foo would be more future-proof than -fno-built-bar, but -fno-builtin-foo is still potentially overkill. We may want to prevent calls from foo() being optimized into calls to bar(), but we still may want other optimization on calls to foo().
It seems that compilers today don't quite provide the fine grain control over which libcall optimizations pseudo-freestanding environments would prefer.
Finally, Kees notes that this interface is unsafe, so we should not encourage its use. As such, I've removed the declaration from any header, but it still needs to be exported to avoid linkage errors in modules.
--- lib/string.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
lib/string.c +24 -0
@@ -272,6 +272,30 @@ ssize_t strscpy_pad(char *dest, const ch }EXPORT_SYMBOL (strscpy_pad); +/** +* stpcpy - copy a string from src to dest returning a pointer to the new end +* of dest, including src's %NUL-terminator. May overrun dest. +* @dest: pointer to end of string being copied into. Must be large enough +* to receive copy. +* @src: pointer to the beginning of string being copied from. Must not overlap +* dest. +* +* stpcpy differs from strcpy in a key way: the return value is a pointer +* to the new %NUL-terminating character in @dest. (For strcpy, the return +* value is a pointer to the start of @dest). This interface is considered +* unsafe as it doesn't perform bounds checking of the inputs. As such it's +* not recommended for usage. Instead, its definition is provided in case +* the compiler lowers other libcalls to stpcpy. +*/ +char *stpcpy (char *__restrict__ dest,const char *__restrict__ src); +char *stpcpy (char *__restrict__ dest,const char *__restrict__ src) +{ +while ((*dest++ = *src++) !='\0' ) +/* nothing */ ; +return --dest; +} +EXPORT_SYMBOL (stpcpy); +#ifndef __HAVE_ARCH_STRCAT/** * strcat - Append one %NUL-terminated string to another
Greg Kroah-Hartman
maintainerPATCH 374/388 tracing: fix double free
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
commit 46bbe5c671e06f070428b9be142cc4ee5cedebac upstream.
clang static analyzer reports this problem
trace_events_hist.c:3824:3: warning: Attempt to free
released memory
kfree(hist_data->attrs->var_defs.name[i]);
In parse_var_defs() if there is a problem allocating var_defs.expr, the earlier var_defs.name is freed. This free is duplicated by free_var_defs() which frees the rest of the list.
Because free_var_defs() has to run anyway, remove the second free fom parse_var_defs().
--- kernel/trace/trace_events_hist.c | 1 - 1 file changed, 1 deletion(-)
kernel/trace/trace_events_hist.c +0 -1
@@ -4770,7 +4770,6 @@ static int parse_var_defs(struct hist_tr s =kstrdup (field_str,GFP_KERNEL );if (!s) { -kfree (hist_data->attrs->var_defs.name[n_vars]); ret = -ENOMEM ; goto free; }
Greg Kroah-Hartman
maintainerPATCH 375/388 s390/dasd: Fix zero write for FBA devices
In reply to Greg Kroah-HartmanFrom: Jan Höppner <[email protected]>
commit 709192d531e5b0a91f20aa14abfe2fc27ddd47af upstream.
A discard request that writes zeros using the global kernel internal ZERO_PAGE will fail for machines with more than 2GB of memory due to the location of the ZERO_PAGE.
Fix this by using a driver owned global zero page allocated with GFP_DMA flag set.
--- drivers/s390/block/dasd_fba.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/s390/block/dasd_fba.c +8 -1
@@ -40,6 +40,7 @@MODULE_LICENSE ("GPL" );static struct dasd_discipline dasd_fba_discipline; +static void *dasd_fba_zero_page;struct dasd_fba_private {struct dasd_fba_characteristics rdc_data;
@@ -270,7 +271,7 @@ static void ccw_write_zero(struct ccw1 * ccw->cmd_code =DASD_FBA_CCW_WRITE ; ccw->flags |=CCW_FLAG_SLI ; ccw->count = count; - ccw->cda = (__u32 ) (addr_t )page_to_phys (ZERO_PAGE (0 )); + ccw->cda = (__u32 ) (addr_t ) dasd_fba_zero_page; }/*
@@ -830,6 +831,11 @@ dasd_fba_init(void)int ret;ASCEBC (dasd_fba_discipline.ebcname,4 ); + + dasd_fba_zero_page = (void *)get_zeroed_page (GFP_KERNEL |GFP_DMA ); +if (!dasd_fba_zero_page) +return -ENOMEM ; + ret =ccw_driver_register (&dasd_fba_driver);if (!ret)wait_for_device_probe ();
@@ -841,6 +847,7 @@ static void __exitdasd_fba_cleanup (void) {ccw_driver_unregister (&dasd_fba_driver); +free_page ((unsigned long )dasd_fba_zero_page); }module_init (dasd_fba_init);
Greg Kroah-Hartman
maintainerPATCH 376/388 kprobes: Fix to check probe enabled before disarm_kprobe_ftrace()
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
commit 3031313eb3d549b7ad6f9fbcc52ba04412e3eb9e upstream.
Commit 0cb2f1372baa ("kprobes: Fix NULL pointer dereference at kprobe_ftrace_handler") fixed one bug but not completely fixed yet. If we run a kprobe_module.tc of ftracetest, kernel showed a warning as below.
# ./ftracetest test.d/kprobe/kprobe_module.tc === Ftrace unit tests === [1] Kprobe dynamic event - probing module ... [ 22.400215] ------------[ cut here ]------------ [ 22.400962] Failed to disarm kprobe-ftrace at trace_printk_irq_work+0x0/0x7e [trace_printk] (-2) [ 22.402139] WARNING: CPU: 7 PID: 200 at kernel/kprobes.c:1091 __disarm_kprobe_ftrace.isra.0+0x7e/0xa0 [ 22.403358] Modules linked in: trace_printk(-) [ 22.404028] CPU: 7 PID: 200 Comm: rmmod Not tainted 5.9.0-rc2+ #66 [ 22.404870] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1 04/01/2014 [ 22.406139] RIP: 0010:__disarm_kprobe_ftrace.isra.0+0x7e/0xa0 [ 22.406947] Code: 30 8b 03 eb c9 80 3d e5 09 1f 01 00 75 dc 49 8b 34 24 89 c2 48 c7 c7 a0 c2 05 82 89 45 e4 c6 05 cc 09 1f 01 01 e8 a9 c7 f0 ff <0f> 0b 8b 45 e4 eb b9 89 c6 48 c7 c7 70 c2 05 82 89 45 e4 e8 91 c7 [ 22.409544] RSP: 0018:ffffc90000237df0 EFLAGS: 00010286 [ 22.410385] RAX: 0000000000000000 RBX: ffffffff83066024 RCX: 0000000000000000 [ 22.411434] RDX: 0000000000000001 RSI: ffffffff810de8d3 RDI: ffffffff810de8d3 [ 22.412687] RBP: ffffc90000237e10 R08: 0000000000000001 R09: 0000000000000001 [ 22.413762] R10: 0000000000000000 R11: 0000000000000001 R12: ffff88807c478640 [ 22.414852] R13: ffffffff8235ebc0 R14: ffffffffa00060c0 R15: 0000000000000000 [ 22.415941] FS: 00000000019d48c0(0000) GS:ffff88807d7c0000(0000) knlGS:0000000000000000 [ 22.417264] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 22.418176] CR2: 00000000005bb7e3 CR3: 0000000078f7a000 CR4: 00000000000006a0 [ 22.419309] Call Trace: [ 22.419990] kill_kprobe+0x94/0x160 [ 22.420652] kprobes_module_callback+0x64/0x230 [ 22.421470] notifier_call_chain+0x4f/0x70 [ 22.422184] blocking_notifier_call_chain+0x49/0x70 [ 22.422979] __x64_sys_delete_module+0x1ac/0x240 [ 22.423733] do_syscall_64+0x38/0x50 [ 22.424366] entry_SYSCALL_64_after_hwframe+0x44/0xa9 [ 22.425176] RIP: 0033:0x4bb81d [ 22.425741] Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 e0 ff ff ff f7 d8 64 89 01 48 [ 22.428726] RSP: 002b:00007ffc70fef008 EFLAGS: 00000246 ORIG_RAX: 00000000000000b0 [ 22.430169] RAX: ffffffffffffffda RBX: 00000000019d48a0 RCX: 00000000004bb81d [ 22.431375] RDX: 0000000000000000 RSI: 0000000000000880 RDI: 00007ffc70fef028 [ 22.432543] RBP: 0000000000000880 R08: 00000000ffffffff R09: 00007ffc70fef320 [ 22.433692] R10: 0000000000656300 R11: 0000000000000246 R12: 00007ffc70fef028 [ 22.434635] R13: 0000000000000000 R14: 0000000000000002 R15: 0000000000000000 [ 22.435682] irq event stamp: 1169 [ 22.436240] hardirqs last enabled at (1179): [<ffffffff810df542>] console_unlock+0x422/0x580 [ 22.437466] hardirqs last disabled at (1188): [<ffffffff810df19b>] console_unlock+0x7b/0x580 [ 22.438608] softirqs last enabled at (866): [<ffffffff81c0038e>] __do_softirq+0x38e/0x490 [ 22.439637] softirqs last disabled at (859): [<ffffffff81a00f42>] asm_call_on_stack+0x12/0x20 [ 22.440690] ---[ end trace 1e7ce7e1e4567276 ]--- [ 22.472832] trace_kprobe: This probe might be able to register after target module is loaded. Continue.
This is because the kill_kprobe() calls disarm_kprobe_ftrace() even if the given probe is not enabled. In that case, ftrace_set_filter_ip() fails because the given probe point is not registered to ftrace.
Fix to check the given (going) probe is enabled before invoking disarm_kprobe_ftrace().
--- kernel/kprobes.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
kernel/kprobes.c +3 -2
@@ -2110,9 +2110,10 @@ static void kill_kprobe(struct kprobe *p/* * The module is going away. We should disarm the kprobe which -* is using ftrace. +* is using ftrace, because ftrace framework is still available at +* MODULE_STATE_GOING notification. */ -if (kprobe_ftrace (p)) +if (kprobe_ftrace (p) && !kprobe_disabled (p) && !kprobes_all_disarmed)disarm_kprobe_ftrace (p); }
Greg Kroah-Hartman
maintainerPATCH 377/388 kprobes: tracing/kprobes: Fix to kill kprobes on initmem after boot
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
commit 82d083ab60c3693201c6f5c7a5f23a6ed422098d upstream.
Since kprobe_event= cmdline option allows user to put kprobes on the functions in initmem, kprobe has to make such probes gone after boot. Currently the probes on the init functions in modules will be handled by module callback, but the kernel init text isn't handled. Without this, kprobes may access non-exist text area to disable or remove it.
--- include/linux/kprobes.h | 5 +++++ init/main.c | 2 ++ kernel/kprobes.c | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+)
include/linux/kprobes.h +5 -0
@@ -369,6 +369,8 @@ void unregister_kretprobes(struct kretprvoid kprobe_flush_task (struct task_struct *tk);void recycle_rp_inst (struct kretprobe_instance *ri,struct hlist_head *head); +void kprobe_free_init_mem (void ); +int disable_kprobe (struct kprobe *kp);int enable_kprobe (struct kprobe *kp);
@@ -426,6 +428,9 @@ static inline void unregister_kretprobesstatic inline void kprobe_flush_task (struct task_struct *tk) { } +static inline void kprobe_free_init_mem (void ) +{ +}static inline int disable_kprobe (struct kprobe *kp) {return -ENOSYS ;
init/main.c +2 -0
@@ -32,6 +32,7 @@#include <linux/nmi.h> #include <linux/percpu.h> #include <linux/kmod.h> +#include <linux/kprobes.h> #include <linux/vmalloc.h> #include <linux/kernel_stat.h> #include <linux/start_kernel.h>
@@ -1111,6 +1112,7 @@ static int __ref kernel_init(void *unusekernel_init_freeable ();/* need to finish all async __init code before freeing the memory */ async_synchronize_full (); +kprobe_free_init_mem ();ftrace_free_init_mem ();free_initmem ();mark_readonly ();
kernel/kprobes.c +22 -0
@@ -2309,6 +2309,28 @@ static struct notifier_block kprobe_moduextern unsigned long __start_kprobe_blacklist[];extern unsigned long __stop_kprobe_blacklist[]; +void kprobe_free_init_mem (void ) +{ +void *start = (void *)(&__init_begin); +void *end = (void *)(&__init_end); +struct hlist_head *head; +struct kprobe *p; +int i; + +mutex_lock (&kprobe_mutex); + +/* Kill all kprobes on initmem */ +for (i =0 ; i <KPROBE_TABLE_SIZE ; i++) { + head = &kprobe_table[i]; +hlist_for_each_entry (p, head, hlist) { +if (start <= (void *)p->addr && (void *)p->addr < end) +kill_kprobe (p); + } + } + +mutex_unlock (&kprobe_mutex); +} +static int __init init_kprobes (void ) {int i, err =0 ;
Greg Kroah-Hartman
maintainerPATCH 378/388 btrfs: fix overflow when copying corrupt csums for a message
In reply to Greg Kroah-HartmanFrom: Johannes Thumshirn <[email protected]>
commit 35be8851d172c6e3db836c0f28c19087b10c9e00 upstream.
Syzkaller reported a buffer overflow in btree_readpage_end_io_hook() when loop mounting a crafted image:
detected buffer overflow in memcpy
------------[ cut here ]------------ kernel BUG at lib/string.c:1129! invalid opcode: 0000 [#1] PREEMPT SMP KASAN CPU: 1 PID: 26 Comm: kworker/u4:2 Not tainted 5.9.0-rc4-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Workqueue: btrfs-endio-meta btrfs_work_helper RIP: 0010:fortify_panic+0xf/0x20 lib/string.c:1129 RSP: 0018:ffffc90000e27980 EFLAGS: 00010286 RAX: 0000000000000022 RBX: ffff8880a80dca64 RCX: 0000000000000000 RDX: ffff8880a90860c0 RSI: ffffffff815dba07 RDI: fffff520001c4f22 RBP: ffff8880a80dca00 R08: 0000000000000022 R09: ffff8880ae7318e7 R10: 0000000000000000 R11: 0000000000077578 R12: 00000000ffffff6e R13: 0000000000000008 R14: ffffc90000e27a40 R15: 1ffff920001c4f3c FS: 0000000000000000(0000) GS:ffff8880ae700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000557335f440d0 CR3: 000000009647d000 CR4: 00000000001506e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: memcpy include/linux/string.h:405 [inline] btree_readpage_end_io_hook.cold+0x206/0x221 fs/btrfs/disk-io.c:642 end_bio_extent_readpage+0x4de/0x10c0 fs/btrfs/extent_io.c:2854 bio_endio+0x3cf/0x7f0 block/bio.c:1449 end_workqueue_fn+0x114/0x170 fs/btrfs/disk-io.c:1695 btrfs_work_helper+0x221/0xe20 fs/btrfs/async-thread.c:318 process_one_work+0x94c/0x1670 kernel/workqueue.c:2269 worker_thread+0x64c/0x1120 kernel/workqueue.c:2415 kthread+0x3b5/0x4a0 kernel/kthread.c:292 ret_from_fork+0x1f/0x30 arch/x86/entry/entry_64.S:294 Modules linked in: ---[ end trace b68924293169feef ]--- RIP: 0010:fortify_panic+0xf/0x20 lib/string.c:1129 RSP: 0018:ffffc90000e27980 EFLAGS: 00010286 RAX: 0000000000000022 RBX: ffff8880a80dca64 RCX: 0000000000000000 RDX: ffff8880a90860c0 RSI: ffffffff815dba07 RDI: fffff520001c4f22 RBP: ffff8880a80dca00 R08: 0000000000000022 R09: ffff8880ae7318e7 R10: 0000000000000000 R11: 0000000000077578 R12: 00000000ffffff6e R13: 0000000000000008 R14: ffffc90000e27a40 R15: 1ffff920001c4f3c FS: 0000000000000000(0000) GS:ffff8880ae700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f95b7c4d008 CR3: 000000009647d000 CR4: 00000000001506e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
The overflow happens, because in btree_readpage_end_io_hook() we assume that we have found a 4 byte checksum instead of the real possible 32 bytes we have for the checksums.
With the fix applied:
[ 35.726623] BTRFS: device fsid 815caf9a-dc43-4d2a-ac54-764b8333d765 devid 1 transid 5 /dev/loop0 scanned by syz-repro (215) [ 35.738994] BTRFS info (device loop0): disk space caching is enabled [ 35.738998] BTRFS info (device loop0): has skinny extents [ 35.743337] BTRFS warning (device loop0): loop0 checksum verify failed on 1052672 wanted 0xf9c035fc8d239a54 found 0x67a25c14b7eabcf9 level 0 [ 35.743420] BTRFS error (device loop0): failed to read chunk root [ 35.745899] BTRFS error (device loop0): open_ctree failed
--- fs/btrfs/disk-io.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
fs/btrfs/disk-io.c +5 -6
@@ -649,16 +649,15 @@ static int btree_readpage_end_io_hook(st goto err;if (memcmp_extent_buffer (eb, result,0 , csum_size)) { -u32 val; -u32 found =0 ; - -memcpy (&found, result, csum_size); +u8 val[BTRFS_CSUM_SIZE ] = {0 };read_extent_buffer (eb, &val,0 , csum_size);btrfs_warn_rl (fs_info, -"%s checksum verify failed on %llu wanted %x found %x level %d" , +"%s checksum verify failed on %llu wanted " CSUM_FMT " found " CSUM_FMT " level %d" , fs_info->sb->s_id, eb->start, - val, found,btrfs_header_level (eb)); +CSUM_FMT_VALUE (csum_size, val), +CSUM_FMT_VALUE (csum_size, result), +btrfs_header_level (eb)); ret = -EUCLEAN ; goto err; }
Greg Kroah-Hartman
maintainerPATCH 379/388 dmabuf: fix NULL pointer dereference in dma_buf_release()
In reply to Greg Kroah-HartmanFrom: Charan Teja Reddy <[email protected]>
commit 19a508bd1ad8e444de86873bf2f2b2ab8edd6552 upstream.
NULL pointer dereference is observed while exporting the dmabuf but failed to allocate the 'struct file' which results into the dropping of the allocated dentry corresponding to this file in the dmabuf fs, which is ending up in dma_buf_release() and accessing the uninitialzed dentry->d_fsdata.
Call stack on 5.4 is below:
dma_buf_release+0x2c/0x254 drivers/dma-buf/dma-buf.c:88 __dentry_kill+0x294/0x31c fs/dcache.c:584 dentry_kill fs/dcache.c:673 [inline] dput+0x250/0x380 fs/dcache.c:859 path_put+0x24/0x40 fs/namei.c:485 alloc_file_pseudo+0x1a4/0x200 fs/file_table.c:235 dma_buf_getfile drivers/dma-buf/dma-buf.c:473 [inline] dma_buf_export+0x25c/0x3ec drivers/dma-buf/dma-buf.c:585
Fix this by checking for the valid pointer in the dentry->d_fsdata.
--- drivers/dma-buf/dma-buf.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/dma-buf/dma-buf.c +2 -0
@@ -59,6 +59,8 @@ static void dma_buf_release(struct dentrstruct dma_buf *dmabuf; dmabuf = dentry->d_fsdata; +if (unlikely (!dmabuf)) +return ;BUG_ON (dmabuf->vmapping_counter);
Greg Kroah-Hartman
maintainerPATCH 380/388 mm, THP, swap: fix allocating cluster for swapfile by mistake
In reply to Greg Kroah-HartmanFrom: Gao Xiang <[email protected]>
commit 41663430588c737dd735bad5a0d1ba325dcabd59 upstream.
SWP_FS is used to make swap_{read,write}page() go through the filesystem, and it's only used for swap files over NFS. So, !SWP_FS means non NFS for now, it could be either file backed or device backed. Something similar goes with legacy SWP_FILE.
So in order to achieve the goal of the original patch, SWP_BLKDEV should be used instead.
FS corruption can be observed with SSD device + XFS + fragmented swapfile due to CONFIG_THP_SWAP=y.
I reproduced the issue with the following details:
Environment:
QEMU + upstream kernel + buildroot + NVMe (2 GB)
Kernel config:
CONFIG_BLK_DEV_NVME=y
CONFIG_THP_SWAP=y
Some reproducible steps:
mkfs.xfs -f /dev/nvme0n1
mkdir /tmp/mnt
mount /dev/nvme0n1 /tmp/mnt
bs="32k"
sz="1024m" # doesn't matter too much, I also tried 16m
xfs_io -f -c "pwrite -R -b $bs 0 $sz" -c "fdatasync" /tmp/mnt/sw xfs_io -f -c "pwrite -R -b $bs 0 $sz" -c "fdatasync" /tmp/mnt/sw xfs_io -f -c "pwrite -R -b $bs 0 $sz" -c "fdatasync" /tmp/mnt/sw xfs_io -f -c "pwrite -F -S 0 -b $bs 0 $sz" -c "fdatasync" /tmp/mnt/sw xfs_io -f -c "pwrite -R -b $bs 0 $sz" -c "fsync" /tmp/mnt/sw
mkswap /tmp/mnt/sw
swapon /tmp/mnt/sw
stress --vm 2 --vm-bytes 600M # doesn't matter too much as well
Symptoms:
- FS corruption (e.g. checksum failure)
- memory corruption at: 0xd2808010
- segfault
--- mm/swapfile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/swapfile.c +1 -1
@@ -1038,7 +1038,7 @@ start_over: goto nextsi; }if (size ==SWAPFILE_CLUSTER ) { -if (!(si->flags &SWP_FS )) +if (si->flags &SWP_BLKDEV ) n_ret =swap_alloc_cluster (si, swp_entries); }else n_ret = scan_swap_map_slots(si, SWAP_HAS_CACHE,
Greg Kroah-Hartman
maintainerPATCH 381/388 mm/gup: fix gup_fast with dynamic page table folding
In reply to Greg Kroah-HartmanFrom: Vasily Gorbik <[email protected]>
commit d3f7b1bb204099f2f7306318896223e8599bb6a2 upstream.
Currently to make sure that every page table entry is read just once gup_fast walks perform READ_ONCE and pass pXd value down to the next gup_pXd_range function by value e.g.:
static int gup_pud_range(p4d_t p4d, unsigned long addr, unsigned long end,
unsigned int flags, struct page **pages, int *nr)
...
pudp = pud_offset(&p4d, addr);
This function passes a reference on that local value copy to pXd_offset, and might get the very same pointer in return. This happens when the level is folded (on most arches), and that pointer should not be iterated.
On s390 due to the fact that each task might have different 5,4 or 3-level address translation and hence different levels folded the logic is more complex and non-iteratable pointer to a local copy leads to severe problems.
Here is an example of what happens with gup_fast on s390, for a task with 3-level paging, crossing a 2 GB pud boundary:
// addr = 0x1007ffff000, end = 0x10080001000
static int gup_pud_range(p4d_t p4d, unsigned long addr, unsigned long end,
unsigned int flags, struct page **pages, int *nr)
{
unsigned long next;
pud_t *pudp;
// pud_offset returns &p4d itself (a pointer to a value on stack)
pudp = pud_offset(&p4d, addr);
do {
// on second iteratation reading "random" stack value
pud_t pud = READ_ONCE(*pudp);
// next = 0x10080000000, due to PUD_SIZE/MASK != PGDIR_SIZE/MASK on s390
next = pud_addr_end(addr, end);
...
} while (pudp++, addr = next, addr != end); // pudp++ iterating over stack
return 1;}
This happens since s390 moved to common gup code with commit d1874a0c2805 ("s390/mm: make the pxd_offset functions more robust") and commit 1a42010cdc26 ("s390/mm: convert to the generic get_user_pages_fast code").
s390 tried to mimic static level folding by changing pXd_offset primitives to always calculate top level page table offset in pgd_offset and just return the value passed when pXd_offset has to act as folded.
What is crucial for gup_fast and what has been overlooked is that PxD_SIZE/MASK and thus pXd_addr_end should also change correspondingly. And the latter is not possible with dynamic folding.
To fix the issue in addition to pXd values pass original pXdp pointers down to gup_pXd_range functions. And introduce pXd_offset_lockless helpers, which take an additional pXd entry value parameter. This has already been discussed in
https://lkml.kernel.org/r/20190418100218.0a4afd51@mschwideX1
--- arch/s390/include/asm/pgtable.h | 44 +++++++++++++++++++++++++++++----------- include/asm-generic/pgtable.h | 10 +++++++++ mm/gup.c | 18 ++++++++-------- 3 files changed, 51 insertions(+), 21 deletions(-)
arch/s390/include/asm/pgtable.h +32 -12
@@ -1247,26 +1247,46 @@ static inline pgd_t *pgd_offset_raw(pgd_#define pgd_offset (mm, address) pgd_offset_raw(READ_ONCE((mm)->pgd), address)#define pgd_offset_k (address) pgd_offset(&init_mm, address) -static inline p4d_t *p4d_offset (pgd_t *pgd,unsigned long address) +static inline p4d_t *p4d_offset_lockless (pgd_t *pgdp,pgd_t pgd,unsigned long address) { -if ((pgd_val (*pgd) & _REGION_ENTRY_TYPE_MASK) >= _REGION_ENTRY_TYPE_R1) -return (p4d_t *)pgd_deref (*pgd) +p4d_index (address); -return (p4d_t *) pgd; +if ((pgd_val (pgd) & _REGION_ENTRY_TYPE_MASK) >= _REGION_ENTRY_TYPE_R1) +return (p4d_t *)pgd_deref (pgd) +p4d_index (address); +return (p4d_t *) pgdp; } +#define p4d_offset_lockless p4d_offset_lockless -static inline pud_t *pud_offset (p4d_t *p4d,unsigned long address) +static inline p4d_t *p4d_offset (pgd_t *pgdp,unsigned long address) { -if ((p4d_val (*p4d) & _REGION_ENTRY_TYPE_MASK) >= _REGION_ENTRY_TYPE_R2) -return (pud_t *)p4d_deref (*p4d) +pud_index (address); -return (pud_t *) p4d; +return p4d_offset_lockless (pgdp, *pgdp, address); } -static inline pmd_t *pmd_offset (pud_t *pud,unsigned long address) +static inline pud_t *pud_offset_lockless (p4d_t *p4dp,p4d_t p4d,unsigned long address) { -if ((pud_val (*pud) & _REGION_ENTRY_TYPE_MASK) >= _REGION_ENTRY_TYPE_R3) -return (pmd_t *)pud_deref (*pud) +pmd_index (address); -return (pmd_t *) pud; +if ((p4d_val (p4d) & _REGION_ENTRY_TYPE_MASK) >= _REGION_ENTRY_TYPE_R2) +return (pud_t *)p4d_deref (p4d) +pud_index (address); +return (pud_t *) p4dp; } +#define pud_offset_lockless pud_offset_lockless + +static inline pud_t *pud_offset (p4d_t *p4dp,unsigned long address) +{ +return pud_offset_lockless (p4dp, *p4dp, address); +} +#define pud_offset pud_offset + +static inline pmd_t *pmd_offset_lockless (pud_t *pudp,pud_t pud,unsigned long address) +{ +if ((pud_val (pud) & _REGION_ENTRY_TYPE_MASK) >= _REGION_ENTRY_TYPE_R3) +return (pmd_t *)pud_deref (pud) +pmd_index (address); +return (pmd_t *) pudp; +} +#define pmd_offset_lockless pmd_offset_lockless + +static inline pmd_t *pmd_offset (pud_t *pudp,unsigned long address) +{ +return pmd_offset_lockless (pudp, *pudp, address); +} +#define pmd_offset pmd_offsetstatic inline pte_t *pte_offset (pmd_t *pmd,unsigned long address) {
include/asm-generic/pgtable.h +10 -0
@@ -1171,6 +1171,16 @@ static inline bool arch_has_pfn_modify_c#endif #endif +#ifndef p4d_offset_lockless +#define p4d_offset_lockless (pgdp, pgd, address) p4d_offset(&(pgd), address) +#endif +#ifndef pud_offset_lockless +#define pud_offset_lockless (p4dp, p4d, address) pud_offset(&(p4d), address) +#endif +#ifndef pmd_offset_lockless +#define pmd_offset_lockless (pudp, pud, address) pmd_offset(&(pud), address) +#endif +/* * On some architectures it depends on the mm if the p4d/pud or pmd * layer of the page table hierarchy is folded or not.
mm/gup.c +9 -9
@@ -2184,13 +2184,13 @@ static int gup_huge_pgd(pgd_t orig, pgd_return 1 ; } -static int gup_pmd_range (pud_t pud,unsigned long addr,unsigned long end, +static int gup_pmd_range (pud_t *pudp,pud_t pud,unsigned long addr,unsigned long end,unsigned int flags,struct page **pages,int *nr) {unsigned long next;pmd_t *pmdp; - pmdp =pmd_offset (&pud, addr); + pmdp =pmd_offset_lockless (pudp, pud, addr); do { pmd_t pmd = READ_ONCE(*pmdp);
@@ -2227,13 +2227,13 @@ static int gup_pmd_range(pud_t pud, unsireturn 1 ; } -static int gup_pud_range (p4d_t p4d,unsigned long addr,unsigned long end, +static int gup_pud_range (p4d_t *p4dp,p4d_t p4d,unsigned long addr,unsigned long end,unsigned int flags,struct page **pages,int *nr) {unsigned long next;pud_t *pudp; - pudp =pud_offset (&p4d, addr); + pudp =pud_offset_lockless (p4dp, p4d, addr); do { pud_t pud = READ_ONCE(*pudp);
@@ -2248,20 +2248,20 @@ static int gup_pud_range(p4d_t p4d, unsiif (!gup_huge_pd (__hugepd (pud_val (pud)), addr,PUD_SHIFT , next, flags, pages, nr))return 0 ; - }else if (!gup_pmd_range (pud, addr, next, flags, pages, nr)) + }else if (!gup_pmd_range (pudp, pud, addr, next, flags, pages, nr))return 0 ; }while (pudp++, addr = next, addr != end);return 1 ; } -static int gup_p4d_range (pgd_t pgd,unsigned long addr,unsigned long end, +static int gup_p4d_range (pgd_t *pgdp,pgd_t pgd,unsigned long addr,unsigned long end,unsigned int flags,struct page **pages,int *nr) {unsigned long next;p4d_t *p4dp; - p4dp =p4d_offset (&pgd, addr); + p4dp =p4d_offset_lockless (pgdp, pgd, addr); do { p4d_t p4d = READ_ONCE(*p4dp);
@@ -2273,7 +2273,7 @@ static int gup_p4d_range(pgd_t pgd, unsiif (!gup_huge_pd (__hugepd (p4d_val (p4d)), addr,P4D_SHIFT , next, flags, pages, nr))return 0 ; - }else if (!gup_pud_range (p4d, addr, next, flags, pages, nr)) + }else if (!gup_pud_range (p4dp, p4d, addr, next, flags, pages, nr))return 0 ; }while (p4dp++, addr = next, addr != end);
@@ -2301,7 +2301,7 @@ static void gup_pgd_range(unsigned longif (!gup_huge_pd (__hugepd (pgd_val (pgd)), addr,PGDIR_SHIFT , next, flags, pages, nr))return ; - }else if (!gup_p4d_range (pgd, addr, next, flags, pages, nr)) + }else if (!gup_p4d_range (pgdp, pgd, addr, next, flags, pages, nr))return ; }while (pgdp++, addr = next, addr != end); }
Greg Kroah-Hartman
maintainerPATCH 382/388 s390/zcrypt: Fix ZCRYPT_PERDEV_REQCNT ioctl
In reply to Greg Kroah-HartmanFrom: Christian Borntraeger <[email protected]>
commit f7e80983f0cf470bb82036e73bff4d5a7daf8fc2 upstream.
reqcnt is an u32 pointer but we do copy sizeof(reqcnt) which is the size of the pointer. This means we only copy 8 byte. Let us copy the full monty.
--- drivers/s390/crypto/zcrypt_api.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/s390/crypto/zcrypt_api.c +2 -1
@@ -1419,7 +1419,8 @@ static long zcrypt_unlocked_ioctl(structif (!reqcnt)return -ENOMEM ;zcrypt_perdev_reqcnt (reqcnt,AP_DEVICES ); -if (copy_to_user ((int __user *) arg, reqcnt,sizeof (reqcnt))) +if (copy_to_user ((int __user *) arg, reqcnt, +sizeof (u32) *AP_DEVICES )) rc = -EFAULT ;kfree (reqcnt);return rc;
Greg Kroah-Hartman
maintainerPATCH 383/388 KVM: arm64: Assume write fault on S1PTW permission fault on instruction fetch
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
commit c4ad98e4b72cb5be30ea282fce935248f2300e62 upstream.
KVM currently assumes that an instruction abort can never be a write. This is in general true, except when the abort is triggered by a S1PTW on instruction fetch that tries to update the S1 page tables (to set AF, for example).
This can happen if the page tables have been paged out and brought back in without seeing a direct write to them (they are thus marked read only), and the fault handling code will make the PT executable(!) instead of writable. The guest gets stuck forever.
In these conditions, the permission fault must be considered as a write so that the Stage-1 update can take place. This is essentially the I-side equivalent of the problem fixed by 60e21a0ef54c ("arm64: KVM:
Take S1 walks into account when determining S2 write faults").
Update kvm_is_write_fault() to return true on IABT+S1PTW, and introduce kvm_vcpu_trap_is_exec_fault() that only return true when no faulting on a S1 fault. Additionally, kvm_vcpu_dabt_iss1tw() is renamed to kvm_vcpu_abt_iss1tw(), as the above makes it plain that it isn't specific to data abort.
--- arch/arm/include/asm/kvm_emulate.h | 11 ++++++++--- arch/arm64/include/asm/kvm_emulate.h | 12 ++++++++++-- arch/arm64/kvm/hyp/switch.c | 2 +- virt/kvm/arm/mmio.c | 2 +- virt/kvm/arm/mmu.c | 2 +- 5 files changed, 21 insertions(+), 8 deletions(-)
arch/arm/include/asm/kvm_emulate.h +8 -3
@@ -204,7 +204,7 @@ static inline int kvm_vcpu_dabt_get_rd(sreturn (kvm_vcpu_get_hsr (vcpu) &HSR_SRT_MASK ) >>HSR_SRT_SHIFT ; } -static inline bool kvm_vcpu_dabt_iss1tw (struct kvm_vcpu *vcpu) +static inline bool kvm_vcpu_abt_iss1tw (const struct kvm_vcpu *vcpu) {return kvm_vcpu_get_hsr (vcpu) &HSR_DABT_S1PTW ; }
@@ -236,16 +236,21 @@ static inline bool kvm_vcpu_trap_il_is32return kvm_vcpu_get_hsr (vcpu) &HSR_IL ; } -static inline u8 kvm_vcpu_trap_get_class (struct kvm_vcpu *vcpu) +static inline u8 kvm_vcpu_trap_get_class (const struct kvm_vcpu *vcpu) {return kvm_vcpu_get_hsr (vcpu) >>HSR_EC_SHIFT ; } -static inline bool kvm_vcpu_trap_is_iabt (struct kvm_vcpu *vcpu) +static inline bool kvm_vcpu_trap_is_iabt (const struct kvm_vcpu *vcpu) {return kvm_vcpu_trap_get_class (vcpu) ==HSR_EC_IABT ; } +static inline bool kvm_vcpu_trap_is_exec_fault (const struct kvm_vcpu *vcpu) +{ +return kvm_vcpu_trap_is_iabt (vcpu) && !kvm_vcpu_abt_iss1tw (vcpu); +} +static inline u8 kvm_vcpu_trap_get_fault (struct kvm_vcpu *vcpu) {return kvm_vcpu_get_hsr (vcpu) &HSR_FSC ;
arch/arm64/include/asm/kvm_emulate.h +10 -2
@@ -299,7 +299,7 @@ static inline int kvm_vcpu_dabt_get_rd(creturn (kvm_vcpu_get_hsr (vcpu) & ESR_ELx_SRT_MASK) >> ESR_ELx_SRT_SHIFT; } -static inline bool kvm_vcpu_dabt_iss1tw (const struct kvm_vcpu *vcpu) +static __always_inline bool kvm_vcpu_abt_iss1tw(const struct kvm_vcpu *vcpu) {return !!(kvm_vcpu_get_hsr (vcpu) & ESR_ELx_S1PTW); }
@@ -307,7 +307,7 @@ static inline bool kvm_vcpu_dabt_iss1tw(static inline bool kvm_vcpu_dabt_iswrite (const struct kvm_vcpu *vcpu) {return !!(kvm_vcpu_get_hsr (vcpu) & ESR_ELx_WNR) || -kvm_vcpu_dabt_iss1tw (vcpu);/* AF/DBM update */ +kvm_vcpu_abt_iss1tw (vcpu);/* AF/DBM update */ }static inline bool kvm_vcpu_dabt_is_cm (const struct kvm_vcpu *vcpu)
@@ -336,6 +336,11 @@ static inline bool kvm_vcpu_trap_is_iabtreturn kvm_vcpu_trap_get_class (vcpu) == ESR_ELx_EC_IABT_LOW; } +static inline bool kvm_vcpu_trap_is_exec_fault (const struct kvm_vcpu *vcpu) +{ +return kvm_vcpu_trap_is_iabt (vcpu) && !kvm_vcpu_abt_iss1tw (vcpu); +} +static inline u8 kvm_vcpu_trap_get_fault (const struct kvm_vcpu *vcpu) {return kvm_vcpu_get_hsr (vcpu) & ESR_ELx_FSC;
@@ -373,6 +378,9 @@ static inline int kvm_vcpu_sys_get_rt(ststatic inline bool kvm_is_write_fault (struct kvm_vcpu *vcpu) { +if (kvm_vcpu_abt_iss1tw (vcpu)) +return true; +if (kvm_vcpu_trap_is_iabt (vcpu))return false;
arch/arm64/kvm/hyp/switch.c +1 -1
@@ -496,7 +496,7 @@ static bool __hyp_text fixup_guest_exit(kvm_vcpu_trap_get_fault_type (vcpu) ==FSC_FAULT &&kvm_vcpu_dabt_isvalid (vcpu) && !kvm_vcpu_dabt_isextabt (vcpu) && - !kvm_vcpu_dabt_iss1tw (vcpu); + !kvm_vcpu_abt_iss1tw (vcpu);if (valid) {int ret =__vgic_v2_perform_cpuif_access (vcpu);
virt/kvm/arm/mmio.c +1 -1
@@ -130,7 +130,7 @@ static int decode_hsr(struct kvm_vcpu *vbool sign_extend;bool sixty_four; -if (kvm_vcpu_dabt_iss1tw (vcpu)) { +if (kvm_vcpu_abt_iss1tw (vcpu)) {/* page table accesses IO mem: tell guest to fix its TTBR */ kvm_inject_dabt (vcpu,kvm_vcpu_get_hfar (vcpu));return 1 ;
virt/kvm/arm/mmu.c +1 -1
@@ -1690,7 +1690,7 @@ static int user_mem_abort(struct kvm_vcpunsigned long vma_pagesize, flags =0 ; write_fault =kvm_is_write_fault (vcpu); - exec_fault =kvm_vcpu_trap_is_iabt (vcpu); + exec_fault =kvm_vcpu_trap_is_exec_fault (vcpu);VM_BUG_ON (write_fault && exec_fault);if (fault_status ==FSC_PERM && !write_fault && !exec_fault) {
Greg Kroah-Hartman
maintainerPATCH 384/388 dm: fix bio splitting and its bio completion order for regular IO
In reply to Greg Kroah-HartmanFrom: Mike Snitzer <[email protected]>
commit ee1dfad5325ff1cfb2239e564cd411b3bfe8667a upstream.
dm_queue_split() is removed because __split_and_process_bio() _must_ handle splitting bios to ensure proper bio submission and completion ordering as a bio is split.
Otherwise, multiple recursive calls to ->submit_bio will cause multiple split bios to be allocated from the same ->bio_split mempool at the same time. This would result in deadlock in low memory conditions because no progress could be made (only one bio is available in ->bio_split mempool).
This fix has been verified to still fix the loss of performance, due to excess splitting, that commit 120c9257f5f1 provided.
--- drivers/md/dm.c | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-)
drivers/md/dm.c +2 -21
@@ -1720,23 +1720,6 @@ out:return ret; } -static void dm_queue_split (struct mapped_device *md,struct dm_target *ti,struct bio **bio) -{ -unsigned len, sector_count; - - sector_count =bio_sectors (*bio); - len =min_t (sector_t,max_io_len ((*bio)->bi_iter.bi_sector, ti), sector_count); - -if (sector_count > len) { -struct bio *split =bio_split (*bio, len,GFP_NOIO , &md->queue->bio_split); - -bio_chain (split, *bio); -trace_block_split (md->queue, split, (*bio)->bi_iter.bi_sector); -generic_make_request (*bio); - *bio = split; - } -} -static blk_qc_t dm_process_bio (struct mapped_device *md,struct dm_table *map,struct bio *bio) {
@@ -1764,14 +1747,12 @@ static blk_qc_t dm_process_bio(struct maif (current->bio_list) {if (is_abnormal_io (bio))blk_queue_split (md->queue, &bio); -else -dm_queue_split (md, ti, &bio); +/* regular IO is split by __split_and_process_bio */ }if (dm_get_md_type (md) ==DM_TYPE_NVME_BIO_BASED )return __process_bio (md, map, bio, ti); -else -return __split_and_process_bio (md, map, bio); +return __split_and_process_bio (md, map, bio); }static blk_qc_t dm_make_request (struct request_queue *q,struct bio *bio)
Greg Kroah-Hartman
maintainerPATCH 385/388 kprobes: Fix compiler warning for !CONFIG_KPROBES_ON_FTRACE
In reply to Greg Kroah-HartmanFrom: Muchun Song <[email protected]>
commit 10de795a5addd1962406796a6e13ba6cc0fc6bee upstream.
Fix compiler warning(as show below) for !CONFIG_KPROBES_ON_FTRACE.
kernel/kprobes.c: In function 'kill_kprobe':kernel/kprobes.c:1116:33: warning: statement with no effect [-Wunused-value]
1116 | #define disarm_kprobe_ftrace(p) (-ENODEV)
| ^kernel/kprobes.c:2154:3: note: in expansion of macro 'disarm_kprobe_ftrace'
2154 | disarm_kprobe_ftrace(p);
--- kernel/kprobes.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
kernel/kprobes.c +14 -3
@@ -1076,9 +1076,20 @@ static int disarm_kprobe_ftrace(struct k ipmodify ? &kprobe_ipmodify_enabled : &kprobe_ftrace_enabled); }#else /* !CONFIG_KPROBES_ON_FTRACE */ -#define prepare_kprobe (p) arch_prepare_kprobe(p) -#define arm_kprobe_ftrace (p) (-ENODEV) -#define disarm_kprobe_ftrace (p) (-ENODEV) +static inline int prepare_kprobe (struct kprobe *p) +{ +return arch_prepare_kprobe (p); +} + +static inline int arm_kprobe_ftrace (struct kprobe *p) +{ +return -ENODEV ; +} + +static inline int disarm_kprobe_ftrace (struct kprobe *p) +{ +return -ENODEV ; +}#endif /* Arm a kprobe with text_mutex */
Greg Kroah-Hartman
maintainerPATCH 386/388 ata: define AC_ERR_OK
In reply to Greg Kroah-HartmanFrom: Jiri Slaby <[email protected]>
commit 25937580a5065d6fbd92d9c8ebd47145ad80052e upstream.
Since we will return enum ata_completion_errors from qc_prep in the next patch, let's define AC_ERR_OK to mark the OK status.
--- include/linux/libata.h | 1 + 1 file changed, 1 insertion(+)
include/linux/libata.h +1 -0
@@ -486,6 +486,7 @@ enum hsm_task_states { };enum ata_completion_errors { +AC_ERR_OK =0 ,/* no error */ AC_ERR_DEV = (1 <<0 ),/* device reported error */ AC_ERR_HSM = (1 <<1 ),/* host state machine violation */ AC_ERR_TIMEOUT = (1 <<2 ),/* timeout */
Greg Kroah-Hartman
maintainerPATCH 387/388 ata: make qc_prep return ata_completion_errors
In reply to Greg Kroah-HartmanFrom: Jiri Slaby <[email protected]>
commit 95364f36701e62dd50eee91e1303187fd1a9f567 upstream.
In case a driver wants to return an error from qc_prep, return enum ata_completion_errors. sata_mv is one of those drivers -- see the next patch. Other drivers return the newly defined AC_ERR_OK.
[v2] use enum ata_completion_errors and AC_ERR_OK.
--- Documentation/driver-api/libata.rst | 2 +- drivers/ata/acard-ahci.c | 6 ++++-- drivers/ata/libahci.c | 6 ++++-- drivers/ata/libata-core.c | 9 +++++++-- drivers/ata/libata-sff.c | 12 ++++++++---- drivers/ata/pata_macio.c | 6 ++++-- drivers/ata/pata_pxa.c | 8 +++++--- drivers/ata/pdc_adma.c | 7 ++++--- drivers/ata/sata_fsl.c | 4 +++- drivers/ata/sata_inic162x.c | 4 +++- drivers/ata/sata_mv.c | 26 +++++++++++++++----------- drivers/ata/sata_nv.c | 18 +++++++++++------- drivers/ata/sata_promise.c | 6 ++++-- drivers/ata/sata_qstor.c | 8 +++++--- drivers/ata/sata_rcar.c | 6 ++++-- drivers/ata/sata_sil.c | 8 +++++--- drivers/ata/sata_sil24.c | 6 ++++-- drivers/ata/sata_sx4.c | 6 ++++-- include/linux/libata.h | 12 ++++++------ 19 files changed, 101 insertions(+), 59 deletions(-)
Documentation/driver-api/libata.rst +1 -1
@@ -250,7 +250,7 @@ High-level taskfile hooks :: - void (*qc_prep) (struct ata_queued_cmd *qc); + enum ata_completion_errors (*qc_prep) (struct ata_queued_cmd *qc); int (*qc_issue) (struct ata_queued_cmd *qc);
drivers/ata/acard-ahci.c +4 -2
@@ -56,7 +56,7 @@ struct acard_sg {__le32 size;/* bit 31 (EOT) max==0x10000 (64k) */ }; -static void acard_ahci_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors acard_ahci_qc_prep (struct ata_queued_cmd *qc);static bool acard_ahci_qc_fill_rtf (struct ata_queued_cmd *qc);static int acard_ahci_port_start (struct ata_port *ap);static int acard_ahci_init_one (struct pci_dev *pdev,const struct pci_device_id *ent);
@@ -210,7 +210,7 @@ static unsigned int acard_ahci_fill_sg(sreturn si; } -static void acard_ahci_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors acard_ahci_qc_prep (struct ata_queued_cmd *qc) {struct ata_port *ap = qc->ap;struct ahci_port_priv *pp = ap->private_data;
@@ -248,6 +248,8 @@ static void acard_ahci_qc_prep(struct at opts |=AHCI_CMD_ATAPI |AHCI_CMD_PREFETCH ;ahci_fill_cmd_slot (pp, qc->hw_tag, opts); + +return AC_ERR_OK ; }static bool acard_ahci_qc_fill_rtf (struct ata_queued_cmd *qc)
drivers/ata/libahci.c +4 -2
@@ -57,7 +57,7 @@ static int ahci_scr_write(struct ata_linstatic bool ahci_qc_fill_rtf (struct ata_queued_cmd *qc);static int ahci_port_start (struct ata_port *ap);static void ahci_port_stop (struct ata_port *ap); -static void ahci_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors ahci_qc_prep (struct ata_queued_cmd *qc);static int ahci_pmp_qc_defer (struct ata_queued_cmd *qc);static void ahci_freeze (struct ata_port *ap);static void ahci_thaw (struct ata_port *ap);
@@ -1624,7 +1624,7 @@ static int ahci_pmp_qc_defer(struct ata_return sata_pmp_qc_defer_cmd_switch (qc); } -static void ahci_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors ahci_qc_prep (struct ata_queued_cmd *qc) {struct ata_port *ap = qc->ap;struct ahci_port_priv *pp = ap->private_data;
@@ -1660,6 +1660,8 @@ static void ahci_qc_prep(struct ata_queu opts |=AHCI_CMD_ATAPI |AHCI_CMD_PREFETCH ;ahci_fill_cmd_slot (pp, qc->hw_tag, opts); + +return AC_ERR_OK ; }static void ahci_fbs_dec_intr (struct ata_port *ap)
drivers/ata/libata-core.c +7 -2
@@ -4978,7 +4978,10 @@ int ata_std_qc_defer(struct ata_queued_creturn ATA_DEFER_LINK ; } -void ata_noop_qc_prep (struct ata_queued_cmd *qc) { } +enum ata_completion_errors ata_noop_qc_prep (struct ata_queued_cmd *qc) +{ +return AC_ERR_OK ; +}/** * ata_sg_init - Associate command with scatter-gather table.
@@ -5465,7 +5468,9 @@ void ata_qc_issue(struct ata_queued_cmdreturn ; } - ap->ops->qc_prep (qc); + qc->err_mask |= ap->ops->qc_prep (qc); +if (unlikely (qc->err_mask)) + goto err;trace_ata_qc_issue (qc); qc->err_mask |= ap->ops->qc_issue (qc);if (unlikely (qc->err_mask))
drivers/ata/libata-sff.c +8 -4
@@ -2679,12 +2679,14 @@ static void ata_bmdma_fill_sg_dumb(struc* LOCKING: * spin_lock_irqsave(host lock) */ -void ata_bmdma_qc_prep (struct ata_queued_cmd *qc) +enum ata_completion_errors ata_bmdma_qc_prep (struct ata_queued_cmd *qc) {if (!(qc->flags &ATA_QCFLAG_DMAMAP )) -return ; +return AC_ERR_OK ;ata_bmdma_fill_sg (qc); + +return AC_ERR_OK ; }EXPORT_SYMBOL_GPL (ata_bmdma_qc_prep);
@@ -2697,12 +2699,14 @@ EXPORT_SYMBOL_GPL(ata_bmdma_qc_prep);* LOCKING: * spin_lock_irqsave(host lock) */ -void ata_bmdma_dumb_qc_prep (struct ata_queued_cmd *qc) +enum ata_completion_errors ata_bmdma_dumb_qc_prep (struct ata_queued_cmd *qc) {if (!(qc->flags &ATA_QCFLAG_DMAMAP )) -return ; +return AC_ERR_OK ;ata_bmdma_fill_sg_dumb (qc); + +return AC_ERR_OK ; }EXPORT_SYMBOL_GPL (ata_bmdma_dumb_qc_prep);
drivers/ata/pata_macio.c +4 -2
@@ -510,7 +510,7 @@ static int pata_macio_cable_detect(strucreturn ATA_CBL_PATA40 ; } -static void pata_macio_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors pata_macio_qc_prep (struct ata_queued_cmd *qc) {unsigned int write = (qc->tf.flags &ATA_TFLAG_WRITE );struct ata_port *ap = qc->ap;
@@ -523,7 +523,7 @@ static void pata_macio_qc_prep(struct at __func__, qc, qc->flags, write, qc->dev->devno);if (!(qc->flags &ATA_QCFLAG_DMAMAP )) -return ; +return AC_ERR_OK ; table = (struct dbdma_cmd *) priv->dma_table_cpu;
@@ -568,6 +568,8 @@ static void pata_macio_qc_prep(struct at table->command =cpu_to_le16 (DBDMA_STOP );dev_dbgdma (priv->dev,"%s: %d DMA list entries\n" , __func__, pi); + +return AC_ERR_OK ; }
drivers/ata/pata_pxa.c +5 -3
@@ -44,25 +44,27 @@ static void pxa_ata_dma_irq(void *d)/* * Prepare taskfile for submission. */ -static void pxa_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors pxa_qc_prep (struct ata_queued_cmd *qc) {struct pata_pxa_data *pd = qc->ap->private_data;struct dma_async_tx_descriptor *tx;enum dma_transfer_direction dir;if (!(qc->flags &ATA_QCFLAG_DMAMAP )) -return ; +return AC_ERR_OK ; dir = (qc->dma_dir ==DMA_TO_DEVICE ?DMA_MEM_TO_DEV :DMA_DEV_TO_MEM ); tx =dmaengine_prep_slave_sg (pd->dma_chan, qc->sg, qc->n_elem, dir,DMA_PREP_INTERRUPT );if (!tx) {ata_dev_err (qc->dev,"prep_slave_sg() failed\n" ); -return ; +return AC_ERR_OK ; } tx->callback = pxa_ata_dma_irq; tx->callback_param = pd; pd->dma_cookie =dmaengine_submit (tx); + +return AC_ERR_OK ; }/*
drivers/ata/pdc_adma.c +4 -3
@@ -116,7 +116,7 @@ static int adma_ata_init_one(struct pci_ const struct pci_device_id *ent);static int adma_port_start (struct ata_port *ap);static void adma_port_stop (struct ata_port *ap); -static void adma_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors adma_qc_prep (struct ata_queued_cmd *qc);static unsigned int adma_qc_issue (struct ata_queued_cmd *qc);static int adma_check_atapi_dma (struct ata_queued_cmd *qc);static void adma_freeze (struct ata_port *ap);
@@ -295,7 +295,7 @@ static int adma_fill_sg(struct ata_queuereturn i; } -static void adma_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors adma_qc_prep (struct ata_queued_cmd *qc) {struct adma_port_priv *pp = qc->ap->private_data;u8 *buf = pp->pkt;
@@ -306,7 +306,7 @@ static void adma_qc_prep(struct ata_queuadma_enter_reg_mode (qc->ap);if (qc->tf.protocol !=ATA_PROT_DMA ) -return ; +return AC_ERR_OK ; buf[i++] =0 ;/* Response flags */ buf[i++] =0 ;/* reserved */
@@ -371,6 +371,7 @@ static void adma_qc_prep(struct ata_queu printk("%s\n", obuf); }#endif +return AC_ERR_OK ; }static inline void adma_packet_start (struct ata_queued_cmd *qc)
drivers/ata/sata_fsl.c +3 -1
@@ -502,7 +502,7 @@ static unsigned int sata_fsl_fill_sg(strreturn num_prde; } -static void sata_fsl_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors sata_fsl_qc_prep (struct ata_queued_cmd *qc) {struct ata_port *ap = qc->ap;struct sata_fsl_port_priv *pp = ap->private_data;
@@ -548,6 +548,8 @@ static void sata_fsl_qc_prep(struct ata_VPRINTK ("SATA FSL : xx_qc_prep, di = 0x%x, ttl = %d, num_prde = %d\n" , desc_info, ttl_dwords, num_prde); + +return AC_ERR_OK ; }static unsigned int sata_fsl_qc_issue (struct ata_queued_cmd *qc)
drivers/ata/sata_inic162x.c +3 -1
@@ -478,7 +478,7 @@ static void inic_fill_sg(struct inic_prd prd[-1 ].flags |=PRD_END ; } -static void inic_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors inic_qc_prep (struct ata_queued_cmd *qc) {struct inic_port_priv *pp = qc->ap->private_data;struct inic_pkt *pkt = pp->pkt;
@@ -538,6 +538,8 @@ static void inic_qc_prep(struct ata_queuinic_fill_sg (prd, qc); pp->cpb_tbl[0 ] = pp->pkt_dma; + +return AC_ERR_OK ; }static unsigned int inic_qc_issue (struct ata_queued_cmd *qc)
drivers/ata/sata_mv.c +15 -11
@@ -592,8 +592,8 @@ static int mv5_scr_write(struct ata_linkstatic int mv_port_start (struct ata_port *ap);static void mv_port_stop (struct ata_port *ap);static int mv_qc_defer (struct ata_queued_cmd *qc); -static void mv_qc_prep (struct ata_queued_cmd *qc); -static void mv_qc_prep_iie (struct ata_queued_cmd *qc); +static enum ata_completion_errors mv_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors mv_qc_prep_iie (struct ata_queued_cmd *qc);static unsigned int mv_qc_issue (struct ata_queued_cmd *qc);static int mv_hardreset (struct ata_link *link,unsigned int *class,unsigned long deadline);
@@ -2031,7 +2031,7 @@ static void mv_rw_multi_errata_sata24(st* LOCKING: * Inherited from caller. */ -static void mv_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors mv_qc_prep (struct ata_queued_cmd *qc) {struct ata_port *ap = qc->ap;struct mv_port_priv *pp = ap->private_data;
@@ -2043,15 +2043,15 @@ static void mv_qc_prep(struct ata_queuedswitch (tf->protocol) {case ATA_PROT_DMA :if (tf->command ==ATA_CMD_DSM ) -return ; +return AC_ERR_OK ;/* fall-thru */ case ATA_PROT_NCQ :break ;/* continue below */ case ATA_PROT_PIO :mv_rw_multi_errata_sata24 (qc); -return ; +return AC_ERR_OK ;default : -return ; +return AC_ERR_OK ; }/* Fill in command request block
@@ -2116,8 +2116,10 @@ static void mv_qc_prep(struct ata_queuedmv_crqb_pack_cmd (cw++, tf->command,ATA_REG_CMD ,1 );/* last */ if (!(qc->flags &ATA_QCFLAG_DMAMAP )) -return ; +return AC_ERR_OK ;mv_fill_sg (qc); + +return AC_ERR_OK ; }/**
@@ -2132,7 +2134,7 @@ static void mv_qc_prep(struct ata_queued* LOCKING: * Inherited from caller. */ -static void mv_qc_prep_iie (struct ata_queued_cmd *qc) +static enum ata_completion_errors mv_qc_prep_iie (struct ata_queued_cmd *qc) {struct ata_port *ap = qc->ap;struct mv_port_priv *pp = ap->private_data;
@@ -2143,9 +2145,9 @@ static void mv_qc_prep_iie(struct ata_quif ((tf->protocol !=ATA_PROT_DMA ) && (tf->protocol !=ATA_PROT_NCQ )) -return ; +return AC_ERR_OK ;if (tf->command ==ATA_CMD_DSM ) -return ;/* use bmdma for this */ +return AC_ERR_OK ;/* use bmdma for this */ /* Fill in Gen IIE command request block */ if (!(tf->flags &ATA_TFLAG_WRITE ))
@@ -2186,8 +2188,10 @@ static void mv_qc_prep_iie(struct ata_qu );if (!(qc->flags &ATA_QCFLAG_DMAMAP )) -return ; +return AC_ERR_OK ;mv_fill_sg (qc); + +return AC_ERR_OK ; }/**
drivers/ata/sata_nv.c +11 -7
@@ -297,7 +297,7 @@ static void nv_ck804_freeze(struct ata_pstatic void nv_ck804_thaw (struct ata_port *ap);static int nv_adma_slave_config (struct scsi_device *sdev);static int nv_adma_check_atapi_dma (struct ata_queued_cmd *qc); -static void nv_adma_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors nv_adma_qc_prep (struct ata_queued_cmd *qc);static unsigned int nv_adma_qc_issue (struct ata_queued_cmd *qc);static irqreturn_t nv_adma_interrupt (int irq,void *dev_instance);static void nv_adma_irq_clear (struct ata_port *ap);
@@ -319,7 +319,7 @@ static void nv_mcp55_freeze(struct ata_pstatic void nv_swncq_error_handler (struct ata_port *ap);static int nv_swncq_slave_config (struct scsi_device *sdev);static int nv_swncq_port_start (struct ata_port *ap); -static void nv_swncq_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors nv_swncq_qc_prep (struct ata_queued_cmd *qc);static void nv_swncq_fill_sg (struct ata_queued_cmd *qc);static unsigned int nv_swncq_qc_issue (struct ata_queued_cmd *qc);static void nv_swncq_irq_clear (struct ata_port *ap,u16 fis);
@@ -1344,7 +1344,7 @@ static int nv_adma_use_reg_mode(struct areturn 1 ; } -static void nv_adma_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors nv_adma_qc_prep (struct ata_queued_cmd *qc) {struct nv_adma_port_priv *pp = qc->ap->private_data;struct nv_adma_cpb *cpb = &pp->cpb[qc->hw_tag];
@@ -1356,7 +1356,7 @@ static void nv_adma_qc_prep(struct ata_q (qc->flags & ATA_QCFLAG_DMAMAP));nv_adma_register_mode (qc->ap);ata_bmdma_qc_prep (qc); -return ; +return AC_ERR_OK ; } cpb->resp_flags =NV_CPB_RESP_DONE ;
@@ -1388,6 +1388,8 @@ static void nv_adma_qc_prep(struct ata_q cpb->ctl_flags = ctl_flags;wmb (); cpb->resp_flags =0 ; + +return AC_ERR_OK ; }static unsigned int nv_adma_qc_issue (struct ata_queued_cmd *qc)
@@ -1950,17 +1952,19 @@ static int nv_swncq_port_start(struct atreturn 0 ; } -static void nv_swncq_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors nv_swncq_qc_prep (struct ata_queued_cmd *qc) {if (qc->tf.protocol !=ATA_PROT_NCQ ) {ata_bmdma_qc_prep (qc); -return ; +return AC_ERR_OK ; }if (!(qc->flags &ATA_QCFLAG_DMAMAP )) -return ; +return AC_ERR_OK ;nv_swncq_fill_sg (qc); + +return AC_ERR_OK ; }static void nv_swncq_fill_sg (struct ata_queued_cmd *qc)
drivers/ata/sata_promise.c +4 -2
@@ -139,7 +139,7 @@ static int pdc_sata_scr_write(struct atastatic int pdc_ata_init_one (struct pci_dev *pdev,const struct pci_device_id *ent);static int pdc_common_port_start (struct ata_port *ap);static int pdc_sata_port_start (struct ata_port *ap); -static void pdc_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors pdc_qc_prep (struct ata_queued_cmd *qc);static void pdc_tf_load_mmio (struct ata_port *ap,const struct ata_taskfile *tf);static void pdc_exec_command_mmio (struct ata_port *ap,const struct ata_taskfile *tf);static int pdc_check_atapi_dma (struct ata_queued_cmd *qc);
@@ -633,7 +633,7 @@ static void pdc_fill_sg(struct ata_queue prd[idx -1 ].flags_len |=cpu_to_le32 (ATA_PRD_EOT ); } -static void pdc_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors pdc_qc_prep (struct ata_queued_cmd *qc) {struct pdc_port_priv *pp = qc->ap->private_data;unsigned int i;
@@ -665,6 +665,8 @@ static void pdc_qc_prep(struct ata_queuedefault :break ; } + +return AC_ERR_OK ; }static int pdc_is_sataii_tx4 (unsigned long flags)
drivers/ata/sata_qstor.c +5 -3
@@ -100,7 +100,7 @@ static int qs_scr_write(struct ata_linkstatic int qs_ata_init_one (struct pci_dev *pdev,const struct pci_device_id *ent);static int qs_port_start (struct ata_port *ap);static void qs_host_stop (struct ata_host *host); -static void qs_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors qs_qc_prep (struct ata_queued_cmd *qc);static unsigned int qs_qc_issue (struct ata_queued_cmd *qc);static int qs_check_atapi_dma (struct ata_queued_cmd *qc);static void qs_freeze (struct ata_port *ap);
@@ -260,7 +260,7 @@ static unsigned int qs_fill_sg(struct atreturn si; } -static void qs_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors qs_qc_prep (struct ata_queued_cmd *qc) {struct qs_port_priv *pp = qc->ap->private_data;u8 dflags =QS_DF_PORD , *buf = pp->pkt;
@@ -272,7 +272,7 @@ static void qs_qc_prep(struct ata_queuedqs_enter_reg_mode (qc->ap);if (qc->tf.protocol !=ATA_PROT_DMA ) -return ; +return AC_ERR_OK ; nelem =qs_fill_sg (qc);
@@ -295,6 +295,8 @@ static void qs_qc_prep(struct ata_queued/* frame information structure (FIS) */ ata_tf_to_fis (&qc->tf,0 ,1 , &buf[32 ]); + +return AC_ERR_OK ; }static inline void qs_packet_start (struct ata_queued_cmd *qc)
drivers/ata/sata_rcar.c +4 -2
@@ -550,12 +550,14 @@ static void sata_rcar_bmdma_fill_sg(stru prd[si -1 ].addr |=cpu_to_le32 (SATA_RCAR_DTEND ); } -static void sata_rcar_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors sata_rcar_qc_prep (struct ata_queued_cmd *qc) {if (!(qc->flags &ATA_QCFLAG_DMAMAP )) -return ; +return AC_ERR_OK ;sata_rcar_bmdma_fill_sg (qc); + +return AC_ERR_OK ; }static void sata_rcar_bmdma_setup (struct ata_queued_cmd *qc)
drivers/ata/sata_sil.c +5 -3
@@ -103,7 +103,7 @@ static void sil_dev_config(struct ata_destatic int sil_scr_read (struct ata_link *link,unsigned int sc_reg,u32 *val);static int sil_scr_write (struct ata_link *link,unsigned int sc_reg,u32 val);static int sil_set_mode (struct ata_link *link,struct ata_device **r_failed); -static void sil_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors sil_qc_prep (struct ata_queued_cmd *qc);static void sil_bmdma_setup (struct ata_queued_cmd *qc);static void sil_bmdma_start (struct ata_queued_cmd *qc);static void sil_bmdma_stop (struct ata_queued_cmd *qc);
@@ -317,12 +317,14 @@ static void sil_fill_sg(struct ata_queue last_prd->flags_len |=cpu_to_le32 (ATA_PRD_EOT ); } -static void sil_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors sil_qc_prep (struct ata_queued_cmd *qc) {if (!(qc->flags &ATA_QCFLAG_DMAMAP )) -return ; +return AC_ERR_OK ;sil_fill_sg (qc); + +return AC_ERR_OK ; }static unsigned char sil_get_device_cache_line (struct pci_dev *pdev)
drivers/ata/sata_sil24.c +4 -2
@@ -326,7 +326,7 @@ static void sil24_dev_config(struct ata_static int sil24_scr_read (struct ata_link *link,unsigned sc_reg,u32 *val);static int sil24_scr_write (struct ata_link *link,unsigned sc_reg,u32 val);static int sil24_qc_defer (struct ata_queued_cmd *qc); -static void sil24_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors sil24_qc_prep (struct ata_queued_cmd *qc);static unsigned int sil24_qc_issue (struct ata_queued_cmd *qc);static bool sil24_qc_fill_rtf (struct ata_queued_cmd *qc);static void sil24_pmp_attach (struct ata_port *ap);
@@ -830,7 +830,7 @@ static int sil24_qc_defer(struct ata_quereturn ata_std_qc_defer (qc); } -static void sil24_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors sil24_qc_prep (struct ata_queued_cmd *qc) {struct ata_port *ap = qc->ap;struct sil24_port_priv *pp = ap->private_data;
@@ -874,6 +874,8 @@ static void sil24_qc_prep(struct ata_queif (qc->flags &ATA_QCFLAG_DMAMAP )sil24_fill_sg (qc, sge); + +return AC_ERR_OK ; }static unsigned int sil24_qc_issue (struct ata_queued_cmd *qc)
drivers/ata/sata_sx4.c +4 -2
@@ -202,7 +202,7 @@ static void pdc_error_handler(struct atastatic void pdc_freeze (struct ata_port *ap);static void pdc_thaw (struct ata_port *ap);static int pdc_port_start (struct ata_port *ap); -static void pdc20621_qc_prep (struct ata_queued_cmd *qc); +static enum ata_completion_errors pdc20621_qc_prep (struct ata_queued_cmd *qc);static void pdc_tf_load_mmio (struct ata_port *ap,const struct ata_taskfile *tf);static void pdc_exec_command_mmio (struct ata_port *ap,const struct ata_taskfile *tf);static unsigned int pdc20621_dimm_init (struct ata_host *host);
@@ -530,7 +530,7 @@ static void pdc20621_nodata_prep(structVPRINTK ("ata pkt buf ofs %u, mmio copied\n" , i); } -static void pdc20621_qc_prep (struct ata_queued_cmd *qc) +static enum ata_completion_errors pdc20621_qc_prep (struct ata_queued_cmd *qc) {switch (qc->tf.protocol) {case ATA_PROT_DMA :
@@ -542,6 +542,8 @@ static void pdc20621_qc_prep(struct ata_default :break ; } + +return AC_ERR_OK ; } static void __pdc20621_push_hdma(struct ata_queued_cmd *qc,
include/linux/libata.h +6 -6
@@ -896,9 +896,9 @@ struct ata_port_operations {/* * Command execution */ -int (*qc_defer)(struct ata_queued_cmd *qc); -int (*check_atapi_dma)(struct ata_queued_cmd *qc); -void (*qc_prep)(struct ata_queued_cmd *qc); +int (*qc_defer)(struct ata_queued_cmd *qc); +int (*check_atapi_dma)(struct ata_queued_cmd *qc); +enum ata_completion_errors (*qc_prep)(struct ata_queued_cmd *qc);unsigned int (*qc_issue)(struct ata_queued_cmd *qc);bool (*qc_fill_rtf)(struct ata_queued_cmd *qc);
@@ -1166,7 +1166,7 @@ extern int ata_xfer_mode2shift(unsignedextern const char *ata_mode_string (unsigned long xfer_mask);extern unsigned long ata_id_xfermask (const u16 *id);extern int ata_std_qc_defer (struct ata_queued_cmd *qc); -extern void ata_noop_qc_prep (struct ata_queued_cmd *qc); +extern enum ata_completion_errors ata_noop_qc_prep (struct ata_queued_cmd *qc);extern void ata_sg_init (struct ata_queued_cmd *qc,struct scatterlist *sg,unsigned int n_elem);extern unsigned int ata_dev_classify (const struct ata_taskfile *tf);
@@ -1900,9 +1900,9 @@ extern const struct ata_port_operations .sg_tablesize = LIBATA_MAX_PRD, \ .dma_boundary = ATA_DMA_BOUNDARY -extern void ata_bmdma_qc_prep(struct ata_queued_cmd *qc); +extern enum ata_completion_errors ata_bmdma_qc_prep(struct ata_queued_cmd *qc);extern unsigned int ata_bmdma_qc_issue (struct ata_queued_cmd *qc); -extern void ata_bmdma_dumb_qc_prep (struct ata_queued_cmd *qc); +extern enum ata_completion_errors ata_bmdma_dumb_qc_prep (struct ata_queued_cmd *qc);extern unsigned int ata_bmdma_port_intr (struct ata_port *ap,struct ata_queued_cmd *qc);extern irqreturn_t ata_bmdma_interrupt (int irq,void *dev_instance);
Greg Kroah-Hartman
maintainerPATCH 388/388 ata: sata_mv, avoid trigerrable BUG_ON
In reply to Greg Kroah-HartmanFrom: Jiri Slaby <[email protected]>
commit e9f691d899188679746eeb96e6cb520459eda9b4 upstream.
There are several reports that the BUG_ON on unsupported command in mv_qc_prep can be triggered under some circumstances:
https://bugzilla.suse.com/show_bug.cgi?id=1110252
https://serverfault.com/questions/888897/raid-problems-after-power-outage
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1652185
https://bugs.centos.org/view.php?id=14998
Let sata_mv handle the failure gracefully: warn about that incl. the failed command number and return an AC_ERR_INVALID error. We can do that now thanks to the previous patch.
Remove also the long-standing FIXME.
[v2] use %.2x as commands are defined as hexa.
--- drivers/ata/sata_mv.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/ata/sata_mv.c +3 -5
@@ -2098,12 +2098,10 @@ static enum ata_completion_errors mv_qc_* non-NCQ mode are: [RW] STREAM DMA and W DMA FUA EXT, none * of which are defined/used by Linux. If we get here, this * driver needs work. -* -* FIXME: modify libata to give qc_prep a return value and -* return error here. */ -BUG_ON (tf->command); -break ; +ata_port_err (ap,"%s: unsupported command: %.2x\n" , __func__, + tf->command); +return AC_ERR_INVALID ; }mv_crqb_pack_cmd (cw++, tf->nsect,ATA_REG_NSECT ,0 );mv_crqb_pack_cmd (cw++, tf->hob_lbal,ATA_REG_LBAL ,0 );
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.69 release. There are 388 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, 01 Oct 2020 10:59:03 +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.69-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 passing for Tegra ...
Test results for stable-v5.4:
14 builds: 14 pass, 0 fail
26 boots: 26 pass, 0 fail
56 tests: 56 pass, 0 failLinux version: 5.4.69-rc1-g256bdd45e196
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Jon
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.69 release. There are 388 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, 01 Oct 2020 10:59:03 +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
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.69 release. There are 388 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, 01 Oct 2020 10:59:03 +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.69-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.69-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: 256bdd45e196b3d68513dcd043370c3809a97654
git describe: v5.4.68-389-g256bdd45e196
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-5.4.y/build/v5.4.68-389-g256bdd45e196
No regressions (compared to build v5.4.68)
No fixes (compared to build v5.4.68)
Ran 27670 total tests in the following environments and test suites.
Environments
--------------
- dragonboard-410c
- hi6220-hikey
- i386
- juno-r2
- nxp-ls2088
- qemu_arm
- qemu_arm64
- qemu_i386
- qemu_x86_64
- x15
- x86
- x86-kasan
Test Suites
-----------
* build
* install-android-platform-tools-r2600
* kselftest
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-controllers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-tracing-tests
* perf
* v4l2-compliance
* ltp-cve-tests
* ltp-sched-tests
* network-basic-tests
* ltp-fs-tests
* ltp-ipc-tests
* ltp-open-posix-tests
* kselftest-vsyscall
* kselftest-vsyscall-mode-native
* kselftest-vsyscall-mode-none
* ssuite
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.69 release. There are 388 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, 01 Oct 2020 10:59:03 +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.69-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