Patch "OPP: fix dev_pm_opp_find_bw_*() when bandwidth table not initialized" has been added to the 6.12-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    OPP: fix dev_pm_opp_find_bw_*() when bandwidth table not initialized

to the 6.12-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     opp-fix-dev_pm_opp_find_bw_-when-bandwidth-table-not.patch
and it can be found in the queue-6.12 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f63c9ed55df050dd9ed4003a42e25f4cda73772a
Author: Neil Armstrong <neil.armstrong@xxxxxxxxxx>
Date:   Tue Dec 3 09:13:00 2024 +0100

    OPP: fix dev_pm_opp_find_bw_*() when bandwidth table not initialized
    
    [ Upstream commit b44b9bc7cab2967c3d6a791b1cd542c89fc07f0e ]
    
    If a driver calls dev_pm_opp_find_bw_ceil/floor() the retrieve bandwidth
    from the OPP table but the bandwidth table was not created because the
    interconnect properties were missing in the OPP consumer node, the
    kernel will crash with:
    
    Unable to handle kernel NULL pointer dereference at virtual address 0000000000000004
    ...
    pc : _read_bw+0x8/0x10
    lr : _opp_table_find_key+0x9c/0x174
    ...
    Call trace:
      _read_bw+0x8/0x10 (P)
      _opp_table_find_key+0x9c/0x174 (L)
      _find_key+0x98/0x168
      dev_pm_opp_find_bw_ceil+0x50/0x88
    ...
    
    In order to fix the crash, create an assert function to check
    if the bandwidth table was created before trying to get a
    bandwidth with _read_bw().
    
    Fixes: add1dc094a74 ("OPP: Use generic key finding helpers for bandwidth key")
    Signed-off-by: Neil Armstrong <neil.armstrong@xxxxxxxxxx>
    Signed-off-by: Viresh Kumar <viresh.kumar@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/opp/core.c b/drivers/opp/core.c
index 1efb819c91b63..5ac209472c0cf 100644
--- a/drivers/opp/core.c
+++ b/drivers/opp/core.c
@@ -116,6 +116,15 @@ static bool assert_clk_index(struct opp_table *opp_table,
 	return opp_table->clk_count > index;
 }
 
+/*
+ * Returns true if bandwidth table is large enough to contain the bandwidth index.
+ */
+static bool assert_bandwidth_index(struct opp_table *opp_table,
+				   unsigned int index)
+{
+	return opp_table->path_count > index;
+}
+
 /**
  * dev_pm_opp_get_voltage() - Gets the voltage corresponding to an opp
  * @opp:	opp for which voltage has to be returned for
@@ -890,7 +899,8 @@ struct dev_pm_opp *dev_pm_opp_find_bw_ceil(struct device *dev, unsigned int *bw,
 	unsigned long temp = *bw;
 	struct dev_pm_opp *opp;
 
-	opp = _find_key_ceil(dev, &temp, index, true, _read_bw, NULL);
+	opp = _find_key_ceil(dev, &temp, index, true, _read_bw,
+			     assert_bandwidth_index);
 	*bw = temp;
 	return opp;
 }
@@ -921,7 +931,8 @@ struct dev_pm_opp *dev_pm_opp_find_bw_floor(struct device *dev,
 	unsigned long temp = *bw;
 	struct dev_pm_opp *opp;
 
-	opp = _find_key_floor(dev, &temp, index, true, _read_bw, NULL);
+	opp = _find_key_floor(dev, &temp, index, true, _read_bw,
+			      assert_bandwidth_index);
 	*bw = temp;
 	return opp;
 }




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux