6.1.120-rc1 review
Subsystems (7)
Greg Kroah-Hartman
maintainerPATCH 128/772 drm/vc4: hvs: Fix dlist debug not resetting the next entry pointer
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit 6d5f76e0544b04ec5bdd2a09c19d90aeeb2cd479 ]
The debug function to display the dlists didn't reset next_entry_start when starting each display, so resulting in not stopping the list at the correct place.
--- drivers/gpu/drm/vc4/vc4_hvs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/vc4/vc4_hvs.c +2 -1
@@ -108,7 +108,7 @@ static int vc4_hvs_debugfs_dlist(struct seq_file *m, void *data)struct vc4_dev *vc4 =to_vc4_dev (dev);struct vc4_hvs *hvs = vc4->hvs;struct drm_printer p =drm_seq_file_printer (m); -unsigned int next_entry_start =0 ; +unsigned int next_entry_start;unsigned int i, j;u32 dlist_word, dispstat;
@@ -122,6 +122,7 @@ static int vc4_hvs_debugfs_dlist(struct seq_file *m, void *data) }drm_printf (&p,"HVS chan %u:\n" , i); + next_entry_start =0 ;for (j =HVS_READ (SCALER_DISPLISTX (i)); j <256 ; j++) { dlist_word =readl ((u32 __iomem *)vc4->hvs->dlist + j);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 129/772 drm/vc4: hvs: Remove incorrect limit from hvs_dlist debugfs function
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit d285bb622ebdfaa84f51df3a1abccb87036157ea ]
The debugfs function to dump dlists aborted at 256 bytes, when actually the dlist memory is generally significantly larger but varies based on SoC.
We already have the correct limit in __vc4_hvs_alloc, so store it for use in the debugfs dlist function.
--- drivers/gpu/drm/vc4/vc4_drv.h | 1 + drivers/gpu/drm/vc4/vc4_hvs.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-)
drivers/gpu/drm/vc4/vc4_drv.h +1 -0
@@ -323,6 +323,7 @@ struct vc4_hvs {struct platform_device *pdev;void __iomem *regs;u32 __iomem *dlist; +unsigned int dlist_mem_size;struct clk *core_clk;
drivers/gpu/drm/vc4/vc4_hvs.c +4 -2
@@ -108,6 +108,7 @@ static int vc4_hvs_debugfs_dlist(struct seq_file *m, void *data)struct vc4_dev *vc4 =to_vc4_dev (dev);struct vc4_hvs *hvs = vc4->hvs;struct drm_printer p =drm_seq_file_printer (m); +unsigned int dlist_mem_size = hvs->dlist_mem_size;unsigned int next_entry_start;unsigned int i, j;u32 dlist_word, dispstat;
@@ -124,7 +125,7 @@ static int vc4_hvs_debugfs_dlist(struct seq_file *m, void *data)drm_printf (&p,"HVS chan %u:\n" , i); next_entry_start =0 ; -for (j =HVS_READ (SCALER_DISPLISTX (i)); j <256 ; j++) { +for (j =HVS_READ (SCALER_DISPLISTX (i)); j < dlist_mem_size; j++) { dlist_word =readl ((u32 __iomem *)vc4->hvs->dlist + j);drm_printf (&p,"dlist: %02d: 0x%08x\n" , j, dlist_word);
@@ -827,9 +828,10 @@ static int vc4_hvs_bind(struct device *dev, struct device *master, void *data)* our 16K), since we don't want to scramble the screen when * transitioning from the firmware's boot setup to runtime. */ + hvs->dlist_mem_size = (SCALER_DLIST_SIZE >>2 ) -HVS_BOOTLOADER_DLIST_END ;drm_mm_init (&hvs->dlist_mm,HVS_BOOTLOADER_DLIST_END , - (SCALER_DLIST_SIZE >>2 ) -HVS_BOOTLOADER_DLIST_END ); + hvs->dlist_mem_size);/* Set up the HVS LBM memory manager. We could have some more * complicated data structure that allowed reuse of LBM areas
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 130/772 drm/vc4: hvs: Correct logic on stopping an HVS channel
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit 7ab6512e7942889c0962588355cb92424a690be6 ]
When factoring out __vc4_hvs_stop_channel, the logic got inverted from
if (condition) // stop channel to if (condition) goto out //stop channel out:
and also changed the exact register writes used to stop the channel.
Correct the logic so that the channel is actually stopped, and revert to the original register writes.
--- drivers/gpu/drm/vc4/vc4_hvs.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/gpu/drm/vc4/vc4_hvs.c +3 -5
@@ -418,13 +418,11 @@ void vc4_hvs_stop_channel(struct vc4_hvs *hvs, unsigned int chan)if (!drm_dev_enter (drm, &idx))return ; -if (HVS_READ (SCALER_DISPCTRLX (chan)) &SCALER_DISPCTRLX_ENABLE ) +if (!(HVS_READ (SCALER_DISPCTRLX (chan)) &SCALER_DISPCTRLX_ENABLE )) goto out; -HVS_WRITE (SCALER_DISPCTRLX (chan), -HVS_READ (SCALER_DISPCTRLX (chan)) |SCALER_DISPCTRLX_RESET ); -HVS_WRITE (SCALER_DISPCTRLX (chan), -HVS_READ (SCALER_DISPCTRLX (chan)) & ~SCALER_DISPCTRLX_ENABLE ); +HVS_WRITE (SCALER_DISPCTRLX (chan),SCALER_DISPCTRLX_RESET ); +HVS_WRITE (SCALER_DISPCTRLX (chan),0 );/* Once we leave, the scaler should be disabled and its fifo empty. */ WARN_ON_ONCE (HVS_READ (SCALER_DISPCTRLX (chan)) &SCALER_DISPCTRLX_RESET );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 131/772 wifi: ath9k: add range check for conn_rsp_epid in htc_connect_service()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeongjun Park <[email protected]>
[ Upstream commit 8619593634cbdf5abf43f5714df49b04e4ef09ab ]
I found the following bug in my fuzzer:
UBSAN: array-index-out-of-bounds in drivers/net/wireless/ath/ath9k/htc_hst.c:26:51 index 255 is out of range for type 'htc_endpoint [22]' CPU: 0 UID: 0 PID: 8 Comm: kworker/0:0 Not tainted 6.11.0-rc6-dirty #14 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014 Workqueue: events request_firmware_work_func Call Trace: <TASK> dump_stack_lvl+0x180/0x1b0 __ubsan_handle_out_of_bounds+0xd4/0x130 htc_issue_send.constprop.0+0x20c/0x230 ? _raw_spin_unlock_irqrestore+0x3c/0x70 ath9k_wmi_cmd+0x41d/0x610 ? mark_held_locks+0x9f/0xe0 ...
Since this bug has been confirmed to be caused by insufficient verification of conn_rsp_epid, I think it would be appropriate to add a range check for conn_rsp_epid to htc_connect_service() to prevent the bug from occurring.
--- drivers/net/wireless/ath/ath9k/htc_hst.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/ath/ath9k/htc_hst.c +3 -0
@@ -294,6 +294,9 @@ int htc_connect_service(struct htc_target *target,return -ETIMEDOUT ; } +if (target->conn_rsp_epid <0 || target->conn_rsp_epid >=ENDPOINT_MAX ) +return -EINVAL ; + *conn_rsp_epid = target->conn_rsp_epid;return 0 ; err:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 132/772 drm/omap: Fix possible NULL dereference
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit a88fee2d67d9b78c24630a987a88ccf886b2498b ]
smatch reports:
drivers/gpu/drm/omapdrm/dss/base.c:176 omapdss_device_disconnect() error: we previously assumed 'src' could be null (see line 169)
This code is mostly from a time when omapdrm had its own display device model. I can't honestly remember the details, and I don't think it's worth digging in deeply into that for a legacy driver.
However, it looks like we only call omapdss_device_disconnect() and omapdss_device_connect() with NULL as the src parameter. We can thus drop the src parameter from both functions, and fix the smatch warning.
I don't think omapdss_device_disconnect() ever gets NULL for the dst parameter (if it did, we'd crash soon after returning from the function), but I have kept the !dst check, just in case, but I added a WARN_ON() there.
Also, if the dst parameter can be NULL, we can't always get the struct dss_device pointer from dst->dss (which is only used for a debug print). To make sure we can't hit that issue, do it similarly to the omapdss_device_connect() function: add 'struct dss_device *dss' as the first parameter, so that we always have it regardless of the dst.
--- drivers/gpu/drm/omapdrm/dss/base.c | 25 ++++++------------------- drivers/gpu/drm/omapdrm/dss/omapdss.h | 3 +-- drivers/gpu/drm/omapdrm/omap_drv.c | 4 ++-- 3 files changed, 9 insertions(+), 23 deletions(-)
drivers/gpu/drm/omapdrm/dss/base.c +6 -19
@@ -139,21 +139,13 @@ static bool omapdss_device_is_connected(struct omap_dss_device *dssdev) }int omapdss_device_connect (struct dss_device *dss, -struct omap_dss_device *src,struct omap_dss_device *dst) { -dev_dbg (&dss->pdev->dev,"connect(%s, %s)\n" , - src ?dev_name (src->dev) :"NULL" , +dev_dbg (&dss->pdev->dev,"connect(%s)\n" , dst ?dev_name (dst->dev) :"NULL" ); -if (!dst) { -/* -* The destination is NULL when the source is connected to a -* bridge instead of a DSS device. Stop here, we will attach -* the bridge later when we will have a DRM encoder. -*/ -return src && src->bridge ?0 : -EINVAL ; - } +if (!dst) +return -EINVAL ;if (omapdss_device_is_connected (dst))return -EBUSY ;
@@ -163,19 +155,14 @@ int omapdss_device_connect(struct dss_device *dss,return 0 ; } -void omapdss_device_disconnect (struct omap_dss_device *src, +void omapdss_device_disconnect (struct dss_device *dss,struct omap_dss_device *dst) { -struct dss_device *dss = src ? src->dss : dst->dss; - -dev_dbg (&dss->pdev->dev,"disconnect(%s, %s)\n" , - src ?dev_name (src->dev) :"NULL" , +dev_dbg (&dss->pdev->dev,"disconnect(%s)\n" , dst ?dev_name (dst->dev) :"NULL" ); -if (!dst) { -WARN_ON (!src->bridge); +if (WARN_ON (!dst))return ; - }if (!dst->id && !omapdss_device_is_connected (dst)) {WARN_ON (1 );
drivers/gpu/drm/omapdrm/dss/omapdss.h +1 -2
@@ -242,9 +242,8 @@ struct omap_dss_device *omapdss_device_get(struct omap_dss_device *dssdev);void omapdss_device_put (struct omap_dss_device *dssdev);struct omap_dss_device *omapdss_find_device_by_node (struct device_node *node);int omapdss_device_connect (struct dss_device *dss, -struct omap_dss_device *src,struct omap_dss_device *dst); -void omapdss_device_disconnect (struct omap_dss_device *src, +void omapdss_device_disconnect (struct dss_device *dss,struct omap_dss_device *dst);int omap_dss_get_num_overlay_managers (void );
drivers/gpu/drm/omapdrm/omap_drv.c +2 -2
@@ -307,7 +307,7 @@ static void omap_disconnect_pipelines(struct drm_device *ddev)for (i =0 ; i < priv->num_pipes; i++) {struct omap_drm_pipeline *pipe = &priv->pipes[i]; -omapdss_device_disconnect (NULL , pipe->output); +omapdss_device_disconnect (priv->dss, pipe->output);omapdss_device_put (pipe->output); pipe->output =NULL ;
@@ -325,7 +325,7 @@ static int omap_connect_pipelines(struct drm_device *ddev)int r;for_each_dss_output (output) { - r =omapdss_device_connect (priv->dss,NULL , output); + r =omapdss_device_connect (priv->dss, output);if (r == -EPROBE_DEFER ) {omapdss_device_put (output);return r;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 133/772 drm/omap: Fix locking in omap_gem_new_dmabuf()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit e6a1c4037227539373c8cf484ace83833e2ad6a2 ]
omap_gem_new_dmabuf() creates the new gem object, and then takes and holds the omap_obj->lock for the rest of the function. This has two issues:
- omap_gem_free_object(), which is called in the error paths, also takes the same lock, leading to deadlock
- Even if the above wouldn't happen, in the error cases omap_gem_new_dmabuf() still unlocks omap_obj->lock, even after the omap_obj has already been freed.
Furthermore, I don't think there's any reason to take the lock at all, as the object was just created and not yet shared with anyone else.
To fix all this, drop taking the lock.
--- drivers/gpu/drm/omapdrm/omap_gem.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
drivers/gpu/drm/omapdrm/omap_gem.c +2 -8
@@ -1408,8 +1408,6 @@ struct drm_gem_object *omap_gem_new_dmabuf(struct drm_device *dev, size_t size, omap_obj =to_omap_bo (obj); -mutex_lock (&omap_obj->lock); - omap_obj->sgt = sgt;if (sgt->orig_nents ==1 ) {
@@ -1424,21 +1422,17 @@ struct drm_gem_object *omap_gem_new_dmabuf(struct drm_device *dev, size_t size, pages =kcalloc (npages,sizeof (*pages),GFP_KERNEL );if (!pages) {omap_gem_free_object (obj); - obj =ERR_PTR (-ENOMEM ); - goto done; +return ERR_PTR (-ENOMEM ); } omap_obj->pages = pages; ret =drm_prime_sg_to_page_array (sgt, pages, npages);if (ret) {omap_gem_free_object (obj); - obj =ERR_PTR (-ENOMEM ); - goto done; +return ERR_PTR (-ENOMEM ); } } -done: -mutex_unlock (&omap_obj->lock);return obj; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 134/772 wifi: p54: Use IRQF_NO_AUTOEN flag in request_irq()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit bcd1371bd85e560ccc9159b7747f94bfe43b77a6 ]
disable_irq() after request_irq() still has a time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN flag will disable IRQ auto-enable when request IRQ.
--- drivers/net/wireless/intersil/p54/p54spi.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/net/wireless/intersil/p54/p54spi.c +1 -3
@@ -623,7 +623,7 @@ static int p54spi_probe(struct spi_device *spi)gpio_direction_input (p54spi_gpio_irq); ret =request_irq (gpio_to_irq (p54spi_gpio_irq), - p54spi_interrupt,0 ,"p54spi" , + p54spi_interrupt,IRQF_NO_AUTOEN ,"p54spi" , priv->spi);if (ret <0 ) {dev_err (&priv->spi->dev,"request_irq() failed" );
@@ -632,8 +632,6 @@ static int p54spi_probe(struct spi_device *spi)irq_set_irq_type (gpio_to_irq (p54spi_gpio_irq),IRQ_TYPE_EDGE_RISING ); -disable_irq (gpio_to_irq (p54spi_gpio_irq)); -INIT_WORK (&priv->work, p54spi_work);init_completion (&priv->fw_comp);INIT_LIST_HEAD (&priv->tx_pending);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 135/772 wifi: mwifiex: Use IRQF_NO_AUTOEN flag in request_irq()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 9a98dd48b6d834d7a3fe5e8e7b8c3a1d006f9685 ]
disable_irq() after request_irq() still has a time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN flag will disable IRQ auto-enable when request IRQ.
--- drivers/net/wireless/marvell/mwifiex/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/marvell/mwifiex/main.c +2 -2
@@ -1638,7 +1638,8 @@ static void mwifiex_probe_of(struct mwifiex_adapter *adapter) } ret =devm_request_irq (dev, adapter->irq_wakeup, - mwifiex_irq_wakeup_handler,IRQF_TRIGGER_LOW , + mwifiex_irq_wakeup_handler, +IRQF_TRIGGER_LOW |IRQF_NO_AUTOEN ,"wifi_wake" , adapter);if (ret) { dev_err(dev, "Failed to request irq_wakeup %d (%d)\n",
@@ -1646,7 +1647,6 @@ static void mwifiex_probe_of(struct mwifiex_adapter *adapter) goto err_exit; } -disable_irq (adapter->irq_wakeup);if (device_init_wakeup (dev, true)) {dev_err (dev,"fail to init wakeup for mwifiex\n" ); goto err_exit;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 136/772 drm/imx/dcss: Use IRQF_NO_AUTOEN flag in request_irq()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 1af01e14db7e0b45ae502d822776a58c86688763 ]
disable_irq() after request_irq() still has a time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN flag will disable IRQ auto-enable when request IRQ.
--- drivers/gpu/drm/imx/dcss/dcss-crtc.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/gpu/drm/imx/dcss/dcss-crtc.c +2 -4
@@ -206,15 +206,13 @@ int dcss_crtc_init(struct dcss_crtc *crtc, struct drm_device *drm)if (crtc->irq <0 )return crtc->irq; - ret =request_irq (crtc->irq, dcss_crtc_irq_handler, -0 ,"dcss_drm" , crtc); + ret =request_irq (crtc->irq, dcss_crtc_irq_handler,IRQF_NO_AUTOEN , +"dcss_drm" , crtc);if (ret) {dev_err (dcss->dev,"irq request failed with %d.\n" , ret);return ret; } -disable_irq (crtc->irq); -return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 137/772 drm/imx/ipuv3: Use IRQF_NO_AUTOEN flag in request_irq()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 40004709a3d3b07041a473a163ca911ef04ab8bd ]
disable_irq() after request_irq() still has a time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN flag will disable IRQ auto-enable when request IRQ.
--- drivers/gpu/drm/imx/ipuv3-crtc.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/gpu/drm/imx/ipuv3-crtc.c +2 -4
@@ -410,14 +410,12 @@ static int ipu_drm_bind(struct device *dev, struct device *master, void *data) } ipu_crtc->irq =ipu_plane_irq (ipu_crtc->plane[0 ]); - ret =devm_request_irq (ipu_crtc->dev, ipu_crtc->irq, ipu_irq_handler,0 , -"imx_drm" , ipu_crtc); + ret =devm_request_irq (ipu_crtc->dev, ipu_crtc->irq, ipu_irq_handler, +IRQF_NO_AUTOEN ,"imx_drm" , ipu_crtc);if (ret <0 ) {dev_err (ipu_crtc->dev,"irq request failed with %d.\n" , ret);return ret; } -/* Only enable IRQ when we actually need it to trigger work. */ -disable_irq (ipu_crtc->irq);return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 138/772 drm/v3d: Address race-condition in MMU flush
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maíra Canal <[email protected]>
[ Upstream commit cf1becb7f996a0a23ea2c270cf6bb0911ec3ca1a ]
We must first flush the MMU cache and then, flush the TLB, not the other way around. Currently, we can see a race condition between the MMU cache and the TLB when running multiple rendering processes at the same time. This is evidenced by MMU errors triggered by the IRQ.
Fix the MMU flush order by flushing the MMU cache and then the TLB. Also, in order to address the race condition, wait for the MMU cache flush to finish before starting the TLB flush.
--- drivers/gpu/drm/v3d/v3d_mmu.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-)
drivers/gpu/drm/v3d/v3d_mmu.c +10 -19
@@ -34,32 +34,23 @@ static int v3d_mmu_flush_all(struct v3d_dev *v3d) {int ret; -/* Make sure that another flush isn't already running when we -* start this one. -*/ - ret =wait_for (!(V3D_READ (V3D_MMU_CTL ) & -V3D_MMU_CTL_TLB_CLEARING ),100 ); -if (ret) -dev_err (v3d->drm.dev,"TLB clear wait idle pre-wait failed\n" ); - -V3D_WRITE (V3D_MMU_CTL ,V3D_READ (V3D_MMU_CTL ) | -V3D_MMU_CTL_TLB_CLEAR ); - -V3D_WRITE (V3D_MMUC_CONTROL , -V3D_MMUC_CONTROL_FLUSH | +V3D_WRITE (V3D_MMUC_CONTROL ,V3D_MMUC_CONTROL_FLUSH |V3D_MMUC_CONTROL_ENABLE ); - ret =wait_for (!(V3D_READ (V3D_MMU_CTL ) & -V3D_MMU_CTL_TLB_CLEARING ),100 ); + ret =wait_for (!(V3D_READ (V3D_MMUC_CONTROL ) & +V3D_MMUC_CONTROL_FLUSHING ),100 );if (ret) { -dev_err (v3d->drm.dev,"TLB clear wait idle failed\n" ); +dev_err (v3d->drm.dev,"MMUC flush wait idle failed\n" );return ret; } - ret =wait_for (!(V3D_READ (V3D_MMUC_CONTROL ) & -V3D_MMUC_CONTROL_FLUSHING ),100 ); +V3D_WRITE (V3D_MMU_CTL ,V3D_READ (V3D_MMU_CTL ) | +V3D_MMU_CTL_TLB_CLEAR ); + + ret =wait_for (!(V3D_READ (V3D_MMU_CTL ) & +V3D_MMU_CTL_TLB_CLEARING ),100 );if (ret) -dev_err (v3d->drm.dev,"MMUC flush wait idle failed\n" ); +dev_err (v3d->drm.dev,"MMU TLB clear wait idle failed\n" );return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 139/772 wifi: ath10k: fix invalid VHT parameters in supported_vht_mcs_rate_nss1
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baochen Qiang <[email protected]>
[ Upstream commit d50886b27850447d90c0cd40c725238097909d1e ]
In supported_vht_mcs_rate_nss1, the rate for MCS9 & VHT20 is defined as {780, 867}, this does not align with firmware's definition and therefore fails the verification in ath10k_mac_get_rate_flags_vht():
invalid vht params rate 960 100kbps nss 1 mcs 9
Change it to {865, 960} to align with firmware, so this issue could be fixed.
Since ath10k_hw_params::supports_peer_stats_info is enabled only for QCA6174, this change does not affect other chips.
Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00309-QCARMSWPZ-1
--- drivers/net/wireless/ath/ath10k/mac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath10k/mac.c +1 -1
@@ -9120,7 +9120,7 @@ static const struct ath10k_index_vht_data_rate_type supported_vht_mcs_rate_nss1[ {6, {2633, 2925}, {1215, 1350}, {585, 650} }, {7, {2925, 3250}, {1350, 1500}, {650, 722} }, {8, {3510, 3900}, {1620, 1800}, {780, 867} }, - {9, {3900, 4333}, {1800, 2000}, {780, 867} } + {9, {3900, 4333}, {1800, 2000}, {865, 960} } };/*MCS parameters with Nss = 2 */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 140/772 wifi: ath10k: fix invalid VHT parameters in supported_vht_mcs_rate_nss2
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baochen Qiang <[email protected]>
[ Upstream commit 52db16ec5bae7bd027804265b968259d1a6c3970 ]
In supported_vht_mcs_rate_nss2, the rate for MCS9 & VHT20 is defined as {1560, 1733}, this does not align with firmware's definition and therefore fails the verification in ath10k_mac_get_rate_flags_vht():
invalid vht params rate 1730 100kbps nss 2 mcs 9
and:
invalid vht params rate 1920 100kbps nss 2 mcs 9
Change it to {1730, 1920} to align with firmware to fix the issue.
Since ath10k_hw_params::supports_peer_stats_info is enabled only for QCA6174, this change does not affect other chips.
Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00309-QCARMSWPZ-1
--- drivers/net/wireless/ath/ath10k/mac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath10k/mac.c +1 -1
@@ -9135,7 +9135,7 @@ static const struct ath10k_index_vht_data_rate_type supported_vht_mcs_rate_nss2[ {6, {5265, 5850}, {2430, 2700}, {1170, 1300} }, {7, {5850, 6500}, {2700, 3000}, {1300, 1444} }, {8, {7020, 7800}, {3240, 3600}, {1560, 1733} }, - {9, {7800, 8667}, {3600, 4000}, {1560, 1733} } + {9, {7800, 8667}, {3600, 4000}, {1730, 1920} } }; static void ath10k_mac_get_rate_flags_ht(struct ath10k *ar, u32 rate, u8 nss, u8 mcs,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 141/772 dt-bindings: vendor-prefixes: Add NeoFidelity, Inc
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Igor Prusov <[email protected]>
[ Upstream commit 5d9e6d6fc1b98c8c22d110ee931b3b233d43cd13 ]
Add vendor prefix for NeoFidelity, Inc
--- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
@@ -869,6 +869,8 @@ patternProperties: description: National Semiconductor "^nec,.*": description: NEC LCD Technologies, Ltd. + "^neofidelity,.*": + description: Neofidelity Inc. "^neonode,.*": description: Neonode Inc. "^netgear,.*":
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 142/772 ASoC: fsl_micfil: fix regmap_write_bits usage
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 06df673d20230afb0e383e39235a4fa8b9a62464 ]
The last parameter 1 means BIT(0), which should be the correct BIT(X).
--- sound/soc/fsl/fsl_micfil.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/fsl/fsl_micfil.c +2 -2
@@ -563,7 +563,7 @@ static irqreturn_t micfil_isr(int irq, void *devid)regmap_write_bits (micfil->regmap,REG_MICFIL_STAT ,MICFIL_STAT_CHXF (i), -1 ); +MICFIL_STAT_CHXF (i)); }for (i =0 ; i <MICFIL_FIFO_NUM ; i++) {
@@ -598,7 +598,7 @@ static irqreturn_t micfil_err_isr(int irq, void *devid)if (stat_reg &MICFIL_STAT_LOWFREQF ) {dev_dbg (&pdev->dev,"isr: ipg_clk_app is too low\n" );regmap_write_bits (micfil->regmap,REG_MICFIL_STAT , -MICFIL_STAT_LOWFREQF ,1 ); +MICFIL_STAT_LOWFREQF ,MICFIL_STAT_LOWFREQF ); }return IRQ_HANDLED ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 143/772 ASoC: dt-bindings: mt6359: Update generic node name and dmic-mode
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Macpaul Lin <[email protected]>
[ Upstream commit 4649cbd97fdae5069e9a71cd7669b62b90e03669 ]
Some fix and updates in the following items:
1. examples:
Update generic node name to 'audio-codec' to comply with the coming change in 'mt6359.dtsi'. This change is necessary to fix the dtbs_check error:
pmic: 'mt6359codec' does not match any of the regexes: 'pinctrl-[0-9]+'
2. mediatek,dmic-mode:
After inspecting the .dts and .dtsi files using 'mt6359-codec', it was discovered that the definitions of 'two wires' and 'one wire' are inverted compared to the DT schema.
For example, the following boards using MT6359 PMIC:
- mt8192-asurada.dtsi
- mt8195-cherry.dtsi
These boards use the same definitions of 'dmic-mode' as other boards using MT6358 PMIC. The meaning of '0' or '1' has been noted as comments in the device trees.
Upon examining the code in [1] and [2], it was confirmed that the definitions of 'dmic-mode' are consistent between "MT6359 PMIC" and "MT6358 PMIC". Therefore, the DT Schema should be correct as is.
References:
[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/mt6358.c#n1875
[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/sound/soc/codecs/mt6359.c#L1515
--- Documentation/devicetree/bindings/sound/mt6359.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
Documentation/devicetree/bindings/sound/mt6359.yaml +5 -5
@@ -23,8 +23,8 @@ properties: Indicates how many data pins are used to transmit two channels of PDM signal. 0 means two wires, 1 means one wire. Default value is 0. enum: - - 0 # one wire - - 1 # two wires + - 0 # two wires + - 1 # one wire mediatek,mic-type-0: $ref: /schemas/types.yaml#/definitions/uint32
@@ -53,9 +53,9 @@ additionalProperties: false examples: - | - mt6359codec: mt6359codec { - mediatek,dmic-mode = <0>; - mediatek,mic-type-0 = <2>; + mt6359codec: audio-codec { + mediatek,dmic-mode = <0>; + mediatek,mic-type-0 = <2>; }; ...
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 144/772 drm/bridge: anx7625: Drop EDID cache on bridge power off
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pin-yen Lin <[email protected]>
[ Upstream commit 00ae002116a14c2e6a342c4c9ae080cdbb9b4b21 ]
The bridge might miss the display change events when it's powered off. This happens when a user changes the external monitor when the system is suspended and the embedded controller doesn't not wake AP up.
It's also observed that one DP-to-HDMI bridge doesn't work correctly when there is no EDID read after it is powered on.
Drop the cache to force an EDID read after system resume to fix this.
--- drivers/gpu/drm/bridge/analogix/anx7625.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/gpu/drm/bridge/analogix/anx7625.c +2 -0
@@ -2567,6 +2567,8 @@ static int __maybe_unused anx7625_runtime_pm_suspend(struct device *dev)mutex_lock (&ctx->lock);anx7625_stop_dp_work (ctx); +if (!ctx->pdata.panel_bridge) +anx7625_remove_edid (ctx);anx7625_power_standby (ctx);mutex_unlock (&ctx->lock);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 145/772 libbpf: Fix output .symtab byte-order during linking
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit f896b4a5399e97af0b451fcf04754ed316935674 ]
Object linking output data uses the default ELF_T_BYTE type for '.symtab' section data, which disables any libelf-based translation. Explicitly set the ELF_T_SYM type for output to restore libelf's byte-order conversion, noting that input '.symtab' data is already correctly translated.
--- tools/lib/bpf/linker.c | 2 ++ 1 file changed, 2 insertions(+)
tools/lib/bpf/linker.c +2 -0
@@ -396,6 +396,8 @@ static int init_output_elf(struct bpf_linker *linker, const char *file)pr_warn_elf ("failed to create SYMTAB data" );return -EINVAL ; } +/* Ensure libelf translates byte-order of symbol records */ + sec->data->d_type =ELF_T_SYM ; str_off =strset__add_str (linker->strtab_strs, sec->sec_name);if (str_off <0 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 146/772 bpf: Fix the xdp_adjust_tail sample prog issue
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Chen <[email protected]>
[ Upstream commit 4236f114a3ffbbfd217436c08852e94cae372f57 ]
During the xdp_adjust_tail test, probabilistic failure occurs and SKB package is discarded by the kernel. After checking the issues by tracking SKB package, it is identified that they were caused by checksum errors. Refer to checksum of the arch/arm64/include/asm/checksum.h for fixing.
v2: Based on Alexei Starovoitov's suggestions, it is necessary to keep the code
implementation consistent.
--- samples/bpf/xdp_adjust_tail_kern.c | 1 + 1 file changed, 1 insertion(+)
samples/bpf/xdp_adjust_tail_kern.c +1 -0
@@ -57,6 +57,7 @@ static __always_inline void swap_mac(void *data, struct ethhdr *orig_eth) static __always_inline __u16 csum_fold_helper(__u32 csum) { + csum = (csum &0xffff ) + (csum >>16 );return ~((csum &0xffff ) + (csum >>16 )); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 147/772 selftests/bpf: Add csum helpers
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stanislav Fomichev <[email protected]>
[ Upstream commit f6642de0c3e94d3ef6f44e127d11fcf4138873f7 ]
Checksum helpers will be used to calculate pseudo-header checksum in AF_XDP metadata selftests.
The helpers are mirroring existing kernel ones:
- csum_tcpudp_magic : IPv4 pseudo header csum
- csum_ipv6_magic : IPv6 pseudo header csum
- csum_fold : fold csum and do one's complement
Stable-dep-of: 5bf1557e3d6a ("selftests/bpf: Fix backtrace printing for selftests crashes")
--- tools/testing/selftests/bpf/network_helpers.h | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+)
tools/testing/selftests/bpf/network_helpers.h +43 -0
@@ -66,4 +66,47 @@ struct nstoken;*/ struct nstoken *open_netns (const char *name);void close_netns (struct nstoken *token); + +static __u16 csum_fold (__u32 csum) +{ + csum = (csum &0xffff ) + (csum >>16 ); + csum = (csum &0xffff ) + (csum >>16 ); + +return (__u16 )~csum; +} + +static inline __sum16 csum_tcpudp_magic (__be32 saddr,__be32 daddr, +__u32 len,__u8 proto, +__wsum csum) +{ +__u64 s = csum; + + s += (__u32 )saddr; + s += (__u32 )daddr; + s +=htons (proto + len); + s = (s &0xffffffff ) + (s >>32 ); + s = (s &0xffffffff ) + (s >>32 ); + +return csum_fold ((__u32 )s); +} + +static inline __sum16 csum_ipv6_magic (const struct in6_addr *saddr, +const struct in6_addr *daddr, +__u32 len,__u8 proto, +__wsum csum) +{ +__u64 s = csum; +int i; + +for (i =0 ; i <4 ; i++) + s += (__u32 )saddr->s6_addr32[i]; +for (i =0 ; i <4 ; i++) + s += (__u32 )daddr->s6_addr32[i]; + s +=htons (proto + len); + s = (s &0xffffffff ) + (s >>32 ); + s = (s &0xffffffff ) + (s >>32 ); + +return csum_fold ((__u32 )s); +} +#endif
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 148/772 selftests/bpf: Fix backtrace printing for selftests crashes
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduard Zingerman <[email protected]>
[ Upstream commit 5bf1557e3d6a69113649d831276ea2f97585fc33 ]
test_progs uses glibc specific functions backtrace() and backtrace_symbols_fd() to print backtrace in case of SIGSEGV.
Recent commit (see fixes) updated test_progs.c to define stub versions of the same functions with attriubte "weak" in order to allow linking test_progs against musl libc. Unfortunately this broke the backtrace handling for glibc builds.
As it turns out, glibc defines backtrace() and backtrace_symbols_fd() as weak:
$ llvm-readelf --symbols /lib64/libc.so.6 \
| grep -P '( backtrace_symbols_fd| backtrace)$'
4910: 0000000000126b40 161 FUNC WEAK DEFAULT 16 backtrace
6843: 0000000000126f90 852 FUNC WEAK DEFAULT 16 backtrace_symbols_fdSo does test_progs:
$ llvm-readelf --symbols test_progs \
| grep -P '( backtrace_symbols_fd| backtrace)$'
2891: 00000000006ad190 15 FUNC WEAK DEFAULT 13 backtrace
11215: 00000000006ad1a0 41 FUNC WEAK DEFAULT 13 backtrace_symbols_fdIn such situation dynamic linker is not obliged to favour glibc implementation over the one defined in test_progs.
Compiling with the following simple modification to test_progs.c demonstrates the issue:
$ git diff
...
\--- a/tools/testing/selftests/bpf/test_progs.c
\+++ b/tools/testing/selftests/bpf/test_progs.c
\@@ -1817,6 +1817,7 @@ int main(int argc, char **argv)
if (err)
return err; + *(int *)0xdeadbeef = 42;
err = cd_flavor_subdir(argv[0]);
if (err)
return err;$ ./test_progs [0]: Caught signal #11! Stack trace: <backtrace not supported> Segmentation fault (core dumped)
Resolve this by hiding stub definitions behind __GLIBC__ macro check instead of using "weak" attribute.
--- tools/testing/selftests/bpf/test_progs.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
tools/testing/selftests/bpf/test_progs.c +6 -3
@@ -16,11 +16,13 @@#include <sys/socket.h> #include <sys/un.h> +/* backtrace() and backtrace_symbols_fd() are glibc specific, +* use header file when glibc is available and provide stub +* implementations when another libc implementation is used. +*/ #ifdef __GLIBC__#include <execinfo.h> /* backtrace */ -#endif - -/* Default backtrace funcs if missing at link */ +#else __weak int backtrace (void **buffer,int size) {return 0 ;
@@ -30,6 +32,7 @@ __weak void backtrace_symbols_fd(void *const *buffer, int size, int fd) {dprintf (fd,"<backtrace not supported>\n" ); } +#endif /*__GLIBC__ */ static bool verbose (void ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 149/772 selftests/bpf: add missing header include for htons
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexis Lothoré (eBPF Foundation) <[email protected]>
[ Upstream commit bc9b3fb827fceec4e05564d6e668280f4470ab5b ]
Including the network_helpers.h header in tests can lead to the following build error:
./network_helpers.h: In function ‘csum_tcpudp_magic’:
./network_helpers.h:116:14: error: implicit declaration of function \
‘htons’ [-Werror=implicit-function-declaration]
116 | s += htons(proto + len);
The error is avoided in many cases thanks to some other headers included earlier and bringing in arpa/inet.h (ie: test_progs.h).
Make sure that test_progs build success does not depend on header ordering by adding the missing header include in network_helpers.h
--- tools/testing/selftests/bpf/network_helpers.h | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/network_helpers.h +1 -0
@@ -1,6 +1,7 @@/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __NETWORK_HELPERS_H#define __NETWORK_HELPERS_H +#include <arpa/inet.h> #include <sys/socket.h> #include <sys/types.h> #include <linux/types.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 150/772 libbpf: fix sym_is_subprog() logic for weak global subprogs
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrii Nakryiko <[email protected]>
[ Upstream commit 4073213488be542f563eb4b2457ab4cbcfc2b738 ]
sym_is_subprog() is incorrectly rejecting relocations against *weak* global subprogs. Fix that by realizing that STB_WEAK is also a global function.
While it seems like verifier doesn't support taking an address of non-static subprog right now, it's still best to fix support for it on libbpf side, otherwise users will get a very confusing error during BPF skeleton generation or static linking due to misinterpreted relocation:
libbpf: prog 'handle_tp': bad map relo against 'foo' in section '.text'
Error: failed to open BPF object file: Relocation failed
It's clearly not a map relocation, but is treated and reported as such without this fix.
--- tools/lib/bpf/libbpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/lib/bpf/libbpf.c +1 -1
@@ -3501,7 +3501,7 @@ static bool sym_is_subprog(const Elf64_Sym *sym, int text_shndx)return true;/* global function */ -return bind ==STB_GLOBAL && type ==STT_FUNC ; +return (bind ==STB_GLOBAL || bind ==STB_WEAK ) && type ==STT_FUNC ; }static int find_extern_btf_id (const struct btf *btf,const char *ext_name)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 151/772 libbpf: never interpret subprogs in .text as entry programs
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrii Nakryiko <[email protected]>
[ Upstream commit db089c9158c1d535a36dfc010e5db37fccea2561 ]
Libbpf pre-1.0 had a legacy logic of allowing singular non-annotated (i.e., not having explicit SEC() annotation) function to be treated as sole entry BPF program (unless there were other explicit entry programs).
This behavior was dropped during libbpf 1.0 transition period (unless LIBBPF_STRICT_SEC_NAME flag was unset in libbpf_mode). When 1.0 was released and all the legacy behavior was removed, the bug slipped through leaving this legacy behavior around.
Fix this for good, as it actually causes very confusing behavior if BPF object file only has subprograms, but no entry programs.
--- tools/lib/bpf/libbpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/lib/bpf/libbpf.c +1 -1
@@ -3896,7 +3896,7 @@ static int bpf_object__collect_externs(struct bpf_object *obj)static bool prog_is_subprog (const struct bpf_object *obj,const struct bpf_program *prog) { -return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs >1 ; +return prog->sec_idx == obj->efile.text_shndx; } struct bpf_program *
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 152/772 netdevsim: copy addresses for both in and out paths
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hangbin Liu <[email protected]>
[ Upstream commit 2cf567f421dbfe7e53b7e5ddee9400da10efb75d ]
The current code only copies the address for the in path, leaving the out path address set to 0. This patch corrects the issue by copying the addresses for both the in and out paths. Before this patch:
# cat /sys/kernel/debug/netdevsim/netdevsim0/ports/0/ipsec SA count=2 tx=20 sa[0] tx ipaddr=0.0.0.0 sa[0] spi=0x00000100 proto=0x32 salt=0x0adecc3a crypt=1 sa[0] key=0x3167608a ca4f1397 43565909 941fa627 sa[1] rx ipaddr=192.168.0.1 sa[1] spi=0x00000101 proto=0x32 salt=0x0adecc3a crypt=1 sa[1] key=0x3167608a ca4f1397 43565909 941fa627
After this patch:
= cat /sys/kernel/debug/netdevsim/netdevsim0/ports/0/ipsec SA count=2 tx=20
sa[0] tx ipaddr=192.168.0.2
sa[0] spi=0x00000100 proto=0x32 salt=0x0adecc3a crypt=1
sa[0] key=0x3167608a ca4f1397 43565909 941fa627
sa[1] rx ipaddr=192.168.0.1
sa[1] spi=0x00000101 proto=0x32 salt=0x0adecc3a crypt=1
sa[1] key=0x3167608a ca4f1397 43565909 941fa627
--- drivers/net/netdevsim/ipsec.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/net/netdevsim/ipsec.c +5 -6
@@ -171,14 +171,13 @@ static int nsim_ipsec_add_sa(struct xfrm_state *xs)return ret; } -if (xs->xso.dir ==XFRM_DEV_OFFLOAD_IN ) { +if (xs->xso.dir ==XFRM_DEV_OFFLOAD_IN ) sa.rx = true; -if (xs->props.family ==AF_INET6 ) -memcpy (sa.ipaddr, &xs->id.daddr.a6,16 ); -else -memcpy (&sa.ipaddr[3 ], &xs->id.daddr.a4,4 ); - } +if (xs->props.family ==AF_INET6 ) +memcpy (sa.ipaddr, &xs->id.daddr.a6,16 ); +else +memcpy (&sa.ipaddr[3 ], &xs->id.daddr.a4,4 );/* the preparations worked, so save the info */ memcpy (&ipsec->sa[sa_idx], &sa,sizeof (sa));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 153/772 drm/bridge: tc358767: Fix link properties discovery
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 2d343723c7e1f9f6d64f721f07cfdfc2993758d1 ]
When a display controller driver uses DRM_BRIDGE_ATTACH_NO_CONNECTOR, tc358767 will behave properly and skip the creation of the connector.
However, tc_get_display_props(), which is used to find out about the DP monitor and link, is only called from two places: .atomic_enable() and tc_connector_get_modes(). The latter is only used when tc358767 creates its own connector, i.e. when DRM_BRIDGE_ATTACH_NO_CONNECTOR is _not_ set.
Thus, the driver never finds out the link properties before get_edid() is called. With num_lanes of 0 and link_rate of 0 there are not many valid modes...
Fix this by adding tc_get_display_props() call at the beginning of get_edid(), so that we have up to date information before looking at the modes.
--- drivers/gpu/drm/bridge/tc358767.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/bridge/tc358767.c +7 -0
@@ -1579,6 +1579,13 @@ static struct edid *tc_get_edid(struct drm_bridge *bridge, struct drm_connector *connector) {struct tc_data *tc =bridge_to_tc (bridge); +int ret; + + ret =tc_get_display_props (tc); +if (ret <0 ) { +dev_err (tc->dev,"failed to read display props: %d\n" , ret); +return 0 ; + }return drm_get_edid (connector, &tc->aux.ddc); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 154/772 selftests/bpf: Fix msg_verify_data in test_sockmap
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijian Zhang <[email protected]>
[ Upstream commit ee9b352ce4650ffc0d8ca0ac373d7c009c7e561e ]
Function msg_verify_data should have context of bytes_cnt and k instead of assuming they are zero. Otherwise, test_sockmap with data integrity test will report some errors. I also fix the logic related to size and index j
1/ 6 sockmap::txmsg test passthrough:FAIL 2/ 6 sockmap::txmsg test redirect:FAIL 7/12 sockmap::txmsg test apply:FAIL 10/11 sockmap::txmsg test push_data:FAIL 11/17 sockmap::txmsg test pull-data:FAIL 12/ 9 sockmap::txmsg test pop-data:FAIL 13/ 1 sockmap::txmsg test push/pop data:FAIL
...
Pass: 24 Fail: 52
After applying this patch, some of the errors are solved, but for push, pull and pop, we may need more fixes to msg_verify_data, added a TODO
10/11 sockmap::txmsg test push_data:FAIL 11/17 sockmap::txmsg test pull-data:FAIL 12/ 9 sockmap::txmsg test pop-data:FAIL
...
Pass: 37 Fail: 15
Besides, added a custom errno EDATAINTEGRITY for msg_verify_data, we shall not ignore the error in txmsg_cork case.
--- tools/testing/selftests/bpf/test_sockmap.c | 30 ++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-)
tools/testing/selftests/bpf/test_sockmap.c +20 -10
@@ -56,6 +56,8 @@ static void running_handler(int a);#define BPF_SOCKHASH_FILENAME "test_sockhash_kern.bpf.o"#define CG_PATH "/sockmap" +#define EDATAINTEGRITY 2001 +/* global sockets */ int s1, s2, c1, c2, p1, p2;int test_cnt;
@@ -509,23 +511,25 @@ static int msg_alloc_iov(struct msghdr *msg,return -ENOMEM ; } -static int msg_verify_data (struct msghdr *msg,int size,int chunk_sz) +/* TODO: Add verification logic for push, pull and pop data */ +static int msg_verify_data (struct msghdr *msg,int size,int chunk_sz, +unsigned char *k_p,int *bytes_cnt_p) { -int i, j =0 , bytes_cnt =0 ; -unsigned char k =0 ; +int i, j, bytes_cnt = *bytes_cnt_p; +unsigned char k = *k_p; -for (i =0 ; i < msg->msg_iovlen; i++) { +for (i =0 , j =0 ; i < msg->msg_iovlen && size; i++, j =0 ) {unsigned char *d = msg->msg_iov[i].iov_base;/* Special case test for skb ingress + ktls */ if (i ==0 && txmsg_ktls_skb) {if (msg->msg_iov[i].iov_len <4 ) -return -EIO ; +return -EDATAINTEGRITY ;if (memcmp (d,"PASS" ,4 ) !=0 ) {fprintf (stderr,"detected skb data error with skb ingress update @iov[%i]:%i \"%02x %02x %02x %02x\" != \"PASS\"\n" , i,0 , d[0 ], d[1 ], d[2 ], d[3 ]); -return -EIO ; +return -EDATAINTEGRITY ; } j =4 ;/* advance index past PASS header */ }
@@ -535,7 +539,7 @@ static int msg_verify_data(struct msghdr *msg, int size, int chunk_sz)fprintf (stderr,"detected data corruption @iov[%i]:%i %02x != %02x, %02x ?= %02x\n" , i, j, d[j], k -1 , d[j+1 ], k); -return -EIO ; +return -EDATAINTEGRITY ; } bytes_cnt++;if (bytes_cnt == chunk_sz) {
@@ -545,6 +549,8 @@ static int msg_verify_data(struct msghdr *msg, int size, int chunk_sz) size--; } } + *k_p = k; + *bytes_cnt_p = bytes_cnt;return 0 ; }
@@ -601,6 +607,8 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt,float total_bytes, txmsg_pop_total;int fd_flags =O_NONBLOCK ;struct timeval timeout; +unsigned char k =0 ; +int bytes_cnt =0 ;fd_set w;fcntl (fd, fd_flags);
@@ -695,7 +703,7 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt, iov_length * cnt :iov_length * iov_count; - errno =msg_verify_data (&msg, recv, chunk_sz); + errno =msg_verify_data (&msg, recv, chunk_sz, &k, &bytes_cnt);if (errno) {perror ("data verify msg failed" ); goto out_errno;
@@ -703,7 +711,9 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt,if (recvp) { errno =msg_verify_data (&msg_peek, recvp, - chunk_sz); + chunk_sz, + &k, + &bytes_cnt);if (errno) {perror ("data verify msg_peek failed" ); goto out_errno;
@@ -811,7 +821,7 @@ static int sendmsg_test(struct sockmap_options *opt) s.bytes_sent, sent_Bps, sent_Bps/giga, s.bytes_recvd, recvd_Bps, recvd_Bps/giga, peek_flag ? "(peek_msg)" : ""); -if (err && txmsg_cork) +if (err && err != -EDATAINTEGRITY && txmsg_cork) err =0 ;exit (err ?1 :0 ); }else if (rxpid ==-1 ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 155/772 selftests/bpf: Fix txmsg_redir of test_txmsg_pull in test_sockmap
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijian Zhang <[email protected]>
[ Upstream commit b29e231d66303c12b7b8ac3ac2a057df06b161e8 ]
txmsg_redir in "Test pull + redirect" case of test_txmsg_pull should be 1 instead of 0.
--- tools/testing/selftests/bpf/test_sockmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/test_sockmap.c +1 -1
@@ -1609,7 +1609,7 @@ static void test_txmsg_pull(int cgrp, struct sockmap_options *opt)test_send_large (opt, cgrp);/* Test pull + redirect */ - txmsg_redir =0 ; + txmsg_redir =1 ; txmsg_start =1 ; txmsg_end =2 ;test_send (opt, cgrp);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 156/772 wifi: mwifiex: Fix memcpy() field-spanning write warning in mwifiex_config_scan()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alper Nebi Yasak <[email protected]>
[ Upstream commit d241a139c2e9f8a479f25c75ebd5391e6a448500 ]
Replace one-element array with a flexible-array member in struct mwifiex_ie_types_wildcard_ssid_params to fix the following warning on a MT8173 Chromebook (mt8173-elm-hana):
[ 356.775250] ------------[ cut here ]------------ [ 356.784543] memcpy: detected field-spanning write (size 6) of single field "wildcard_ssid_tlv->ssid" at drivers/net/wireless/marvell/mwifiex/scan.c:904 (size 1) [ 356.813403] WARNING: CPU: 3 PID: 742 at drivers/net/wireless/marvell/mwifiex/scan.c:904 mwifiex_scan_networks+0x4fc/0xf28 [mwifiex]
The "(size 6)" above is exactly the length of the SSID of the network this device was connected to. The source of the warning looks like:
ssid_len = user_scan_in->ssid_list[i].ssid_len;
[...]
memcpy(wildcard_ssid_tlv->ssid,
user_scan_in->ssid_list[i].ssid, ssid_len);There is a #define WILDCARD_SSID_TLV_MAX_SIZE that uses sizeof() on this struct, but it already didn't account for the size of the one-element array, so it doesn't need to be changed.
--- drivers/net/wireless/marvell/mwifiex/fw.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/marvell/mwifiex/fw.h +1 -1
@@ -842,7 +842,7 @@ struct mwifiex_ietypes_chanstats {struct mwifiex_ie_types_wildcard_ssid_params {struct mwifiex_ie_types_header header;u8 max_ssid_length; -u8 ssid[1 ]; +u8 ssid[]; } __packed;#define TSF_DATA_SIZE 8
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 157/772 drm: fsl-dcu: enable PIXCLK on LS1021A
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthias Schiffer <[email protected]>
[ Upstream commit ffcde9e44d3e18fde3d18bfff8d9318935413bfd ]
The PIXCLK needs to be enabled in SCFG before accessing certain DCU registers, or the access will hang. For simplicity, the PIXCLK is enabled unconditionally, resulting in increased power consumption.
--- drivers/gpu/drm/fsl-dcu/Kconfig | 1 + drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | 15 +++++++++++++++ drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h | 3 +++ 3 files changed, 19 insertions(+)
drivers/gpu/drm/fsl-dcu/Kconfig +1 -0
@@ -8,6 +8,7 @@ config DRM_FSL_DCU select DRM_PANEL select REGMAP_MMIO select VIDEOMODE_HELPERS + select MFD_SYSCON if SOC_LS1021A help Choose this option if you have an Freescale DCU chipset. If M is selected the module will be called fsl-dcu-drm.
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c +15 -0
@@ -100,6 +100,7 @@ static void fsl_dcu_irq_uninstall(struct drm_device *dev)static int fsl_dcu_load (struct drm_device *dev,unsigned long flags) {struct fsl_dcu_drm_device *fsl_dev = dev->dev_private; +struct regmap *scfg;int ret; ret =fsl_dcu_drm_modeset_init (fsl_dev);
@@ -108,6 +109,20 @@ static int fsl_dcu_load(struct drm_device *dev, unsigned long flags)return ret; } + scfg =syscon_regmap_lookup_by_compatible ("fsl,ls1021a-scfg" ); +if (PTR_ERR (scfg) != -ENODEV ) { +/* +* For simplicity, enable the PIXCLK unconditionally, +* resulting in increased power consumption. Disabling +* the clock in PM or on unload could be implemented as +* a future improvement. +*/ + ret =regmap_update_bits (scfg,SCFG_PIXCLKCR ,SCFG_PIXCLKCR_PXCEN , +SCFG_PIXCLKCR_PXCEN ); +if (ret <0 ) +return dev_err_probe (dev->dev, ret,"failed to enable pixclk\n" ); + } + ret =drm_vblank_init (dev, dev->mode_config.num_crtc);if (ret <0 ) {dev_err (dev->dev,"failed to initialize vblank\n" );
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h +3 -0
@@ -160,6 +160,9 @@#define FSL_DCU_ARGB4444 12#define FSL_DCU_YUV422 14 +#define SCFG_PIXCLKCR 0x28 +#define SCFG_PIXCLKCR_PXCEN BIT(31) +#define VF610_LAYER_REG_NUM 9#define LS1021A_LAYER_REG_NUM 10
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 158/772 octeontx2-pf: handle otx2_mbox_get_rsp errors in otx2_common.c
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dipendra Khadka <[email protected]>
[ Upstream commit 0fbc7a5027c6f7f2c785adae3dcec22b2f2b69b3 ]
Add error pointer check after calling otx2_mbox_get_rsp().
--- drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.c +4 -0
@@ -1786,6 +1786,10 @@ u16 otx2_get_max_mtu(struct otx2_nic *pfvf)if (!rc) { rsp = (struct nix_hw_info *)otx2_mbox_get_rsp (&pfvf->mbox.mbox,0 , &req->hdr); +if (IS_ERR (rsp)) { + rc =PTR_ERR (rsp); + goto out; + }/* HW counts VLAN insertion bytes (8 for double tag) * irrespective of whether SQE is requesting to insert VLAN
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 159/772 octeontx2-pf: handle otx2_mbox_get_rsp errors in otx2_ethtool.c
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dipendra Khadka <[email protected]>
[ Upstream commit e26f8eac6bb20b20fdb8f7dc695711ebce4c7c5c ]
Add error pointer check after calling otx2_mbox_get_rsp().
--- .../net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_ethtool.c +10 -0
@@ -333,6 +333,11 @@ static void otx2_get_pauseparam(struct net_device *netdev,if (!otx2_sync_mbox_msg (&pfvf->mbox)) { rsp = (struct cgx_pause_frm_cfg *)otx2_mbox_get_rsp (&pfvf->mbox.mbox,0 , &req->hdr); +if (IS_ERR (rsp)) { +mutex_unlock (&pfvf->mbox.lock); +return ; + } + pause->rx_pause = rsp->rx_pause; pause->tx_pause = rsp->tx_pause; }
@@ -1072,6 +1077,11 @@ static int otx2_set_fecparam(struct net_device *netdev, rsp = (struct fec_mode *)otx2_mbox_get_rsp (&pfvf->mbox.mbox,0 , &req->hdr); +if (IS_ERR (rsp)) { + err =PTR_ERR (rsp); + goto end; + } +if (rsp->fec >=0 ) pfvf->linfo.fec = rsp->fec;else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 160/772 octeontx2-pf: handle otx2_mbox_get_rsp errors in otx2_flows.c
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dipendra Khadka <[email protected]>
[ Upstream commit bd3110bc102ab6292656b8118be819faa0de8dd0 ]
Adding error pointer check after calling otx2_mbox_get_rsp().
--- .../net/ethernet/marvell/octeontx2/nic/otx2_flows.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_flows.c +10 -0
@@ -121,6 +121,8 @@ int otx2_alloc_mcam_entries(struct otx2_nic *pfvf, u16 count) rsp = (struct npc_mcam_alloc_entry_rsp *)otx2_mbox_get_rsp (&pfvf->mbox.mbox,0 , &req->hdr); +if (IS_ERR (rsp)) + goto exit;for (ent =0 ; ent < rsp->count; ent++) flow_cfg->flow_ent[ent + allocated] = rsp->entry_list[ent];
@@ -199,6 +201,10 @@ static int otx2_mcam_entry_init(struct otx2_nic *pfvf) rsp = (struct npc_mcam_alloc_entry_rsp *)otx2_mbox_get_rsp (&pfvf->mbox.mbox,0 , &req->hdr); +if (IS_ERR (rsp)) { +mutex_unlock (&pfvf->mbox.lock); +return PTR_ERR (rsp); + }if (rsp->count != req->count) { netdev_info(pfvf->netdev,
@@ -234,6 +240,10 @@ static int otx2_mcam_entry_init(struct otx2_nic *pfvf) frsp = (struct npc_get_field_status_rsp *)otx2_mbox_get_rsp (&pfvf->mbox.mbox,0 , &freq->hdr); +if (IS_ERR (frsp)) { +mutex_unlock (&pfvf->mbox.lock); +return PTR_ERR (frsp); + }if (frsp->enable) { pfvf->flags |=OTX2_FLAG_RX_VLAN_SUPPORT ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 161/772 octeontx2-pf: handle otx2_mbox_get_rsp errors in cn10k.c
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dipendra Khadka <[email protected]>
[ Upstream commit ac9183023b6a9c09467516abd8aab04f9a2f9564 ]
Add error pointer check after calling otx2_mbox_get_rsp().
--- drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/cn10k.c +5 -0
@@ -201,6 +201,11 @@ int cn10k_alloc_leaf_profile(struct otx2_nic *pfvf, u16 *leaf) rsp = (struct nix_bandprof_alloc_rsp *)otx2_mbox_get_rsp (&pfvf->mbox.mbox,0 , &req->hdr); +if (IS_ERR (rsp)) { + rc =PTR_ERR (rsp); + goto out; + } +if (!rsp->prof_count[BAND_PROF_LEAF_LAYER ]) { rc = -EIO ; goto out;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 162/772 octeontx2-pf: handle otx2_mbox_get_rsp errors in otx2_dmac_flt.c
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dipendra Khadka <[email protected]>
[ Upstream commit f5b942e6c54b13246ee49d42dcfb71b7f29e3c64 ]
Add error pointer checks after calling otx2_mbox_get_rsp().
--- .../net/ethernet/marvell/octeontx2/nic/otx2_dmac_flt.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_dmac_flt.c +9 -0
@@ -28,6 +28,11 @@ static int otx2_dmacflt_do_add(struct otx2_nic *pf, const u8 *mac,if (!err) { rsp = (struct cgx_mac_addr_add_rsp *)otx2_mbox_get_rsp (&pf->mbox.mbox,0 , &req->hdr); +if (IS_ERR (rsp)) { +mutex_unlock (&pf->mbox.lock); +return PTR_ERR (rsp); + } + *dmac_index = rsp->index; }
@@ -200,6 +205,10 @@ int otx2_dmacflt_update(struct otx2_nic *pf, u8 *mac, u32 bit_pos) rsp = (struct cgx_mac_addr_update_rsp *)otx2_mbox_get_rsp (&pf->mbox.mbox,0 , &req->hdr); +if (IS_ERR (rsp)) { + rc =PTR_ERR (rsp); + goto out; + } pf->flow_cfg->bmap_to_dmacindex[bit_pos] = rsp->index;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 163/772 octeontx2-pf: handle otx2_mbox_get_rsp errors in otx2_dcbnl.c
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dipendra Khadka <[email protected]>
[ Upstream commit 69297b0d3369488af259e3a7cf53d69157938ea1 ]
Add error pointer check after calling otx2_mbox_get_rsp().
--- drivers/net/ethernet/marvell/octeontx2/nic/otx2_dcbnl.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/marvell/octeontx2/nic/otx2_dcbnl.c +5 -0
@@ -311,6 +311,11 @@ int otx2_config_priority_flow_ctrl(struct otx2_nic *pfvf)if (!otx2_sync_mbox_msg (&pfvf->mbox)) { rsp = (struct cgx_pfc_rsp *)otx2_mbox_get_rsp (&pfvf->mbox.mbox,0 , &req->hdr); +if (IS_ERR (rsp)) { + err =PTR_ERR (rsp); + goto unlock; + } +if (req->rx_pause != rsp->rx_pause || req->tx_pause != rsp->tx_pause) {dev_warn (pfvf->dev,"Failed to config PFC\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 164/772 drm/panfrost: Remove unused id_mask from struct panfrost_model
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Price <[email protected]>
[ Upstream commit 581d1f8248550f2b67847e6d84f29fbe3751ea0a ]
The id_mask field of struct panfrost_model has never been used.
--- drivers/gpu/drm/panfrost/panfrost_gpu.c | 1 - 1 file changed, 1 deletion(-)
drivers/gpu/drm/panfrost/panfrost_gpu.c +0 -1
@@ -157,7 +157,6 @@ static void panfrost_gpu_init_quirks(struct panfrost_device *pfdev)struct panfrost_model {const char *name;u32 id; -u32 id_mask;u64 features;u64 issues;struct {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 165/772 bpf, arm64: Remove garbage frame for struct_ops trampoline
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Kuohai <[email protected]>
[ Upstream commit 87cb58aebdf7005661a07e9fd5a900f924d48c75 ]
The callsite layout for arm64 fentry is:
mov x9, lr
nop
When a bpf prog is attached, the nop instruction is patched to a call to bpf trampoline:
mov x9, lr
bl <bpf trampoline>
So two return addresses are passed to bpf trampoline: the return address for the traced function/prog, stored in x9, and the return address for the bpf trampoline itself, stored in lr. To obtain a full and accurate call stack, the bpf trampoline constructs two fake function frames using x9 and lr.
However, struct_ops progs are invoked directly as function callbacks, meaning that x9 is not set as it is in the fentry callsite. In this case, the frame constructed using x9 is garbage. The following stack trace for struct_ops, captured by perf sampling, illustrates this issue, where tcp_ack+0x404 is a garbage frame:
ffffffc0801a04b4 bpf_prog_50992e55a0f655a9_bpf_cubic_cong_avoid+0x98 (bpf_prog_50992e55a0f655a9_bpf_cubic_cong_avoid) ffffffc0801a228c [unknown] ([kernel.kallsyms]) // bpf trampolineffffffd08d362590 tcp_ack+0x798 ([kernel.kallsyms]) // caller for bpf trampolineffffffd08d3621fc tcp_ack+0x404 ([kernel.kallsyms]) // garbage frameffffffd08d36452c tcp_rcv_established+0x4ac ([kernel.kallsyms])ffffffd08d375c58 tcp_v4_do_rcv+0x1f0 ([kernel.kallsyms])ffffffd08d378630 tcp_v4_rcv+0xeb8 ([kernel.kallsyms])
To fix it, construct only one frame using lr for struct_ops.
The above stack trace also indicates that there is no kernel symbol for struct_ops bpf trampoline. This will be addressed in a follow-up patch.
--- arch/arm64/net/bpf_jit_comp.c | 47 +++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 16 deletions(-)
arch/arm64/net/bpf_jit_comp.c +31 -16
@@ -1757,6 +1757,12 @@ static void restore_args(struct jit_ctx *ctx, int args_off, int nargs) } } +static bool is_struct_ops_tramp (const struct bpf_tramp_links *fentry_links) +{ +return fentry_links->nr_links ==1 && + fentry_links->links[0 ]->link.type ==BPF_LINK_TYPE_STRUCT_OPS ; +} +/* Based on the x86's implementation of arch_prepare_bpf_trampoline(). * * bpf prog and function entry before bpf trampoline hooked:
@@ -1786,6 +1792,7 @@ static int prepare_trampoline(struct jit_ctx *ctx, struct bpf_tramp_image *im,struct bpf_tramp_links *fmod_ret = &tlinks[BPF_TRAMP_MODIFY_RETURN ];bool save_ret;__le32 **branches =NULL ; +bool is_struct_ops =is_struct_ops_tramp (fentry);/* trampoline stack layout: * [ parent ip ]
@@ -1854,11 +1861,14 @@ static int prepare_trampoline(struct jit_ctx *ctx, struct bpf_tramp_image *im,*/ emit_bti (A64_BTI_JC , ctx); -/* frame for parent function */ -emit (A64_PUSH (A64_FP ,A64_R (9 ),A64_SP ), ctx); -emit (A64_MOV (1 ,A64_FP ,A64_SP ), ctx); +/* x9 is not set for struct_ops */ +if (!is_struct_ops) { +/* frame for parent function */ +emit (A64_PUSH (A64_FP ,A64_R (9 ),A64_SP ), ctx); +emit (A64_MOV (1 ,A64_FP ,A64_SP ), ctx); + } -/* frame for patched function */ +/* frame for patched function for tracing, or caller for struct_ops */ emit (A64_PUSH (A64_FP ,A64_LR ,A64_SP ), ctx);emit (A64_MOV (1 ,A64_FP ,A64_SP ), ctx);
@@ -1944,19 +1954,24 @@ static int prepare_trampoline(struct jit_ctx *ctx, struct bpf_tramp_image *im,/* reset SP */ emit (A64_MOV (1 ,A64_SP ,A64_FP ), ctx); -/* pop frames */ -emit (A64_POP (A64_FP ,A64_LR ,A64_SP ), ctx); -emit (A64_POP (A64_FP ,A64_R (9 ),A64_SP ), ctx); - -if (flags &BPF_TRAMP_F_SKIP_FRAME ) { -/* skip patched function, return to parent */ -emit (A64_MOV (1 ,A64_LR ,A64_R (9 )), ctx); -emit (A64_RET (A64_R (9 )), ctx); +if (is_struct_ops) { +emit (A64_POP (A64_FP ,A64_LR ,A64_SP ), ctx); +emit (A64_RET (A64_LR ), ctx); }else { -/* return to patched function */ -emit (A64_MOV (1 ,A64_R (10 ),A64_LR ), ctx); -emit (A64_MOV (1 ,A64_LR ,A64_R (9 )), ctx); -emit (A64_RET (A64_R (10 )), ctx); +/* pop frames */ +emit (A64_POP (A64_FP ,A64_LR ,A64_SP ), ctx); +emit (A64_POP (A64_FP ,A64_R (9 ),A64_SP ), ctx); + +if (flags &BPF_TRAMP_F_SKIP_FRAME ) { +/* skip patched function, return to parent */ +emit (A64_MOV (1 ,A64_LR ,A64_R (9 )), ctx); +emit (A64_RET (A64_R (9 )), ctx); + }else { +/* return to patched function */ +emit (A64_MOV (1 ,A64_R (10 ),A64_LR ), ctx); +emit (A64_MOV (1 ,A64_LR ,A64_R (9 )), ctx); +emit (A64_RET (A64_R (10 )), ctx); + } }if (ctx->image)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 166/772 drm/msm/adreno: Use IRQF_NO_AUTOEN flag in request_irq()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 394679f322649d06fea3c646ba65f5a0887f52c3 ]
disable_irq() after request_irq() still has a time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN flag will disable IRQ auto-enable when request IRQ.
Patchwork: https://patchwork.freedesktop.org/patch/614075/
--- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/gpu/drm/msm/adreno/a6xx_gmu.c +1 -3
@@ -1462,15 +1462,13 @@ static int a6xx_gmu_get_irq(struct a6xx_gmu *gmu, struct platform_device *pdev, irq =platform_get_irq_byname (pdev, name); - ret =request_irq (irq, handler,IRQF_TRIGGER_HIGH , name, gmu); + ret =request_irq (irq, handler,IRQF_TRIGGER_HIGH |IRQF_NO_AUTOEN , name, gmu);if (ret) {DRM_DEV_ERROR (&pdev->dev,"Unable to get interrupt %s %d\n" , name, ret);return ret; } -disable_irq (irq); -return irq; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 167/772 drm/msm/gpu: Add devfreq tuning debugfs
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit 6563f60f14cbb3dcbdc4e1d8469fc0fbaaa80544 ]
Make the handful of tuning knobs available visible via debugfs.
v2: select DEVFREQ_GOV_SIMPLE_ONDEMAND because for some reason
struct devfreq_simple_ondemand_data depends on this
Patchwork: https://patchwork.freedesktop.org/patch/517784/
Stable-dep-of: 8f32ddd87e49 ("drm/msm/gpu: Check the status of registration to PM QoS")
--- drivers/gpu/drm/msm/Kconfig | 1 + drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 2 +- drivers/gpu/drm/msm/msm_debugfs.c | 12 ++++++++++++ drivers/gpu/drm/msm/msm_drv.h | 9 +++++++++ drivers/gpu/drm/msm/msm_gpu.h | 3 --- drivers/gpu/drm/msm/msm_gpu_devfreq.c | 6 ++++-- 6 files changed, 27 insertions(+), 6 deletions(-)
drivers/gpu/drm/msm/Kconfig +1 -0
@@ -23,6 +23,7 @@ config DRM_MSM select SHMEM select TMPFS select QCOM_SCM + select DEVFREQ_GOV_SIMPLE_ONDEMAND select WANT_DEV_COREDUMP select SND_SOC_HDMI_CODEC if SND_SOC select SYNC_FILE
drivers/gpu/drm/msm/adreno/a6xx_gpu.c +1 -1
@@ -2056,7 +2056,7 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev)* to cause power supply issues: */ if (adreno_is_a618 (adreno_gpu) ||adreno_is_7c3 (adreno_gpu)) - gpu->clamp_to_idle = true; + priv->gpu_clamp_to_idle = true;/* Check if there is a GMU phandle and set it up */ node =of_parse_phandle (pdev->dev.of_node,"qcom,gmu" ,0 );
drivers/gpu/drm/msm/msm_debugfs.c +12 -0
@@ -305,6 +305,7 @@ void msm_debugfs_init(struct drm_minor *minor) {struct drm_device *dev = minor->dev;struct msm_drm_private *priv = dev->dev_private; +struct dentry *gpu_devfreq; drm_debugfs_create_files(msm_debugfs_list, ARRAY_SIZE(msm_debugfs_list),
@@ -325,6 +326,17 @@ void msm_debugfs_init(struct drm_minor *minor)debugfs_create_file ("shrink" ,S_IRWXU , minor->debugfs_root, dev, &shrink_fops); + gpu_devfreq =debugfs_create_dir ("devfreq" , minor->debugfs_root); + +debugfs_create_bool ("idle_clamp" ,0600 , gpu_devfreq, + &priv->gpu_clamp_to_idle); + +debugfs_create_u32 ("upthreshold" ,0600 , gpu_devfreq, + &priv->gpu_devfreq_config.upthreshold); + +debugfs_create_u32 ("downdifferential" ,0600 , gpu_devfreq, + &priv->gpu_devfreq_config.downdifferential); +if (priv->kms && priv->kms->funcs->debugfs_init) priv->kms->funcs->debugfs_init (priv->kms, minor);
drivers/gpu/drm/msm/msm_drv.h +9 -0
@@ -11,6 +11,7 @@#include <linux/kernel.h> #include <linux/clk.h> #include <linux/cpufreq.h> +#include <linux/devfreq.h> #include <linux/module.h> #include <linux/component.h> #include <linux/platform_device.h>
@@ -233,6 +234,14 @@ struct msm_drm_private {*/ unsigned int hangcheck_period; +/** gpu_devfreq_config: Devfreq tuning config for the GPU. */ +struct devfreq_simple_ondemand_data gpu_devfreq_config; + +/** +* gpu_clamp_to_idle: Enable clamping to idle freq when inactive +*/ +bool gpu_clamp_to_idle; +/** * disable_err_irq: *
drivers/gpu/drm/msm/msm_gpu.h +0 -3
@@ -275,9 +275,6 @@ struct msm_gpu {struct msm_gpu_state *crashstate; -/* Enable clamping to idle freq when inactive: */ -bool clamp_to_idle; -/* True if the hardware supports expanded apriv (a650 and newer) */ bool hw_apriv;
drivers/gpu/drm/msm/msm_gpu_devfreq.c +4 -2
@@ -183,6 +183,7 @@ static bool has_devfreq(struct msm_gpu *gpu)void msm_devfreq_init (struct msm_gpu *gpu) {struct msm_gpu_devfreq *df = &gpu->devfreq; +struct msm_drm_private *priv = gpu->dev->dev_private;/* We need target support to do devfreq */ if (!gpu->funcs->gpu_busy)
@@ -209,7 +210,7 @@ void msm_devfreq_init(struct msm_gpu *gpu) df->devfreq =devm_devfreq_add_device (&gpu->pdev->dev, &msm_devfreq_profile,DEVFREQ_GOV_SIMPLE_ONDEMAND , -NULL ); + &priv->gpu_devfreq_config);if (IS_ERR (df->devfreq)) {DRM_DEV_ERROR (&gpu->pdev->dev,"Couldn't initialize GPU devfreq\n" );
@@ -358,10 +359,11 @@ static void msm_devfreq_idle_work(struct kthread_work *work)struct msm_gpu_devfreq *df =container_of (work, struct msm_gpu_devfreq, idle_work.work); struct msm_gpu *gpu = container_of(df, struct msm_gpu, devfreq); +struct msm_drm_private *priv = gpu->dev->dev_private; df->idle_time =ktime_get (); -if (gpu->clamp_to_idle) +if (priv->gpu_clamp_to_idle)dev_pm_qos_update_request (&df->idle_freq,0 ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 168/772 drm/msm/gpu: Bypass PM QoS constraint for idle clamp
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit fadcc3ab1302d4e5baa32c272b658221f0066696 ]
Change idle freq clamping back to the direct method, bypassing PM QoS requests. The problem with using PM QoS requests is they call (indirectly) the governors ->get_target_freq() which goes thru a get_dev_status() cycle. The problem comes when the GPU becomes active again and we remove the idle-clamp request, we go through another get_dev_status() cycle for the period that the GPU has been idle, which triggers the governor to lower the target freq excessively.
This partially reverts commit 7c0ffcd40b16 ("drm/msm/gpu: Respect PM QoS constraints"), but preserves the use of boost QoS request, so that it will continue to play nicely with other QoS requests such as a cooling device. This also mostly undoes commit 78f815c1cf8f ("drm/msm: return the average load over the polling period")
Patchwork: https://patchwork.freedesktop.org/patch/517785/
Stable-dep-of: 8f32ddd87e49 ("drm/msm/gpu: Check the status of registration to PM QoS")
--- drivers/gpu/drm/msm/msm_gpu.h | 12 ++- drivers/gpu/drm/msm/msm_gpu_devfreq.c | 135 +++++++++++--------------- 2 files changed, 65 insertions(+), 82 deletions(-)
drivers/gpu/drm/msm/msm_gpu.h +7 -5
@@ -109,11 +109,15 @@ struct msm_gpu_devfreq {struct mutex lock;/** -* idle_constraint: +* idle_freq: * -* A PM QoS constraint to limit max freq while the GPU is idle. +* Shadow frequency used while the GPU is idle. From the PoV of +* the devfreq governor, we are continuing to sample busyness and +* adjust frequency while the GPU is idle, but we use this shadow +* value as the GPU is actually clamped to minimum frequency while +* it is inactive. */ -struct dev_pm_qos_request idle_freq; +unsigned long idle_freq;/** * boost_constraint:
@@ -135,8 +139,6 @@ struct msm_gpu_devfreq {/** idle_time: Time of last transition to idle: */ ktime_t idle_time; -struct devfreq_dev_status average_status; -/** * idle_work: *
drivers/gpu/drm/msm/msm_gpu_devfreq.c +58 -77
214 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 169/772 drm/msm/gpu: Check the status of registration to PM QoS
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lukasz Luba <[email protected]>
[ Upstream commit 8f32ddd87e499ba6d2dc74ce30b6932baf1e1fc3 ]
There is a need to check the returned value of the registration function. In case of returned error, print that and stop the init process.
Patchwork: https://patchwork.freedesktop.org/patch/620336/
--- drivers/gpu/drm/msm/msm_gpu_devfreq.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/gpu/drm/msm/msm_gpu_devfreq.c +7 -2
@@ -140,6 +140,7 @@ void msm_devfreq_init(struct msm_gpu *gpu) {struct msm_gpu_devfreq *df = &gpu->devfreq;struct msm_drm_private *priv = gpu->dev->dev_private; +int ret;/* We need target support to do devfreq */ if (!gpu->funcs->gpu_busy)
@@ -147,8 +148,12 @@ void msm_devfreq_init(struct msm_gpu *gpu)mutex_init (&df->lock); -dev_pm_qos_add_request (&gpu->pdev->dev, &df->boost_freq, -DEV_PM_QOS_MIN_FREQUENCY ,0 ); + ret =dev_pm_qos_add_request (&gpu->pdev->dev, &df->boost_freq, +DEV_PM_QOS_MIN_FREQUENCY ,0 ); +if (ret <0 ) { +DRM_DEV_ERROR (&gpu->pdev->dev,"Couldn't initialize QoS\n" ); +return ; + } msm_devfreq_profile.initial_freq = gpu->fast_rate;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 170/772 drm/etnaviv: Request pages from DMA32 zone on addressing_limited
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaolei Wang <[email protected]>
[ Upstream commit 13c96ac9a3f0f1c7ba1ff0656ea508e7fa065e7e ]
Remove __GFP_HIGHMEM when requesting a page from DMA32 zone, and since all vivante GPUs in the system will share the same DMA constraints, move the check of whether to get a page from DMA32 to etnaviv_bind().
--- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 10 ++++++++++ drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 8 -------- 2 files changed, 10 insertions(+), 8 deletions(-)
drivers/gpu/drm/etnaviv/etnaviv_drv.c +10 -0
@@ -519,6 +519,16 @@ static int etnaviv_bind(struct device *dev) priv->num_gpus =0 ; priv->shm_gfp_mask =GFP_HIGHUSER | __GFP_RETRY_MAYFAIL | __GFP_NOWARN; +/* +* If the GPU is part of a system with DMA addressing limitations, +* request pages for our SHM backend buffers from the DMA32 zone to +* hopefully avoid performance killing SWIOTLB bounce buffering. +*/ +if (dma_addressing_limited (dev)) { + priv->shm_gfp_mask |=GFP_DMA32 ; + priv->shm_gfp_mask &= ~__GFP_HIGHMEM; + } + priv->cmdbuf_suballoc =etnaviv_cmdbuf_suballoc_new (drm->dev);if (IS_ERR (priv->cmdbuf_suballoc)) {dev_err (drm->dev,"Failed to create cmdbuf suballocator\n" );
drivers/gpu/drm/etnaviv/etnaviv_gpu.c +0 -8
@@ -798,14 +798,6 @@ int etnaviv_gpu_init(struct etnaviv_gpu *gpu)if (ret) goto fail; -/* -* If the GPU is part of a system with DMA addressing limitations, -* request pages for our SHM backend buffers from the DMA32 zone to -* hopefully avoid performance killing SWIOTLB bounce buffering. -*/ -if (dma_addressing_limited (gpu->dev)) - priv->shm_gfp_mask |=GFP_DMA32 ; -/* Create buffer: */ ret =etnaviv_cmdbuf_init (priv->cmdbuf_suballoc, &gpu->buffer,PAGE_SIZE );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 171/772 drm/etnaviv: fix power register offset on GC300
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Doug Brown <[email protected]>
[ Upstream commit 61a6920bb604df3a0e389a2a9479e1e233e4461d ]
Older GC300 revisions have their power registers at an offset of 0x200 rather than 0x100. Add new gpu_read_power and gpu_write_power functions to encapsulate accesses to the power addresses and fix the addresses.
Stable-dep-of: 37dc4737447a ("drm/etnaviv: hold GPU lock across perfmon sampling")
--- drivers/gpu/drm/etnaviv/etnaviv_dump.c | 7 ++++++- drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 20 ++++++++++---------- drivers/gpu/drm/etnaviv/etnaviv_gpu.h | 21 +++++++++++++++++++++ 3 files changed, 37 insertions(+), 11 deletions(-)
drivers/gpu/drm/etnaviv/etnaviv_dump.c +6 -1
@@ -83,10 +83,15 @@ static void etnaviv_core_dump_registers(struct core_dump_iterator *iter, {struct etnaviv_dump_registers *reg = iter->data;unsigned int i; +u32 read_addr;for (i =0 ; i <ARRAY_SIZE (etnaviv_dump_registers); i++, reg++) { + read_addr = etnaviv_dump_registers[i]; +if (read_addr >=VIVS_PM_POWER_CONTROLS && + read_addr <=VIVS_PM_PULSE_EATER ) + read_addr =gpu_fix_power_address (gpu, read_addr); reg->reg =cpu_to_le32 (etnaviv_dump_registers[i]); - reg->value =cpu_to_le32 (gpu_read (gpu, etnaviv_dump_registers[i])); + reg->value =cpu_to_le32 (gpu_read (gpu, read_addr)); }etnaviv_core_dump_header (iter,ETDUMP_BUF_REG , reg);
drivers/gpu/drm/etnaviv/etnaviv_gpu.c +10 -10
@@ -590,7 +590,7 @@ static void etnaviv_gpu_enable_mlcg(struct etnaviv_gpu *gpu)u32 pmc, ppc;/* enable clock gating */ - ppc =gpu_read (gpu,VIVS_PM_POWER_CONTROLS ); + ppc =gpu_read_power (gpu,VIVS_PM_POWER_CONTROLS ); ppc |=VIVS_PM_POWER_CONTROLS_ENABLE_MODULE_CLOCK_GATING ;/* Disable stall module clock gating for 4.3.0.1 and 4.3.0.2 revs */
@@ -598,9 +598,9 @@ static void etnaviv_gpu_enable_mlcg(struct etnaviv_gpu *gpu) gpu->identity.revision == 0x4302) ppc |=VIVS_PM_POWER_CONTROLS_DISABLE_STALL_MODULE_CLOCK_GATING ; -gpu_write (gpu,VIVS_PM_POWER_CONTROLS , ppc); +gpu_write_power (gpu,VIVS_PM_POWER_CONTROLS , ppc); - pmc =gpu_read (gpu,VIVS_PM_MODULE_CONTROLS ); + pmc =gpu_read_power (gpu,VIVS_PM_MODULE_CONTROLS );/* Disable PA clock gating for GC400+ without bugfix except for GC420 */ if (gpu->identity.model >= chipModel_GC400 &&
@@ -635,7 +635,7 @@ static void etnaviv_gpu_enable_mlcg(struct etnaviv_gpu *gpu) pmc |=VIVS_PM_MODULE_CONTROLS_DISABLE_MODULE_CLOCK_GATING_RA_HZ ; pmc |=VIVS_PM_MODULE_CONTROLS_DISABLE_MODULE_CLOCK_GATING_RA_EZ ; -gpu_write (gpu,VIVS_PM_MODULE_CONTROLS , pmc); +gpu_write_power (gpu,VIVS_PM_MODULE_CONTROLS , pmc); }void etnaviv_gpu_start_fe (struct etnaviv_gpu *gpu,u32 address,u16 prefetch)
@@ -695,11 +695,11 @@ static void etnaviv_gpu_setup_pulse_eater(struct etnaviv_gpu *gpu) (gpu->identity.features & chipFeatures_PIPE_3D)) {/* Performance fix: disable internal DFS */ - pulse_eater =gpu_read (gpu,VIVS_PM_PULSE_EATER ); + pulse_eater =gpu_read_power (gpu,VIVS_PM_PULSE_EATER ); pulse_eater |=BIT (18 ); } -gpu_write (gpu,VIVS_PM_PULSE_EATER , pulse_eater); +gpu_write_power (gpu,VIVS_PM_PULSE_EATER , pulse_eater); }static void etnaviv_gpu_hw_init (struct etnaviv_gpu *gpu)
@@ -1293,9 +1293,9 @@ static void sync_point_perfmon_sample_pre(struct etnaviv_gpu *gpu,u32 val;/* disable clock gating */ - val =gpu_read (gpu,VIVS_PM_POWER_CONTROLS ); + val =gpu_read_power (gpu,VIVS_PM_POWER_CONTROLS ); val &= ~VIVS_PM_POWER_CONTROLS_ENABLE_MODULE_CLOCK_GATING ; -gpu_write (gpu,VIVS_PM_POWER_CONTROLS , val); +gpu_write_power (gpu,VIVS_PM_POWER_CONTROLS , val);/* enable debug register */ val =gpu_read (gpu,VIVS_HI_CLOCK_CONTROL );
@@ -1326,9 +1326,9 @@ static void sync_point_perfmon_sample_post(struct etnaviv_gpu *gpu,gpu_write (gpu,VIVS_HI_CLOCK_CONTROL , val);/* enable clock gating */ - val =gpu_read (gpu,VIVS_PM_POWER_CONTROLS ); + val =gpu_read_power (gpu,VIVS_PM_POWER_CONTROLS ); val |=VIVS_PM_POWER_CONTROLS_ENABLE_MODULE_CLOCK_GATING ; -gpu_write (gpu,VIVS_PM_POWER_CONTROLS , val); +gpu_write_power (gpu,VIVS_PM_POWER_CONTROLS , val); }
drivers/gpu/drm/etnaviv/etnaviv_gpu.h +21 -0
@@ -10,6 +10,7 @@#include "etnaviv_gem.h" #include "etnaviv_mmu.h" #include "etnaviv_drv.h" +#include "common.xml.h" struct etnaviv_gem_submit ;struct etnaviv_vram_mapping ;
@@ -159,6 +160,26 @@ static inline u32 gpu_read(struct etnaviv_gpu *gpu, u32 reg)return readl (gpu->mmio + reg); } +static inline u32 gpu_fix_power_address (struct etnaviv_gpu *gpu,u32 reg) +{ +/* Power registers in GC300 < 2.0 are offset by 0x100 */ +if (gpu->identity.model == chipModel_GC300 && + gpu->identity.revision <0x2000 ) + reg +=0x100 ; + +return reg; +} + +static inline void gpu_write_power (struct etnaviv_gpu *gpu,u32 reg,u32 data) +{ +writel (data, gpu->mmio +gpu_fix_power_address (gpu, reg)); +} + +static inline u32 gpu_read_power (struct etnaviv_gpu *gpu,u32 reg) +{ +return readl (gpu->mmio +gpu_fix_power_address (gpu, reg)); +} +int etnaviv_gpu_get_param (struct etnaviv_gpu *gpu,u32 param,u64 *value);int etnaviv_gpu_init (struct etnaviv_gpu *gpu);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 172/772 drm/etnaviv: hold GPU lock across perfmon sampling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lucas Stach <[email protected]>
[ Upstream commit 37dc4737447a7667f8e9ec790dac251da057eb27 ]
The perfmon sampling mutates shared GPU state (e.g. VIVS_HI_CLOCK_CONTROL to select the pipe for the perf counter reads). To avoid clashing with other functions mutating the same state (e.g. etnaviv_gpu_update_clock) the perfmon sampling needs to hold the GPU lock.
--- drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-)
drivers/gpu/drm/etnaviv/etnaviv_gpu.c +14 -6
@@ -1292,6 +1292,8 @@ static void sync_point_perfmon_sample_pre(struct etnaviv_gpu *gpu, {u32 val; +mutex_lock (&gpu->lock); +/* disable clock gating */ val =gpu_read_power (gpu,VIVS_PM_POWER_CONTROLS ); val &= ~VIVS_PM_POWER_CONTROLS_ENABLE_MODULE_CLOCK_GATING ;
@@ -1303,6 +1305,8 @@ static void sync_point_perfmon_sample_pre(struct etnaviv_gpu *gpu,gpu_write (gpu,VIVS_HI_CLOCK_CONTROL , val);sync_point_perfmon_sample (gpu, event,ETNA_PM_PROCESS_PRE ); + +mutex_unlock (&gpu->lock); } static void sync_point_perfmon_sample_post(struct etnaviv_gpu *gpu,
@@ -1312,13 +1316,9 @@ static void sync_point_perfmon_sample_post(struct etnaviv_gpu *gpu,unsigned int i;u32 val; -sync_point_perfmon_sample (gpu, event,ETNA_PM_PROCESS_POST ); - -for (i =0 ; i < submit->nr_pmrs; i++) { -const struct etnaviv_perfmon_request *pmr = submit->pmrs + i; +mutex_lock (&gpu->lock); - *pmr->bo_vma = pmr->sequence; - } +sync_point_perfmon_sample (gpu, event,ETNA_PM_PROCESS_POST );/* disable debug register */ val =gpu_read (gpu,VIVS_HI_CLOCK_CONTROL );
@@ -1329,6 +1329,14 @@ static void sync_point_perfmon_sample_post(struct etnaviv_gpu *gpu, val =gpu_read_power (gpu,VIVS_PM_POWER_CONTROLS ); val |=VIVS_PM_POWER_CONTROLS_ENABLE_MODULE_CLOCK_GATING ;gpu_write_power (gpu,VIVS_PM_POWER_CONTROLS , val); + +mutex_unlock (&gpu->lock); + +for (i =0 ; i < submit->nr_pmrs; i++) { +const struct etnaviv_perfmon_request *pmr = submit->pmrs + i; + + *pmr->bo_vma = pmr->sequence; + } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 173/772 wifi: wfx: Fix error handling in wfx_core_init()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Can <[email protected]>
[ Upstream commit 3b88a9876779b55478a4dde867e73f7a100ffa23 ]
The wfx_core_init() returns without checking the retval from sdio_register_driver().
If the sdio_register_driver() failed, the module failed to install, leaving the wfx_spi_driver not unregistered.
--- drivers/net/wireless/silabs/wfx/main.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
drivers/net/wireless/silabs/wfx/main.c +15 -2
@@ -479,10 +479,23 @@ static int __init wfx_core_init(void) {int ret =0 ; -if (IS_ENABLED (CONFIG_SPI )) +if (IS_ENABLED (CONFIG_SPI )) { ret =spi_register_driver (&wfx_spi_driver); -if (IS_ENABLED (CONFIG_MMC ) && !ret) +if (ret) + goto out; + } +if (IS_ENABLED (CONFIG_MMC )) { ret =sdio_register_driver (&wfx_sdio_driver); +if (ret) + goto unregister_spi; + } + +return 0 ; + +unregister_spi: +if (IS_ENABLED (CONFIG_SPI )) +spi_unregister_driver (&wfx_spi_driver); +out:return ret; }module_init (wfx_core_init);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 174/772 drm/msm/dpu: cast crtc_clk calculation to u64 in _dpu_core_perf_calc_clk()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zichen Xie <[email protected]>
[ Upstream commit 20c7b42d9dbd048019bfe0af39229e3014007a98 ]
There may be a potential integer overflow issue in _dpu_core_perf_calc_clk(). crtc_clk is defined as u64, while mode->vtotal, mode->hdisplay, and drm_mode_vrefresh(mode) are defined as a smaller data type. The result of the calculation will be limited to "int" in this case without correct casting. In screen with high resolution and high refresh rate, integer overflow may happen. So, we recommend adding an extra cast to prevent potential integer overflow.
Patchwork: https://patchwork.freedesktop.org/patch/622206/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c +1 -1
@@ -80,7 +80,7 @@ static u64 _dpu_core_perf_calc_clk(struct dpu_kms *kms, mode = &state->adjusted_mode; - crtc_clk = mode->vtotal * mode->hdisplay *drm_mode_vrefresh (mode); + crtc_clk = (u64 )mode->vtotal * mode->hdisplay *drm_mode_vrefresh (mode);drm_atomic_crtc_for_each_plane (plane, crtc) { pstate =to_dpu_plane_state (plane->state);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 175/772 netfilter: nf_tables: skip transaction if update object is not implemented
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 84b1a0c0140a9a92ea108576c0002210f224ce59 ]
Turn update into noop as a follow up for:
9fedd894b4e1 ("netfilter: nf_tables: fix unexpected EOPNOTSUPP error")
instead of adding a transaction object which is simply discarded at a later stage of the commit protocol.
Stable-dep-of: cddc04275f95 ("netfilter: nf_tables: must hold rcu read lock while iterating object type list")
--- net/netfilter/nf_tables_api.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/netfilter/nf_tables_api.c +6 -2
@@ -7313,6 +7313,9 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,if (WARN_ON_ONCE (!type))return -ENOENT ; +if (!obj->ops->update) +return 0 ; +nft_ctx_init (&ctx, net, skb, info->nlh, family, table,NULL , nla);return nf_tables_updobj (&ctx, type, nla[NFTA_OBJ_DATA ], obj);
@@ -8972,9 +8975,10 @@ static void nft_obj_commit_update(struct nft_trans *trans) obj =nft_trans_obj (trans); newobj =nft_trans_obj_newobj (trans); -if (obj->ops->update) - obj->ops->update (obj, newobj); +if (WARN_ON_ONCE (!obj->ops->update)) +return ; + obj->ops->update (obj, newobj);nft_obj_destroy (&trans->ctx, newobj); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 176/772 netfilter: nf_tables: must hold rcu read lock while iterating object type list
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit cddc04275f95ca3b18da5c0fb111705ac173af89 ]
Update of stateful object triggers:
WARNING: suspicious RCU usagenet/netfilter/nf_tables_api.c:7759 RCU-list traversed in non-reader section!!
other info that might help us debug this:rcu_scheduler_active = 2, debug_locks = 1
1 lock held by nft/3060:
#0: ffff88810f0578c8 (&nft_net->commit_mutex){+.+.}-{4:4}, [..]
... but this list is not protected by the transaction mutex but the nfnl nftables subsystem mutex.
Switch to nft_obj_type_get which will acquire rcu read lock, bump refcount, and returns the result.
v3: Dan Carpenter points out nft_obj_type_get returns error pointer, not NULL, on error.
--- net/netfilter/nf_tables_api.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
net/netfilter/nf_tables_api.c +6 -7
@@ -7239,9 +7239,7 @@ static int nf_tables_updobj(const struct nft_ctx *ctx,struct nft_trans *trans;int err = -ENOMEM ; -if (!try_module_get (type->owner)) -return -ENOENT ; - +/* caller must have obtained type->owner reference. */ trans =nft_trans_alloc (ctx,NFT_MSG_NEWOBJ ,sizeof (struct nft_trans_obj ));if (!trans)
@@ -7309,15 +7307,16 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,if (info->nlh->nlmsg_flags &NLM_F_REPLACE )return -EOPNOTSUPP ; - type =__nft_obj_type_get (objtype, family); -if (WARN_ON_ONCE (!type)) -return -ENOENT ; -if (!obj->ops->update)return 0 ; + type =nft_obj_type_get (net, objtype, family); +if (WARN_ON_ONCE (IS_ERR (type))) +return PTR_ERR (type); +nft_ctx_init (&ctx, net, skb, info->nlh, family, table,NULL , nla); +/* type->owner reference is put when transaction object is released. */ return nf_tables_updobj (&ctx, type, nla[NFTA_OBJ_DATA ], obj); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 177/772 netlink: typographical error in nlmsg_type constants definition
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maurice Lambert <[email protected]>
[ Upstream commit 84bfbfbbd32aee136afea4b6bf82581dce79c305 ]
This commit fix a typographical error in netlink nlmsg_type constants definition in the include/uapi/linux/rtnetlink.h at line 177. The definition is RTM_NEWNVLAN RTM_NEWVLAN instead of RTM_NEWVLAN RTM_NEWVLAN.
--- include/uapi/linux/rtnetlink.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/uapi/linux/rtnetlink.h +1 -1
@@ -174,7 +174,7 @@ enum {#define RTM_GETLINKPROP RTM_GETLINKPROP RTM_NEWVLAN = 112, -#define RTM_NEWNVLAN RTM_NEWVLAN +#define RTM_NEWVLAN RTM_NEWVLAN RTM_DELVLAN,#define RTM_DELVLAN RTM_DELVLAN RTM_GETVLAN,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 178/772 selftests/bpf: Add txmsg_pass to pull/push/pop in test_sockmap
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijian Zhang <[email protected]>
[ Upstream commit 66c54c20408d994be34be2c070fba08472f69eee ]
Add txmsg_pass to test_txmsg_pull/push/pop. If txmsg_pass is missing, tx_prog will be NULL, and no program will be attached to the sockmap. As a result, pull/push/pop are never invoked.
--- tools/testing/selftests/bpf/test_sockmap.c | 7 +++++++ 1 file changed, 7 insertions(+)
tools/testing/selftests/bpf/test_sockmap.c +7 -0
@@ -1599,11 +1599,13 @@ static void test_txmsg_cork_hangs(int cgrp, struct sockmap_options *opt)static void test_txmsg_pull (int cgrp,struct sockmap_options *opt) {/* Test basic start/end */ + txmsg_pass =1 ; txmsg_start =1 ; txmsg_end =2 ;test_send (opt, cgrp);/* Test >4k pull */ + txmsg_pass =1 ; txmsg_start =4096 ; txmsg_end =9182 ;test_send_large (opt, cgrp);
@@ -1632,11 +1634,13 @@ static void test_txmsg_pull(int cgrp, struct sockmap_options *opt)static void test_txmsg_pop (int cgrp,struct sockmap_options *opt) {/* Test basic pop */ + txmsg_pass =1 ; txmsg_start_pop =1 ; txmsg_pop =2 ;test_send_many (opt, cgrp);/* Test pop with >4k */ + txmsg_pass =1 ; txmsg_start_pop =4096 ; txmsg_pop =4096 ;test_send_large (opt, cgrp);
@@ -1665,11 +1669,13 @@ static void test_txmsg_pop(int cgrp, struct sockmap_options *opt)static void test_txmsg_push (int cgrp,struct sockmap_options *opt) {/* Test basic push */ + txmsg_pass =1 ; txmsg_start_push =1 ; txmsg_end_push =1 ;test_send (opt, cgrp);/* Test push 4kB >4k */ + txmsg_pass =1 ; txmsg_start_push =4096 ; txmsg_end_push =4096 ;test_send_large (opt, cgrp);
@@ -1690,6 +1696,7 @@ static void test_txmsg_push(int cgrp, struct sockmap_options *opt)static void test_txmsg_push_pop (int cgrp,struct sockmap_options *opt) { + txmsg_pass =1 ; txmsg_start_push =1 ; txmsg_end_push =10 ; txmsg_start_pop =5 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 179/772 selftests/bpf: Fix SENDPAGE data logic in test_sockmap
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijian Zhang <[email protected]>
[ Upstream commit 4095031463d4e99b534d2cd82035a417295764ae ]
In the SENDPAGE test, "opt->iov_length * cnt" size of data will be sent cnt times by sendfile.
1. In push/pop tests, they will be invoked cnt times, for the simplicity of msg_verify_data, change chunk_sz to iov_length
2. Change iov_length in test_send_large from 1024 to 8192. We have pop test where txmsg_start_pop is 4096. 4096 > 1024, an error will be returned.
--- tools/testing/selftests/bpf/test_sockmap.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
tools/testing/selftests/bpf/test_sockmap.c +11 -7
@@ -419,16 +419,18 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, {bool drop = opt->drop_expected;unsigned char k =0 ; +int i, j, fp;FILE *file; -int i, fp; file =tmpfile ();if (!file) {perror ("create file for sendpage" );return 1 ; } -for (i =0 ; i < iov_length * cnt; i++, k++) -fwrite (&k,sizeof (char ),1 , file); +for (i =0 ; i < cnt; i++, k =0 ) { +for (j =0 ; j < iov_length; j++, k++) +fwrite (&k,sizeof (char ),1 , file); + }fflush (file);fseek (file,0 ,SEEK_SET );
@@ -622,7 +624,9 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt,* This is really only useful for testing edge cases in code * paths. */ - total_bytes = (float )iov_count * (float )iov_length * (float )cnt; + total_bytes = (float )iov_length * (float )cnt; +if (!opt->sendpage) + total_bytes *= (float )iov_count;if (txmsg_apply) txmsg_pop_total = txmsg_pop * (total_bytes / txmsg_apply);else
@@ -700,7 +704,7 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt,if (data) {int chunk_sz = opt->sendpage ? - iov_length * cnt : + iov_length : iov_length * iov_count; errno =msg_verify_data (&msg, recv, chunk_sz, &k, &bytes_cnt);
@@ -1469,8 +1473,8 @@ static void test_send_many(struct sockmap_options *opt, int cgrp)static void test_send_large (struct sockmap_options *opt,int cgrp) { - opt->iov_length =256 ; - opt->iov_count =1024 ; + opt->iov_length =8192 ; + opt->iov_count =32 ; opt->rate =2 ;test_exec (cgrp, opt); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 180/772 selftests/bpf: Fix total_bytes in msg_loop_rx in test_sockmap
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijian Zhang <[email protected]>
[ Upstream commit 523dffccbadea0cfd65f1ff04944b864c558c4a8 ]
total_bytes in msg_loop_rx should also take push into account, otherwise total_bytes will be a smaller value, which makes the msg_loop_rx end early.
Besides, total_bytes has already taken pop into account, so we don't need to subtract some bytes from iov_buf in sendmsg_test. The additional subtraction may make total_bytes a negative number, and msg_loop_rx will just end without checking anything.
--- tools/testing/selftests/bpf/test_sockmap.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
tools/testing/selftests/bpf/test_sockmap.c +7 -5
@@ -605,8 +605,8 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt, }clock_gettime (CLOCK_MONOTONIC , &s->end); }else { +float total_bytes, txmsg_pop_total, txmsg_push_total;int slct, recvp =0 , recv, max_fd = fd; -float total_bytes, txmsg_pop_total;int fd_flags =O_NONBLOCK ;struct timeval timeout;unsigned char k =0 ;
@@ -627,10 +627,14 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt, total_bytes = (float )iov_length * (float )cnt;if (!opt->sendpage) total_bytes *= (float )iov_count; -if (txmsg_apply) +if (txmsg_apply) { + txmsg_push_total = txmsg_end_push * (total_bytes / txmsg_apply); txmsg_pop_total = txmsg_pop * (total_bytes / txmsg_apply); -else + }else { + txmsg_push_total = txmsg_end_push * cnt; txmsg_pop_total = txmsg_pop * cnt; + } + total_bytes += txmsg_push_total; total_bytes -= txmsg_pop_total; err =clock_gettime (CLOCK_MONOTONIC , &s->start);if (err <0 )
@@ -799,8 +803,6 @@ static int sendmsg_test(struct sockmap_options *opt) rxpid =fork ();if (rxpid ==0 ) { -if (txmsg_pop || txmsg_start_pop) - iov_buf -= (txmsg_pop - txmsg_start_pop +1 );if (opt->drop_expected || txmsg_ktls_skb_drop)_exit (0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 181/772 selftests/bpf: Add push/pop checking for msg_verify_data in test_sockmap
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijian Zhang <[email protected]>
[ Upstream commit 862087c3d36219ed44569666eb263efc97f00c9a ]
Add push/pop checking for msg_verify_data in test_sockmap, except for pop/push with cork tests, in these tests the logic will be different.
1. With corking, pop/push might not be invoked in each sendmsg, it makes the layout of the received data difficult
2. It makes it hard to calculate the total_bytes in the recvmsg Temporarily skip the data integrity test for these cases now, added a TODO
--- tools/testing/selftests/bpf/test_sockmap.c | 106 ++++++++++++++++++++- 1 file changed, 101 insertions(+), 5 deletions(-)
tools/testing/selftests/bpf/test_sockmap.c +101 -5
@@ -87,6 +87,10 @@ int ktls;int peek_flag;int skb_use_parser;int txmsg_omit_skb_parser; +int verify_push_start; +int verify_push_len; +int verify_pop_start; +int verify_pop_len;static const struct option long_options[] = { {"help" , no_argument,NULL ,'h' },
@@ -513,12 +517,41 @@ static int msg_alloc_iov(struct msghdr *msg,return -ENOMEM ; } -/* TODO: Add verification logic for push, pull and pop data */ +/* In push or pop test, we need to do some calculations for msg_verify_data */ +static void msg_verify_date_prep (void ) +{ +int push_range_end = txmsg_start_push + txmsg_end_push -1 ; +int pop_range_end = txmsg_start_pop + txmsg_pop -1 ; + +if (txmsg_end_push && txmsg_pop && + txmsg_start_push <= pop_range_end && txmsg_start_pop <= push_range_end) { +/* The push range and the pop range overlap */ +int overlap_len; + + verify_push_start = txmsg_start_push; + verify_pop_start = txmsg_start_pop; +if (txmsg_start_push < txmsg_start_pop) + overlap_len =min (push_range_end - txmsg_start_pop +1 , txmsg_pop); +else + overlap_len =min (pop_range_end - txmsg_start_push +1 , txmsg_end_push); + verify_push_len =max (txmsg_end_push - overlap_len,0 ); + verify_pop_len =max (txmsg_pop - overlap_len,0 ); + }else { +/* Otherwise */ + verify_push_start = txmsg_start_push; + verify_pop_start = txmsg_start_pop; + verify_push_len = txmsg_end_push; + verify_pop_len = txmsg_pop; + } +} +static int msg_verify_data (struct msghdr *msg,int size,int chunk_sz, -unsigned char *k_p,int *bytes_cnt_p) +unsigned char *k_p,int *bytes_cnt_p, +int *check_cnt_p,int *push_p) { -int i, j, bytes_cnt = *bytes_cnt_p; +int bytes_cnt = *bytes_cnt_p, check_cnt = *check_cnt_p, push = *push_p;unsigned char k = *k_p; +int i, j;for (i =0 , j =0 ; i < msg->msg_iovlen && size; i++, j =0 ) {unsigned char *d = msg->msg_iov[i].iov_base;
@@ -537,6 +570,37 @@ static int msg_verify_data(struct msghdr *msg, int size, int chunk_sz, }for (; j < msg->msg_iov[i].iov_len && size; j++) { +if (push >0 && + check_cnt == verify_push_start + verify_push_len - push) { +int skipped; +revisit_push: + skipped = push; +if (j + push >= msg->msg_iov[i].iov_len) + skipped = msg->msg_iov[i].iov_len - j; + push -= skipped; + size -= skipped; + j += skipped -1 ; + check_cnt += skipped; +continue ; + } + +if (verify_pop_len >0 && check_cnt == verify_pop_start) { + bytes_cnt += verify_pop_len; + check_cnt += verify_pop_len; + k += verify_pop_len; + +if (bytes_cnt == chunk_sz) { + k =0 ; + bytes_cnt =0 ; + check_cnt =0 ; + push = verify_push_len; + } + +if (push >0 && + check_cnt == verify_push_start + verify_push_len - push) + goto revisit_push; + } +if (d[j] != k++) { fprintf(stderr, "detected data corruption @iov[%i]:%i %02x != %02x, %02x ?= %02x\n",
@@ -544,15 +608,20 @@ static int msg_verify_data(struct msghdr *msg, int size, int chunk_sz,return -EDATAINTEGRITY ; } bytes_cnt++; + check_cnt++;if (bytes_cnt == chunk_sz) { k =0 ; bytes_cnt =0 ; + check_cnt =0 ; + push = verify_push_len; } size--; } } *k_p = k; *bytes_cnt_p = bytes_cnt; + *check_cnt_p = check_cnt; + *push_p = push;return 0 ; }
@@ -611,6 +680,8 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt,struct timeval timeout;unsigned char k =0 ;int bytes_cnt =0 ; +int check_cnt =0 ; +int push =0 ;fd_set w;fcntl (fd, fd_flags);
@@ -636,6 +707,10 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt, } total_bytes += txmsg_push_total; total_bytes -= txmsg_pop_total; +if (data) { +msg_verify_date_prep (); + push = verify_push_len; + } err =clock_gettime (CLOCK_MONOTONIC , &s->start);if (err <0 )perror ("recv start time" );
@@ -711,7 +786,8 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt, iov_length :iov_length * iov_count; - errno =msg_verify_data (&msg, recv, chunk_sz, &k, &bytes_cnt); + errno =msg_verify_data (&msg, recv, chunk_sz, &k, &bytes_cnt, + &check_cnt, &push);if (errno) {perror ("data verify msg failed" ); goto out_errno;
@@ -721,7 +797,9 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt, recvp, chunk_sz, &k, - &bytes_cnt); + &bytes_cnt, + &check_cnt, + &push);if (errno) {perror ("data verify msg_peek failed" ); goto out_errno;
@@ -1639,6 +1717,8 @@ static void test_txmsg_pull(int cgrp, struct sockmap_options *opt)static void test_txmsg_pop (int cgrp,struct sockmap_options *opt) { +bool data = opt->data_test; +/* Test basic pop */ txmsg_pass =1 ; txmsg_start_pop =1 ;
@@ -1657,6 +1737,12 @@ static void test_txmsg_pop(int cgrp, struct sockmap_options *opt) txmsg_pop =2 ;test_send_many (opt, cgrp); +/* TODO: Test for pop + cork should be different, +* - It makes the layout of the received data difficult +* - It makes it hard to calculate the total_bytes in the recvmsg +* Temporarily skip the data integrity test for this case now. +*/ + opt->data_test = false;/* Test pop + cork */ txmsg_redir =0 ; txmsg_cork =512 ;
@@ -1670,10 +1756,13 @@ static void test_txmsg_pop(int cgrp, struct sockmap_options *opt) txmsg_start_pop =1 ; txmsg_pop =2 ;test_send_many (opt, cgrp); + opt->data_test = data; }static void test_txmsg_push (int cgrp,struct sockmap_options *opt) { +bool data = opt->data_test; +/* Test basic push */ txmsg_pass =1 ; txmsg_start_push =1 ;
@@ -1692,12 +1781,19 @@ static void test_txmsg_push(int cgrp, struct sockmap_options *opt) txmsg_end_push =2 ;test_send_many (opt, cgrp); +/* TODO: Test for push + cork should be different, +* - It makes the layout of the received data difficult +* - It makes it hard to calculate the total_bytes in the recvmsg +* Temporarily skip the data integrity test for this case now. +*/ + opt->data_test = false;/* Test push + cork */ txmsg_redir =0 ; txmsg_cork =512 ; txmsg_start_push =1 ; txmsg_end_push =2 ;test_send_many (opt, cgrp); + opt->data_test = data; }static void test_txmsg_push_pop (int cgrp,struct sockmap_options *opt)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 182/772 bpf, sockmap: Several fixes to bpf_msg_push_data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijian Zhang <[email protected]>
[ Upstream commit 15ab0548e3107665c34579ae523b2b6e7c22082a ]
Several fixes to bpf_msg_push_data,
1. test_sockmap has tests where bpf_msg_push_data is invoked to push some data at the end of a message, but -EINVAL is returned. In this case, in bpf_msg_push_data, after the first loop, i will be set to msg->sg.end, add the logic to handle it.
2. In the code block of "if (start - offset)", it's possible that "i" points to the last of sk_msg_elem. In this case, "sk_msg_iter_next(msg, end)" might still be called twice, another invoking is in "if (!copy)" code block, but actually only one is needed. Add the logic to handle it, and reconstruct the code to make the logic more clear.
--- net/core/filter.c | 53 +++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 20 deletions(-)
net/core/filter.c +33 -20
@@ -2768,7 +2768,7 @@ BPF_CALL_4(bpf_msg_push_data, struct sk_msg *, msg, u32, start,sk_msg_iter_var_next (i); }while (i != msg->sg.end); -if (start >= offset + l) +if (start > offset + l)return -EINVAL ; space =MAX_MSG_FRAGS -sk_msg_elem_used (msg);
@@ -2793,6 +2793,8 @@ BPF_CALL_4(bpf_msg_push_data, struct sk_msg *, msg, u32, start, raw =page_address (page); +if (i == msg->sg.end) +sk_msg_iter_var_prev (i); psge =sk_msg_elem (msg, i); front = start - offset; back = psge->length - front;
@@ -2809,7 +2811,13 @@ BPF_CALL_4(bpf_msg_push_data, struct sk_msg *, msg, u32, start, }put_page (sg_page (psge)); - }else if (start - offset) { + new = i; + goto place_new; + } + +if (start - offset) { +if (i == msg->sg.end) +sk_msg_iter_var_prev (i); psge =sk_msg_elem (msg, i); rsge =sk_msg_elem_cpy (msg, i);
@@ -2820,39 +2828,44 @@ BPF_CALL_4(bpf_msg_push_data, struct sk_msg *, msg, u32, start,sk_msg_iter_var_next (i);sg_unmark_end (psge);sg_unmark_end (&rsge); -sk_msg_iter_next (msg, end); }/* Slot(s) to place newly allocated data */ +sk_msg_iter_next (msg, end); new = i; +sk_msg_iter_var_next (i); + +if (i == msg->sg.end) { +if (!rsge.length) + goto place_new; +sk_msg_iter_next (msg, end); + goto place_new; + }/* Shift one or two slots as needed */ -if (!copy) { - sge =sk_msg_elem_cpy (msg, i); + sge =sk_msg_elem_cpy (msg, new); +sg_unmark_end (&sge); + nsge =sk_msg_elem_cpy (msg, i); +if (rsge.length) {sk_msg_iter_var_next (i); -sg_unmark_end (&sge); + nnsge =sk_msg_elem_cpy (msg, i);sk_msg_iter_next (msg, end); + } - nsge =sk_msg_elem_cpy (msg, i); +while (i != msg->sg.end) { + msg->sg.data[i] = sge; + sge = nsge; +sk_msg_iter_var_next (i);if (rsge.length) { -sk_msg_iter_var_next (i); + nsge = nnsge; nnsge =sk_msg_elem_cpy (msg, i); - } - -while (i != msg->sg.end) { - msg->sg.data[i] = sge; - sge = nsge; -sk_msg_iter_var_next (i); -if (rsge.length) { - nsge = nnsge; - nnsge =sk_msg_elem_cpy (msg, i); - }else { - nsge =sk_msg_elem_cpy (msg, i); - } + }else { + nsge =sk_msg_elem_cpy (msg, i); } } +place_new:/* Place newly allocated data buffer */ sk_mem_charge (msg->sk, len); msg->sg.size += len;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 183/772 bpf, sockmap: Several fixes to bpf_msg_pop_data
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijian Zhang <[email protected]>
[ Upstream commit 5d609ba262475db450ba69b8e8a557bd768ac07a ]
Several fixes to bpf_msg_pop_data,
1. In sk_msg_shift_left, we should put_page
2. if (len == 0), return early is better
3. pop the entire sk_msg (last == msg->sg.size) should be supported
4. Fix for the value of variable "a"
5. In sk_msg_shift_left, after shifting, i has already pointed to the next element. Addtional sk_msg_iter_var_next may result in BUG.
--- net/core/filter.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
net/core/filter.c +9 -6
@@ -2894,8 +2894,10 @@ static const struct bpf_func_proto bpf_msg_push_data_proto = {static void sk_msg_shift_left (struct sk_msg *msg,int i) { +struct scatterlist *sge =sk_msg_elem (msg, i);int prev; +put_page (sg_page (sge)); do { prev = i; sk_msg_iter_var_next(i);
@@ -2932,6 +2934,9 @@ BPF_CALL_4(bpf_msg_pop_data, struct sk_msg *, msg, u32, start,if (unlikely (flags))return -EINVAL ; +if (unlikely (len ==0 )) +return 0 ; +/* First find the starting scatterlist element */ i = msg->sg.start; do {
@@ -2944,7 +2949,7 @@ BPF_CALL_4(bpf_msg_pop_data, struct sk_msg *, msg, u32, start, }while (i != msg->sg.end);/* Bounds checks: start and pop must be inside message */ -if (start >= offset + l || last >= msg->sg.size) +if (start >= offset + l || last > msg->sg.size)return -EINVAL ; space =MAX_MSG_FRAGS -sk_msg_elem_used (msg);
@@ -2973,12 +2978,12 @@ BPF_CALL_4(bpf_msg_pop_data, struct sk_msg *, msg, u32, start,*/ if (start != offset) {struct scatterlist *nsge, *sge =sk_msg_elem (msg, i); -int a = start; +int a = start - offset;int b = sge->length - pop - a;sk_msg_iter_var_next (i); -if (pop < sge->length - a) { +if (b >0 ) {if (space) { sge->length = a;sk_msg_shift_right (msg, i);
@@ -2997,7 +3002,6 @@ BPF_CALL_4(bpf_msg_pop_data, struct sk_msg *, msg, u32, start,if (unlikely (!page))return -ENOMEM ; - sge->length = a; orig =sg_page (sge); from =sg_virt (sge); to =page_address (page);
@@ -3007,7 +3011,7 @@ BPF_CALL_4(bpf_msg_pop_data, struct sk_msg *, msg, u32, start,put_page (orig); } pop =0 ; - }else if (pop >= sge->length - a) { + }else { pop -= (sge->length - a); sge->length = a; }
@@ -3041,7 +3045,6 @@ BPF_CALL_4(bpf_msg_pop_data, struct sk_msg *, msg, u32, start, pop -= sge->length;sk_msg_shift_left (msg, i); } -sk_msg_iter_var_next (i); }sk_mem_uncharge (msg->sk, len - pop);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 184/772 bpf, sockmap: Fix sk_msg_reset_curr
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijian Zhang <[email protected]>
[ Upstream commit 955afd57dc4bf7e8c620a0a9e3af3c881c2c6dff ]
Found in the test_txmsg_pull in test_sockmap,
``` txmsg_cork = 512; // corking is importrant here opt->iov_length = 3; opt->iov_count = 1; opt->rate = 512; // sendmsg will be invoked 512 times ```
The first sendmsg will send an sk_msg with size 3, and bpf_msg_pull_data will be invoked the first time. sk_msg_reset_curr will reset the copybreak from 3 to 0. In the second sendmsg, since we are in the stage of corking, psock->cork will be reused in func sk_msg_alloc. msg->sg.copybreak is 0 now, the second msg will overwrite the first msg. As a result, we could not pass the data integrity test.
The same problem happens in push and pop test. Thus, fix sk_msg_reset_curr to restore the correct copybreak.
--- net/core/filter.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
net/core/filter.c +9 -11
@@ -2594,18 +2594,16 @@ BPF_CALL_2(bpf_msg_cork_bytes, struct sk_msg *, msg, u32, bytes)static void sk_msg_reset_curr (struct sk_msg *msg) { -u32 i = msg->sg.start; -u32 len =0 ; - -do { - len +=sk_msg_elem (msg, i)->length; -sk_msg_iter_var_next (i); -if (len >= msg->sg.size) -break ; - }while (i != msg->sg.end); +if (!msg->sg.size) { + msg->sg.curr = msg->sg.start; + msg->sg.copybreak =0 ; + }else { +u32 i = msg->sg.end; - msg->sg.curr = i; - msg->sg.copybreak =0 ; +sk_msg_iter_var_prev (i); + msg->sg.curr = i; + msg->sg.copybreak = msg->sg.data[i].length; + } }static const struct bpf_func_proto bpf_msg_cork_bytes_proto = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 185/772 sock_diag: add module pointer to "struct sock_diag_handler"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 114b4bb1cc19239b272d52ebbe156053483fe2f8 ]
Following patch is going to use RCU instead ofsock_diag_table_mutex acquisition.
This patch is a preparation, no change of behavior yet.
Stable-dep-of: eb02688c5c45 ("ipv6: release nexthop on device removal")
--- include/linux/sock_diag.h | 1 + net/ipv4/inet_diag.c | 2 ++ net/netlink/diag.c | 1 + net/packet/diag.c | 1 + net/smc/smc_diag.c | 1 + net/tipc/diag.c | 1 + net/unix/diag.c | 1 + net/vmw_vsock/diag.c | 1 + net/xdp/xsk_diag.c | 1 + 9 files changed, 10 insertions(+)
include/linux/sock_diag.h +1 -0
@@ -13,6 +13,7 @@ struct nlmsghdr;struct sock ;struct sock_diag_handler { +struct module *owner;__u8 family;int (*dump)(struct sk_buff *skb,struct nlmsghdr *nlh);int (*get_info)(struct sk_buff *skb,struct sock *sk);
net/ipv4/inet_diag.c +2 -0
@@ -1397,6 +1397,7 @@ int inet_diag_handler_get_info(struct sk_buff *skb, struct sock *sk) }static const struct sock_diag_handler inet_diag_handler = { + .owner =THIS_MODULE , .family =AF_INET , .dump = inet_diag_handler_cmd, .get_info = inet_diag_handler_get_info,
@@ -1404,6 +1405,7 @@ static const struct sock_diag_handler inet_diag_handler = { };static const struct sock_diag_handler inet6_diag_handler = { + .owner =THIS_MODULE , .family =AF_INET6 , .dump = inet_diag_handler_cmd, .get_info = inet_diag_handler_get_info,
net/netlink/diag.c +1 -0
@@ -241,6 +241,7 @@ static int netlink_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h) }static const struct sock_diag_handler netlink_diag_handler = { + .owner =THIS_MODULE , .family =AF_NETLINK , .dump = netlink_diag_handler_dump, };
net/packet/diag.c +1 -0
@@ -245,6 +245,7 @@ static int packet_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h) }static const struct sock_diag_handler packet_diag_handler = { + .owner =THIS_MODULE , .family =AF_PACKET , .dump = packet_diag_handler_dump, };
net/smc/smc_diag.c +1 -0
@@ -249,6 +249,7 @@ static int smc_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h) }static const struct sock_diag_handler smc_diag_handler = { + .owner =THIS_MODULE , .family =AF_SMC , .dump = smc_diag_handler_dump, };
net/tipc/diag.c +1 -0
@@ -95,6 +95,7 @@ static int tipc_sock_diag_handler_dump(struct sk_buff *skb, }static const struct sock_diag_handler tipc_sock_diag_handler = { + .owner =THIS_MODULE , .family =AF_TIPC , .dump = tipc_sock_diag_handler_dump, };
net/unix/diag.c +1 -0
@@ -322,6 +322,7 @@ static int unix_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h) }static const struct sock_diag_handler unix_diag_handler = { + .owner =THIS_MODULE , .family =AF_UNIX , .dump = unix_diag_handler_dump, };
net/vmw_vsock/diag.c +1 -0
@@ -157,6 +157,7 @@ static int vsock_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h) }static const struct sock_diag_handler vsock_diag_handler = { + .owner =THIS_MODULE , .family =AF_VSOCK , .dump = vsock_diag_handler_dump, };
net/xdp/xsk_diag.c +1 -0
@@ -194,6 +194,7 @@ static int xsk_diag_handler_dump(struct sk_buff *nlskb, struct nlmsghdr *hdr) }static const struct sock_diag_handler xsk_diag_handler = { + .owner =THIS_MODULE , .family =AF_XDP , .dump = xsk_diag_handler_dump, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 186/772 sock_diag: allow concurrent operations
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 1d55a6974756cf3979efd2cc68bcece611a44053 ]
sock_diag_broadcast_destroy_work() and __sock_diag_cmd() are currently using sock_diag_table_mutex to protect against concurrent sock_diag_handlers[] changes.
This makes inet_diag dump serialized, thus less scalable than legacy /proc files.
It is time to switch to full RCU protection.
Stable-dep-of: eb02688c5c45 ("ipv6: release nexthop on device removal")
--- net/core/sock_diag.c | 73 +++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 31 deletions(-)
net/core/sock_diag.c +42 -31
@@ -16,7 +16,7 @@#include <linux/inet_diag.h> #include <linux/sock_diag.h> -static const struct sock_diag_handler *sock_diag_handlers[AF_MAX ]; +static const struct sock_diag_handler __rcu *sock_diag_handlers[AF_MAX ];static int (*inet_rcv_compat)(struct sk_buff *skb,struct nlmsghdr *nlh);static DEFINE_MUTEX (sock_diag_table_mutex);static struct workqueue_struct *broadcast_wq;
@@ -119,6 +119,24 @@ static size_t sock_diag_nlmsg_size(void) + nla_total_size_64bit(sizeof(struct tcp_info))); /* INET_DIAG_INFO */ } +static const struct sock_diag_handler *sock_diag_lock_handler (int family) +{ +const struct sock_diag_handler *handler; + +rcu_read_lock (); + handler =rcu_dereference (sock_diag_handlers[family]); +if (handler && !try_module_get (handler->owner)) + handler =NULL ; +rcu_read_unlock (); + +return handler; +} + +static void sock_diag_unlock_handler (const struct sock_diag_handler *handler) +{ +module_put (handler->owner); +} +static void sock_diag_broadcast_destroy_work (struct work_struct *work) { struct broadcast_sk *bsk =
@@ -135,12 +153,12 @@ static void sock_diag_broadcast_destroy_work(struct work_struct *work)if (!skb) goto out; -mutex_lock (&sock_diag_table_mutex); - hndl = sock_diag_handlers[sk->sk_family]; -if (hndl && hndl->get_info) - err = hndl->get_info (skb, sk); -mutex_unlock (&sock_diag_table_mutex); - + hndl =sock_diag_lock_handler (sk->sk_family); +if (hndl) { +if (hndl->get_info) + err = hndl->get_info (skb, sk); +sock_diag_unlock_handler (hndl); + }if (!err)nlmsg_multicast (sock_net (sk)->diag_nlsk, skb,0 , group,GFP_KERNEL );
@@ -181,33 +199,26 @@ EXPORT_SYMBOL_GPL(sock_diag_unregister_inet_compat);int sock_diag_register (const struct sock_diag_handler *hndl) { -int err =0 ; +int family = hndl->family; -if (hndl->family >=AF_MAX ) +if (family >=AF_MAX )return -EINVAL ; -mutex_lock (&sock_diag_table_mutex); -if (sock_diag_handlers[hndl->family]) - err = -EBUSY ; -else -WRITE_ONCE (sock_diag_handlers[hndl->family], hndl); -mutex_unlock (&sock_diag_table_mutex); - -return err; +return !cmpxchg ((const struct sock_diag_handler **) + &sock_diag_handlers[family], +NULL , hndl) ?0 : -EBUSY ; }EXPORT_SYMBOL_GPL (sock_diag_register); -void sock_diag_unregister (const struct sock_diag_handler *hnld) +void sock_diag_unregister (const struct sock_diag_handler *hndl) { -int family = hnld->family; +int family = hndl->family;if (family >=AF_MAX )return ; -mutex_lock (&sock_diag_table_mutex); -BUG_ON (sock_diag_handlers[family] != hnld); -WRITE_ONCE (sock_diag_handlers[family],NULL ); -mutex_unlock (&sock_diag_table_mutex); +xchg ((const struct sock_diag_handler **)&sock_diag_handlers[family], +NULL ); }EXPORT_SYMBOL_GPL (sock_diag_unregister);
@@ -224,20 +235,20 @@ static int __sock_diag_cmd(struct sk_buff *skb, struct nlmsghdr *nlh)return -EINVAL ; req->sdiag_family =array_index_nospec (req->sdiag_family,AF_MAX ); -if (READ_ONCE (sock_diag_handlers[req->sdiag_family]) ==NULL ) +if (!rcu_access_pointer (sock_diag_handlers[req->sdiag_family]))sock_load_diag_module (req->sdiag_family,0 ); -mutex_lock (&sock_diag_table_mutex); - hndl = sock_diag_handlers[req->sdiag_family]; + hndl =sock_diag_lock_handler (req->sdiag_family);if (hndl ==NULL ) - err = -ENOENT ; -else if (nlh->nlmsg_type ==SOCK_DIAG_BY_FAMILY ) +return -ENOENT ; + +if (nlh->nlmsg_type ==SOCK_DIAG_BY_FAMILY ) err = hndl->dump (skb, nlh);else if (nlh->nlmsg_type ==SOCK_DESTROY && hndl->destroy) err = hndl->destroy (skb, nlh);else err = -EOPNOTSUPP ; -mutex_unlock (&sock_diag_table_mutex); +sock_diag_unlock_handler (hndl);return err; }
@@ -283,12 +294,12 @@ static int sock_diag_bind(struct net *net, int group)switch (group) {case SKNLGRP_INET_TCP_DESTROY :case SKNLGRP_INET_UDP_DESTROY : -if (!READ_ONCE (sock_diag_handlers[AF_INET ])) +if (!rcu_access_pointer (sock_diag_handlers[AF_INET ]))sock_load_diag_module (AF_INET ,0 );break ;case SKNLGRP_INET6_TCP_DESTROY :case SKNLGRP_INET6_UDP_DESTROY : -if (!READ_ONCE (sock_diag_handlers[AF_INET6 ])) +if (!rcu_access_pointer (sock_diag_handlers[AF_INET6 ]))sock_load_diag_module (AF_INET6 ,0 );break ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 187/772 sock_diag: allow concurrent operation in sock_diag_rcv_msg()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 86e8921df05c6e9423ab74ab8d41022775d8b83a ]
TCPDIAG_GETSOCK and DCCPDIAG_GETSOCK diag are serialized on sock_diag_table_mutex.
This is to make sure inet_diag module is not unloaded while diag was ongoing.
It is time to get rid of this mutex and use RCU protection, allowing full parallelism.
Stable-dep-of: eb02688c5c45 ("ipv6: release nexthop on device removal")
--- include/linux/sock_diag.h | 9 ++++++-- net/core/sock_diag.c | 43 +++++++++++++++++++++++---------------- net/ipv4/inet_diag.c | 9 ++++++-- 3 files changed, 40 insertions(+), 21 deletions(-)
include/linux/sock_diag.h +7 -2
@@ -23,8 +23,13 @@ struct sock_diag_handler {int sock_diag_register (const struct sock_diag_handler *h);void sock_diag_unregister (const struct sock_diag_handler *h); -void sock_diag_register_inet_compat (int (*fn)(struct sk_buff *skb,struct nlmsghdr *nlh)); -void sock_diag_unregister_inet_compat (int (*fn)(struct sk_buff *skb,struct nlmsghdr *nlh)); +struct sock_diag_inet_compat { +struct module *owner; +int (*fn)(struct sk_buff *skb,struct nlmsghdr *nlh); +}; + +void sock_diag_register_inet_compat (const struct sock_diag_inet_compat *ptr); +void sock_diag_unregister_inet_compat (const struct sock_diag_inet_compat *ptr);u64 __sock_gen_cookie (struct sock *sk);
net/core/sock_diag.c +26 -17
73 lines not on this page · raw message
net/ipv4/inet_diag.c +7 -2
@@ -1445,6 +1445,11 @@ void inet_diag_unregister(const struct inet_diag_handler *h) }EXPORT_SYMBOL_GPL (inet_diag_unregister); +static const struct sock_diag_inet_compat inet_diag_compat = { + .owner =THIS_MODULE , + .fn = inet_diag_rcv_msg_compat, +}; +static int __init inet_diag_init (void ) { const int inet_diag_table_size = (IPPROTO_MAX *
@@ -1463,7 +1468,7 @@ static int __init inet_diag_init(void)if (err) goto out_free_inet; -sock_diag_register_inet_compat (inet_diag_rcv_msg_compat); +sock_diag_register_inet_compat (&inet_diag_compat); out:return err;
@@ -1478,7 +1483,7 @@ static void __exit inet_diag_exit(void) {sock_diag_unregister (&inet6_diag_handler);sock_diag_unregister (&inet_diag_handler); -sock_diag_unregister_inet_compat (inet_diag_rcv_msg_compat); +sock_diag_unregister_inet_compat (&inet_diag_compat);kfree (inet_diag_table); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 188/772 net: use unrcu_pointer() helper
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit b4cb4a1391dcdc640c4ade003aaf0ee19cc8d509 ]
Toke mentioned unrcu_pointer() existence, allowing to remove some of the ugly casts we have when using xchg() for rcu protected pointers.
Also make inet_rcv_compat const.
Stable-dep-of: eb02688c5c45 ("ipv6: release nexthop on device removal")
--- include/net/sock.h | 2 +- net/core/gen_estimator.c | 2 +- net/core/sock_diag.c | 8 +++----- net/ipv4/cipso_ipv4.c | 2 +- net/ipv4/tcp.c | 2 +- net/ipv4/tcp_fastopen.c | 7 ++++--- net/ipv4/udp.c | 2 +- net/ipv6/af_inet6.c | 2 +- net/ipv6/ip6_fib.c | 2 +- net/ipv6/ipv6_sockglue.c | 3 +-- net/ipv6/route.c | 6 +++--- net/sched/act_api.c | 2 +- 12 files changed, 19 insertions(+), 21 deletions(-)
include/net/sock.h +1 -1
@@ -2246,7 +2246,7 @@ sk_dst_set(struct sock *sk, struct dst_entry *dst)sk_tx_queue_clear (sk);WRITE_ONCE (sk->sk_dst_pending_confirm,0 ); - old_dst =xchg ((__force struct dst_entry **)&sk->sk_dst_cache, dst); + old_dst =unrcu_pointer (xchg (&sk->sk_dst_cache,RCU_INITIALIZER (dst)));dst_release (old_dst); }
net/core/gen_estimator.c +1 -1
@@ -206,7 +206,7 @@ void gen_kill_estimator(struct net_rate_estimator __rcu **rate_est) {struct net_rate_estimator *est; - est =xchg ((__force struct net_rate_estimator **)rate_est,NULL ); + est =unrcu_pointer (xchg (rate_est,NULL ));if (est) {del_timer_sync (&est->timer);kfree_rcu (est, rcu);
net/core/sock_diag.c +3 -5
@@ -18,7 +18,7 @@static const struct sock_diag_handler __rcu *sock_diag_handlers[AF_MAX ]; -static struct sock_diag_inet_compat __rcu *inet_rcv_compat; +static const struct sock_diag_inet_compat __rcu *inet_rcv_compat;static struct workqueue_struct *broadcast_wq;
@@ -184,8 +184,7 @@ void sock_diag_broadcast_destroy(struct sock *sk)void sock_diag_register_inet_compat (const struct sock_diag_inet_compat *ptr) { -xchg ((__force const struct sock_diag_inet_compat **)&inet_rcv_compat, - ptr); +xchg (&inet_rcv_compat,RCU_INITIALIZER (ptr)); }EXPORT_SYMBOL_GPL (sock_diag_register_inet_compat);
@@ -193,8 +192,7 @@ void sock_diag_unregister_inet_compat(const struct sock_diag_inet_compat *ptr) {const struct sock_diag_inet_compat *old; - old =xchg ((__force const struct sock_diag_inet_compat **)&inet_rcv_compat, -NULL ); + old =unrcu_pointer (xchg (&inet_rcv_compat,NULL ));WARN_ON_ONCE (old != ptr); }EXPORT_SYMBOL_GPL (sock_diag_unregister_inet_compat);
net/ipv4/cipso_ipv4.c +1 -1
@@ -1955,7 +1955,7 @@ int cipso_v4_req_setattr(struct request_sock *req, buf =NULL ; req_inet =inet_rsk (req); - opt =xchg ((__force struct ip_options_rcu **)&req_inet->ireq_opt, opt); + opt =unrcu_pointer (xchg (&req_inet->ireq_opt,RCU_INITIALIZER (opt)));if (opt)kfree_rcu (opt, rcu);
net/ipv4/tcp.c +1 -1
@@ -3184,7 +3184,7 @@ int tcp_disconnect(struct sock *sk, int flags) icsk->icsk_ack.rcv_mss =TCP_MIN_MSS ;memset (&tp->rx_opt,0 ,sizeof (tp->rx_opt));__sk_dst_reset (sk); -dst_release (xchg ((__force struct dst_entry **)&sk->sk_rx_dst,NULL )); +dst_release (unrcu_pointer (xchg (&sk->sk_rx_dst,NULL )));tcp_saved_syn_free (tp); tp->compressed_ack =0 ; tp->segs_in =0 ;
net/ipv4/tcp_fastopen.c +4 -3
@@ -49,7 +49,7 @@ void tcp_fastopen_ctx_destroy(struct net *net) {struct tcp_fastopen_context *ctxt; - ctxt =xchg ((__force struct tcp_fastopen_context **)&net->ipv4.tcp_fastopen_ctx,NULL ); + ctxt =unrcu_pointer (xchg (&net->ipv4.tcp_fastopen_ctx,NULL ));if (ctxt)call_rcu (&ctxt->rcu, tcp_fastopen_ctx_free);
@@ -80,9 +80,10 @@ int tcp_fastopen_reset_cipher(struct net *net, struct sock *sk,if (sk) { q = &inet_csk (sk)->icsk_accept_queue.fastopenq; - octx =xchg ((__force struct tcp_fastopen_context **)&q->ctx, ctx); + octx =unrcu_pointer (xchg (&q->ctx,RCU_INITIALIZER (ctx))); }else { - octx =xchg ((__force struct tcp_fastopen_context **)&net->ipv4.tcp_fastopen_ctx, ctx); + octx =unrcu_pointer (xchg (&net->ipv4.tcp_fastopen_ctx, +RCU_INITIALIZER (ctx))); }if (octx)
net/ipv4/udp.c +1 -1
@@ -2252,7 +2252,7 @@ bool udp_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst)struct dst_entry *old;if (dst_hold_safe (dst)) { - old =xchg ((__force struct dst_entry **)&sk->sk_rx_dst, dst); + old =unrcu_pointer (xchg (&sk->sk_rx_dst,RCU_INITIALIZER (dst)));dst_release (old);return old != dst; }
net/ipv6/af_inet6.c +1 -1
@@ -513,7 +513,7 @@ void inet6_destroy_sock(struct sock *sk)/* Free tx options */ - opt =xchg ((__force struct ipv6_txoptions **)&np->opt,NULL ); + opt =unrcu_pointer (xchg (&np->opt,NULL ));if (opt) {atomic_sub (opt->tot_len, &sk->sk_omem_alloc);txopt_put (opt);
net/ipv6/ip6_fib.c +1 -1
@@ -983,7 +983,7 @@ static void __fib6_drop_pcpu_from(struct fib6_nh *fib6_nh,if (pcpu_rt &&rcu_access_pointer (pcpu_rt->from) == match) {struct fib6_info *from; - from =xchg ((__force struct fib6_info **)&pcpu_rt->from,NULL ); + from =unrcu_pointer (xchg (&pcpu_rt->from,NULL ));fib6_info_release (from); } }
net/ipv6/ipv6_sockglue.c +1 -2
@@ -111,8 +111,7 @@ struct ipv6_txoptions *ipv6_update_options(struct sock *sk, icsk->icsk_sync_mss (sk, icsk->icsk_pmtu_cookie); } } - opt =xchg ((__force struct ipv6_txoptions **)&inet6_sk (sk)->opt, - opt); + opt =unrcu_pointer (xchg (&inet6_sk (sk)->opt,RCU_INITIALIZER (opt)));sk_dst_reset (sk);return opt;
net/ipv6/route.c +3 -3
@@ -369,7 +369,7 @@ static void ip6_dst_destroy(struct dst_entry *dst)in6_dev_put (idev); } - from =xchg ((__force struct fib6_info **)&rt->from,NULL ); + from =unrcu_pointer (xchg (&rt->from,NULL ));fib6_info_release (from); }
@@ -1432,7 +1432,7 @@ static struct rt6_info *rt6_make_pcpu_route(struct net *net,if (res->f6i->fib6_destroying) {struct fib6_info *from; - from =xchg ((__force struct fib6_info **)&pcpu_rt->from,NULL ); + from =unrcu_pointer (xchg (&pcpu_rt->from,NULL ));fib6_info_release (from); }
@@ -1461,7 +1461,7 @@ static void rt6_remove_exception(struct rt6_exception_bucket *bucket,/* purge completely the exception to allow releasing the held resources: * some [sk] cache may keep the dst around for unlimited time */ - from =xchg ((__force struct fib6_info **)&rt6_ex->rt6i->from,NULL ); + from =unrcu_pointer (xchg (&rt6_ex->rt6i->from,NULL ));fib6_info_release (from);dst_dev_put (&rt6_ex->rt6i->dst);
net/sched/act_api.c +1 -1
@@ -61,7 +61,7 @@ static void tcf_set_action_cookie(struct tc_cookie __rcu **old_cookie, {struct tc_cookie *old; - old =xchg ((__force struct tc_cookie **)old_cookie, new_cookie); + old =unrcu_pointer (xchg (old_cookie,RCU_INITIALIZER (new_cookie)));if (old)call_rcu (&old->rcu, tcf_free_cookie_rcu); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 189/772 ipv6: release nexthop on device removal
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit eb02688c5c45c3e7af7e71f036a7144f5639cbfe ]
The CI is hitting some aperiodic hangup at device removal time in the pmtu.sh self-test:
unregister_netdevice: waiting for veth_A-R1 to become free. Usage count = 6ref_tracker: veth_A-R1@ffff888013df15d8 has 1/5 users at
dst_init+0x84/0x4a0 dst_alloc+0x97/0x150 ip6_dst_alloc+0x23/0x90 ip6_rt_pcpu_alloc+0x1e6/0x520 ip6_pol_route+0x56f/0x840 fib6_rule_lookup+0x334/0x630 ip6_route_output_flags+0x259/0x480 ip6_dst_lookup_tail.constprop.0+0x5c2/0x940 ip6_dst_lookup_flow+0x88/0x190 udp_tunnel6_dst_lookup+0x2a7/0x4c0 vxlan_xmit_one+0xbde/0x4a50 [vxlan] vxlan_xmit+0x9ad/0xf20 [vxlan] dev_hard_start_xmit+0x10e/0x360 __dev_queue_xmit+0xf95/0x18c0 arp_solicit+0x4a2/0xe00 neigh_probe+0xaa/0xf0
While the first suspect is the dst_cache, explicitly tracking the dst owing the last device reference via probes proved such dst is held by the nexthop in the originating fib6_info.
Similar to commit f5b51fe804ec ("ipv6: route: purge exception on removal"), we need to explicitly release the originating fib info when disconnecting a to-be-removed device from a live ipv6 dst: move the fib6_info cleanup into ip6_dst_ifdown().
Tested running:
./pmtu.sh cleanup_ipv6_exception
in a tight loop for more than 400 iterations with no spat, running an unpatched kernel I observed a splat every ~10 iterations.
--- net/ipv6/route.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/ipv6/route.c +3 -3
@@ -378,6 +378,7 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, {struct rt6_info *rt = (struct rt6_info *)dst;struct inet6_dev *idev = rt->rt6i_idev; +struct fib6_info *from;if (idev && idev->dev != blackhole_netdev) {struct inet6_dev *blackhole_idev =in6_dev_get (blackhole_netdev);
@@ -387,6 +388,8 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,in6_dev_put (idev); } } + from =unrcu_pointer (xchg (&rt->from,NULL )); +fib6_info_release (from); }static bool __rt6_check_expired (const struct rt6_info *rt)
@@ -1449,7 +1452,6 @@ static DEFINE_SPINLOCK(rt6_exception_lock);static void rt6_remove_exception (struct rt6_exception_bucket *bucket,struct rt6_exception *rt6_ex) { -struct fib6_info *from;struct net *net;if (!bucket || !rt6_ex)
@@ -1461,8 +1463,6 @@ static void rt6_remove_exception(struct rt6_exception_bucket *bucket,/* purge completely the exception to allow releasing the held resources: * some [sk] cache may keep the dst around for unlimited time */ - from =unrcu_pointer (xchg (&rt6_ex->rt6i->from,NULL )); -fib6_info_release (from);dst_dev_put (&rt6_ex->rt6i->dst);hlist_del_rcu (&rt6_ex->hlist);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 190/772 selftests: net: really check for bg process completion
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit 52ed077aa6336dbef83a2d6d21c52d1706fb7f16 ]
A recent refactor transformed the check for process completion in a true statement, due to a typo.
As a result, the relevant test-case is unable to catch the regression it was supposed to detect.
Restore the correct condition.
--- tools/testing/selftests/net/pmtu.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/pmtu.sh +1 -1
@@ -1932,7 +1932,7 @@ check_running() { pid=${1} cmd=${2} - [ "$(cat /proc/${pid}/cmdline 2>/dev/null | tr -d '\0')" = "{cmd}" ] + [ "$(cat /proc/${pid}/cmdline 2>/dev/null | tr -d '\0')" = "${cmd}" ] } test_cleanup_vxlanX_exception() {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 191/772 drm/amdkfd: Fix wrong usage of INIT_WORK()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Can <[email protected]>
[ Upstream commit 21cae8debc6a1d243f64fa82cd1b41cb612b5c61 ]
In kfd_procfs_show(), the sdma_activity_work_handler is a local variable and the sdma_activity_work_handler.sdma_activity_work should initialize with INIT_WORK_ONSTACK() instead of INIT_WORK().
--- drivers/gpu/drm/amd/amdkfd/kfd_process.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_process.c +3 -2
@@ -314,8 +314,8 @@ static ssize_t kfd_procfs_show(struct kobject *kobj, struct attribute *attr, attr_sdma);struct kfd_sdma_activity_handler_workarea sdma_activity_work_handler; -INIT_WORK (&sdma_activity_work_handler.sdma_activity_work, - kfd_sdma_activity_worker); +INIT_WORK_ONSTACK (&sdma_activity_work_handler.sdma_activity_work, + kfd_sdma_activity_worker); sdma_activity_work_handler.pdd = pdd; sdma_activity_work_handler.sdma_activity_counter =0 ;
@@ -323,6 +323,7 @@ static ssize_t kfd_procfs_show(struct kobject *kobj, struct attribute *attr,schedule_work (&sdma_activity_work_handler.sdma_activity_work);flush_work (&sdma_activity_work_handler.sdma_activity_work); +destroy_work_on_stack (&sdma_activity_work_handler.sdma_activity_work); return snprintf(buffer, PAGE_SIZE, "%llu\n", (sdma_activity_work_handler.sdma_activity_counter)/
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 192/772 net: rfkill: gpio: Add check for clk_enable()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mingwei Zheng <[email protected]>
[ Upstream commit 8251e7621b25ccdb689f1dd9553b8789e3745ea1 ]
Add check for the return value of clk_enable() to catch the potential error.
--- net/rfkill/rfkill-gpio.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/rfkill/rfkill-gpio.c +6 -2
@@ -30,8 +30,12 @@ static int rfkill_gpio_set_power(void *data, bool blocked) {struct rfkill_gpio_data *rfkill = data; -if (!blocked && !IS_ERR (rfkill->clk) && !rfkill->clk_enabled) -clk_enable (rfkill->clk); +if (!blocked && !IS_ERR (rfkill->clk) && !rfkill->clk_enabled) { +int ret =clk_enable (rfkill->clk); + +if (ret) +return ret; + }gpiod_set_value_cansleep (rfkill->shutdown_gpio, !blocked);gpiod_set_value_cansleep (rfkill->reset_gpio, !blocked);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 193/772 ALSA: usx2y: Use snd_card_free_when_closed() at disconnection
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit dafb28f02be407e07a6f679e922a626592b481b0 ]
The USB disconnect callback is supposed to be short and not too-long waiting. OTOH, the current code uses snd_card_free() at disconnection, but this waits for the close of all used fds, hence it can take long. It eventually blocks the upper layer USB ioctls, which may trigger a soft lockup.
An easy workaround is to replace snd_card_free() with snd_card_free_when_closed(). This variant returns immediately while the release of resources is done asynchronously by the card device release at the last close.
--- sound/usb/usx2y/usbusx2y.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/usb/usx2y/usbusx2y.c +1 -1
@@ -423,7 +423,7 @@ static void snd_usx2y_disconnect(struct usb_interface *intf) }if (usx2y->us428ctls_sharedmem)wake_up (&usx2y->us428ctls_wait_queue_head); -snd_card_free (card); +snd_card_free_when_closed (card); } static int snd_usx2y_probe(struct usb_interface *intf,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 194/772 ALSA: us122l: Use snd_card_free_when_closed() at disconnection
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit b7df09bb348016943f56b09dcaafe221e3f73947 ]
The USB disconnect callback is supposed to be short and not too-long waiting. OTOH, the current code uses snd_card_free() at disconnection, but this waits for the close of all used fds, hence it can take long. It eventually blocks the upper layer USB ioctls, which may trigger a soft lockup.
An easy workaround is to replace snd_card_free() with snd_card_free_when_closed(). This variant returns immediately while the release of resources is done asynchronously by the card device release at the last close.
The loop of us122l->mmap_count check is dropped as well. The check is useless for the asynchronous operation with *_when_closed().
--- sound/usb/usx2y/us122l.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
sound/usb/usx2y/us122l.c +1 -4
@@ -617,10 +617,7 @@ static void snd_us122l_disconnect(struct usb_interface *intf)usb_put_intf (usb_ifnum_to_if (us122l->dev,1 ));usb_put_dev (us122l->dev); -while (atomic_read (&us122l->mmap_count)) -msleep (500 ); - -snd_card_free (card); +snd_card_free_when_closed (card); }static int snd_us122l_suspend (struct usb_interface *intf,pm_message_t message)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 195/772 ALSA: caiaq: Use snd_card_free_when_closed() at disconnection
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit b04dcbb7f7b1908806b7dc22671cdbe78ff2b82c ]
The USB disconnect callback is supposed to be short and not too-long waiting. OTOH, the current code uses snd_card_free() at disconnection, but this waits for the close of all used fds, hence it can take long. It eventually blocks the upper layer USB ioctls, which may trigger a soft lockup.
An easy workaround is to replace snd_card_free() with snd_card_free_when_closed(). This variant returns immediately while the release of resources is done asynchronously by the card device release at the last close.
This patch also splits the code to the disconnect and the free phases; the former is called immediately at the USB disconnect callback while the latter is called from the card destructor.
--- sound/usb/caiaq/audio.c | 10 ++++++++-- sound/usb/caiaq/audio.h | 1 + sound/usb/caiaq/device.c | 19 +++++++++++++++---- sound/usb/caiaq/input.c | 12 +++++++++--- sound/usb/caiaq/input.h | 1 + 5 files changed, 34 insertions(+), 9 deletions(-)
sound/usb/caiaq/audio.c +8 -2
@@ -869,14 +869,20 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *cdev)return 0 ; } -void snd_usb_caiaq_audio_free (struct snd_usb_caiaqdev *cdev) +void snd_usb_caiaq_audio_disconnect (struct snd_usb_caiaqdev *cdev) {struct device *dev =caiaqdev_to_dev (cdev);dev_dbg (dev,"%s(%p)\n" , __func__, cdev);stream_stop (cdev); +} + +void snd_usb_caiaq_audio_free (struct snd_usb_caiaqdev *cdev) +{ +struct device *dev =caiaqdev_to_dev (cdev); + +dev_dbg (dev,"%s(%p)\n" , __func__, cdev);free_urbs (cdev->data_urbs_in);free_urbs (cdev->data_urbs_out);kfree (cdev->data_cb_info); } -
sound/usb/caiaq/audio.h +1 -0
@@ -3,6 +3,7 @@#define CAIAQ_AUDIO_H int snd_usb_caiaq_audio_init (struct snd_usb_caiaqdev *cdev); +void snd_usb_caiaq_audio_disconnect (struct snd_usb_caiaqdev *cdev);void snd_usb_caiaq_audio_free (struct snd_usb_caiaqdev *cdev);#endif /* CAIAQ_AUDIO_H */
sound/usb/caiaq/device.c +15 -4
@@ -376,6 +376,17 @@ static void setup_card(struct snd_usb_caiaqdev *cdev)dev_err (dev,"Unable to set up control system (ret=%d)\n" , ret); } +static void card_free (struct snd_card *card) +{ +struct snd_usb_caiaqdev *cdev =caiaqdev (card); + +#ifdef CONFIG_SND_USB_CAIAQ_INPUT +snd_usb_caiaq_input_free (cdev); +#endif +snd_usb_caiaq_audio_free (cdev); +usb_reset_device (cdev->chip.dev); +} +static int create_card (struct usb_device *usb_dev,struct usb_interface *intf,struct snd_card **cardp)
@@ -489,6 +500,7 @@ static int init_card(struct snd_usb_caiaqdev *cdev) cdev->vendor_name, cdev->product_name, usbpath);setup_card (cdev); + card->private_free = card_free;return 0 ; err_kill_urb:
@@ -534,15 +546,14 @@ static void snd_disconnect(struct usb_interface *intf)snd_card_disconnect (card);#ifdef CONFIG_SND_USB_CAIAQ_INPUT -snd_usb_caiaq_input_free (cdev); +snd_usb_caiaq_input_disconnect (cdev);#endif -snd_usb_caiaq_audio_free (cdev); +snd_usb_caiaq_audio_disconnect (cdev);usb_kill_urb (&cdev->ep1_in_urb);usb_kill_urb (&cdev->midi_out_urb); -snd_card_free (card); -usb_reset_device (interface_to_usbdev (intf)); +snd_card_free_when_closed (card); }
sound/usb/caiaq/input.c +9 -3
@@ -829,15 +829,21 @@ int snd_usb_caiaq_input_init(struct snd_usb_caiaqdev *cdev)return ret; } -void snd_usb_caiaq_input_free (struct snd_usb_caiaqdev *cdev) +void snd_usb_caiaq_input_disconnect (struct snd_usb_caiaqdev *cdev) {if (!cdev || !cdev->input_dev)return ;usb_kill_urb (cdev->ep4_in_urb); +input_unregister_device (cdev->input_dev); +} + +void snd_usb_caiaq_input_free (struct snd_usb_caiaqdev *cdev) +{ +if (!cdev || !cdev->input_dev) +return ; +usb_free_urb (cdev->ep4_in_urb); cdev->ep4_in_urb =NULL ; - -input_unregister_device (cdev->input_dev); cdev->input_dev =NULL ; }
sound/usb/caiaq/input.h +1 -0
@@ -4,6 +4,7 @@void snd_usb_caiaq_input_dispatch (struct snd_usb_caiaqdev *cdev,char *buf,unsigned int len);int snd_usb_caiaq_input_init (struct snd_usb_caiaqdev *cdev); +void snd_usb_caiaq_input_disconnect (struct snd_usb_caiaqdev *cdev);void snd_usb_caiaq_input_free (struct snd_usb_caiaqdev *cdev);#endif
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 196/772 ALSA: 6fire: Release resources at card release
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit a0810c3d6dd2d29a9b92604d682eacd2902ce947 ]
The current 6fire code tries to release the resources right after the call of usb6fire_chip_abort(). But at this moment, the card object might be still in use (as we're calling snd_card_free_when_closed()).
For avoid potential UAFs, move the release of resources to the card's private_free instead of the manual call of usb6fire_chip_destroy() at the USB disconnect callback.
--- sound/usb/6fire/chip.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
sound/usb/6fire/chip.c +5 -5
@@ -61,8 +61,10 @@ static void usb6fire_chip_abort(struct sfire_chip *chip) } } -static void usb6fire_chip_destroy (struct sfire_chip *chip) +static void usb6fire_card_free (struct snd_card *card) { +struct sfire_chip *chip = card->private_data; +if (chip) {if (chip->pcm)usb6fire_pcm_destroy (chip);
@@ -72,8 +74,6 @@ static void usb6fire_chip_destroy(struct sfire_chip *chip)usb6fire_comm_destroy (chip);if (chip->control)usb6fire_control_destroy (chip); -if (chip->card) -snd_card_free (chip->card); } }
@@ -136,6 +136,7 @@ static int usb6fire_chip_probe(struct usb_interface *intf, chip->regidx = regidx; chip->intf_count =1 ; chip->card = card; + card->private_free = usb6fire_card_free; ret =usb6fire_comm_init (chip);if (ret <0 )
@@ -162,7 +163,7 @@ static int usb6fire_chip_probe(struct usb_interface *intf,return 0 ; destroy_chip: -usb6fire_chip_destroy (chip); +snd_card_free (card);return ret; }
@@ -181,7 +182,6 @@ static void usb6fire_chip_disconnect(struct usb_interface *intf) chip->shutdown = true;usb6fire_chip_abort (chip); -usb6fire_chip_destroy (chip); } } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 197/772 Bluetooth: fix use-after-free in device_for_each_child()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
[ Upstream commit 27aabf27fd014ae037cc179c61b0bee7cff55b3d ]
Syzbot has reported the following KASAN splat:
BUG: KASAN: slab-use-after-free in device_for_each_child+0x18f/0x1a0 Read of size 8 at addr ffff88801f605308 by task kbnepd bnep0/4980 CPU: 0 UID: 0 PID: 4980 Comm: kbnepd bnep0 Not tainted 6.12.0-rc4-00161-gae90f6a6170d #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-2.fc40 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0x100/0x190 ? device_for_each_child+0x18f/0x1a0 print_report+0x13a/0x4cb ? __virt_addr_valid+0x5e/0x590 ? __phys_addr+0xc6/0x150 ? device_for_each_child+0x18f/0x1a0 kasan_report+0xda/0x110 ? device_for_each_child+0x18f/0x1a0 ? __pfx_dev_memalloc_noio+0x10/0x10 device_for_each_child+0x18f/0x1a0 ? __pfx_device_for_each_child+0x10/0x10 pm_runtime_set_memalloc_noio+0xf2/0x180 netdev_unregister_kobject+0x1ed/0x270 unregister_netdevice_many_notify+0x123c/0x1d80 ? __mutex_trylock_common+0xde/0x250 ? __pfx_unregister_netdevice_many_notify+0x10/0x10 ? trace_contention_end+0xe6/0x140 ? __mutex_lock+0x4e7/0x8f0 ? __pfx_lock_acquire.part.0+0x10/0x10 ? rcu_is_watching+0x12/0xc0 ? unregister_netdev+0x12/0x30 unregister_netdevice_queue+0x30d/0x3f0 ? __pfx_unregister_netdevice_queue+0x10/0x10 ? __pfx_down_write+0x10/0x10 unregister_netdev+0x1c/0x30 bnep_session+0x1fb3/0x2ab0 ? __pfx_bnep_session+0x10/0x10 ? __pfx_lock_release+0x10/0x10 ? __pfx_woken_wake_function+0x10/0x10 ? __kthread_parkme+0x132/0x200 ? __pfx_bnep_session+0x10/0x10 ? kthread+0x13a/0x370 ? __pfx_bnep_session+0x10/0x10 kthread+0x2b7/0x370 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x48/0x80 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK> Allocated by task 4974: kasan_save_stack+0x30/0x50 kasan_save_track+0x14/0x30 __kasan_kmalloc+0xaa/0xb0 __kmalloc_noprof+0x1d1/0x440 hci_alloc_dev_priv+0x1d/0x2820 __vhci_create_device+0xef/0x7d0 vhci_write+0x2c7/0x480 vfs_write+0x6a0/0xfc0 ksys_write+0x12f/0x260 do_syscall_64+0xc7/0x250 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 4979: kasan_save_stack+0x30/0x50 kasan_save_track+0x14/0x30 kasan_save_free_info+0x3b/0x60 __kasan_slab_free+0x4f/0x70 kfree+0x141/0x490 hci_release_dev+0x4d9/0x600 bt_host_release+0x6a/0xb0 device_release+0xa4/0x240 kobject_put+0x1ec/0x5a0 put_device+0x1f/0x30 vhci_release+0x81/0xf0 __fput+0x3f6/0xb30 task_work_run+0x151/0x250 do_exit+0xa79/0x2c30 do_group_exit+0xd5/0x2a0 get_signal+0x1fcd/0x2210 arch_do_signal_or_restart+0x93/0x780 syscall_exit_to_user_mode+0x140/0x290 do_syscall_64+0xd4/0x250 entry_SYSCALL_64_after_hwframe+0x77/0x7f
In 'hci_conn_del_sysfs()', 'device_unregister()' may be called when an underlying (kobject) reference counter is greater than 1. This means that reparenting (happened when the device is actually freed) is delayed and, during that delay, parent controller device (hciX) may be deleted. Since the latter may create a dangling pointer to freed parent, avoid that scenario by reparenting to NULL explicitly.
--- net/bluetooth/hci_sysfs.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-)
net/bluetooth/hci_sysfs.c +4 -11
@@ -19,16 +19,6 @@ static const struct device_type bt_link = { .release = bt_link_release, }; -/* -* The rfcomm tty device will possibly retain even when conn -* is down, and sysfs doesn't support move zombie device, -* so we should move the device before conn device is destroyed. -*/ -static int __match_tty (struct device *dev,void *data) -{ -return !strncmp (dev_name (dev),"rfcomm" ,6 ); -} -void hci_conn_init_sysfs (struct hci_conn *conn) {struct hci_dev *hdev = conn->hdev;
@@ -71,10 +61,13 @@ void hci_conn_del_sysfs(struct hci_conn *conn)return ; } +/* If there are devices using the connection as parent reset it to NULL +* before unregistering the device. +*/ while (1 ) {struct device *dev; - dev =device_find_child (&conn->dev,NULL , __match_tty); + dev =device_find_any_child (&conn->dev);if (!dev)break ;device_move (dev,NULL ,DPM_ORDER_DEV_LAST );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 198/772 netpoll: Use rcu_access_pointer() in netpoll_poll_lock
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit a57d5a72f8dec7db8a79d0016fb0a3bdecc82b56 ]
The ndev->npinfo pointer in netpoll_poll_lock() is RCU-protected but is being accessed directly for a NULL check. While no RCU read lock is held in this context, we should still use proper RCU primitives for consistency and correctness.
Replace the direct NULL check with rcu_access_pointer(), which is the appropriate primitive when only checking for NULL without dereferencing the pointer. This function provides the necessary ordering guarantees without requiring RCU read-side protection.
--- include/linux/netpoll.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/linux/netpoll.h +1 -1
@@ -71,7 +71,7 @@ static inline void *netpoll_poll_lock(struct napi_struct *napi) {struct net_device *dev = napi->dev; -if (dev && dev->npinfo) { +if (dev &&rcu_access_pointer (dev->npinfo)) {int owner =smp_processor_id ();while (cmpxchg (&napi->poll_owner,-1 , owner) !=-1 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 199/772 wireguard: selftests: load nf_conntrack if not present
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hangbin Liu <[email protected]>
[ Upstream commit 0290abc9860917f1ee8b58309c2bbd740a39ee8e ]
Some distros may not load nf_conntrack by default, which will cause subsequent nf_conntrack sets to fail. Load this module if it is not already loaded.
--- tools/testing/selftests/wireguard/netns.sh | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/wireguard/netns.sh +1 -0
@@ -332,6 +332,7 @@ waitiface $netns1 vethc waitiface $netns2 veths n0 bash -c 'printf 1 > /proc/sys/net/ipv4/ip_forward' +[[ -e /proc/sys/net/netfilter/nf_conntrack_udp_timeout ]] || modprobe nf_conntrack n0 bash -c 'printf 2 > /proc/sys/net/netfilter/nf_conntrack_udp_timeout' n0 bash -c 'printf 2 > /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream' n0 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 10.0.0.0/24 -j SNAT --to 10.0.0.1
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 200/772 bpf: fix recursive lock when verdict program return SK_PASS
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiayuan Chen <[email protected]>
[ Upstream commit 8ca2a1eeadf09862190b2810697702d803ceef2d ]
When the stream_verdict program returns SK_PASS, it places the received skb into its own receive queue, but a recursive lock eventually occurs, leading to an operating system deadlock. This issue has been present since v6.9.
'''sk_psock_strp_data_ready
write_lock_bh(&sk->sk_callback_lock)
strp_data_ready
strp_read_sock
read_sock -> tcp_read_sock
strp_recv
cb.rcv_msg -> sk_psock_strp_read
# now stream_verdict return SK_PASS without peer sock assign
__SK_PASS = sk_psock_map_verd(SK_PASS, NULL)
sk_psock_verdict_apply
sk_psock_skb_ingress_self
sk_psock_skb_ingress_enqueue
sk_psock_data_ready
read_lock_bh(&sk->sk_callback_lock) <= dead lock'''
This topic has been discussed before, but it has not been fixed. Previous discussion:
https://lore.kernel.org/all/[email protected]
--- net/core/skmsg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/core/skmsg.c +2 -2
@@ -1114,9 +1114,9 @@ static void sk_psock_strp_data_ready(struct sock *sk)if (tls_sw_has_ctx_rx (sk)) { psock->saved_data_ready (sk); }else { -write_lock_bh (&sk->sk_callback_lock); +read_lock_bh (&sk->sk_callback_lock);strp_data_ready (&psock->strp); -write_unlock_bh (&sk->sk_callback_lock); +read_unlock_bh (&sk->sk_callback_lock); } }rcu_read_unlock ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 201/772 unicode: Fix utf8_load() error path
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: André Almeida <[email protected]>
[ Upstream commit 156bb2c569cd869583c593d27a5bd69e7b2a4264 ]
utf8_load() requests the symbol "utf8_data_table" and then checks if the requested UTF-8 version is supported. If it's unsupported, it tries to put the data table using symbol_put(). If an unsupported version is requested, symbol_put() fails like this:
kernel BUG at kernel/module/main.c:786!
RIP: 0010:__symbol_put+0x93/0xb0 Call Trace: <TASK> ? __die_body.cold+0x19/0x27 ? die+0x2e/0x50 ? do_trap+0xca/0x110 ? do_error_trap+0x65/0x80 ? __symbol_put+0x93/0xb0 ? exc_invalid_op+0x51/0x70 ? __symbol_put+0x93/0xb0 ? asm_exc_invalid_op+0x1a/0x20 ? __pfx_cmp_name+0x10/0x10 ? __symbol_put+0x93/0xb0 ? __symbol_put+0x62/0xb0 utf8_load+0xf8/0x150
That happens because symbol_put() expects the unique string that identify the symbol, instead of a pointer to the loaded symbol. Fix that by using such string.
--- fs/unicode/utf8-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/unicode/utf8-core.c +1 -1
@@ -198,7 +198,7 @@ struct unicode_map *utf8_load(unsigned int version)return um; out_symbol_put: -symbol_put (um->tables); +symbol_put (utf8_data_table); out_free_um:kfree (um);return ERR_PTR (-EINVAL );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 202/772 trace/trace_event_perf: remove duplicate samples on the first tracepoint event
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Levi Yun <[email protected]>
[ Upstream commit afe5960dc208fe069ddaaeb0994d857b24ac19d1 ]
When a tracepoint event is created with attr.freq = 1, 'hwc->period_left' is not initialized correctly. As a result,
in the perf_swevent_overflow() function, when the first time the event occurs, it calculates the event overflow and the perf_swevent_set_period() returns 3, this leads to the event are recorded for three duplicate times.
Step to reproduce:
1. Enable the tracepoint event & starting tracing
$ echo 1 > /sys/kernel/tracing/events/module/module_free $ echo 1 > /sys/kernel/tracing/tracing_on
2. Record with perf
$ perf record -a --strict-freq -F 1 -e "module:module_free"
3. Trigger module_free event.
$ modprobe -i sunrpc
$ modprobe -r sunrpc
Result:
- Trace pipe result:
$ cat trace_pipe
modprobe-174509 [003] ..... 6504.868896: module_free: sunrpc
- perf sample:
modprobe 174509 [003] 6504.868980: module:module_free: sunrpc
modprobe 174509 [003] 6504.868980: module:module_free: sunrpc
modprobe 174509 [003] 6504.868980: module:module_free: sunrpcBy setting period_left via perf_swevent_set_period() as other sw_event did, This problem could be solved.
After patch:
- Trace pipe result:
$ cat trace_pipe
modprobe 1153096 [068] 613468.867774: module:module_free: xfs
- perf sample
modprobe 1153096 [068] 613468.867794: module:module_free: xfs
--- kernel/trace/trace_event_perf.c | 6 ++++++ 1 file changed, 6 insertions(+)
kernel/trace/trace_event_perf.c +6 -0
@@ -356,10 +356,16 @@ void perf_uprobe_destroy(struct perf_event *p_event)int perf_trace_add (struct perf_event *p_event,int flags) {struct trace_event_call *tp_event = p_event->tp_event; +struct hw_perf_event *hwc = &p_event->hw;if (!(flags &PERF_EF_START )) p_event->hw.state =PERF_HES_STOPPED ; +if (is_sampling_event (p_event)) { + hwc->last_period = hwc->sample_period; +perf_swevent_set_period (p_event); + } +/* * If TRACE_REG_PERF_ADD returns false; no custom action was performed * and we need to take the default action of enqueueing our event on
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 203/772 pinctrl: zynqmp: drop excess struct member description
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bartosz Golaszewski <[email protected]>
[ Upstream commit 2a85fc7044987d751f27d7f1e4423eebbcecc2c6 ]
The 'node' member has never been part of this structure so drop its description.
--- drivers/pinctrl/pinctrl-zynqmp.c | 1 - 1 file changed, 1 deletion(-)
drivers/pinctrl/pinctrl-zynqmp.c +0 -1
@@ -45,7 +45,6 @@* @name: Name of the pin mux function * @groups: List of pin groups for this function * @ngroups: Number of entries in @groups -* @node: Firmware node matching with the function * * This structure holds information about pin control function * and function group names supporting that function.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 204/772 powerpc/vdso: Flag VDSO64 entry points as functions
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Leroy <[email protected]>
[ Upstream commit 0161bd38c24312853ed5ae9a425a1c41c4ac674a ]
On powerpc64 as shown below by readelf, vDSO functions symbols have type NOTYPE.
$ powerpc64-linux-gnu-readelf -a arch/powerpc/kernel/vdso/vdso64.so.dbg ELF Header: Magic: 7f 45 4c 46 02 02 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, big endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: PowerPC64 Version: 0x1 ...
Symbol table '.dynsym' contains 12 entries:
Num: Value Size Type Bind Vis Ndx Name
...
1: 0000000000000524 84 NOTYPE GLOBAL DEFAULT 8 __[...]@@LINUX_2.6.15
...
4: 0000000000000000 0 OBJECT GLOBAL DEFAULT ABS LINUX_2.6.15
5: 00000000000006c0 48 NOTYPE GLOBAL DEFAULT 8 __[...]@@LINUX_2.6.15Symbol table '.symtab' contains 56 entries:
Num: Value Size Type Bind Vis Ndx Name
...
45: 0000000000000000 0 OBJECT GLOBAL DEFAULT ABS LINUX_2.6.15
46: 00000000000006c0 48 NOTYPE GLOBAL DEFAULT 8 __kernel_getcpu
47: 0000000000000524 84 NOTYPE GLOBAL DEFAULT 8 __kernel_clock_getresTo overcome that, commit ba83b3239e65 ("selftests: vDSO: fix vDSO symbols lookup for powerpc64") was applied to have selftests also look for NOTYPE symbols, but the correct fix should be to flag VDSO entry points as functions.
The original commit that brought VDSO support into powerpc/64 has the following explanation:
Note that the symbols exposed by the vDSO aren't "normal" function symbols, apps can't be expected to link against them directly, the vDSO's are both seen as if they were linked at 0 and the symbols just contain offsets to the various functions. This is done on purpose to avoid a relocation step (ppc64 functions normally have descriptors with abs addresses in them). When glibc uses those functions, it's expected to use it's own trampolines that know how to reach them.
The descriptors it's talking about are the OPD function descriptors used on ABI v1 (big endian). But it would be more correct for a text symbol to have type function, even if there's no function descriptor for it.
glibc has a special case already for handling the VDSO symbols which creates a fake opd pointing at the kernel symbol. So changing the VDSO symbol type to function shouldn't affect that.
For ABI v2, there is no function descriptors and VDSO functions can safely have function type.
So lets flag VDSO entry points as functions and revert the selftest change.
--- arch/powerpc/include/asm/vdso.h | 1 + tools/testing/selftests/vDSO/parse_vdso.c | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/include/asm/vdso.h +1 -0
@@ -25,6 +25,7 @@ int vdso_getcpu_init(void);#ifdef __VDSO64__#define V_FUNCTION_BEGIN (name) \ .globl name; \ + .type name,@function; \ name: \#define V_FUNCTION_END (name) \
tools/testing/selftests/vDSO/parse_vdso.c +1 -2
@@ -222,8 +222,7 @@ void *vdso_sym(const char *version, const char *name)ELF (Sym) *sym = &vdso_info.symtab[chain];/* Check for a defined global or weak function w/ right name. */ -if (ELF64_ST_TYPE (sym->st_info) !=STT_FUNC && -ELF64_ST_TYPE (sym->st_info) !=STT_NOTYPE ) +if (ELF64_ST_TYPE (sym->st_info) !=STT_FUNC )continue ;if (ELF64_ST_BIND (sym->st_info) !=STB_GLOBAL &&ELF64_ST_BIND (sym->st_info) !=STB_WEAK )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 205/772 mfd: tps65010: Use IRQF_NO_AUTOEN flag in request_irq() to fix race
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 2174f9a8c9db50f74df769edd5a4ab822c73b6d2 ]
As the comment said, disable_irq() after request_irq() still has a time gap in which interrupts can come. request_irq() with IRQF_NO_AUTOEN flag will disable IRQ auto-enable when request IRQ.
--- drivers/mfd/tps65010.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
drivers/mfd/tps65010.c +2 -6
@@ -548,17 +548,13 @@ static int tps65010_probe(struct i2c_client *client,*/ if (client->irq >0 ) { status =request_irq (client->irq, tps65010_irq, -IRQF_TRIGGER_FALLING ,DRIVER_NAME , tps); +IRQF_TRIGGER_FALLING |IRQF_NO_AUTOEN , +DRIVER_NAME , tps);if (status <0 ) {dev_dbg (&client->dev,"can't get IRQ %d, err %d\n" , client->irq, status);return status; } -/* annoying race here, ideally we'd have an option -* to claim the irq now and enable it later. -* FIXME genirq IRQF_NOAUTOEN now solves that ... -*/ -disable_irq (client->irq);set_bit (FLAG_IRQ_ENABLE , &tps->flags); }else dev_warn (&client->dev,"IRQ not configured!\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 206/772 mfd: da9052-spi: Change read-mask to write-mask
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marcus Folkesson <[email protected]>
[ Upstream commit 2e3378f6c79a1b3f7855ded1ef306ea4406352ed ]
Driver has mixed up the R/W bit.
The LSB bit is set on write rather than read.
Change it to avoid nasty things to happen.
--- drivers/mfd/da9052-spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mfd/da9052-spi.c +1 -1
@@ -37,7 +37,7 @@ static int da9052_spi_probe(struct spi_device *spi)spi_set_drvdata (spi, da9052); config = da9052_regmap_config; - config.read_flag_mask =1 ; + config.write_flag_mask =1 ; config.reg_bits =7 ; config.pad_bits =1 ; config.val_bits =8 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 207/772 mfd: intel_soc_pmic_bxtwc: Use IRQ domain for USB Type-C device
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 686fb77712a4bc94b76a0c5ae74c60118b7a0d79 ]
While design wise the idea of converting the driver to use the hierarchy of the IRQ chips is correct, the implementation has (inherited) flaws. This was unveiled when platform_get_irq() had started WARN() on IRQ 0 that is supposed to be a Linux IRQ number (also known as vIRQ).
Rework the driver to respect IRQ domain when creating each MFD device separately, as the domain is not the same for all of them.
--- drivers/mfd/intel_soc_pmic_bxtwc.c | 57 +++++++++++++++++++++--------- drivers/usb/typec/tcpm/wcove.c | 4 --- 2 files changed, 40 insertions(+), 21 deletions(-)
drivers/mfd/intel_soc_pmic_bxtwc.c +40 -17
@@ -241,16 +241,6 @@ static struct mfd_cell bxt_wc_dev[] = { .num_resources = ARRAY_SIZE(thermal_resources), .resources = thermal_resources, }, - { - .name = "bxt_wcove_usbc", - .num_resources = ARRAY_SIZE(usbc_resources), - .resources = usbc_resources, - }, - { - .name = "bxt_wcove_ext_charger", - .num_resources = ARRAY_SIZE(charger_resources), - .resources = charger_resources, - }, { .name = "bxt_wcove_bcu", .num_resources = ARRAY_SIZE(bcu_resources),
@@ -272,6 +262,19 @@ static struct mfd_cell bxt_wc_dev[] = { }, }; +static struct mfd_cell bxt_wc_chgr_dev[] = { + { + .name ="bxt_wcove_usbc" , + .num_resources =ARRAY_SIZE (usbc_resources), + .resources = usbc_resources, + }, + { + .name ="bxt_wcove_ext_charger" , + .num_resources =ARRAY_SIZE (charger_resources), + .resources = charger_resources, + }, +}; +static int regmap_ipc_byte_reg_read (void *context,unsigned int reg,unsigned int *val) {
@@ -426,6 +429,26 @@ static int bxtwc_add_chained_irq_chip(struct intel_soc_pmic *pmic, 0, chip, data); } +static int bxtwc_add_chained_devices (struct intel_soc_pmic *pmic, +const struct mfd_cell *cells,int n_devs, +struct regmap_irq_chip_data *pdata, +int pirq,int irq_flags, +const struct regmap_irq_chip *chip, +struct regmap_irq_chip_data **data) +{ +struct device *dev = pmic->dev; +struct irq_domain *domain; +int ret; + + ret =bxtwc_add_chained_irq_chip (pmic, pdata, pirq, irq_flags, chip, data); +if (ret) +return dev_err_probe (dev, ret,"Failed to add %s IRQ chip\n" , chip->name); + + domain =regmap_irq_get_domain (*data); + +return devm_mfd_add_devices (dev,PLATFORM_DEVID_NONE , cells, n_devs,NULL ,0 , domain); +} +static int bxtwc_probe (struct platform_device *pdev) {struct device *dev = &pdev->dev;
@@ -501,14 +524,14 @@ static int bxtwc_probe(struct platform_device *pdev)if (ret)return dev_err_probe (dev, ret,"Failed to add ADC IRQ chip\n" ); -/* Add chained IRQ handler for CHGR IRQs */ - ret =bxtwc_add_chained_irq_chip (pmic, pmic->irq_chip_data, -BXTWC_CHGR_LVL1_IRQ , -IRQF_ONESHOT , - &bxtwc_regmap_irq_chip_chgr, - &pmic->irq_chip_data_chgr); + ret =bxtwc_add_chained_devices (pmic, bxt_wc_chgr_dev,ARRAY_SIZE (bxt_wc_chgr_dev), + pmic->irq_chip_data, +BXTWC_CHGR_LVL1_IRQ , +IRQF_ONESHOT , + &bxtwc_regmap_irq_chip_chgr, + &pmic->irq_chip_data_chgr);if (ret) -return dev_err_probe (dev, ret,"Failed to add CHGR IRQ chip\n" ); +return ret;/* Add chained IRQ handler for CRIT IRQs */ ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data,
drivers/usb/typec/tcpm/wcove.c +0 -4
@@ -621,10 +621,6 @@ static int wcove_typec_probe(struct platform_device *pdev)if (irq <0 )return irq; - irq =regmap_irq_get_virq (pmic->irq_chip_data_chgr, irq); -if (irq <0 ) -return irq; - ret =guid_parse (WCOVE_DSM_UUID , &wcove->guid);if (ret)return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 208/772 mfd: intel_soc_pmic_bxtwc: Use IRQ domain for TMU device
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 9b79d59e6b2b515eb9a22bc469ef7b8f0904fc73 ]
While design wise the idea of converting the driver to use the hierarchy of the IRQ chips is correct, the implementation has (inherited) flaws. This was unveiled when platform_get_irq() had started WARN() on IRQ 0 that is supposed to be a Linux IRQ number (also known as vIRQ).
Rework the driver to respect IRQ domain when creating each MFD device separately, as the domain is not the same for all of them.
--- drivers/mfd/intel_soc_pmic_bxtwc.c | 31 ++++++++++++++------------ drivers/platform/x86/intel/bxtwc_tmu.c | 22 +++++------------- 2 files changed, 23 insertions(+), 30 deletions(-)
drivers/mfd/intel_soc_pmic_bxtwc.c +17 -14
@@ -246,12 +246,6 @@ static struct mfd_cell bxt_wc_dev[] = { .num_resources = ARRAY_SIZE(bcu_resources), .resources = bcu_resources, }, - { - .name = "bxt_wcove_tmu", - .num_resources = ARRAY_SIZE(tmu_resources), - .resources = tmu_resources, - }, - { .name = "bxt_wcove_gpio", .num_resources = ARRAY_SIZE(gpio_resources),
@@ -262,6 +256,14 @@ static struct mfd_cell bxt_wc_dev[] = { }, }; +static const struct mfd_cell bxt_wc_tmu_dev[] = { + { + .name ="bxt_wcove_tmu" , + .num_resources =ARRAY_SIZE (tmu_resources), + .resources = tmu_resources, + }, +}; +static struct mfd_cell bxt_wc_chgr_dev[] = { { .name ="bxt_wcove_usbc" ,
@@ -490,6 +492,15 @@ static int bxtwc_probe(struct platform_device *pdev)if (ret)return dev_err_probe (dev, ret,"Failed to add IRQ chip\n" ); + ret =bxtwc_add_chained_devices (pmic, bxt_wc_tmu_dev,ARRAY_SIZE (bxt_wc_tmu_dev), + pmic->irq_chip_data, +BXTWC_TMU_LVL1_IRQ , +IRQF_ONESHOT , + &bxtwc_regmap_irq_chip_tmu, + &pmic->irq_chip_data_tmu); +if (ret) +return ret; + ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, BXTWC_PWRBTN_LVL1_IRQ, IRQF_ONESHOT,
@@ -498,14 +509,6 @@ static int bxtwc_probe(struct platform_device *pdev)if (ret)return dev_err_probe (dev, ret,"Failed to add PWRBTN IRQ chip\n" ); - ret =bxtwc_add_chained_irq_chip (pmic, pmic->irq_chip_data, -BXTWC_TMU_LVL1_IRQ , -IRQF_ONESHOT , - &bxtwc_regmap_irq_chip_tmu, - &pmic->irq_chip_data_tmu); -if (ret) -return dev_err_probe (dev, ret,"Failed to add TMU IRQ chip\n" ); -/* Add chained IRQ handler for BCU IRQs */ ret = bxtwc_add_chained_irq_chip(pmic, pmic->irq_chip_data, BXTWC_BCU_LVL1_IRQ,
drivers/platform/x86/intel/bxtwc_tmu.c +6 -16
@@ -48,9 +48,8 @@ static irqreturn_t bxt_wcove_tmu_irq_handler(int irq, void *data)static int bxt_wcove_tmu_probe (struct platform_device *pdev) {struct intel_soc_pmic *pmic =dev_get_drvdata (pdev->dev.parent); -struct regmap_irq_chip_data *regmap_irq_chip;struct wcove_tmu *wctmu; -int ret, virq, irq; +int ret; wctmu =devm_kzalloc (&pdev->dev,sizeof (*wctmu),GFP_KERNEL );if (!wctmu)
@@ -59,27 +58,18 @@ static int bxt_wcove_tmu_probe(struct platform_device *pdev) wctmu->dev = &pdev->dev; wctmu->regmap = pmic->regmap; - irq =platform_get_irq (pdev,0 ); -if (irq <0 ) -return irq; + wctmu->irq =platform_get_irq (pdev,0 ); +if (wctmu->irq <0 ) +return wctmu->irq; - regmap_irq_chip = pmic->irq_chip_data_tmu; - virq =regmap_irq_get_virq (regmap_irq_chip, irq); -if (virq <0 ) { -dev_err (&pdev->dev, -"failed to get virtual interrupt=%d\n" , irq); -return virq; - } - - ret =devm_request_threaded_irq (&pdev->dev, virq, + ret =devm_request_threaded_irq (&pdev->dev, wctmu->irq,NULL , bxt_wcove_tmu_irq_handler,IRQF_ONESHOT ,"bxt_wcove_tmu" , wctmu);if (ret) {dev_err (&pdev->dev,"request irq failed: %d,virq: %d\n" , - ret, virq); + ret, wctmu->irq);return ret; } - wctmu->irq = virq;/* Unmask TMU second level Wake & System alarm */ regmap_update_bits(wctmu->regmap, BXTWC_MTMUIRQ_REG,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 209/772 mfd: intel_soc_pmic_bxtwc: Use IRQ domain for PMIC devices
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 0350d783ab888cb1cb48ced36cc28b372723f1a4 ]
While design wise the idea of converting the driver to use the hierarchy of the IRQ chips is correct, the implementation has (inherited) flaws. This was unveiled when platform_get_irq() had started WARN() on IRQ 0 that is supposed to be a Linux IRQ number (also known as vIRQ).
Rework the driver to respect IRQ domain when creating each MFD device separately, as the domain is not the same for all of them.
--- drivers/mfd/intel_soc_pmic_bxtwc.c | 54 +++++++++++++++++------------- 1 file changed, 30 insertions(+), 24 deletions(-)
drivers/mfd/intel_soc_pmic_bxtwc.c +30 -24
@@ -231,21 +231,11 @@ static const struct resource tmu_resources[] = { };static struct mfd_cell bxt_wc_dev[] = { - { - .name ="bxt_wcove_gpadc" , - .num_resources =ARRAY_SIZE (adc_resources), - .resources = adc_resources, - }, { .name ="bxt_wcove_thermal" , .num_resources =ARRAY_SIZE (thermal_resources), .resources = thermal_resources, }, - { - .name ="bxt_wcove_bcu" , - .num_resources =ARRAY_SIZE (bcu_resources), - .resources = bcu_resources, - }, { .name ="bxt_wcove_gpio" , .num_resources =ARRAY_SIZE (gpio_resources),
@@ -264,6 +254,22 @@ static const struct mfd_cell bxt_wc_tmu_dev[] = { }, }; +static const struct mfd_cell bxt_wc_bcu_dev[] = { + { + .name ="bxt_wcove_bcu" , + .num_resources =ARRAY_SIZE (bcu_resources), + .resources = bcu_resources, + }, +}; + +static const struct mfd_cell bxt_wc_adc_dev[] = { + { + .name ="bxt_wcove_gpadc" , + .num_resources =ARRAY_SIZE (adc_resources), + .resources = adc_resources, + }, +}; +static struct mfd_cell bxt_wc_chgr_dev[] = { { .name ="bxt_wcove_usbc" ,
@@ -509,23 +515,23 @@ static int bxtwc_probe(struct platform_device *pdev)if (ret)return dev_err_probe (dev, ret,"Failed to add PWRBTN IRQ chip\n" ); -/* Add chained IRQ handler for BCU IRQs */ - ret =bxtwc_add_chained_irq_chip (pmic, pmic->irq_chip_data, -BXTWC_BCU_LVL1_IRQ , -IRQF_ONESHOT , - &bxtwc_regmap_irq_chip_bcu, - &pmic->irq_chip_data_bcu); + ret =bxtwc_add_chained_devices (pmic, bxt_wc_bcu_dev,ARRAY_SIZE (bxt_wc_bcu_dev), + pmic->irq_chip_data, +BXTWC_BCU_LVL1_IRQ , +IRQF_ONESHOT , + &bxtwc_regmap_irq_chip_bcu, + &pmic->irq_chip_data_bcu);if (ret) -return dev_err_probe (dev, ret,"Failed to add BUC IRQ chip\n" ); +return ret; -/* Add chained IRQ handler for ADC IRQs */ - ret =bxtwc_add_chained_irq_chip (pmic, pmic->irq_chip_data, -BXTWC_ADC_LVL1_IRQ , -IRQF_ONESHOT , - &bxtwc_regmap_irq_chip_adc, - &pmic->irq_chip_data_adc); + ret =bxtwc_add_chained_devices (pmic, bxt_wc_adc_dev,ARRAY_SIZE (bxt_wc_adc_dev), + pmic->irq_chip_data, +BXTWC_ADC_LVL1_IRQ , +IRQF_ONESHOT , + &bxtwc_regmap_irq_chip_adc, + &pmic->irq_chip_data_adc);if (ret) -return dev_err_probe (dev, ret,"Failed to add ADC IRQ chip\n" ); +return ret; ret = bxtwc_add_chained_devices(pmic, bxt_wc_chgr_dev, ARRAY_SIZE(bxt_wc_chgr_dev), pmic->irq_chip_data,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 210/772 cpufreq: loongson2: Unregister platform_driver on failure
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Can <[email protected]>
[ Upstream commit 5f856d71ccdf89b4bac0ff70ebb0bb582e7f7f18 ]
When cpufreq_register_driver() returns error, the cpufreq_init() returns without unregister platform_driver, fix by add missing platform_driver_unregister() when cpufreq_register_driver() failed.
--- drivers/cpufreq/loongson2_cpufreq.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/cpufreq/loongson2_cpufreq.c +3 -1
@@ -154,7 +154,9 @@ static int __init cpufreq_init(void) ret =cpufreq_register_driver (&loongson2_cpufreq_driver); -if (!ret && !nowait) { +if (ret) { +platform_driver_unregister (&platform_driver); + }else if (!nowait) { saved_cpu_wait = cpu_wait; cpu_wait = loongson2_cpu_wait; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 211/772 powerpc/fadump: Refactor and prepare fadump_cma_init for late init
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ritesh Harjani (IBM) <[email protected]>
[ Upstream commit adfaec30ffaceecd565e06adae367aa944acc3c9 ]
We anyway don't use any return values from fadump_cma_init(). Since fadump_reserve_mem() from where fadump_cma_init() gets called today, already has the required checks.
This patch makes this function return type as void. Let's also handle extra cases like return if fadump_supported is false or dump_active, so that in later patches we can call fadump_cma_init() separately from setup_arch().
Stable-dep-of: 05b94cae1c47 ("powerpc/fadump: Move fadump_cma_init to setup_arch() after initmem_init()")
--- arch/powerpc/kernel/fadump.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-)
arch/powerpc/kernel/fadump.c +9 -14
@@ -80,27 +80,23 @@ static struct cma *fadump_cma;* But for some reason even if it fails we still have the memory reservation * with us and we can still continue doing fadump. */ -static int __init fadump_cma_init (void ) +static void __init fadump_cma_init (void ) {unsigned long long base, size;int rc; -if (!fw_dump.fadump_enabled) -return 0 ; - +if (!fw_dump.fadump_supported || !fw_dump.fadump_enabled || + fw_dump.dump_active) +return ;/* * Do not use CMA if user has provided fadump=nocma kernel parameter. -* Return 1 to continue with fadump old behaviour. */ -if (fw_dump.nocma) -return 1 ; +if (fw_dump.nocma || !fw_dump.boot_memory_size) +return ; base = fw_dump.reserve_dump_area_start; size = fw_dump.boot_memory_size; -if (!size) -return 0 ; - rc =cma_init_reserved_mem (base, size,0 ,"fadump_cma" , &fadump_cma);if (rc) {pr_err ("Failed to init cma area for firmware-assisted dump,%d\n" , rc);
@@ -110,7 +106,7 @@ static int __init fadump_cma_init(void)* blocked from production system usage. Hence return 1, * so that we can continue with fadump. */ -return 1 ; +return ; }/*
@@ -127,10 +123,9 @@ static int __init fadump_cma_init(void)cma_get_size (fadump_cma), (unsigned long )cma_get_base (fadump_cma) >>20 , fw_dump.reserve_dump_area_size); - return 1; }#else -static int __init fadump_cma_init (void ) {return 1 ; } +static void __init fadump_cma_init (void ) { }#endif /* CONFIG_CMA */ /* Scan the Firmware Assisted dump configuration details. */
@@ -648,7 +643,7 @@ int __init fadump_reserve_mem(void)pr_info ("Reserved %lldMB of memory at %#016llx (System RAM: %lldMB)\n" , (size >>20 ), base, (memblock_phys_mem_size () >>20 )); - ret =fadump_cma_init (); +fadump_cma_init (); }return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 212/772 powerpc/fadump: Move fadump_cma_init to setup_arch() after initmem_init()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ritesh Harjani (IBM) <[email protected]>
[ Upstream commit 05b94cae1c47f94588c3e7096963c1007c4d9c1d ]
During early init CMA_MIN_ALIGNMENT_BYTES can be PAGE_SIZE, since pageblock_order is still zero and it gets initialized later during initmem_init() e.g.setup_arch() -> initmem_init() -> sparse_init() -> set_pageblock_order()
One such use case where this causes issue is -early_setup() -> early_init_devtree() -> fadump_reserve_mem() -> fadump_cma_init()
This causes CMA memory alignment check to be bypassed in cma_init_reserved_mem(). Then later cma_activate_area() can hit a VM_BUG_ON_PAGE(pfn & ((1 << order) - 1)) if the reserved memory area was not pageblock_order aligned.
Fix it by moving the fadump_cma_init() after initmem_init(), where other such cma reservations also gets called.
<stack trace>
==============
page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x10010 flags: 0x13ffff800000000(node=1|zone=0|lastcpupid=0x7ffff) CMA raw: 013ffff800000000 5deadbeef0000100 5deadbeef0000122 0000000000000000 raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000 page dumped because: VM_BUG_ON_PAGE(pfn & ((1 << order) - 1)) ------------[ cut here ]------------ kernel BUG at mm/page_alloc.c:778! Call Trace: __free_one_page+0x57c/0x7b0 (unreliable) free_pcppages_bulk+0x1a8/0x2c8 free_unref_page_commit+0x3d4/0x4e4 free_unref_page+0x458/0x6d0 init_cma_reserved_pageblock+0x114/0x198 cma_init_reserved_areas+0x270/0x3e0 do_one_initcall+0x80/0x2f8 kernel_init_freeable+0x33c/0x530 kernel_init+0x34/0x26c ret_from_kernel_user_thread+0x14/0x1c
--- arch/powerpc/include/asm/fadump.h | 7 +++++++ arch/powerpc/kernel/fadump.c | 6 +----- arch/powerpc/kernel/setup-common.c | 6 ++++-- 3 files changed, 12 insertions(+), 7 deletions(-)
arch/powerpc/include/asm/fadump.h +7 -0
@@ -32,4 +32,11 @@ extern int early_init_dt_scan_fw_dump(unsigned long node, const char *uname, int depth, void *data);extern int fadump_reserve_mem (void );#endif + +#if defined(CONFIG_FA_DUMP ) && defined(CONFIG_CMA ) +void fadump_cma_init (void ); +#else +static inline void fadump_cma_init (void ) { } +#endif +#endif /* _ASM_POWERPC_FADUMP_H */
arch/powerpc/kernel/fadump.c +1 -5
@@ -80,7 +80,7 @@ static struct cma *fadump_cma;* But for some reason even if it fails we still have the memory reservation * with us and we can still continue doing fadump. */ -static void __init fadump_cma_init (void ) +void __init fadump_cma_init (void ) {unsigned long long base, size;int rc;
@@ -124,8 +124,6 @@ static void __init fadump_cma_init(void) (unsigned long )cma_get_base (fadump_cma) >>20 , fw_dump.reserve_dump_area_size); } -#else -static void __init fadump_cma_init (void ) { }#endif /* CONFIG_CMA */ /* Scan the Firmware Assisted dump configuration details. */
@@ -642,8 +640,6 @@ int __init fadump_reserve_mem(void)pr_info ("Reserved %lldMB of memory at %#016llx (System RAM: %lldMB)\n" , (size >>20 ), base, (memblock_phys_mem_size () >>20 )); - -fadump_cma_init (); }return ret;
arch/powerpc/kernel/setup-common.c +4 -2
@@ -982,9 +982,11 @@ void __init setup_arch(char **cmdline_p)initmem_init ();/* -* Reserve large chunks of memory for use by CMA for KVM and hugetlb. These must -* be called after initmem_init(), so that pageblock_order is initialised. +* Reserve large chunks of memory for use by CMA for fadump, KVM and +* hugetlb. These must be called after initmem_init(), so that +* pageblock_order is initialised. */ +fadump_cma_init ();kvm_cma_reserve ();gigantic_hugetlb_cma_reserve ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 213/772 memory: renesas-rpc-if: Improve Runtime PM handling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit bb0b025d72d22b8617df920b61f5ae1e23d1b593 ]
Convert from the deprecated pm_runtime_get_sync() to the new pm_runtime_resume_and_get(), and add error checking.
Stable-dep-of: 7d189579a287 ("mtd: hyperbus: rpc-if: Add missing MODULE_DEVICE_TABLE")
--- drivers/memory/renesas-rpc-if.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
drivers/memory/renesas-rpc-if.c +11 -5
@@ -303,12 +303,13 @@ int rpcif_hw_init(struct rpcif *rpcif, bool hyperflash) {struct rpcif_priv *rpc =dev_get_drvdata (rpcif->dev);u32 dummy; +int ret; -pm_runtime_get_sync (rpc->dev); + ret =pm_runtime_resume_and_get (rpc->dev); +if (ret) +return ret;if (rpc->type ==RPCIF_RZ_G2L ) { -int ret; - ret =reset_control_reset (rpc->rstc);if (ret)return ret;
@@ -478,7 +479,9 @@ int rpcif_manual_xfer(struct rpcif *rpcif)u32 smenr, smcr, pos =0 , max = rpc->bus_size ==2 ?8 :4 ;int ret =0 ; -pm_runtime_get_sync (rpc->dev); + ret =pm_runtime_resume_and_get (rpc->dev); +if (ret <0 ) +return ret;regmap_update_bits (rpc->regmap,RPCIF_PHYCNT ,RPCIF_PHYCNT_CAL ,RPCIF_PHYCNT_CAL );
@@ -646,11 +649,14 @@ ssize_t rpcif_dirmap_read(struct rpcif *rpcif, u64 offs, size_t len, void *buf)struct rpcif_priv *rpc =dev_get_drvdata (rpcif->dev);loff_t from = offs & (rpc->size -1 );size_t size = rpc->size - from; +int ret;if (len > size) len = size; -pm_runtime_get_sync (rpc->dev); + ret =pm_runtime_resume_and_get (rpc->dev); +if (ret <0 ) +return ret;regmap_update_bits (rpc->regmap,RPCIF_CMNCR ,RPCIF_CMNCR_MD ,0 );regmap_write (rpc->regmap,RPCIF_DRCR ,0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 214/772 memory: renesas-rpc-if: Pass device instead of rpcif to rpcif_*()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit a198fcd1d53cbaf616d94822921c77910b94edb7 ]
Most rpcif_*() API functions do not need access to any other fields in the rpcif structure than the device pointer. Simplify dependencies by passing the device pointer instead.
Stable-dep-of: 7d189579a287 ("mtd: hyperbus: rpc-if: Add missing MODULE_DEVICE_TABLE")
--- drivers/memory/renesas-rpc-if.c | 32 ++++++++++++++++---------------- drivers/mtd/hyperbus/rpc-if.c | 18 +++++++++--------- drivers/spi/spi-rpc-if.c | 14 +++++++------- include/memory/renesas-rpc-if.h | 16 ++++++++-------- 4 files changed, 40 insertions(+), 40 deletions(-)
drivers/memory/renesas-rpc-if.c +16 -16
@@ -299,13 +299,13 @@ static void rpcif_rzg2l_timing_adjust_sdr(struct rpcif_priv *rpc)regmap_write (rpc->regmap,RPCIF_PHYADD ,0x80000032 ); } -int rpcif_hw_init (struct rpcif *rpcif,bool hyperflash) +int rpcif_hw_init (struct device *dev,bool hyperflash) { -struct rpcif_priv *rpc =dev_get_drvdata (rpcif->dev); +struct rpcif_priv *rpc =dev_get_drvdata (dev);u32 dummy;int ret; - ret =pm_runtime_resume_and_get (rpc->dev); + ret =pm_runtime_resume_and_get (dev);if (ret)return ret;
@@ -355,7 +355,7 @@ int rpcif_hw_init(struct rpcif *rpcif, bool hyperflash)regmap_write (rpc->regmap,RPCIF_SSLDR ,RPCIF_SSLDR_SPNDL (7 ) |RPCIF_SSLDR_SLNDL (7 ) |RPCIF_SSLDR_SCKDL (7 )); -pm_runtime_put (rpc->dev); +pm_runtime_put (dev); rpc->bus_size = hyperflash ?2 :1 ;
@@ -385,10 +385,10 @@ static u8 rpcif_bit_size(u8 buswidth)return buswidth >4 ?2 :ilog2 (buswidth); } -void rpcif_prepare (struct rpcif *rpcif,const struct rpcif_op *op,u64 *offs, +void rpcif_prepare (struct device *dev,const struct rpcif_op *op,u64 *offs,size_t *len) { -struct rpcif_priv *rpc =dev_get_drvdata (rpcif->dev); +struct rpcif_priv *rpc =dev_get_drvdata (dev); rpc->smcr =0 ; rpc->smadr =0 ;
@@ -473,13 +473,13 @@ void rpcif_prepare(struct rpcif *rpcif, const struct rpcif_op *op, u64 *offs, }EXPORT_SYMBOL (rpcif_prepare); -int rpcif_manual_xfer (struct rpcif *rpcif) +int rpcif_manual_xfer (struct device *dev) { -struct rpcif_priv *rpc =dev_get_drvdata (rpcif->dev); +struct rpcif_priv *rpc =dev_get_drvdata (dev);u32 smenr, smcr, pos =0 , max = rpc->bus_size ==2 ?8 :4 ;int ret =0 ; - ret =pm_runtime_resume_and_get (rpc->dev); + ret =pm_runtime_resume_and_get (dev);if (ret <0 )return ret;
@@ -591,13 +591,13 @@ int rpcif_manual_xfer(struct rpcif *rpcif) } exit: -pm_runtime_put (rpc->dev); +pm_runtime_put (dev);return ret; err_out:if (reset_control_reset (rpc->rstc)) -dev_err (rpc->dev,"Failed to reset HW\n" ); -rpcif_hw_init (rpcif, rpc->bus_size ==2 ); +dev_err (dev,"Failed to reset HW\n" ); +rpcif_hw_init (dev, rpc->bus_size ==2 ); goto exit; }EXPORT_SYMBOL (rpcif_manual_xfer);
@@ -644,9 +644,9 @@ static void memcpy_fromio_readw(void *to, } } -ssize_t rpcif_dirmap_read (struct rpcif *rpcif,u64 offs,size_t len,void *buf) +ssize_t rpcif_dirmap_read (struct device *dev,u64 offs,size_t len,void *buf) { -struct rpcif_priv *rpc =dev_get_drvdata (rpcif->dev); +struct rpcif_priv *rpc =dev_get_drvdata (dev);loff_t from = offs & (rpc->size -1 );size_t size = rpc->size - from;int ret;
@@ -654,7 +654,7 @@ ssize_t rpcif_dirmap_read(struct rpcif *rpcif, u64 offs, size_t len, void *buf)if (len > size) len = size; - ret =pm_runtime_resume_and_get (rpc->dev); + ret =pm_runtime_resume_and_get (dev);if (ret <0 )return ret;
@@ -674,7 +674,7 @@ ssize_t rpcif_dirmap_read(struct rpcif *rpcif, u64 offs, size_t len, void *buf)else memcpy_fromio (buf, rpc->dirmap + from, len); -pm_runtime_put (rpc->dev); +pm_runtime_put (dev);return len; }
drivers/mtd/hyperbus/rpc-if.c +9 -9
@@ -56,7 +56,7 @@ static void rpcif_hb_prepare_read(struct rpcif *rpc, void *to, op.data.nbytes = len; op.data.buf.in = to; -rpcif_prepare (rpc, &op,NULL ,NULL ); +rpcif_prepare (rpc->dev, &op,NULL ,NULL ); } static void rpcif_hb_prepare_write(struct rpcif *rpc, unsigned long to,
@@ -70,7 +70,7 @@ static void rpcif_hb_prepare_write(struct rpcif *rpc, unsigned long to, op.data.nbytes = len; op.data.buf.out = from; -rpcif_prepare (rpc, &op,NULL ,NULL ); +rpcif_prepare (rpc->dev, &op,NULL ,NULL ); }static u16 rpcif_hb_read16 (struct hyperbus_device *hbdev,unsigned long addr)
@@ -81,7 +81,7 @@ static u16 rpcif_hb_read16(struct hyperbus_device *hbdev, unsigned long addr)rpcif_hb_prepare_read (&hyperbus->rpc, &data, addr,2 ); -rpcif_manual_xfer (&hyperbus->rpc); +rpcif_manual_xfer (hyperbus->rpc.dev);return data.x[0 ]; }
@@ -94,7 +94,7 @@ static void rpcif_hb_write16(struct hyperbus_device *hbdev, unsigned long addr,rpcif_hb_prepare_write (&hyperbus->rpc, addr, &data,2 ); -rpcif_manual_xfer (&hyperbus->rpc); +rpcif_manual_xfer (hyperbus->rpc.dev); } static void rpcif_hb_copy_from(struct hyperbus_device *hbdev, void *to,
@@ -105,7 +105,7 @@ static void rpcif_hb_copy_from(struct hyperbus_device *hbdev, void *to,rpcif_hb_prepare_read (&hyperbus->rpc, to, from, len); -rpcif_dirmap_read (&hyperbus->rpc, from, len, to); +rpcif_dirmap_read (hyperbus->rpc.dev, from, len, to); }static const struct hyperbus_ops rpcif_hb_ops = {
@@ -130,9 +130,9 @@ static int rpcif_hb_probe(struct platform_device *pdev)platform_set_drvdata (pdev, hyperbus); -rpcif_enable_rpm (&hyperbus->rpc); +rpcif_enable_rpm (hyperbus->rpc.dev); - error =rpcif_hw_init (&hyperbus->rpc, true); + error =rpcif_hw_init (hyperbus->rpc.dev, true);if (error) goto out_disable_rpm;
@@ -150,7 +150,7 @@ static int rpcif_hb_probe(struct platform_device *pdev)return 0 ; out_disable_rpm: -rpcif_disable_rpm (&hyperbus->rpc); +rpcif_disable_rpm (hyperbus->rpc.dev);return error; }
@@ -160,7 +160,7 @@ static int rpcif_hb_remove(struct platform_device *pdev)hyperbus_unregister_device (&hyperbus->hbdev); -rpcif_disable_rpm (&hyperbus->rpc); +rpcif_disable_rpm (hyperbus->rpc.dev);return 0 ; }
drivers/spi/spi-rpc-if.c +7 -7
@@ -58,7 +58,7 @@ static void rpcif_spi_mem_prepare(struct spi_device *spi_dev, rpc_op.data.dir =RPCIF_NO_DATA ; } -rpcif_prepare (rpc, &rpc_op, offs, len); +rpcif_prepare (rpc->dev, &rpc_op, offs, len); } static bool rpcif_spi_mem_supports_op(struct spi_mem *mem,
@@ -86,7 +86,7 @@ static ssize_t rpcif_spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,rpcif_spi_mem_prepare (desc->mem->spi, &desc->info.op_tmpl, &offs, &len); -return rpcif_dirmap_read (rpc, offs, len, buf); +return rpcif_dirmap_read (rpc->dev, offs, len, buf); }static int rpcif_spi_mem_dirmap_create (struct spi_mem_dirmap_desc *desc)
@@ -117,7 +117,7 @@ static int rpcif_spi_mem_exec_op(struct spi_mem *mem,rpcif_spi_mem_prepare (mem->spi, op,NULL ,NULL ); -return rpcif_manual_xfer (rpc); +return rpcif_manual_xfer (rpc->dev); }static const struct spi_controller_mem_ops rpcif_spi_mem_ops = {
@@ -147,7 +147,7 @@ static int rpcif_spi_probe(struct platform_device *pdev) ctlr->dev.of_node = parent->of_node; -rpcif_enable_rpm (rpc); +rpcif_enable_rpm (rpc->dev); ctlr->num_chipselect =1 ; ctlr->mem_ops = &rpcif_spi_mem_ops;
@@ -156,7 +156,7 @@ static int rpcif_spi_probe(struct platform_device *pdev) ctlr->mode_bits =SPI_CPOL |SPI_CPHA |SPI_TX_QUAD |SPI_RX_QUAD ; ctlr->flags =SPI_CONTROLLER_HALF_DUPLEX ; - error =rpcif_hw_init (rpc, false); + error =rpcif_hw_init (rpc->dev, false);if (error) goto out_disable_rpm;
@@ -169,7 +169,7 @@ static int rpcif_spi_probe(struct platform_device *pdev)return 0 ; out_disable_rpm: -rpcif_disable_rpm (rpc); +rpcif_disable_rpm (rpc->dev);return error; }
@@ -179,7 +179,7 @@ static int rpcif_spi_remove(struct platform_device *pdev)struct rpcif *rpc =spi_controller_get_devdata (ctlr);spi_unregister_controller (ctlr); -rpcif_disable_rpm (rpc); +rpcif_disable_rpm (rpc->dev);return 0 ; }
include/memory/renesas-rpc-if.h +8 -8
@@ -69,20 +69,20 @@ struct rpcif { };int rpcif_sw_init (struct rpcif *rpc,struct device *dev); -int rpcif_hw_init (struct rpcif *rpc,bool hyperflash); -void rpcif_prepare (struct rpcif *rpc,const struct rpcif_op *op,u64 *offs, +int rpcif_hw_init (struct device *dev,bool hyperflash); +void rpcif_prepare (struct device *dev,const struct rpcif_op *op,u64 *offs,size_t *len); -int rpcif_manual_xfer (struct rpcif *rpc); -ssize_t rpcif_dirmap_read (struct rpcif *rpc,u64 offs,size_t len,void *buf); +int rpcif_manual_xfer (struct device *dev); +ssize_t rpcif_dirmap_read (struct device *dev,u64 offs,size_t len,void *buf); -static inline void rpcif_enable_rpm (struct rpcif *rpc) +static inline void rpcif_enable_rpm (struct device *dev) { -pm_runtime_enable (rpc->dev); +pm_runtime_enable (dev); } -static inline void rpcif_disable_rpm (struct rpcif *rpc) +static inline void rpcif_disable_rpm (struct device *dev) { -pm_runtime_disable (rpc->dev); +pm_runtime_disable (dev); }#endif // __RENESAS_RPC_IF_H
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 215/772 memory: renesas-rpc-if: Remove Runtime PM wrappers
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 27e5f98c30d73cdb8c8baeaf7d0af19af5266d3a ]
Now the rpcif_{en,dis}able_rpm() wrappers just take a pointer to a device structure, there is no point in keeping them. Remove them, and update the callers to call Runtime PM directly.
Stable-dep-of: 7d189579a287 ("mtd: hyperbus: rpc-if: Add missing MODULE_DEVICE_TABLE")
--- drivers/mtd/hyperbus/rpc-if.c | 6 +++--- drivers/spi/spi-rpc-if.c | 6 +++--- include/memory/renesas-rpc-if.h | 10 ---------- 3 files changed, 6 insertions(+), 16 deletions(-)
drivers/mtd/hyperbus/rpc-if.c +3 -3
@@ -130,7 +130,7 @@ static int rpcif_hb_probe(struct platform_device *pdev)platform_set_drvdata (pdev, hyperbus); -rpcif_enable_rpm (hyperbus->rpc.dev); +pm_runtime_enable (hyperbus->rpc.dev); error =rpcif_hw_init (hyperbus->rpc.dev, true);if (error)
@@ -150,7 +150,7 @@ static int rpcif_hb_probe(struct platform_device *pdev)return 0 ; out_disable_rpm: -rpcif_disable_rpm (hyperbus->rpc.dev); +pm_runtime_disable (hyperbus->rpc.dev);return error; }
@@ -160,7 +160,7 @@ static int rpcif_hb_remove(struct platform_device *pdev)hyperbus_unregister_device (&hyperbus->hbdev); -rpcif_disable_rpm (hyperbus->rpc.dev); +pm_runtime_disable (hyperbus->rpc.dev);return 0 ; }
drivers/spi/spi-rpc-if.c +3 -3
@@ -147,7 +147,7 @@ static int rpcif_spi_probe(struct platform_device *pdev) ctlr->dev.of_node = parent->of_node; -rpcif_enable_rpm (rpc->dev); +pm_runtime_enable (rpc->dev); ctlr->num_chipselect =1 ; ctlr->mem_ops = &rpcif_spi_mem_ops;
@@ -169,7 +169,7 @@ static int rpcif_spi_probe(struct platform_device *pdev)return 0 ; out_disable_rpm: -rpcif_disable_rpm (rpc->dev); +pm_runtime_disable (rpc->dev);return error; }
@@ -179,7 +179,7 @@ static int rpcif_spi_remove(struct platform_device *pdev)struct rpcif *rpc =spi_controller_get_devdata (ctlr);spi_unregister_controller (ctlr); -rpcif_disable_rpm (rpc->dev); +pm_runtime_disable (rpc->dev);return 0 ; }
include/memory/renesas-rpc-if.h +0 -10
@@ -75,14 +75,4 @@ void rpcif_prepare(struct device *dev, const struct rpcif_op *op, u64 *offs,int rpcif_manual_xfer (struct device *dev);ssize_t rpcif_dirmap_read (struct device *dev,u64 offs,size_t len,void *buf); -static inline void rpcif_enable_rpm (struct device *dev) -{ -pm_runtime_enable (dev); -} - -static inline void rpcif_disable_rpm (struct device *dev) -{ -pm_runtime_disable (dev); -} -#endif // __RENESAS_RPC_IF_H
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 216/772 mtd: hyperbus: rpc-if: Convert to platform remove callback returning void
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit baaa90c1c923ff2412fae0162eb66d036fd3be6b ]
The .remove() callback for a platform driver returns an int which makes many driver authors wrongly assume it's possible to do error handling by returning an error code. However the value returned is ignored (apart from emitting a warning) and this typically results in resource leaks.
To improve here there is a quest to make the remove callback return void. In the first step of this quest all drivers are converted to .remove_new(), which already returns void. Eventually after all drivers are converted, .remove_new() will be renamed to .remove().
Trivially convert this driver from always returning zero in the remove callback to the void returning variant.
Stable-dep-of: 7d189579a287 ("mtd: hyperbus: rpc-if: Add missing MODULE_DEVICE_TABLE")
--- drivers/mtd/hyperbus/rpc-if.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/mtd/hyperbus/rpc-if.c +2 -4
@@ -154,20 +154,18 @@ static int rpcif_hb_probe(struct platform_device *pdev)return error; } -static int rpcif_hb_remove (struct platform_device *pdev) +static void rpcif_hb_remove (struct platform_device *pdev) {struct rpcif_hyperbus *hyperbus =platform_get_drvdata (pdev);hyperbus_unregister_device (&hyperbus->hbdev);pm_runtime_disable (hyperbus->rpc.dev); - -return 0 ; }static struct platform_driver rpcif_platform_driver = { .probe = rpcif_hb_probe, - .remove = rpcif_hb_remove, + .remove_new = rpcif_hb_remove, .driver = { .name ="rpc-if-hyperflash" , },
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 217/772 mtd: hyperbus: rpc-if: Add missing MODULE_DEVICE_TABLE
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Biju Das <[email protected]>
[ Upstream commit 7d189579a287d5c568db623c5fc2344cce98a887 ]
The rpc-if-hyperflash driver can be compiled as a module, but lacks MODULE_DEVICE_TABLE() and will therefore not be loaded automatically. Fix this.
--- drivers/mtd/hyperbus/rpc-if.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/mtd/hyperbus/rpc-if.c +7 -0
@@ -163,9 +163,16 @@ static void rpcif_hb_remove(struct platform_device *pdev)pm_runtime_disable (hyperbus->rpc.dev); } +static const struct platform_device_id rpc_if_hyperflash_id_table[] = { + { .name ="rpc-if-hyperflash" }, + {/* sentinel */ } +}; +MODULE_DEVICE_TABLE (platform, rpc_if_hyperflash_id_table); +static struct platform_driver rpcif_platform_driver = { .probe = rpcif_hb_probe, .remove_new = rpcif_hb_remove, + .id_table = rpc_if_hyperflash_id_table, .driver = { .name ="rpc-if-hyperflash" , },
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 218/772 mtd: rawnand: atmel: Fix possible memory leak
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miquel Raynal <[email protected]>
[ Upstream commit 6d734f1bfc336aaea91313a5632f2f197608fadd ]
The pmecc "user" structure is allocated in atmel_pmecc_create_user() and was supposed to be freed with atmel_pmecc_destroy_user(), but this other helper is never called. One solution would be to find the proper location to call the destructor, but the trend today is to switch to device managed allocations, which in this case fits pretty well.
Replace kzalloc() by devm_kzalloc() and drop the destructor entirely.
--- drivers/mtd/nand/raw/atmel/pmecc.c | 8 +------- drivers/mtd/nand/raw/atmel/pmecc.h | 2 -- 2 files changed, 1 insertion(+), 9 deletions(-)
drivers/mtd/nand/raw/atmel/pmecc.c +1 -7
@@ -362,7 +362,7 @@ atmel_pmecc_create_user(struct atmel_pmecc *pmecc, size =ALIGN (size,sizeof (s32)); size += (req->ecc.strength +1 ) *sizeof (s32) *3 ; - user =kzalloc (size,GFP_KERNEL ); + user =devm_kzalloc (pmecc->dev, size,GFP_KERNEL );if (!user)return ERR_PTR (-ENOMEM );
@@ -408,12 +408,6 @@ atmel_pmecc_create_user(struct atmel_pmecc *pmecc, }EXPORT_SYMBOL_GPL (atmel_pmecc_create_user); -void atmel_pmecc_destroy_user (struct atmel_pmecc_user *user) -{ -kfree (user); -} -EXPORT_SYMBOL_GPL (atmel_pmecc_destroy_user); -static int get_strength (struct atmel_pmecc_user *user) {const int *strengths = user->pmecc->caps->strengths;
drivers/mtd/nand/raw/atmel/pmecc.h +0 -2
@@ -55,8 +55,6 @@ struct atmel_pmecc *devm_atmel_pmecc_get(struct device *dev);struct atmel_pmecc_user *atmel_pmecc_create_user (struct atmel_pmecc *pmecc,struct atmel_pmecc_user_req *req); -void atmel_pmecc_destroy_user (struct atmel_pmecc_user *user); -void atmel_pmecc_reset (struct atmel_pmecc *pmecc);int atmel_pmecc_enable (struct atmel_pmecc_user *user,int op);void atmel_pmecc_disable (struct atmel_pmecc_user *user);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 219/772 powerpc/mm/fault: Fix kfence page fault reporting
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ritesh Harjani (IBM) <[email protected]>
[ Upstream commit 06dbbb4d5f7126b6307ab807cbf04ecfc459b933 ]
copy_from_kernel_nofault() can be called when doing read of /proc/kcore. /proc/kcore can have some unmapped kfence objects which when read via copy_from_kernel_nofault() can cause page faults. Since *_nofault() functions define their own fixup table for handling fault, use that instead of asking kfence to handle such faults.
Hence we search the exception tables for the nip which generated the fault. If there is an entry then we let the fixup table handler handle the page fault by returning an error from within ___do_page_fault().
This can be easily triggered if someone tries to do dd from /proc/kcore. eg. dd if=/proc/kcore of=/dev/null bs=1M
Some example false negatives:
===============================
BUG: KFENCE: invalid read in copy_from_kernel_nofault+0x9c/0x1a0 Invalid read at 0xc0000000fdff0000: copy_from_kernel_nofault+0x9c/0x1a0 0xc00000000665f950 read_kcore_iter+0x57c/0xa04 proc_reg_read_iter+0xe4/0x16c vfs_read+0x320/0x3ec ksys_read+0x90/0x154 system_call_exception+0x120/0x310 system_call_vectored_common+0x15c/0x2ec BUG: KFENCE: use-after-free read in copy_from_kernel_nofault+0x9c/0x1a0 Use-after-free read at 0xc0000000fe050000 (in kfence-#2): copy_from_kernel_nofault+0x9c/0x1a0 0xc00000000665f950 read_kcore_iter+0x57c/0xa04 proc_reg_read_iter+0xe4/0x16c vfs_read+0x320/0x3ec ksys_read+0x90/0x154 system_call_exception+0x120/0x310 system_call_vectored_common+0x15c/0x2ec
--- arch/powerpc/mm/fault.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
arch/powerpc/mm/fault.c +8 -2
@@ -431,10 +431,16 @@ static int ___do_page_fault(struct pt_regs *regs, unsigned long address,/* * The kernel should never take an execute fault nor should it * take a page fault to a kernel address or a page fault to a user -* address outside of dedicated places +* address outside of dedicated places. +* +* Rather than kfence directly reporting false negatives, search whether +* the NIP belongs to the fixup table for cases where fault could come +* from functions like copy_from_kernel_nofault(). */ if (unlikely (!is_user &&bad_kernel_fault (regs, error_code, address, is_write))) { -if (kfence_handle_page_fault (address, is_write, regs)) +if (is_kfence_address ((void *)address) && + !search_exception_tables (instruction_pointer (regs)) && +kfence_handle_page_fault (address, is_write, regs))return 0 ;return SIGSEGV ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 220/772 powerpc/pseries: Fix dtl_access_lock to be a rw_semaphore
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Ellerman <[email protected]>
[ Upstream commit cadae3a45d23aa4f6485938a67cbc47aaaa25e38 ]
The dtl_access_lock needs to be a rw_sempahore, a sleeping lock, because the code calls kmalloc() while holding it, which can sleep:
# echo 1 > /proc/powerpc/vcpudispatch_stats
BUG: sleeping function called from invalid context at include/linux/sched/mm.h:337
in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 199, name: sh
preempt_count: 1, expected: 0
3 locks held by sh/199:
#0: c00000000a0743f8 (sb_writers#3){.+.+}-{0:0}, at: vfs_write+0x324/0x438
#1: c0000000028c7058 (dtl_enable_mutex){+.+.}-{3:3}, at: vcpudispatch_stats_write+0xd4/0x5f4
#2: c0000000028c70b8 (dtl_access_lock){+.+.}-{2:2}, at: vcpudispatch_stats_write+0x220/0x5f4
CPU: 0 PID: 199 Comm: sh Not tainted 6.10.0-rc4 #152
Hardware name: IBM pSeries (emulated by qemu) POWER9 (raw) 0x4e1202 0xf000005 of:SLOF,HEAD hv:linux,kvm pSeries
Call Trace:
dump_stack_lvl+0x130/0x148 (unreliable)
__might_resched+0x174/0x410
kmem_cache_alloc_noprof+0x340/0x3d0
alloc_dtl_buffers+0x124/0x1ac
vcpudispatch_stats_write+0x2a8/0x5f4
proc_reg_write+0xf4/0x150
vfs_write+0xfc/0x438
ksys_write+0x88/0x148
system_call_exception+0x1c4/0x5a0
system_call_common+0xf4/0x258--- arch/powerpc/include/asm/dtl.h | 4 ++-- arch/powerpc/platforms/pseries/dtl.c | 8 ++++---- arch/powerpc/platforms/pseries/lpar.c | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-)
arch/powerpc/include/asm/dtl.h +2 -2
@@ -1,8 +1,8 @@#ifndef _ASM_POWERPC_DTL_H#define _ASM_POWERPC_DTL_H +#include <linux/rwsem.h> #include <asm/lppaca.h> -#include <linux/spinlock_types.h> /* * Layout of entries in the hypervisor's dispatch trace log buffer.
@@ -35,7 +35,7 @@ struct dtl_entry {#define DTL_LOG_ALL (DTL_LOG_CEDE | DTL_LOG_PREEMPT | DTL_LOG_FAULT)extern struct kmem_cache *dtl_cache; -extern rwlock_t dtl_access_lock; +extern struct rw_semaphore dtl_access_lock;extern void register_dtl_buffer (int cpu);extern void alloc_dtl_buffers (unsigned long *time_limit);
arch/powerpc/platforms/pseries/dtl.c +4 -4
@@ -191,7 +191,7 @@ static int dtl_enable(struct dtl *dtl)return -EBUSY ;/* ensure there are no other conflicting dtl users */ -if (!read_trylock (&dtl_access_lock)) +if (!down_read_trylock (&dtl_access_lock))return -EBUSY ; n_entries = dtl_buf_entries;
@@ -199,7 +199,7 @@ static int dtl_enable(struct dtl *dtl)if (!buf) {printk (KERN_WARNING "%s: buffer alloc failed for cpu %d\n" , __func__, dtl->cpu); -read_unlock (&dtl_access_lock); +up_read (&dtl_access_lock);return -ENOMEM ; }
@@ -217,7 +217,7 @@ static int dtl_enable(struct dtl *dtl)spin_unlock (&dtl->lock);if (rc) { -read_unlock (&dtl_access_lock); +up_read (&dtl_access_lock);kmem_cache_free (dtl_cache, buf); }
@@ -232,7 +232,7 @@ static void dtl_disable(struct dtl *dtl) dtl->buf =NULL ; dtl->buf_entries =0 ;spin_unlock (&dtl->lock); -read_unlock (&dtl_access_lock); +up_read (&dtl_access_lock); }/* file interface */
arch/powerpc/platforms/pseries/lpar.c +4 -4
@@ -167,7 +167,7 @@ struct vcpu_dispatch_data {*/ #define NR_CPUS_H NR_CPUS -DEFINE_RWLOCK (dtl_access_lock); +DECLARE_RWSEM (dtl_access_lock); static DEFINE_PER_CPU(struct vcpu_dispatch_data, vcpu_disp_data); static DEFINE_PER_CPU(u64, dtl_entry_ridx); static DEFINE_PER_CPU(struct dtl_worker, dtl_workers);
@@ -461,7 +461,7 @@ static int dtl_worker_enable(unsigned long *time_limit) {int rc =0 , state; -if (!write_trylock (&dtl_access_lock)) { +if (!down_write_trylock (&dtl_access_lock)) { rc = -EBUSY ; goto out; }
@@ -477,7 +477,7 @@ static int dtl_worker_enable(unsigned long *time_limit)pr_err ("vcpudispatch_stats: unable to setup workqueue for DTL processing\n" );free_dtl_buffers (time_limit);reset_global_dtl_mask (); -write_unlock (&dtl_access_lock); +up_write (&dtl_access_lock); rc = -EINVAL ; goto out; }
@@ -492,7 +492,7 @@ static void dtl_worker_disable(unsigned long *time_limit)cpuhp_remove_state (dtl_worker_state);free_dtl_buffers (time_limit);reset_global_dtl_mask (); -write_unlock (&dtl_access_lock); +up_write (&dtl_access_lock); } static ssize_t vcpudispatch_stats_write(struct file *file, const char __user *p,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 221/772 cpufreq: CPPC: Fix possible null-ptr-deref for cpufreq_cpu_get_raw()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit a78e7207564258db6e373e86294a85f9d646d35a ]
cpufreq_cpu_get_raw() may return NULL if the cpu is not in policy->cpus cpu mask and it will cause null pointer dereference.
--- drivers/cpufreq/cppc_cpufreq.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/cpufreq/cppc_cpufreq.c +3 -0
@@ -422,6 +422,9 @@ static int cppc_get_cpu_power(struct device *cpu_dev,struct cppc_cpudata *cpu_data; policy =cpufreq_cpu_get_raw (cpu_dev->id); +if (!policy) +return 0 ; + cpu_data = policy->driver_data; perf_caps = &cpu_data->perf_caps; max_cap =arch_scale_cpu_capacity (cpu_dev->id);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 222/772 cpufreq: CPPC: Fix possible null-ptr-deref for cppc_get_cpu_cost()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit 1a1374bb8c5926674973d849feed500bc61ad535 ]
cpufreq_cpu_get_raw() may return NULL if the cpu is not in policy->cpus cpu mask and it will cause null pointer dereference, so check NULL for cppc_get_cpu_cost().
--- drivers/cpufreq/cppc_cpufreq.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/cpufreq/cppc_cpufreq.c +3 -0
@@ -492,6 +492,9 @@ static int cppc_get_cpu_cost(struct device *cpu_dev, unsigned long KHz,int step; policy =cpufreq_cpu_get_raw (cpu_dev->id); +if (!policy) +return 0 ; + cpu_data = policy->driver_data; perf_caps = &cpu_data->perf_caps; max_cap =arch_scale_cpu_capacity (cpu_dev->id);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 223/772 RDMA/hns: Fix an AEQE overflow error caused by untimely update of eq_db_ci
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: wenglianfa <[email protected]>
[ Upstream commit 571e4ab8a45e530623ab129803f090a844dd3fe9 ]
eq_db_ci is updated only after all AEQEs are processed in the AEQ interrupt handler, which is not timely enough and may result in AEQ overflow. Two optimization methods are proposed:
1. Set an upper limit for AEQE processing.
2. Move time-consuming operations such as printings to the bottom half of the interrupt.
cmd events and flush_cqe events are still fully processed in the top half to ensure timely handling.
--- drivers/infiniband/hw/hns/hns_roce_device.h | 1 + drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 75 ++++++++++++++------- drivers/infiniband/hw/hns/hns_roce_hw_v2.h | 5 ++ drivers/infiniband/hw/hns/hns_roce_qp.c | 54 +++++++++------ 4 files changed, 91 insertions(+), 44 deletions(-)
drivers/infiniband/hw/hns/hns_roce_device.h +1 -0
@@ -1228,6 +1228,7 @@ void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn);void hns_roce_cq_event (struct hns_roce_dev *hr_dev,u32 cqn,int event_type);void flush_cqe (struct hns_roce_dev *dev,struct hns_roce_qp *qp);void hns_roce_qp_event (struct hns_roce_dev *hr_dev,u32 qpn,int event_type); +void hns_roce_flush_cqe (struct hns_roce_dev *hr_dev,u32 qpn);void hns_roce_srq_event (struct hns_roce_dev *hr_dev,u32 srqn,int event_type);u8 hns_get_gid_index (struct hns_roce_dev *hr_dev,u32 port,int gid_index);void hns_roce_handle_device_err (struct hns_roce_dev *hr_dev);
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +50 -25
138 lines not on this page · raw message
drivers/infiniband/hw/hns/hns_roce_hw_v2.h +5 -0
@@ -114,6 +114,11 @@#define HNS_ROCE_V2_TABLE_CHUNK_SIZE (1 << 18) +/* budget must be smaller than aeqe_depth to guarantee that we update +* the ci before we polled all the entries in the EQ. +*/ +#define HNS_AEQ_POLLING_BUDGET 64 +enum {HNS_ROCE_CMD_FLAG_IN =BIT (0 ),HNS_ROCE_CMD_FLAG_OUT =BIT (1 ),
drivers/infiniband/hw/hns/hns_roce_qp.c +35 -19
72 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 224/772 RDMA/hns: Add clear_hem return value to log
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chengchang Tang <[email protected]>
[ Upstream commit a519a612a71848b69b70b18b4d14d165b2d8aaf7 ]
Log return value of clear_hem() to help diagnose.
Stable-dep-of: d81fb6511abf ("RDMA/hns: Use dev_* printings in hem code instead of ibdev_*")
--- drivers/infiniband/hw/hns/hns_roce_hem.c | 44 ++++++++++++++++-------- 1 file changed, 30 insertions(+), 14 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hem.c +30 -14
@@ -619,6 +619,7 @@ static void clear_mhop_hem(struct hns_roce_dev *hr_dev,u32 hop_num = mhop->hop_num;u32 chunk_ba_num;u32 step_idx; +int ret; index->inited =HEM_INDEX_BUF ; chunk_ba_num = mhop->bt_chunk_size /BA_BYTE_LEN ;
@@ -642,16 +643,24 @@ static void clear_mhop_hem(struct hns_roce_dev *hr_dev,else step_idx = hop_num; -if (hr_dev->hw->clear_hem (hr_dev, table, obj, step_idx)) -ibdev_warn (ibdev,"failed to clear hop%u HEM.\n" , hop_num); - -if (index->inited &HEM_INDEX_L1 ) -if (hr_dev->hw->clear_hem (hr_dev, table, obj,1 )) -ibdev_warn (ibdev,"failed to clear HEM step 1.\n" ); + ret = hr_dev->hw->clear_hem (hr_dev, table, obj, step_idx); +if (ret) +ibdev_warn (ibdev,"failed to clear hop%u HEM, ret = %d.\n" , + hop_num, ret); + +if (index->inited &HEM_INDEX_L1 ) { + ret = hr_dev->hw->clear_hem (hr_dev, table, obj,1 ); +if (ret) +ibdev_warn (ibdev,"failed to clear HEM step 1, ret = %d.\n" , + ret); + } -if (index->inited &HEM_INDEX_L0 ) -if (hr_dev->hw->clear_hem (hr_dev, table, obj,0 )) -ibdev_warn (ibdev,"failed to clear HEM step 0.\n" ); +if (index->inited &HEM_INDEX_L0 ) { + ret = hr_dev->hw->clear_hem (hr_dev, table, obj,0 ); +if (ret) +ibdev_warn (ibdev,"failed to clear HEM step 0, ret = %d.\n" , + ret); + } } }
@@ -688,6 +697,7 @@ void hns_roce_table_put(struct hns_roce_dev *hr_dev, {struct device *dev = hr_dev->dev;unsigned long i; +int ret;if (hns_roce_check_whether_mhop (hr_dev, table->type)) {hns_roce_table_mhop_put (hr_dev, table, obj,1 );
@@ -700,8 +710,10 @@ void hns_roce_table_put(struct hns_roce_dev *hr_dev, &table->mutex))return ; -if (hr_dev->hw->clear_hem (hr_dev, table, obj,HEM_HOP_STEP_DIRECT )) -dev_warn (dev,"failed to clear HEM base address.\n" ); + ret = hr_dev->hw->clear_hem (hr_dev, table, obj,HEM_HOP_STEP_DIRECT ); +if (ret) +dev_warn (dev,"failed to clear HEM base address, ret = %d.\n" , + ret);hns_roce_free_hem (hr_dev, table->hem[i]); table->hem[i] =NULL ;
@@ -917,6 +929,8 @@ void hns_roce_cleanup_hem_table(struct hns_roce_dev *hr_dev, {struct device *dev = hr_dev->dev;unsigned long i; +int obj; +int ret;if (hns_roce_check_whether_mhop (hr_dev, table->type)) {hns_roce_cleanup_mhop_hem_table (hr_dev, table);
@@ -925,9 +939,11 @@ void hns_roce_cleanup_hem_table(struct hns_roce_dev *hr_dev,for (i =0 ; i < table->num_hem; ++i)if (table->hem[i]) { -if (hr_dev->hw->clear_hem (hr_dev, table, - i * table->table_chunk_size / table->obj_size,0 )) -dev_err (dev,"clear HEM base address failed.\n" ); + obj = i * table->table_chunk_size / table->obj_size; + ret = hr_dev->hw->clear_hem (hr_dev, table, obj,0 ); +if (ret) +dev_err (dev,"clear HEM base address failed, ret = %d.\n" , + ret);hns_roce_free_hem (hr_dev, table->hem[i]); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 225/772 RDMA/hns: Use dev_* printings in hem code instead of ibdev_*
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit d81fb6511abf18591befaa5f4a972ffc838690ec ]
The hem code is executed before ib_dev is registered, so use dev_* printing instead of ibdev_* to avoid log like this:
(null): set HEM address to HW failed!
--- drivers/infiniband/hw/hns/hns_roce_hem.c | 44 ++++++++++++------------ 1 file changed, 22 insertions(+), 22 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hem.c +22 -22
@@ -337,7 +337,7 @@ static int calc_hem_config(struct hns_roce_dev *hr_dev,struct hns_roce_hem_mhop *mhop, struct hns_roce_hem_index *index) { - struct ib_device *ibdev = &hr_dev->ib_dev; + struct device *dev = hr_dev->dev;unsigned long mhop_obj = obj;u32 l0_idx, l1_idx, l2_idx;u32 chunk_ba_num;
@@ -368,14 +368,14 @@ static int calc_hem_config(struct hns_roce_dev *hr_dev, index->buf = l0_idx;break ;default : -ibdev_err (ibdev,"table %u not support mhop.hop_num = %u!\n" , - table->type, mhop->hop_num); +dev_err (dev,"table %u not support mhop.hop_num = %u!\n" , + table->type, mhop->hop_num);return -EINVAL ; }if (unlikely (index->buf >= table->num_hem)) { -ibdev_err (ibdev,"table %u exceed hem limt idx %llu, max %lu!\n" , - table->type, index->buf, table->num_hem); +dev_err (dev,"table %u exceed hem limt idx %llu, max %lu!\n" , + table->type, index->buf, table->num_hem);return -EINVAL ; }
@@ -487,14 +487,14 @@ static int set_mhop_hem(struct hns_roce_dev *hr_dev,struct hns_roce_hem_mhop *mhop, struct hns_roce_hem_index *index) { - struct ib_device *ibdev = &hr_dev->ib_dev; + struct device *dev = hr_dev->dev;u32 step_idx;int ret =0 ;if (index->inited &HEM_INDEX_L0 ) { ret = hr_dev->hw->set_hem (hr_dev, table, obj,0 );if (ret) { -ibdev_err (ibdev,"set HEM step 0 failed!\n" ); +dev_err (dev,"set HEM step 0 failed!\n" ); goto out; } }
@@ -502,7 +502,7 @@ static int set_mhop_hem(struct hns_roce_dev *hr_dev,if (index->inited &HEM_INDEX_L1 ) { ret = hr_dev->hw->set_hem (hr_dev, table, obj,1 );if (ret) { -ibdev_err (ibdev,"set HEM step 1 failed!\n" ); +dev_err (dev,"set HEM step 1 failed!\n" ); goto out; } }
@@ -514,7 +514,7 @@ static int set_mhop_hem(struct hns_roce_dev *hr_dev, step_idx = mhop->hop_num; ret = hr_dev->hw->set_hem (hr_dev, table, obj, step_idx);if (ret) -ibdev_err (ibdev,"set HEM step last failed!\n" ); +dev_err (dev,"set HEM step last failed!\n" ); } out:return ret;
@@ -524,14 +524,14 @@ static int hns_roce_table_mhop_get(struct hns_roce_dev *hr_dev, struct hns_roce_hem_table *table, unsigned long obj) { -struct ib_device *ibdev = &hr_dev->ib_dev;struct hns_roce_hem_index index = {};struct hns_roce_hem_mhop mhop = {}; +struct device *dev = hr_dev->dev;int ret; ret =calc_hem_config (hr_dev, table, obj, &mhop, &index);if (ret) { -ibdev_err (ibdev,"calc hem config failed!\n" ); +dev_err (dev,"calc hem config failed!\n" );return ret; }
@@ -543,7 +543,7 @@ static int hns_roce_table_mhop_get(struct hns_roce_dev *hr_dev, ret =alloc_mhop_hem (hr_dev, table, &mhop, &index);if (ret) { -ibdev_err (ibdev,"alloc mhop hem failed!\n" ); +dev_err (dev,"alloc mhop hem failed!\n" ); goto out; }
@@ -551,7 +551,7 @@ static int hns_roce_table_mhop_get(struct hns_roce_dev *hr_dev,if (table->type <HEM_TYPE_MTT ) { ret =set_mhop_hem (hr_dev, table, obj, &mhop, &index);if (ret) { -ibdev_err (ibdev,"set HEM address to HW failed!\n" ); +dev_err (dev,"set HEM address to HW failed!\n" ); goto err_alloc; } }
@@ -615,7 +615,7 @@ static void clear_mhop_hem(struct hns_roce_dev *hr_dev,struct hns_roce_hem_mhop *mhop, struct hns_roce_hem_index *index) { - struct ib_device *ibdev = &hr_dev->ib_dev; + struct device *dev = hr_dev->dev;u32 hop_num = mhop->hop_num;u32 chunk_ba_num;u32 step_idx;
@@ -645,21 +645,21 @@ static void clear_mhop_hem(struct hns_roce_dev *hr_dev, ret = hr_dev->hw->clear_hem (hr_dev, table, obj, step_idx);if (ret) -ibdev_warn (ibdev,"failed to clear hop%u HEM, ret = %d.\n" , - hop_num, ret); +dev_warn (dev,"failed to clear hop%u HEM, ret = %d.\n" , + hop_num, ret);if (index->inited &HEM_INDEX_L1 ) { ret = hr_dev->hw->clear_hem (hr_dev, table, obj,1 );if (ret) -ibdev_warn (ibdev,"failed to clear HEM step 1, ret = %d.\n" , - ret); +dev_warn (dev,"failed to clear HEM step 1, ret = %d.\n" , + ret); }if (index->inited &HEM_INDEX_L0 ) { ret = hr_dev->hw->clear_hem (hr_dev, table, obj,0 );if (ret) -ibdev_warn (ibdev,"failed to clear HEM step 0, ret = %d.\n" , - ret); +dev_warn (dev,"failed to clear HEM step 0, ret = %d.\n" , + ret); } } }
@@ -669,14 +669,14 @@ static void hns_roce_table_mhop_put(struct hns_roce_dev *hr_dev, unsigned long obj, int check_refcount) { -struct ib_device *ibdev = &hr_dev->ib_dev;struct hns_roce_hem_index index = {};struct hns_roce_hem_mhop mhop = {}; +struct device *dev = hr_dev->dev;int ret; ret =calc_hem_config (hr_dev, table, obj, &mhop, &index);if (ret) { -ibdev_err (ibdev,"calc hem config failed!\n" ); +dev_err (dev,"calc hem config failed!\n" );return ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 226/772 RDMA/hns: Remove unnecessary QP type checks
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit b9989ab3f61ec459cbaf0a492fea3168bbfa4c7a ]
It is not necessary to check the type of the queue on IO path because unsupported QP type cannot be created.
Stable-dep-of: 323275ac2ff1 ("RDMA/hns: Fix cpu stuck caused by printings during reset")
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 24 +++------------------- 1 file changed, 3 insertions(+), 21 deletions(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +3 -21
@@ -373,17 +373,10 @@ static int check_send_valid(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp) {struct ib_device *ibdev = &hr_dev->ib_dev; -struct ib_qp *ibqp = &hr_qp->ibqp; -if (unlikely (ibqp->qp_type !=IB_QPT_RC && - ibqp->qp_type !=IB_QPT_GSI && - ibqp->qp_type !=IB_QPT_UD )) { -ibdev_err (ibdev,"not supported QP(0x%x)type!\n" , - ibqp->qp_type); -return -EOPNOTSUPP ; - }else if (unlikely (hr_qp->state ==IB_QPS_RESET || - hr_qp->state ==IB_QPS_INIT || - hr_qp->state ==IB_QPS_RTR )) { +if (unlikely (hr_qp->state ==IB_QPS_RESET || + hr_qp->state ==IB_QPS_INIT || + hr_qp->state ==IB_QPS_RTR )) {ibdev_err (ibdev,"failed to post WQE, QP state %u!\n" , hr_qp->state);return -EINVAL ;
@@ -777,17 +770,6 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp,static int check_recv_valid (struct hns_roce_dev *hr_dev,struct hns_roce_qp *hr_qp) { -struct ib_device *ibdev = &hr_dev->ib_dev; -struct ib_qp *ibqp = &hr_qp->ibqp; - -if (unlikely (ibqp->qp_type !=IB_QPT_RC && - ibqp->qp_type !=IB_QPT_GSI && - ibqp->qp_type !=IB_QPT_UD )) { -ibdev_err (ibdev,"unsupported qp type, qp_type = %d.\n" , - ibqp->qp_type); -return -EOPNOTSUPP ; - } -if (unlikely (hr_dev->state >=HNS_ROCE_DEVICE_STATE_RST_DOWN ))return -EIO ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 227/772 RDMA/hns: Fix cpu stuck caused by printings during reset
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: wenglianfa <[email protected]>
[ Upstream commit 323275ac2ff15b2b7b3eac391ae5d8c5a3c3a999 ]
During reset, cmd to destroy resources such as qp, cq, and mr may fail, and error logs will be printed. When a large number of resources are destroyed, there will be lots of printings, and it may lead to a cpu stuck.
Delete some unnecessary printings and replace other printing functions in these paths with the ratelimited version.
--- drivers/infiniband/hw/hns/hns_roce_cq.c | 4 +- drivers/infiniband/hw/hns/hns_roce_hem.c | 4 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 73 ++++++++++------------ drivers/infiniband/hw/hns/hns_roce_mr.c | 4 +- drivers/infiniband/hw/hns/hns_roce_srq.c | 4 +- 5 files changed, 41 insertions(+), 48 deletions(-)
drivers/infiniband/hw/hns/hns_roce_cq.c +2 -2
@@ -180,8 +180,8 @@ static void free_cqc(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq) ret =hns_roce_destroy_hw_ctx (hr_dev,HNS_ROCE_CMD_DESTROY_CQC , hr_cq->cqn);if (ret) -dev_err (dev,"DESTROY_CQ failed (%d) for CQN %06lx\n" , ret, - hr_cq->cqn); +dev_err_ratelimited (dev,"DESTROY_CQ failed (%d) for CQN %06lx\n" , + ret, hr_cq->cqn);xa_erase_irq (&cq_table->array, hr_cq->cqn);
drivers/infiniband/hw/hns/hns_roce_hem.c +2 -2
@@ -712,8 +712,8 @@ void hns_roce_table_put(struct hns_roce_dev *hr_dev, ret = hr_dev->hw->clear_hem (hr_dev, table, obj,HEM_HOP_STEP_DIRECT );if (ret) -dev_warn (dev,"failed to clear HEM base address, ret = %d.\n" , - ret); +dev_warn_ratelimited (dev,"failed to clear HEM base address, ret = %d.\n" , + ret);hns_roce_free_hem (hr_dev, table->hem[i]); table->hem[i] =NULL ;
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +33 -40
160 lines not on this page · raw message
drivers/infiniband/hw/hns/hns_roce_mr.c +2 -2
@@ -130,8 +130,8 @@ static void hns_roce_mr_free(struct hns_roce_dev *hr_dev, struct hns_roce_mr *mrkey_to_hw_index (mr->key) & (hr_dev->caps.num_mtpts - 1));if (ret) -ibdev_warn (ibdev,"failed to destroy mpt, ret = %d.\n" , - ret); +ibdev_warn_ratelimited (ibdev,"failed to destroy mpt, ret = %d.\n" , + ret); }free_mr_pbl (hr_dev, mr);
drivers/infiniband/hw/hns/hns_roce_srq.c +2 -2
@@ -150,8 +150,8 @@ static void free_srqc(struct hns_roce_dev *hr_dev, struct hns_roce_srq *srq) ret =hns_roce_destroy_hw_ctx (hr_dev,HNS_ROCE_CMD_DESTROY_SRQ , srq->srqn);if (ret) -dev_err (hr_dev->dev,"DESTROY_SRQ failed (%d) for SRQN %06lx\n" , - ret, srq->srqn); +dev_err_ratelimited (hr_dev->dev,"DESTROY_SRQ failed (%d) for SRQN %06lx\n" , + ret, srq->srqn);xa_erase_irq (&srq_table->xa, srq->srqn);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 228/772 RDMA/bnxt_re: Check cqe flags to know imm_data vs inv_irkey
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kashyap Desai <[email protected]>
[ Upstream commit 808ca6de989c598bc5af1ae0ad971a66077efac0 ]
Invalidate rkey is cpu endian and immediate data is in big endian format. Both immediate data and invalidate the remote key returned by HW is in little endian format.
While handling the commit in fixes tag, the difference between immediate data and invalidate rkey endianness was not considered.
Without changes of this patch, Kernel ULP was failing while processing inv_rkey.
dmesg log snippet -
nvme nvme0: Bogus remote invalidation for rkey 0x2000019Fix in this patch
Do endianness conversion based on completion queue entry flag. Also, the HW completions are already converted to host endianness in bnxt_qplib_cq_process_res_rc and bnxt_qplib_cq_process_res_ud and there is no need to convert it again in bnxt_re_poll_cq. Modified the union to hold the correct data type.
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 7 +++++-- drivers/infiniband/hw/bnxt_re/qplib_fp.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +5 -2
@@ -3340,7 +3340,7 @@ static void bnxt_re_process_res_shadow_qp_wc(struct bnxt_re_qp *gsi_sqp, wc->byte_len = orig_cqe->length; wc->qp = &gsi_qp->ib_qp; - wc->ex.imm_data =cpu_to_be32 (le32_to_cpu (orig_cqe->immdata)); + wc->ex.imm_data =cpu_to_be32 (orig_cqe->immdata); wc->src_qp = orig_cqe->src_qp;memcpy (wc->smac, orig_cqe->smac,ETH_ALEN );if (bnxt_re_is_vlan_pkt (orig_cqe, &vlan_id, &sl)) {
@@ -3476,7 +3476,10 @@ int bnxt_re_poll_cq(struct ib_cq *ib_cq, int num_entries, struct ib_wc *wc) (unsigned long )(cqe->qp_handle), struct bnxt_re_qp, qplib_qp); wc->qp = &qp->ib_qp; - wc->ex.imm_data =cpu_to_be32 (le32_to_cpu (cqe->immdata)); +if (cqe->flags &CQ_RES_RC_FLAGS_IMM ) + wc->ex.imm_data =cpu_to_be32 (cqe->immdata); +else + wc->ex.invalidate_rkey = cqe->invrkey; wc->src_qp = cqe->src_qp;memcpy (wc->smac, cqe->smac,ETH_ALEN ); wc->port_num =1 ;
drivers/infiniband/hw/bnxt_re/qplib_fp.h +1 -1
@@ -374,7 +374,7 @@ struct bnxt_qplib_cqe {u16 cfa_meta;u64 wr_id;union { -__le32 immdata; +u32 immdata;u32 invrkey; };u64 qp_handle;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 229/772 clk: sunxi-ng: d1: Fix PLL_AUDIO0 preset
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andre Przywara <[email protected]>
[ Upstream commit e0f253a52ccee3cf3eb987e99756e20c68a1aac9 ]
To work around a limitation in our clock modelling, we try to force two bits in the AUDIO0 PLL to 0, in the CCU probe routine. However the ~ operator only applies to the first expression, and does not cover the second bit, so we end up clearing only bit 1.
Group the bit-ORing with parentheses, to make it both clearer to read and actually correct.
--- drivers/clk/sunxi-ng/ccu-sun20i-d1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/sunxi-ng/ccu-sun20i-d1.c +1 -1
@@ -1360,7 +1360,7 @@ static int sun20i_d1_ccu_probe(struct platform_device *pdev)/* Enforce m1 = 0, m0 = 0 for PLL_AUDIO0 */ val =readl (reg +SUN20I_D1_PLL_AUDIO0_REG ); - val &= ~BIT (1 ) |BIT (0 ); + val &= ~(BIT (1 ) |BIT (0 ));writel (val, reg +SUN20I_D1_PLL_AUDIO0_REG );/* Force fanout-27M factor N to 0. */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 230/772 clk: renesas: rzg2l: Fix FOUTPOSTDIV clk
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Biju Das <[email protected]>
[ Upstream commit dabf72b85f298970e86891b5218459c17b57b26a ]
While computing foutpostdiv_rate, the value of params->pl5_fracin is discarded, which results in the wrong refresh rate. Fix the formula for computing foutpostdiv_rate.
--- drivers/clk/renesas/rzg2l-cpg.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/clk/renesas/rzg2l-cpg.c +6 -5
@@ -289,7 +289,7 @@ static unsigned long rzg2l_cpg_get_foutpostdiv_rate(struct rzg2l_pll5_param *params, unsigned long rate) { -unsigned long foutpostdiv_rate; +unsigned long foutpostdiv_rate, foutvco_rate; params->pl5_intin = rate /MEGA ; params->pl5_fracin =div_u64 (((u64 )rate %MEGA ) <<24 ,MEGA );
@@ -298,10 +298,11 @@ rzg2l_cpg_get_foutpostdiv_rate(struct rzg2l_pll5_param *params, params->pl5_postdiv2 =1 ; params->pl5_spread =0x16 ; - foutpostdiv_rate = -EXTAL_FREQ_IN_MEGA_HZ *MEGA / params->pl5_refdiv * - ((((params->pl5_intin <<24 ) + params->pl5_fracin)) >>24 ) / - (params->pl5_postdiv1 * params->pl5_postdiv2); + foutvco_rate =div_u64 (mul_u32_u32 (EXTAL_FREQ_IN_MEGA_HZ *MEGA , + (params->pl5_intin <<24 ) + params->pl5_fracin), + params->pl5_refdiv) >>24 ; + foutpostdiv_rate =DIV_ROUND_CLOSEST_ULL (foutvco_rate, + params->pl5_postdiv1 * params->pl5_postdiv2);return foutpostdiv_rate; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 231/772 clk: imx: lpcg-scu: SW workaround for errata (e10858)
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 5ee063fac85656bea9cfe3570af147ba1701ba18 ]
Back-to-back LPCG writes can be ignored by the LPCG register due to a HW bug. The writes need to be separated by at least 4 cycles of the gated clock. See https://www.nxp.com.cn/docs/en/errata/IMX8_1N94W.pdf
The workaround is implemented as follows:
1. For clocks running greater than or equal to 24MHz, a read followed by the write will provide sufficient delay.
2. For clocks running below 24MHz, add a delay of 4 clock cylces after the write to the LPCG register.
--- drivers/clk/imx/clk-lpcg-scu.c | 37 ++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-)
drivers/clk/imx/clk-lpcg-scu.c +29 -8
@@ -6,10 +6,12 @@#include <linux/bits.h> #include <linux/clk-provider.h> +#include <linux/delay.h> #include <linux/err.h> #include <linux/io.h> #include <linux/slab.h> #include <linux/spinlock.h> +#include <linux/units.h> #include "clk-scu.h"
@@ -41,6 +43,29 @@ struct clk_lpcg_scu {#define to_clk_lpcg_scu (_hw) container_of(_hw, struct clk_lpcg_scu, hw) +/* e10858 -LPCG clock gating register synchronization errata */ +static void lpcg_e10858_writel (unsigned long rate,void __iomem *reg,u32 val) +{ +writel (val, reg); + +if (rate >=24 *HZ_PER_MHZ || rate ==0 ) { +/* +* The time taken to access the LPCG registers from the AP core +* through the interconnect is longer than the minimum delay +* of 4 clock cycles required by the errata. +* Adding a readl will provide sufficient delay to prevent +* back-to-back writes. +*/ +readl (reg); + }else { +/* +* For clocks running below 24MHz, wait a minimum of +* 4 clock cycles. +*/ +ndelay (4 * (DIV_ROUND_UP (1000 *HZ_PER_MHZ , rate))); + } +} +static int clk_lpcg_scu_enable (struct clk_hw *hw) {struct clk_lpcg_scu *clk =to_clk_lpcg_scu (hw);
@@ -57,7 +82,8 @@ static int clk_lpcg_scu_enable(struct clk_hw *hw) val |=CLK_GATE_SCU_LPCG_HW_SEL ; reg |= val << clk->bit_idx; -writel (reg, clk->reg); + +lpcg_e10858_writel (clk_hw_get_rate (hw), clk->reg, reg);spin_unlock_irqrestore (&imx_lpcg_scu_lock, flags);
@@ -74,7 +100,7 @@ static void clk_lpcg_scu_disable(struct clk_hw *hw) reg =readl_relaxed (clk->reg); reg &= ~(CLK_GATE_SCU_LPCG_MASK << clk->bit_idx); -writel (reg, clk->reg); +lpcg_e10858_writel (clk_hw_get_rate (hw), clk->reg, reg);spin_unlock_irqrestore (&imx_lpcg_scu_lock, flags); }
@@ -145,13 +171,8 @@ static int __maybe_unused imx_clk_lpcg_scu_resume(struct device *dev) {struct clk_lpcg_scu *clk =dev_get_drvdata (dev); -/* -* FIXME: Sometimes writes don't work unless the CPU issues -* them twice -*/ - -writel (clk->state, clk->reg);writel (clk->state, clk->reg); +lpcg_e10858_writel (0 , clk->reg, clk->state);dev_dbg (dev,"restore lpcg state 0x%x\n" , clk->state);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 232/772 clk: imx: fracn-gppll: correct PLL initialization flow
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 557be501c38e1864b948fc6ccdf4b035d610a2ea ]
Per i.MX93 Reference Mannual 22.4 Initialization information
1. Program appropriate value of DIV[ODIV], DIV[RDIV] and DIV[MFI] as per Integer mode.
2. Wait for 5 μs.
3. Program the following field in CTRL register.
Set CTRL[POWERUP] to 1'b1 to enable PLL block.
4. Poll PLL_STATUS[PLL_LOCK] register, and wait till PLL_STATUS[PLL_LOCK] is 1'b1 and pll_lock output signal is 1'b1.
5. Set CTRL[CLKMUX_EN] to 1'b1 to enable PLL output clock.
So move the CLKMUX_EN operation after PLL locked.
--- drivers/clk/imx/clk-fracn-gppll.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/clk/imx/clk-fracn-gppll.c +3 -3
@@ -299,13 +299,13 @@ static int clk_fracn_gppll_prepare(struct clk_hw *hw) val |=POWERUP_MASK ;writel_relaxed (val, pll->base +PLL_CTRL ); - val |=CLKMUX_EN ; -writel_relaxed (val, pll->base +PLL_CTRL ); - ret =clk_fracn_gppll_wait_lock (pll);if (ret)return ret; + val |=CLKMUX_EN ; +writel_relaxed (val, pll->base +PLL_CTRL ); + val &= ~CLKMUX_BYPASS ;writel_relaxed (val, pll->base +PLL_CTRL );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 233/772 clk: imx: fracn-gppll: fix pll power up
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit ff4279618f0aec350b0fb41b2b35841324fbd96e ]
To i.MX93 which features dual Cortex-A55 cores and DSU, when using writel_relaxed to write value to PLL registers, the value might be buffered. To make sure the value has been written into the hardware, using readl to read back the register could achieve the goal.
current PLL power up flow can be simplified as below:
1. writel_relaxed to set the PLL POWERUP bit;
2. readl_poll_timeout to check the PLL lock bit:
a). timeout = ktime_add_us(ktime_get(), timeout_us); b). readl the pll the lock reg;
c). check if the pll lock bit ready
d). check if timeout
But in some corner cases, both the write in step 1 and read in step 2 will be blocked by other bus transaction in the SoC for a long time, saying the value into real hardware is just before step b). That means the timeout counting has begins for quite sometime since step a), but value still not written into real hardware until bus released just at a point before step b).
Then there maybe chances that the pll lock bit is not ready when readl done but the timeout happens. readl_poll_timeout will err return due to timeout. To avoid such unexpected failure, read back the reg to make sure the write has been done in HW reg.
So use readl after writel_relaxed to fix the issue.
Since we are here, to avoid udelay to run before writel_relaxed, use readl before udelay.
--- drivers/clk/imx/clk-fracn-gppll.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/clk/imx/clk-fracn-gppll.c +4 -0
@@ -250,9 +250,11 @@ static int clk_fracn_gppll_set_rate(struct clk_hw *hw, unsigned long drate, pll_div =FIELD_PREP (PLL_RDIV_MASK , rate->rdiv) | rate->odiv |FIELD_PREP (PLL_MFI_MASK , rate->mfi);writel_relaxed (pll_div, pll->base +PLL_DIV ); +readl (pll->base +PLL_DIV );if (pll->flags &CLK_FRACN_GPPLL_FRACN ) {writel_relaxed (rate->mfd, pll->base +PLL_DENOMINATOR );writel_relaxed (FIELD_PREP (PLL_MFN_MASK , rate->mfn), pll->base +PLL_NUMERATOR ); +readl (pll->base +PLL_NUMERATOR ); }/* Wait for 5us according to fracn mode pll doc */
@@ -261,6 +263,7 @@ static int clk_fracn_gppll_set_rate(struct clk_hw *hw, unsigned long drate,/* Enable Powerup */ tmp |=POWERUP_MASK ;writel_relaxed (tmp, pll->base +PLL_CTRL ); +readl (pll->base +PLL_CTRL );/* Wait Lock */ ret =clk_fracn_gppll_wait_lock (pll);
@@ -298,6 +301,7 @@ static int clk_fracn_gppll_prepare(struct clk_hw *hw) val |=POWERUP_MASK ;writel_relaxed (val, pll->base +PLL_CTRL ); +readl (pll->base +PLL_CTRL ); ret =clk_fracn_gppll_wait_lock (pll);if (ret)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 234/772 clk: imx: clk-scu: fix clk enable state save and restore
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dong Aisheng <[email protected]>
[ Upstream commit e81361f6cf9bf4a1848b0813bc4becb2250870b8 ]
The scu clk_ops only inplements prepare() and unprepare() callback. Saving the clock state during suspend by checking clk_hw_is_enabled() is not safe as it's possible that some device drivers may only disable the clocks without unprepare. Then the state retention will not work for such clocks.
Fixing it by checking clk_hw_is_prepared() which is more reasonable and safe.
--- drivers/clk/imx/clk-scu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/imx/clk-scu.c +1 -1
@@ -577,7 +577,7 @@ static int __maybe_unused imx_clk_scu_suspend(struct device *dev) clk->rate =clk_scu_recalc_rate (&clk->hw,0 ); else clk->rate = clk_hw_get_rate(&clk->hw); - clk->is_enabled =clk_hw_is_enabled (&clk->hw); + clk->is_enabled =clk_hw_is_prepared (&clk->hw);if (clk->parent) dev_dbg(dev, "save parent %s idx %u\n", clk_hw_get_name(clk->parent),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 235/772 iommu/vt-d: Fix checks and print in dmar_fault_dump_ptes()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhenzhong Duan <[email protected]>
[ Upstream commit 6ceb93f952f6ca34823ce3650c902c31b8385b40 ]
There are some issues in dmar_fault_dump_ptes():
1. return value of phys_to_virt() is used for checking if an entry is present.
2. dump is confusing, e.g., "pasid table entry is not present", confusing by unpresent pasid table vs. unpresent pasid table entry. Current code means the former.
3. pgtable_walk() is called without checking if page table is present.
Fix 1 by checking present bit of an entry before dump a lower level entry. Fix 2 by removing "entry" string, e.g., "pasid table is not present". Fix 3 by checking page table present before walk.
Take issue 3 for example, before fix:
[ 442.240357] DMAR: pasid dir entry: 0x000000012c83e001 [ 442.246661] DMAR: pasid table entry[0]: 0x0000000000000000 [ 442.253429] DMAR: pasid table entry[1]: 0x0000000000000000 [ 442.260203] DMAR: pasid table entry[2]: 0x0000000000000000 [ 442.266969] DMAR: pasid table entry[3]: 0x0000000000000000 [ 442.273733] DMAR: pasid table entry[4]: 0x0000000000000000 [ 442.280479] DMAR: pasid table entry[5]: 0x0000000000000000 [ 442.287234] DMAR: pasid table entry[6]: 0x0000000000000000 [ 442.293989] DMAR: pasid table entry[7]: 0x0000000000000000 [ 442.300742] DMAR: PTE not present at level 2
After fix:
...
[ 357.241214] DMAR: pasid table entry[6]: 0x0000000000000000 [ 357.248022] DMAR: pasid table entry[7]: 0x0000000000000000 [ 357.254824] DMAR: scalable mode page table is not present
--- drivers/iommu/intel/iommu.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-)
drivers/iommu/intel/iommu.c +20 -9
@@ -861,11 +861,11 @@ void dmar_fault_dump_ptes(struct intel_iommu *iommu, u16 source_id,pr_info ("Dump %s table entries for IOVA 0x%llx\n" , iommu->name, addr);/* root entry dump */ - rt_entry = &iommu->root_entry[bus]; -if (!rt_entry) { -pr_info ("root table entry is not present\n" ); +if (!iommu->root_entry) { +pr_info ("root table is not present\n" );return ; } + rt_entry = &iommu->root_entry[bus];if (sm_supported (iommu)) pr_info("scalable mode root entry: hi 0x%016llx, low 0x%016llx\n",
@@ -876,7 +876,7 @@ void dmar_fault_dump_ptes(struct intel_iommu *iommu, u16 source_id,/* context entry dump */ ctx_entry =iommu_context_addr (iommu, bus, devfn,0 );if (!ctx_entry) { -pr_info ("context table entry is not present\n" ); +pr_info ("context table is not present\n" );return ; }
@@ -885,17 +885,23 @@ void dmar_fault_dump_ptes(struct intel_iommu *iommu, u16 source_id,/* legacy mode does not require PASID entries */ if (!sm_supported (iommu)) { +if (!context_present (ctx_entry)) { +pr_info ("legacy mode page table is not present\n" ); +return ; + } level =agaw_to_level (ctx_entry->hi &7 ); pgtable =phys_to_virt (ctx_entry->lo &VTD_PAGE_MASK ); goto pgtable_walk; } -/* get the pointer to pasid directory entry */ - dir =phys_to_virt (ctx_entry->lo &VTD_PAGE_MASK ); -if (!dir) { -pr_info ("pasid directory entry is not present\n" ); +if (!context_present (ctx_entry)) { +pr_info ("pasid directory table is not present\n" );return ; } + +/* get the pointer to pasid directory entry */ + dir =phys_to_virt (ctx_entry->lo &VTD_PAGE_MASK ); +/* For request-without-pasid, get the pasid from context entry */ if (intel_iommu_sm && pasid ==INVALID_IOASID ) pasid =PASID_RID2PASID ;
@@ -907,7 +913,7 @@ void dmar_fault_dump_ptes(struct intel_iommu *iommu, u16 source_id,/* get the pointer to the pasid table entry */ entries =get_pasid_table_from_pde (pde);if (!entries) { -pr_info ("pasid table entry is not present\n" ); +pr_info ("pasid table is not present\n" );return ; } index = pasid &PASID_PTE_MASK ;
@@ -915,6 +921,11 @@ void dmar_fault_dump_ptes(struct intel_iommu *iommu, u16 source_id,for (i =0 ; i <ARRAY_SIZE (pte->val); i++)pr_info ("pasid table entry[%d]: 0x%016llx\n" , i, pte->val[i]); +if (!pasid_pte_is_present (pte)) { +pr_info ("scalable mode page table is not present\n" ); +return ; + } +if (pasid_pte_get_pgtt (pte) ==PASID_ENTRY_PGTT_FL_ONLY ) { level = pte->val[2 ] &BIT_ULL (2 ) ?5 :4 ; pgtable =phys_to_virt (pte->val[2 ] &VTD_PAGE_MASK );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 236/772 iommu/vt-d: Fix checks and print in pgtable_walk()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhenzhong Duan <[email protected]>
[ Upstream commit f1645676f25d2c846798f0233c3a953efd62aafb ]
There are some issues in pgtable_walk():
1. Super page is dumped as non-present page
2. dma_pte_superpage() should not check against leaf page table entries
3. Pointer pte is never NULL so checking it is meaningless
4. When an entry is not present, it still makes sense to dump the entry content.
Fix 1,2 by checking dma_pte_superpage()'s returned value after level check. Fix 3 by removing pte check.
Fix 4 by checking present bit after printing.
By this chance, change to print "page table not present" instead of "PTE not present" to be clearer.
--- drivers/iommu/intel/iommu.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/iommu/intel/iommu.c +6 -5
@@ -831,14 +831,15 @@ static void pgtable_walk(struct intel_iommu *iommu, unsigned long pfn,while (1 ) { offset =pfn_level_offset (pfn, level); pte = &parent[offset]; -if (!pte || (dma_pte_superpage (pte) || !dma_pte_present (pte))) { -pr_info ("PTE not present at level %d\n" , level); -break ; - }pr_info ("pte level: %d, pte value: 0x%016llx\n" , level, pte->val); -if (level ==1 ) +if (!dma_pte_present (pte)) { +pr_info ("page table not present at level %d\n" , level -1 ); +break ; + } + +if (level ==1 ||dma_pte_superpage (pte))break ; parent =phys_to_virt (dma_pte_addr (pte));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 237/772 mfd: rt5033: Fix missing regmap_del_irq_chip()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Changzhong <[email protected]>
[ Upstream commit d256d612f47529ed0b332298e2d5ea981a4dd5b8 ]
Fix missing call to regmap_del_irq_chip() in error handling path by using devm_regmap_add_irq_chip().
--- drivers/mfd/rt5033.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mfd/rt5033.c +2 -2
@@ -82,8 +82,8 @@ static int rt5033_i2c_probe(struct i2c_client *i2c, }dev_info (&i2c->dev,"Device found Device ID: %04x\n" , dev_id); - ret =regmap_add_irq_chip (rt5033->regmap, rt5033->irq, -IRQF_TRIGGER_FALLING |IRQF_ONESHOT , + ret =devm_regmap_add_irq_chip (rt5033->dev, rt5033->regmap, + rt5033->irq,IRQF_TRIGGER_FALLING |IRQF_ONESHOT ,0 , &rt5033_irq_chip, &rt5033->irq_data);if (ret) { dev_err(&i2c->dev, "Failed to request IRQ %d: %d\n",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 238/772 fs/proc/kcore.c: fix coccinelle reported ERROR instances
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mirsad Todorovac <[email protected]>
[ Upstream commit 82e33f249f1126cf3c5f39a31b850d485ac33bc3 ]
Coccinelle complains about the nested reuse of the pointer `iter' with different pointer type:
./fs/proc/kcore.c:515:26-30: ERROR: invalid reference to the index variable of the iterator on line 499 ./fs/proc/kcore.c:534:23-27: ERROR: invalid reference to the index variable of the iterator on line 499 ./fs/proc/kcore.c:550:40-44: ERROR: invalid reference to the index variable of the iterator on line 499 ./fs/proc/kcore.c:568:27-31: ERROR: invalid reference to the index variable of the iterator on line 499 ./fs/proc/kcore.c:581:28-32: ERROR: invalid reference to the index variable of the iterator on line 499 ./fs/proc/kcore.c:599:27-31: ERROR: invalid reference to the index variable of the iterator on line 499 ./fs/proc/kcore.c:607:38-42: ERROR: invalid reference to the index variable of the iterator on line 499 ./fs/proc/kcore.c:614:26-30: ERROR: invalid reference to the index variable of the iterator on line 499
Replacing struct kcore_list *iter' with struct kcore_list *tmp' doesn't change the scope and the functionality is the same and coccinelle seems happy.
NOTE: There was an issue with using `struct kcore_list *pos' as the nested iterator.
The build did not work!
--- fs/proc/kcore.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
fs/proc/kcore.c +5 -5
@@ -496,13 +496,13 @@ read_kcore_iter(struct kiocb *iocb, struct iov_iter *iter)* the previous entry, search for a matching entry. */ if (!m || start < m->addr || start >= m->addr + m->size) { -struct kcore_list *iter; +struct kcore_list *pos; m =NULL ; -list_for_each_entry (iter, &kclist_head, list) { -if (start >= iter->addr && - start < iter->addr + iter->size) { - m = iter; +list_for_each_entry (pos, &kclist_head, list) { +if (start >= pos->addr && + start < pos->addr + pos->size) { + m = pos;break ; } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 239/772 scsi: bfa: Fix use-after-free in bfad_im_module_exit()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ye Bin <[email protected]>
[ Upstream commit 178b8f38932d635e90f5f0e9af1986c6f4a89271 ]
BUG: KASAN: slab-use-after-free in __lock_acquire+0x2aca/0x3a20 Read of size 8 at addr ffff8881082d80c8 by task modprobe/25303 Call Trace: <TASK> dump_stack_lvl+0x95/0xe0 print_report+0xcb/0x620 kasan_report+0xbd/0xf0 __lock_acquire+0x2aca/0x3a20 lock_acquire+0x19b/0x520 _raw_spin_lock+0x2b/0x40 attribute_container_unregister+0x30/0x160 fc_release_transport+0x19/0x90 [scsi_transport_fc] bfad_im_module_exit+0x23/0x60 [bfa] bfad_init+0xdb/0xff0 [bfa] do_one_initcall+0xdc/0x550 do_init_module+0x22d/0x6b0 load_module+0x4e96/0x5ff0 init_module_from_file+0xcd/0x130 idempotent_init_module+0x330/0x620 __x64_sys_finit_module+0xb3/0x110 do_syscall_64+0xc1/0x1d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f </TASK> Allocated by task 25303: kasan_save_stack+0x24/0x50 kasan_save_track+0x14/0x30 __kasan_kmalloc+0x7f/0x90 fc_attach_transport+0x4f/0x4740 [scsi_transport_fc] bfad_im_module_init+0x17/0x80 [bfa] bfad_init+0x23/0xff0 [bfa] do_one_initcall+0xdc/0x550 do_init_module+0x22d/0x6b0 load_module+0x4e96/0x5ff0 init_module_from_file+0xcd/0x130 idempotent_init_module+0x330/0x620 __x64_sys_finit_module+0xb3/0x110 do_syscall_64+0xc1/0x1d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f Freed by task 25303: kasan_save_stack+0x24/0x50 kasan_save_track+0x14/0x30 kasan_save_free_info+0x3b/0x60 __kasan_slab_free+0x38/0x50 kfree+0x212/0x480 bfad_im_module_init+0x7e/0x80 [bfa] bfad_init+0x23/0xff0 [bfa] do_one_initcall+0xdc/0x550 do_init_module+0x22d/0x6b0 load_module+0x4e96/0x5ff0 init_module_from_file+0xcd/0x130 idempotent_init_module+0x330/0x620 __x64_sys_finit_module+0xb3/0x110 do_syscall_64+0xc1/0x1d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f
Above issue happens as follows:
bfad_init
error = bfad_im_module_init()
fc_release_transport(bfad_im_scsi_transport_template);
if (error)
goto ext;ext:
bfad_im_module_exit();
fc_release_transport(bfad_im_scsi_transport_template);
--> Trigger double releaseDon't call bfad_im_module_exit() if bfad_im_module_init() failed.
--- drivers/scsi/bfa/bfad.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/bfa/bfad.c +1 -2
@@ -1699,9 +1699,8 @@ bfad_init(void) error =bfad_im_module_init ();if (error) { - error = -ENOMEM ;printk (KERN_WARNING "bfad_im_module_init failure\n" ); - goto ext; +return -ENOMEM ; }if (strcmp (FCPI_NAME ," fcpim" ) ==0 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 240/772 scsi: fusion: Remove unused variable rc
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zeng Heng <[email protected]>
[ Upstream commit bd65694223f7ad11c790ab63ad1af87a771192ee ]
The return value of scsi_device_reprobe() is currently ignored in _scsih_reprobe_lun(). Fixing the calling code to deal with the potential error is non-trivial, so for now just WARN_ON().
The handling of scsi_device_reprobe()'s return value refers to _scsih_reprobe_lun() and the following link:
--- drivers/message/fusion/mptsas.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/message/fusion/mptsas.c +1 -3
@@ -4234,10 +4234,8 @@ mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER *ioc, u8 phys_disk_num,static void mptsas_reprobe_lun (struct scsi_device *sdev,void *data) { -int rc; - sdev->no_uld_attach = data ?1 :0 ; - rc =scsi_device_reprobe (sdev); +WARN_ON (scsi_device_reprobe (sdev)); } static void
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 241/772 scsi: qedf: Fix a possible memory leak in qedf_alloc_and_init_sb()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhen Lei <[email protected]>
[ Upstream commit c62c30429db3eb4ced35c7fcf6f04a61ce3a01bb ]
Hook "qed_ops->common->sb_init = qed_sb_init" does not release the DMA memory sb_virt when it fails. Add dma_free_coherent() to free it. This is the same way as qedr_alloc_mem_sb() and qede_alloc_mem_sb().
--- drivers/scsi/qedf/qedf_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/qedf/qedf_main.c +1 -0
@@ -2739,6 +2739,7 @@ static int qedf_alloc_and_init_sb(struct qedf_ctx *qedf, sb_id, QED_SB_TYPE_STORAGE);if (ret) { +dma_free_coherent (&qedf->pdev->dev,sizeof (*sb_virt), sb_virt, sb_phys);QEDF_ERR (&qedf->dbg_ctx,"Status block initialization failed (0x%x) for id = %d.\n" , ret, sb_id);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 242/772 scsi: qedi: Fix a possible memory leak in qedi_alloc_and_init_sb()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhen Lei <[email protected]>
[ Upstream commit 95bbdca4999bc59a72ebab01663d421d6ce5775d ]
Hook "qedi_ops->common->sb_init = qed_sb_init" does not release the DMA memory sb_virt when it fails. Add dma_free_coherent() to free it. This is the same way as qedr_alloc_mem_sb() and qede_alloc_mem_sb().
--- drivers/scsi/qedi/qedi_main.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/qedi/qedi_main.c +1 -0
@@ -369,6 +369,7 @@ static int qedi_alloc_and_init_sb(struct qedi_ctx *qedi, ret = qedi_ops->common->sb_init (qedi->cdev, sb_info, sb_virt, sb_phys, sb_id,QED_SB_TYPE_STORAGE );if (ret) { +dma_free_coherent (&qedi->pdev->dev,sizeof (*sb_virt), sb_virt, sb_phys);QEDI_ERR (&qedi->dbg_ctx,"Status block initialization failed for id = %d.\n" , sb_id);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 243/772 RDMA/hns: Fix out-of-order issue of requester when setting FENCE
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit 5dbcb1c1900f45182b5651c89257c272f1f3ead7 ]
The FENCE indicator in hns WQE doesn't ensure that response data from a previous Read/Atomic operation has been written to the requester's memory before the subsequent Send/Write operation is processed. This may result in the subsequent Send/Write operation accessing the original data in memory instead of the expected response data.
Unlike FENCE, the SO (Strong Order) indicator blocks the subsequent operation until the previous response data is written to memory and a bresp is returned. Set the SO indicator instead of FENCE to maintain strict order.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 2 +- drivers/infiniband/hw/hns/hns_roce_hw_v2.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +1 -1
@@ -578,7 +578,7 @@ static inline int set_rc_wqe(struct hns_roce_qp *qp,if (WARN_ON (ret))return ret; -hr_reg_write (rc_sq_wqe,RC_SEND_WQE_FENCE , +hr_reg_write (rc_sq_wqe,RC_SEND_WQE_SO , (wr->send_flags &IB_SEND_FENCE ) ?1 :0 ); hr_reg_write(rc_sq_wqe, RC_SEND_WQE_SE,
drivers/infiniband/hw/hns/hns_roce_hw_v2.h +1 -0
@@ -926,6 +926,7 @@ struct hns_roce_v2_rc_send_wqe {#define RC_SEND_WQE_OWNER RC_SEND_WQE_FIELD_LOC(7, 7)#define RC_SEND_WQE_CQE RC_SEND_WQE_FIELD_LOC(8, 8)#define RC_SEND_WQE_FENCE RC_SEND_WQE_FIELD_LOC(9, 9) +#define RC_SEND_WQE_SO RC_SEND_WQE_FIELD_LOC(10, 10)#define RC_SEND_WQE_SE RC_SEND_WQE_FIELD_LOC(11, 11)#define RC_SEND_WQE_INLINE RC_SEND_WQE_FIELD_LOC(12, 12)#define RC_SEND_WQE_WQE_INDEX RC_SEND_WQE_FIELD_LOC(30, 15)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 244/772 RDMA/hns: Fix NULL pointer derefernce in hns_roce_map_mr_sg()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junxian Huang <[email protected]>
[ Upstream commit 6b526d17eed850352d880b93b9bf20b93006bd92 ]
ib_map_mr_sg() allows ULPs to specify NULL as the sg_offset argument. The driver needs to check whether it is a NULL pointer before dereferencing it.
--- drivers/infiniband/hw/hns/hns_roce_mr.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/infiniband/hw/hns/hns_roce_mr.c +4 -3
@@ -415,15 +415,16 @@ static int hns_roce_set_page(struct ib_mr *ibmr, u64 addr) }int hns_roce_map_mr_sg (struct ib_mr *ibmr,struct scatterlist *sg,int sg_nents, -unsigned int *sg_offset) +unsigned int *sg_offset_p) { +unsigned int sg_offset = sg_offset_p ? *sg_offset_p :0 ;struct hns_roce_dev *hr_dev =to_hr_dev (ibmr->device);struct ib_device *ibdev = &hr_dev->ib_dev;struct hns_roce_mr *mr =to_hr_mr (ibmr);struct hns_roce_mtr *mtr = &mr->pbl_mtr;int ret, sg_num =0 ; -if (!IS_ALIGNED (*sg_offset,HNS_ROCE_FRMR_ALIGN_SIZE ) || +if (!IS_ALIGNED (sg_offset,HNS_ROCE_FRMR_ALIGN_SIZE ) || ibmr->page_size <HNS_HW_PAGE_SIZE || ibmr->page_size >HNS_HW_MAX_PAGE_SIZE )return sg_num;
@@ -434,7 +435,7 @@ int hns_roce_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,if (!mr->page_list)return sg_num; - sg_num =ib_sg_to_pages (ibmr, sg, sg_nents, sg_offset, hns_roce_set_page); + sg_num =ib_sg_to_pages (ibmr, sg, sg_nents, sg_offset_p, hns_roce_set_page);if (sg_num <1 ) {ibdev_err (ibdev,"failed to store sg pages %u %u, cnt = %d.\n" , mr->npages, mr->pbl_mtr.hem_cfg.buf_pg_count, sg_num);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 245/772 cpufreq: CPPC: Fix wrong return value in cppc_get_cpu_cost()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit be392aa80f1e5b0b65ccc2a540b9304fefcfe3d8 ]
cppc_get_cpu_cost() return 0 if the policy is NULL. Then in em_compute_costs(), the later zero check for cost is not valid as cost is uninitialized. As Quentin pointed out, kernel energy model core check the return value of get_cost() first, so if the callback failed it should tell the core. Return -EINVAL to fix it.
--- drivers/cpufreq/cppc_cpufreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/cpufreq/cppc_cpufreq.c +1 -1
@@ -493,7 +493,7 @@ static int cppc_get_cpu_cost(struct device *cpu_dev, unsigned long KHz, policy =cpufreq_cpu_get_raw (cpu_dev->id);if (!policy) -return 0 ; +return -EINVAL ; cpu_data = policy->driver_data; perf_caps = &cpu_data->perf_caps;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 246/772 cpufreq: CPPC: Fix wrong return value in cppc_get_cpu_power()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jinjie Ruan <[email protected]>
[ Upstream commit b51eb0874d8170028434fbd259e80b78ed9b8eca ]
cppc_get_cpu_power() return 0 if the policy is NULL. Then in em_create_perf_table(), the later zero check for power is not valid as power is uninitialized. As Quentin pointed out, kernel energy model core check the return value of active_power() first, so if the callback failed it should tell the core. So return -EINVAL to fix it.
--- drivers/cpufreq/cppc_cpufreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/cpufreq/cppc_cpufreq.c +1 -1
@@ -423,7 +423,7 @@ static int cppc_get_cpu_power(struct device *cpu_dev, policy =cpufreq_cpu_get_raw (cpu_dev->id);if (!policy) -return 0 ; +return -EINVAL ; cpu_data = policy->driver_data; perf_caps = &cpu_data->perf_caps;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 247/772 ocfs2: fix uninitialized value in ocfs2_file_read_iter()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
[ Upstream commit adc77b19f62d7e80f98400b2fca9d700d2afdd6f ]
Syzbot has reported the following KMSAN splat:
BUG: KMSAN: uninit-value in ocfs2_file_read_iter+0x9a4/0xf80 ocfs2_file_read_iter+0x9a4/0xf80 __io_read+0x8d4/0x20f0 io_read+0x3e/0xf0 io_issue_sqe+0x42b/0x22c0 io_wq_submit_work+0xaf9/0xdc0 io_worker_handle_work+0xd13/0x2110 io_wq_worker+0x447/0x1410 ret_from_fork+0x6f/0x90 ret_from_fork_asm+0x1a/0x30
Uninit was created at:
__alloc_pages_noprof+0x9a7/0xe00 alloc_pages_mpol_noprof+0x299/0x990 alloc_pages_noprof+0x1bf/0x1e0 allocate_slab+0x33a/0x1250 ___slab_alloc+0x12ef/0x35e0 kmem_cache_alloc_bulk_noprof+0x486/0x1330 __io_alloc_req_refill+0x84/0x560 io_submit_sqes+0x172f/0x2f30 __se_sys_io_uring_enter+0x406/0x41c0 __x64_sys_io_uring_enter+0x11f/0x1a0 x64_sys_call+0x2b54/0x3ba0 do_syscall_64+0xcd/0x1e0 entry_SYSCALL_64_after_hwframe+0x77/0x7f
Since an instance of 'struct kiocb' may be passed from the block layer with 'private' field uninitialized, introduce 'ocfs2_iocb_init_rw_locked()' and use it from where 'ocfs2_dio_end_io()' might take care, i.e. in 'ocfs2_file_read_iter()' and 'ocfs2_file_write_iter()'.
--- fs/ocfs2/aops.h | 2 ++ fs/ocfs2/file.c | 4 ++++ 2 files changed, 6 insertions(+)
fs/ocfs2/aops.h +2 -0
@@ -70,6 +70,8 @@ enum ocfs2_iocb_lock_bits { OCFS2_IOCB_NUM_LOCKS }; +#define ocfs2_iocb_init_rw_locked (iocb) \ + (iocb->private = NULL)#define ocfs2_iocb_clear_rw_locked (iocb) \ clear_bit(OCFS2_IOCB_RW_LOCK, (unsigned long *)&iocb->private)#define ocfs2_iocb_rw_locked_level (iocb) \
fs/ocfs2/file.c +4 -0
@@ -2398,6 +2398,8 @@ static ssize_t ocfs2_file_write_iter(struct kiocb *iocb, }else inode_lock (inode); +ocfs2_iocb_init_rw_locked (iocb); +/* * Concurrent O_DIRECT writes are allowed with * mount_option "coherency=buffered".
@@ -2544,6 +2546,8 @@ static ssize_t ocfs2_file_read_iter(struct kiocb *iocb,if (!direct_io && nowait)return -EOPNOTSUPP ; +ocfs2_iocb_init_rw_locked (iocb); +/* * buffered reads protect themselves in ->read_folio(). O_DIRECT reads * need locks to protect pending reads from racing with truncate.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 248/772 dax: delete a stale directory pmem
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harshit Mogalapalli <[email protected]>
[ Upstream commit b8e6d7ce50673c39514921ac61f7af00bbb58b87 ]
After commit: 83762cb5c7c4 ("dax: Kill DEV_DAX_PMEM_COMPAT") the pmem/ directory is not needed anymore and Makefile changes were made accordingly in this commit, but there is a Makefile and pmem.c in pmem/ which are now stale and pmem.c is empty, remove them.
--- drivers/dax/pmem/Makefile | 7 ------- drivers/dax/pmem/pmem.c | 10 ---------- 2 files changed, 17 deletions(-) delete mode 100644 drivers/dax/pmem/Makefile delete mode 100644 drivers/dax/pmem/pmem.c
drivers/dax/pmem/Makefile deleted +0 -7
@@ -1,7 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -obj-$(CONFIG_DEV_DAX_PMEM) += dax_pmem.o -obj-$(CONFIG_DEV_DAX_PMEM) += dax_pmem_core.o - -dax_pmem-y := pmem.o -dax_pmem_core-y := core.o -dax_pmem_compat-y := compat.o
drivers/dax/pmem/pmem.c deleted +0 -10
@@ -1,10 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* Copyright(c) 2016 - 2018 Intel Corporation. All rights reserved. */ -#include <linux/percpu-refcount.h> -#include <linux/memremap.h> -#include <linux/module.h> -#include <linux/pfn_t.h> -#include <linux/nd.h> -#include "../bus.h" - -
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 249/772 KVM: PPC: Book3S HV: Stop using vc->dpdes for nested KVM guests
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gautam Menghani <[email protected]>
[ Upstream commit 0d3c6b28896f9889c8864dab469e0343a0ad1c0c ]
commit 6398326b9ba1 ("KVM: PPC: Book3S HV P9: Stop using vc->dpdes") introduced an optimization to use only vcpu->doorbell_request for SMT emulation for Power9 and above guests, but the code for nested guests still relies on the old way of handling doorbells, due to which an L2 guest (see [1]) cannot be booted with XICS with SMT>1. The command to repro this issue is:
// To be run in L1
qemu-system-ppc64 \ -drive file=rhel.qcow2,format=qcow2 \ -m 20G \ -smp 8,cores=1,threads=8 \ -cpu host \ -nographic \ -machine pseries,ic-mode=xics -accel kvm
Fix the plumbing to utilize vcpu->doorbell_request instead of vcore->dpdes for nested KVM guests on P9 and above.
[1] Terminology
1. L0 : PowerNV linux running with HV privileges
2. L1 : Pseries KVM guest running on top of L0
2. L2 : Nested KVM guest running on top of L1
--- arch/powerpc/kvm/book3s_hv.c | 9 +++++++++ arch/powerpc/kvm/book3s_hv_nested.c | 14 ++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-)
arch/powerpc/kvm/book3s_hv.c +9 -0
@@ -4062,6 +4062,15 @@ static int kvmhv_vcpu_entry_p9_nested(struct kvm_vcpu *vcpu, u64 time_limit, uns } hvregs.hdec_expiry = time_limit; +/* +* hvregs has the doorbell status, so zero it here which +* enables us to receive doorbells when H_ENTER_NESTED is +* in progress for this vCPU +*/ + +if (vcpu->arch.doorbell_request) + vcpu->arch.doorbell_request =0 ; +/* * When setting DEC, we must always deal with irq_work_raise * via NMI vs setting DEC. The problem occurs right as we
arch/powerpc/kvm/book3s_hv_nested.c +10 -4
@@ -32,7 +32,7 @@ void kvmhv_save_hv_regs(struct kvm_vcpu *vcpu, struct hv_guest_state *hr)struct kvmppc_vcore *vc = vcpu->arch.vcore; hr->pcr = vc->pcr |PCR_MASK ; - hr->dpdes = vc->dpdes; + hr->dpdes = vcpu->arch.doorbell_request; hr->hfscr = vcpu->arch.hfscr; hr->tb_offset = vc->tb_offset; hr->dawr0 = vcpu->arch.dawr0;
@@ -105,7 +105,7 @@ static void save_hv_return_state(struct kvm_vcpu *vcpu, {struct kvmppc_vcore *vc = vcpu->arch.vcore; - hr->dpdes = vc->dpdes; + hr->dpdes = vcpu->arch.doorbell_request; hr->purr = vcpu->arch.purr; hr->spurr = vcpu->arch.spurr; hr->ic = vcpu->arch.ic;
@@ -143,7 +143,7 @@ static void restore_hv_regs(struct kvm_vcpu *vcpu, const struct hv_guest_state *struct kvmppc_vcore *vc = vcpu->arch.vcore; vc->pcr = hr->pcr |PCR_MASK ; - vc->dpdes = hr->dpdes; + vcpu->arch.doorbell_request = hr->dpdes; vcpu->arch.hfscr = hr->hfscr; vcpu->arch.dawr0 = hr->dawr0; vcpu->arch.dawrx0 = hr->dawrx0;
@@ -170,7 +170,13 @@ void kvmhv_restore_hv_return_state(struct kvm_vcpu *vcpu, {struct kvmppc_vcore *vc = vcpu->arch.vcore; - vc->dpdes = hr->dpdes; +/* +* This L2 vCPU might have received a doorbell while H_ENTER_NESTED was being handled. +* Make sure we preserve the doorbell if it was either: +* a) Sent after H_ENTER_NESTED was called on this vCPU (arch.doorbell_request would be 1) +* b) Doorbell was not handled and L2 exited for some other reason (hr->dpdes would be 1) +*/ + vcpu->arch.doorbell_request = vcpu->arch.doorbell_request | hr->dpdes; vcpu->arch.hfscr = hr->hfscr; vcpu->arch.purr = hr->purr; vcpu->arch.spurr = hr->spurr;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 250/772 KVM: PPC: Book3S HV: Avoid returning to nested hypervisor on pending doorbells
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gautam Menghani <[email protected]>
[ Upstream commit 26686db69917399fa30e3b3135360771e90f83ec ]
Commit 6398326b9ba1 ("KVM: PPC: Book3S HV P9: Stop using vc->dpdes") dropped the use of vcore->dpdes for msgsndp / SMT emulation. Prior to that commit, the below code at L1 level (see [1] for terminology) was responsible for setting vc->dpdes for the respective L2 vCPU:
if (!nested) {
kvmppc_core_prepare_to_enter(vcpu);
if (vcpu->arch.doorbell_request) {
vc->dpdes = 1;
smp_wmb();
vcpu->arch.doorbell_request = 0;
}L1 then sent vc->dpdes to L0 via kvmhv_save_hv_regs(), and while servicing H_ENTER_NESTED at L0, the below condition at L0 level made sure to abort and go back to L1 if vcpu->arch.doorbell_request = 1 so that L1 sets vc->dpdes as per above if condition:
} else if (vcpu->arch.pending_exceptions ||
vcpu->arch.doorbell_request ||
xive_interrupt_pending(vcpu)) {
vcpu->arch.ret = RESUME_HOST;
goto out;
}This worked fine since vcpu->arch.doorbell_request was used more like a flag and vc->dpdes was used to pass around the doorbell state. But after Commit 6398326b9ba1 ("KVM: PPC: Book3S HV P9: Stop using vc->dpdes"), vcpu->arch.doorbell_request is the only variable used to pass around doorbell state.
With the plumbing for handling doorbells for nested guests updated to use vcpu->arch.doorbell_request over vc->dpdes, the above "else if" stops doorbells from working correctly as L0 aborts execution of L2 and instead goes back to L1.
Remove vcpu->arch.doorbell_request from the above "else if" condition as it is no longer needed for L0 to correctly handle the doorbell status while running L2.
[1] Terminology
1. L0 : PowerNV linux running with HV privileges
2. L1 : Pseries KVM guest running on top of L0
2. L2 : Nested KVM guest running on top of L1
--- arch/powerpc/kvm/book3s_hv.c | 1 - 1 file changed, 1 deletion(-)
arch/powerpc/kvm/book3s_hv.c +0 -1
@@ -4653,7 +4653,6 @@ int kvmhv_run_single_vcpu(struct kvm_vcpu *vcpu, u64 time_limit, lpcr |=LPCR_MER ; } }else if (vcpu->arch.pending_exceptions || - vcpu->arch.doorbell_request ||xive_interrupt_pending (vcpu)) { vcpu->arch.ret =RESUME_HOST ; goto out;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 251/772 powerpc/sstep: make emulate_vsx_load and emulate_vsx_store static
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Suchanek <[email protected]>
[ Upstream commit a26c4dbb3d9c1821cb0fc11cb2dbc32d5bf3463b ]
These functions are not used outside of sstep.c
--- arch/powerpc/include/asm/sstep.h | 5 ----- arch/powerpc/lib/sstep.c | 12 ++++-------- 2 files changed, 4 insertions(+), 13 deletions(-)
arch/powerpc/include/asm/sstep.h +0 -5
@@ -173,9 +173,4 @@ int emulate_step(struct pt_regs *regs, ppc_inst_t instr);*/ extern int emulate_loadstore (struct pt_regs *regs,struct instruction_op *op); -extern void emulate_vsx_load (struct instruction_op *op,union vsx_reg *reg, -const void *mem,bool cross_endian); -extern void emulate_vsx_store (struct instruction_op *op, -const union vsx_reg *reg,void *mem, -bool cross_endian);extern int emulate_dcbz (unsigned long ea,struct pt_regs *regs);
arch/powerpc/lib/sstep.c +4 -8
@@ -780,8 +780,8 @@ static nokprobe_inline int emulate_stq(struct pt_regs *regs, unsigned long ea,#endif /* __powerpc64 */ #ifdef CONFIG_VSX -void emulate_vsx_load (struct instruction_op *op,union vsx_reg *reg, -const void *mem,bool rev) +static nokprobe_inline void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg, +const void *mem,bool rev) {int size, read_size;int i, j;
@@ -863,11 +863,9 @@ void emulate_vsx_load(struct instruction_op *op, union vsx_reg *reg,break ; } } -EXPORT_SYMBOL_GPL (emulate_vsx_load); -NOKPROBE_SYMBOL (emulate_vsx_load); -void emulate_vsx_store (struct instruction_op *op,const union vsx_reg *reg, -void *mem,bool rev) +static nokprobe_inline void emulate_vsx_store(struct instruction_op *op, const union vsx_reg *reg, +void *mem,bool rev) {int size, write_size;int i, j;
@@ -955,8 +953,6 @@ void emulate_vsx_store(struct instruction_op *op, const union vsx_reg *reg,break ; } } -EXPORT_SYMBOL_GPL (emulate_vsx_store); -NOKPROBE_SYMBOL (emulate_vsx_store); static nokprobe_inline int do_vsx_load(struct instruction_op *op, unsigned long ea, struct pt_regs *regs,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 252/772 powerpc/kexec: Fix return of uninitialized variable
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Zekun <[email protected]>
[ Upstream commit 83b5a407fbb73e6965adfb4bd0a803724bf87f96 ]
of_property_read_u64() can fail and leave the variable uninitialized, which will then be used. Return error if reading the property failed.
--- arch/powerpc/kexec/file_load_64.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
arch/powerpc/kexec/file_load_64.c +7 -2
@@ -911,13 +911,18 @@ int setup_purgatory_ppc64(struct kimage *image, const void *slave_code,if (dn) {u64 val; -of_property_read_u64 (dn,"opal-base-address" , &val); + ret =of_property_read_u64 (dn,"opal-base-address" , &val); +if (ret) + goto out; + ret =kexec_purgatory_get_set_symbol (image,"opal_base" , &val,sizeof (val), false);if (ret) goto out; -of_property_read_u64 (dn,"opal-entry-address" , &val); + ret =of_property_read_u64 (dn,"opal-entry-address" , &val); +if (ret) + goto out; ret =kexec_purgatory_get_set_symbol (image,"opal_entry" , &val,sizeof (val), false); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 253/772 fbdev/sh7760fb: Alloc DMA memory from hardware device
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
[ Upstream commit 8404e56f4bc1d1a65bfc98450ba3dae5e653dda1 ]
Pass the hardware device to the DMA helpers dma_alloc_coherent() and dma_free_coherent(). The fbdev device that is currently being used is a software device and does not provide DMA memory. Also update the related dev_*() output statements similarly.
Stable-dep-of: f89d17ae2ac4 ("fbdev: sh7760fb: Fix a possible memory leak in sh7760fb_alloc_mem()")
--- drivers/video/fbdev/sh7760fb.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/video/fbdev/sh7760fb.c +4 -4
@@ -359,7 +359,7 @@ static void sh7760fb_free_mem(struct fb_info *info)if (!info->screen_base)return ; -dma_free_coherent (info->dev, info->screen_size, +dma_free_coherent (info->device, info->screen_size, info->screen_base, par->fbdma); par->fbdma =0 ;
@@ -408,14 +408,14 @@ static int sh7760fb_alloc_mem(struct fb_info *info)if (vram <PAGE_SIZE ) vram =PAGE_SIZE ; - fbmem =dma_alloc_coherent (info->dev, vram, &par->fbdma,GFP_KERNEL ); + fbmem =dma_alloc_coherent (info->device, vram, &par->fbdma,GFP_KERNEL );if (!fbmem)return -ENOMEM ;if ((par->fbdma &SH7760FB_DMA_MASK ) !=SH7760FB_DMA_MASK ) {sh7760fb_free_mem (info); -dev_err (info->dev,"kernel gave me memory at 0x%08lx, which is" +dev_err (info->device,"kernel gave me memory at 0x%08lx, which is" "unusable for the LCDC\n" , (unsigned long )par->fbdma);return -ENOMEM ; }
@@ -486,7 +486,7 @@ static int sh7760fb_probe(struct platform_device *pdev) ret =sh7760fb_alloc_mem (info);if (ret) { -dev_dbg (info->dev,"framebuffer memory allocation failed!\n" ); +dev_dbg (info->device,"framebuffer memory allocation failed!\n" ); goto out_unmap; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 254/772 fbdev: sh7760fb: Fix a possible memory leak in sh7760fb_alloc_mem()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhen Lei <[email protected]>
[ Upstream commit f89d17ae2ac42931be2a0153fecbf8533280c927 ]
When information such as info->screen_base is not ready, calling sh7760fb_free_mem() does not release memory correctly. Call dma_free_coherent() instead.
--- drivers/video/fbdev/sh7760fb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/video/fbdev/sh7760fb.c +1 -2
@@ -409,12 +409,11 @@ static int sh7760fb_alloc_mem(struct fb_info *info) vram =PAGE_SIZE ; fbmem =dma_alloc_coherent (info->device, vram, &par->fbdma,GFP_KERNEL ); -if (!fbmem)return -ENOMEM ;if ((par->fbdma &SH7760FB_DMA_MASK ) !=SH7760FB_DMA_MASK ) { -sh7760fb_free_mem (info); +dma_free_coherent (info->device, vram, fbmem, par->fbdma);dev_err (info->device,"kernel gave me memory at 0x%08lx, which is" "unusable for the LCDC\n" , (unsigned long )par->fbdma);return -ENOMEM ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 255/772 clk: clk-apple-nco: Add NULL check in applnco_probe
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Han <[email protected]>
[ Upstream commit 969c765e2b508cca9099d246c010a1e48dcfd089 ]
Add NULL check in applnco_probe, to handle kernel NULL pointer dereference error.
--- drivers/clk/clk-apple-nco.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/clk/clk-apple-nco.c +3 -0
@@ -297,6 +297,9 @@ static int applnco_probe(struct platform_device *pdev)memset (&init,0 ,sizeof (init)); init.name =devm_kasprintf (&pdev->dev,GFP_KERNEL ,"%s-%d" , np->name, i); +if (!init.name) +return -ENOMEM ; + init.ops = &applnco_ops; init.parent_data = &pdata; init.num_parents =1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 256/772 dt-bindings: clock: axi-clkgen: include AXI clk
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sa <[email protected]>
[ Upstream commit 47f3f5a82a31527e027929c5cec3dd1ef5ef30f5 ]
In order to access the registers of the HW, we need to make sure that the AXI bus clock is enabled. Hence let's increase the number of clocks by one and add clock-names to differentiate between parent clocks and the bus clock.
--- .../bindings/clock/adi,axi-clkgen.yaml | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)
Documentation/devicetree/bindings/clock/adi,axi-clkgen.yaml +18 -4
@@ -26,9 +26,21 @@ properties: description: Specifies the reference clock(s) from which the output frequency is derived. This must either reference one clock if only the first clock - input is connected or two if both clock inputs are connected. - minItems: 1 - maxItems: 2 + input is connected or two if both clock inputs are connected. The last + clock is the AXI bus clock that needs to be enabled so we can access the + core registers. + minItems: 2 + maxItems: 3 + + clock-names: + oneOf: + - items: + - const: clkin1 + - const: s_axi_aclk + - items: + - const: clkin1 + - const: clkin2 + - const: s_axi_aclk '#clock-cells': const: 0
@@ -40,6 +52,7 @@ required: - compatible - reg - clocks + - clock-names - '#clock-cells' additionalProperties: false
@@ -50,5 +63,6 @@ examples: compatible = "adi,axi-clkgen-2.00.a"; #clock-cells = <0>; reg = <0xff000000 0x1000>; - clocks = <&osc 1>; + clocks = <&osc 1>, <&clkc 15>; + clock-names = "clkin1", "s_axi_aclk"; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 257/772 clk: clk-axi-clkgen: make sure to enable the AXI bus clock
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sa <[email protected]>
[ Upstream commit c64ef7e4851d1a9abbb7f7833e4936973ac5ba79 ]
In order to access the registers of the HW, we need to make sure that the AXI bus clock is enabled. Hence let's increase the number of clocks by one.
In order to keep backward compatibility and make sure old DTs still work we check if clock-names is available or not. If it is, then we can disambiguate between really having the AXI clock or a parent clock and so we can enable the bus clock. If not, we fallback to what was done before and don't explicitly enable the AXI bus clock.
Note that if clock-names is given, the axi clock must be the last one in the phandle array (also enforced in the DT bindings) so that we can reuse as much code as possible.
--- drivers/clk/clk-axi-clkgen.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-)
drivers/clk/clk-axi-clkgen.c +20 -2
@@ -7,6 +7,7 @@*/ #include <linux/platform_device.h> +#include <linux/clk.h> #include <linux/clk-provider.h> #include <linux/slab.h> #include <linux/io.h>
@@ -510,6 +511,7 @@ static int axi_clkgen_probe(struct platform_device *pdev)struct clk_init_data init;const char *parent_names[2 ];const char *clk_name; +struct clk *axi_clk;unsigned int i;int ret;
@@ -526,8 +528,24 @@ static int axi_clkgen_probe(struct platform_device *pdev)return PTR_ERR (axi_clkgen->base); init.num_parents =of_clk_get_parent_count (pdev->dev.of_node); -if (init.num_parents <1 || init.num_parents >2 ) -return -EINVAL ; + + axi_clk =devm_clk_get_enabled (&pdev->dev,"s_axi_aclk" ); +if (!IS_ERR (axi_clk)) { +if (init.num_parents <2 || init.num_parents >3 ) +return -EINVAL ; + + init.num_parents -=1 ; + }else { +/* +* Legacy... So that old DTs which do not have clock-names still +* work. In this case we don't explicitly enable the AXI bus +* clock. +*/ +if (PTR_ERR (axi_clk) != -ENOENT ) +return PTR_ERR (axi_clk); +if (init.num_parents <1 || init.num_parents >2 ) +return -EINVAL ; + }for (i =0 ; i < init.num_parents; i++) { parent_names[i] =of_clk_get_parent_name (pdev->dev.of_node, i);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 258/772 pinctrl: k210: Undef K210_PC_DEFAULT
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: zhang jiao <[email protected]>
[ Upstream commit 7e86490c5dee5c41a55f32d0dc34269e200e6909 ]
When the temporary macro K210_PC_DEFAULT is not needed anymore, use its name in the #undef statement instead of
the incorrect "DEFAULT" name.
--- drivers/pinctrl/pinctrl-k210.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/pinctrl-k210.c +1 -1
@@ -181,7 +181,7 @@ static const u32 k210_pinconf_mode_id_to_mode[] = { [K210_PC_DEFAULT_INT13] = K210_PC_MODE_IN | K210_PC_PU, }; -#undef DEFAULT +#undef K210_PC_DEFAULT/* * Pin functions configuration information.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 259/772 smb: cached directories can be more than root file handle
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Aurich <[email protected]>
[ Upstream commit 128630e1dbec8074c7707aad107299169047e68f ]
Update this log message since cached fids may represent things other than the root of a mount.
--- fs/smb/client/cached_dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/smb/client/cached_dir.c +1 -1
@@ -354,7 +354,7 @@ int open_cached_dir_by_dentry(struct cifs_tcon *tcon,spin_lock (&cfids->cfid_list_lock);list_for_each_entry (cfid, &cfids->entries, entry) {if (dentry && cfid->dentry == dentry) { -cifs_dbg (FYI ,"found a cached root file handle by dentry\n" ); +cifs_dbg (FYI ,"found a cached file handle by dentry\n" );kref_get (&cfid->refcount); *ret_cfid = cfid;spin_unlock (&cfids->cfid_list_lock);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 260/772 mailbox: arm_mhuv2: clean up loop in get_irq_chan_comb()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 192a16a3430ca459c4e986f3d10758c4d6b1aa29 ]
Both the inner and outer loops in this code use the "i" iterator. The inner loop should really use a different iterator.
It doesn't affect things in practice because the data comes from the device tree. The "protocol" and "windows" variables are going to be zero. That means we're always going to hit the "return &chans[channel];" statement and we're not going to want to iterate through the outer loop again.
Still it's worth fixing this for future use cases.
--- drivers/mailbox/arm_mhuv2.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/mailbox/arm_mhuv2.c +4 -4
@@ -500,7 +500,7 @@ static const struct mhuv2_protocol_ops mhuv2_data_transfer_ops = {static struct mbox_chan *get_irq_chan_comb (struct mhuv2 *mhu,u32 __iomem *reg) {struct mbox_chan *chans = mhu->mbox.chans; -int channel =0 , i, offset =0 , windows, protocol, ch_wn; +int channel =0 , i, j, offset =0 , windows, protocol, ch_wn;u32 stat;for (i =0 ; i <MHUV2_CMB_INT_ST_REG_CNT ; i++) {
@@ -510,9 +510,9 @@ static struct mbox_chan *get_irq_chan_comb(struct mhuv2 *mhu, u32 __iomem *reg) ch_wn = i *MHUV2_STAT_BITS +__builtin_ctz (stat); -for (i =0 ; i < mhu->length; i +=2 ) { - protocol = mhu->protocols[i]; - windows = mhu->protocols[i +1 ]; +for (j =0 ; j < mhu->length; j +=2 ) { + protocol = mhu->protocols[j]; + windows = mhu->protocols[j +1 ];if (ch_wn >= offset + windows) {if (protocol ==DOORBELL )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 261/772 perf cs-etm: Dont flush when packet_queue fills up
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit 5afd032961e8465808c4bc385c06e7676fbe1951 ]
cs_etm__flush(), like cs_etm__sample() is an operation that generates a sample and then swaps the current with the previous packet. Calling flush after processing the queues results in two swaps which corrupts the next sample. Therefore it wasn't appropriate to call flush here so remove it.
Flushing is still done on a discontinuity to explicitly clear the last branch buffer, but when the packet_queue fills up before reaching a timestamp, that's not a discontinuity and the call to cs_etm__process_traceid_queue() already generated samples and drained the buffers correctly.
This is visible by looking for a branch that has the same target as the previous branch and the following source is before the address of the last target, which is impossible as execution would have had to have gone backwards:
ffff800080849d40 _find_next_and_bit+0x78 => ffff80008011cadc update_sg_lb_stats+0x94
(packet_queue fills here before a timestamp, resulting in a flush and
branch target ffff80008011cadc is duplicated.)
ffff80008011cb1c update_sg_lb_stats+0xd4 => ffff80008011cadc update_sg_lb_stats+0x94 ffff8000801117c4 cpu_util+0x24 => ffff8000801117d4 cpu_util+0x34
After removing the flush the correct branch target is used for the second sample, and ffff8000801117c4 is no longer before the previous address:
ffff800080849d40 _find_next_and_bit+0x78 => ffff80008011cadc update_sg_lb_stats+0x94 ffff80008011cb1c update_sg_lb_stats+0xd4 => ffff8000801117a0 cpu_util+0x0 ffff8000801117c4 cpu_util+0x24 => ffff8000801117d4 cpu_util+0x34
Make sure that a final branch stack is output at the end of the trace by calling cs_etm__end_block(). This is already done for both the timeless decode paths.
--- tools/perf/util/cs-etm.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-)
tools/perf/util/cs-etm.c +18 -7
@@ -2124,12 +2124,6 @@ static void cs_etm__clear_all_traceid_queues(struct cs_etm_queue *etmq)/* Ignore return value */ cs_etm__process_traceid_queue (etmq, tidq); - -/* -* Generate an instruction sample with the remaining -* branchstack entries. -*/ -cs_etm__flush (etmq, tidq); } }
@@ -2226,7 +2220,7 @@ static int cs_etm__process_queues(struct cs_etm_auxtrace *etm)while (1 ) {if (!etm->heap.heap_cnt) - goto out; +break ;/* Take the entry at the top of the min heap */ cs_queue_nr = etm->heap.heap_array[0 ].queue_nr;
@@ -2309,6 +2303,23 @@ static int cs_etm__process_queues(struct cs_etm_auxtrace *etm) ret =auxtrace_heap__add (&etm->heap, cs_queue_nr, cs_timestamp); } +for (i =0 ; i < etm->queues.nr_queues; i++) { +struct int_node *inode; + + etmq = etm->queues.queue_array[i].priv; +if (!etmq) +continue ; + +intlist__for_each_entry (inode, etmq->traceid_queues_list) { +int idx = (int )(intptr_t )inode->priv; + +/* Flush any remaining branch stack entries */ + tidq = etmq->traceid_queues[idx]; + ret =cs_etm__end_block (etmq, tidq); +if (ret) +return ret; + } + } out:return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 262/772 PCI: Fix reset_method_store() memory leak
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Todd Kjos <[email protected]>
[ Upstream commit 2985b1844f3f3447f2d938eff1ef6762592065a5 ]
In reset_method_store(), a string is allocated via kstrndup() and assigned to the local "options". options is then used in with strsep() to find spaces:
while ((name = strsep(&options, " ")) != NULL) {If there are no remaining spaces, then options is set to NULL by strsep(), so the subsequent kfree(options) doesn't free the memory allocated via kstrndup().
Fix by using a separate tmp_options to iterate with strsep() so options is preserved.
--- drivers/pci/pci.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/pci/pci.c +3 -2
@@ -5308,7 +5308,7 @@ static ssize_t reset_method_store(struct device *dev, const char *buf, size_t count) {struct pci_dev *pdev =to_pci_dev (dev); -char *options, *name; +char *options, *tmp_options, *name;int m, n;u8 reset_methods[PCI_NUM_RESET_METHODS ] = {0 };
@@ -5328,7 +5328,8 @@ static ssize_t reset_method_store(struct device *dev,return -ENOMEM ; n =0 ; -while ((name =strsep (&options," " )) !=NULL ) { + tmp_options = options; +while ((name =strsep (&tmp_options," " )) !=NULL ) {if (sysfs_streq (name,"" ))continue ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 263/772 perf stat: Close cork_fd when create_perf_stat_counter() failed
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Levi Yun <[email protected]>
[ Upstream commit e880a70f8046df0dd9089fa60dcb866a2cc69194 ]
When create_perf_stat_counter() failed, it doesn't close workload.cork_fd open in evlist__prepare_workload(). This could make too many open file error while __run_perf_stat() repeats.
Introduce evlist__cancel_workload to close workload.cork_fd and wait workload.child_pid until exit to clear child process when create_perf_stat_counter() is failed.
Stable-dep-of: 7f6ccb70e465 ("perf stat: Fix affinity memory leaks on error path")
--- tools/perf/builtin-stat.c | 50 +++++++++++++++++++++++++++------------ tools/perf/util/evlist.c | 19 +++++++++++++-- tools/perf/util/evlist.h | 1 + 3 files changed, 53 insertions(+), 17 deletions(-)
tools/perf/builtin-stat.c +35 -15
@@ -756,15 +756,19 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)evlist__set_leader (evsel_list);if (!cpu_map__is_dummy (evsel_list->core.user_requested_cpus)) { -if (affinity__setup (&saved_affinity) <0 ) -return -1 ; +if (affinity__setup (&saved_affinity) <0 ) { + err =-1 ; + goto err_out; + } affinity = &saved_affinity; }evlist__for_each_entry (evsel_list, counter) { counter->reset_group = false; -if (bpf_counter__load (counter, &target)) -return -1 ; +if (bpf_counter__load (counter, &target)) { + err =-1 ; + goto err_out; + }if (!(evsel__is_bperf (counter))) all_counters_use_bpf = false; }
@@ -805,7 +809,8 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)switch (stat_handle_error (counter)) {case COUNTER_FATAL : -return -1 ; + err =-1 ; + goto err_out;case COUNTER_RETRY : goto try_again;case COUNTER_SKIP :
@@ -846,7 +851,8 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)switch (stat_handle_error (counter)) {case COUNTER_FATAL : -return -1 ; + err =-1 ; + goto err_out;case COUNTER_RETRY : goto try_again_reset;case COUNTER_SKIP :
@@ -871,8 +877,10 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx) stat_config.unit_width = l;if (evsel__should_store_id (counter) && -evsel__store_ids (counter, evsel_list)) -return -1 ; +evsel__store_ids (counter, evsel_list)) { + err =-1 ; + goto err_out; + } }if (evlist__apply_filters (evsel_list, &counter)) {
@@ -893,20 +901,23 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx) }if (err <0 ) -return err; + goto err_out; err =perf_event__synthesize_stat_events (&stat_config,NULL , evsel_list, process_synthesized_event, is_pipe);if (err <0 ) -return err; + goto err_out; + }if (target.initial_delay) {pr_info (EVLIST_DISABLED_MSG ); }else { err =enable_counters (); -if (err) -return -1 ; +if (err) { + err =-1 ; + goto err_out; + } }/* Exec the command, if any */
@@ -916,8 +927,10 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)if (target.initial_delay >0 ) {usleep (target.initial_delay *USEC_PER_MSEC ); err =enable_counters (); -if (err) -return -1 ; +if (err) { + err =-1 ; + goto err_out; + }pr_info (EVLIST_ENABLED_MSG ); }
@@ -937,7 +950,8 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)if (workload_exec_errno) {const char *emsg =str_error_r (workload_exec_errno, msg,sizeof (msg));pr_err ("Workload failed: %s\n" , emsg); -return -1 ; + err =-1 ; + goto err_out; }if (WIFSIGNALED (status))
@@ -986,6 +1000,12 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)evlist__close (evsel_list);return WEXITSTATUS (status); + +err_out: +if (forks) +evlist__cancel_workload (evsel_list); + +return err; }static int run_perf_stat (int argc,const char **argv,int run_idx)
tools/perf/util/evlist.c +17 -2
@@ -42,6 +42,7 @@#include <sys/mman.h> #include <sys/prctl.h> #include <sys/timerfd.h> +#include <sys/wait.h> #include <linux/bitops.h> #include <linux/hash.h>
@@ -1392,6 +1393,8 @@ int evlist__prepare_workload(struct evlist *evlist, struct target *target, constint child_ready_pipe[2 ], go_pipe[2 ];char bf; + evlist->workload.cork_fd =-1 ; +if (pipe (child_ready_pipe) <0 ) {perror ("failed to create 'ready' pipe" );return -1 ;
@@ -1444,7 +1447,7 @@ int evlist__prepare_workload(struct evlist *evlist, struct target *target, const* For cancelling the workload without actually running it, * the parent will just close workload.cork_fd, without writing * anything, i.e. read will return zero and we just exit() -* here. +* here (See evlist__cancel_workload()). */ if (ret !=1 ) {if (ret ==-1 )
@@ -1508,7 +1511,7 @@ int evlist__prepare_workload(struct evlist *evlist, struct target *target, constint evlist__start_workload (struct evlist *evlist) { -if (evlist->workload.cork_fd >0 ) { +if (evlist->workload.cork_fd >=0 ) {char bf =0 ;int ret;/*
@@ -1519,12 +1522,24 @@ int evlist__start_workload(struct evlist *evlist)perror ("unable to write to pipe" );close (evlist->workload.cork_fd); + evlist->workload.cork_fd =-1 ;return ret; }return 0 ; } +void evlist__cancel_workload (struct evlist *evlist) +{ +int status; + +if (evlist->workload.cork_fd >=0 ) { +close (evlist->workload.cork_fd); + evlist->workload.cork_fd =-1 ; +waitpid (evlist->workload.pid, &status,WNOHANG ); + } +} +int evlist__parse_sample (struct evlist *evlist,union perf_event *event,struct perf_sample *sample) {struct evsel *evsel =evlist__event2evsel (evlist, event);
tools/perf/util/evlist.h +1 -0
@@ -187,6 +187,7 @@ int evlist__prepare_workload(struct evlist *evlist, struct target *target, const char *argv[], bool pipe_output, void (*exec_error)(int signo, siginfo_t *info, void *ucontext));int evlist__start_workload (struct evlist *evlist); +void evlist__cancel_workload (struct evlist *evlist);struct option ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 264/772 perf stat: Fix affinity memory leaks on error path
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 7f6ccb70e465bd8c9cf8973aee1c01224e4bdb3c ]
Missed cleanup when an error occurs.
--- tools/perf/builtin-stat.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/builtin-stat.c +2 -0
@@ -865,6 +865,7 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx) } }affinity__cleanup (affinity); + affinity =NULL ;evlist__for_each_entry (evsel_list, counter) {if (!counter->supported) {
@@ -1005,6 +1006,7 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx)if (forks)evlist__cancel_workload (evsel_list); +affinity__cleanup (affinity);return err; }
Signature · 1 line
2.43.0