Commit ab2f4087 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'edac_urgent_for_v6.2_rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras

Pull EDAC fixes from Borislav Petkov:

 - Respect user-supplied polling value in the EDAC device code

 - Fix a use-after-free issue in qcom_edac

* tag 'edac_urgent_for_v6.2_rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras:
  EDAC/qcom: Do not pass llcc_driv_data as edac_device_ctl_info's pvt_info
  EDAC/device: Respect any driver-supplied workqueue polling value
parents 2b299a1c 977c6ba6
...@@ -34,6 +34,9 @@ ...@@ -34,6 +34,9 @@
static DEFINE_MUTEX(device_ctls_mutex); static DEFINE_MUTEX(device_ctls_mutex);
static LIST_HEAD(edac_device_list); static LIST_HEAD(edac_device_list);
/* Default workqueue processing interval on this instance, in msecs */
#define DEFAULT_POLL_INTERVAL 1000
#ifdef CONFIG_EDAC_DEBUG #ifdef CONFIG_EDAC_DEBUG
static void edac_device_dump_device(struct edac_device_ctl_info *edac_dev) static void edac_device_dump_device(struct edac_device_ctl_info *edac_dev)
{ {
...@@ -336,7 +339,7 @@ static void edac_device_workq_function(struct work_struct *work_req) ...@@ -336,7 +339,7 @@ static void edac_device_workq_function(struct work_struct *work_req)
* whole one second to save timers firing all over the period * whole one second to save timers firing all over the period
* between integral seconds * between integral seconds
*/ */
if (edac_dev->poll_msec == 1000) if (edac_dev->poll_msec == DEFAULT_POLL_INTERVAL)
edac_queue_work(&edac_dev->work, round_jiffies_relative(edac_dev->delay)); edac_queue_work(&edac_dev->work, round_jiffies_relative(edac_dev->delay));
else else
edac_queue_work(&edac_dev->work, edac_dev->delay); edac_queue_work(&edac_dev->work, edac_dev->delay);
...@@ -366,7 +369,7 @@ static void edac_device_workq_setup(struct edac_device_ctl_info *edac_dev, ...@@ -366,7 +369,7 @@ static void edac_device_workq_setup(struct edac_device_ctl_info *edac_dev,
* timers firing on sub-second basis, while they are happy * timers firing on sub-second basis, while they are happy
* to fire together on the 1 second exactly * to fire together on the 1 second exactly
*/ */
if (edac_dev->poll_msec == 1000) if (edac_dev->poll_msec == DEFAULT_POLL_INTERVAL)
edac_queue_work(&edac_dev->work, round_jiffies_relative(edac_dev->delay)); edac_queue_work(&edac_dev->work, round_jiffies_relative(edac_dev->delay));
else else
edac_queue_work(&edac_dev->work, edac_dev->delay); edac_queue_work(&edac_dev->work, edac_dev->delay);
...@@ -400,7 +403,7 @@ void edac_device_reset_delay_period(struct edac_device_ctl_info *edac_dev, ...@@ -400,7 +403,7 @@ void edac_device_reset_delay_period(struct edac_device_ctl_info *edac_dev,
edac_dev->delay = msecs_to_jiffies(msec); edac_dev->delay = msecs_to_jiffies(msec);
/* See comment in edac_device_workq_setup() above */ /* See comment in edac_device_workq_setup() above */
if (edac_dev->poll_msec == 1000) if (edac_dev->poll_msec == DEFAULT_POLL_INTERVAL)
edac_mod_work(&edac_dev->work, round_jiffies_relative(edac_dev->delay)); edac_mod_work(&edac_dev->work, round_jiffies_relative(edac_dev->delay));
else else
edac_mod_work(&edac_dev->work, edac_dev->delay); edac_mod_work(&edac_dev->work, edac_dev->delay);
...@@ -442,11 +445,7 @@ int edac_device_add_device(struct edac_device_ctl_info *edac_dev) ...@@ -442,11 +445,7 @@ int edac_device_add_device(struct edac_device_ctl_info *edac_dev)
/* This instance is NOW RUNNING */ /* This instance is NOW RUNNING */
edac_dev->op_state = OP_RUNNING_POLL; edac_dev->op_state = OP_RUNNING_POLL;
/* edac_device_workq_setup(edac_dev, edac_dev->poll_msec ?: DEFAULT_POLL_INTERVAL);
* enable workq processing on this instance,
* default = 1000 msec
*/
edac_device_workq_setup(edac_dev, 1000);
} else { } else {
edac_dev->op_state = OP_RUNNING_INTERRUPT; edac_dev->op_state = OP_RUNNING_INTERRUPT;
} }
......
...@@ -252,7 +252,7 @@ dump_syn_reg_values(struct llcc_drv_data *drv, u32 bank, int err_type) ...@@ -252,7 +252,7 @@ dump_syn_reg_values(struct llcc_drv_data *drv, u32 bank, int err_type)
static int static int
dump_syn_reg(struct edac_device_ctl_info *edev_ctl, int err_type, u32 bank) dump_syn_reg(struct edac_device_ctl_info *edev_ctl, int err_type, u32 bank)
{ {
struct llcc_drv_data *drv = edev_ctl->pvt_info; struct llcc_drv_data *drv = edev_ctl->dev->platform_data;
int ret; int ret;
ret = dump_syn_reg_values(drv, bank, err_type); ret = dump_syn_reg_values(drv, bank, err_type);
...@@ -289,7 +289,7 @@ static irqreturn_t ...@@ -289,7 +289,7 @@ static irqreturn_t
llcc_ecc_irq_handler(int irq, void *edev_ctl) llcc_ecc_irq_handler(int irq, void *edev_ctl)
{ {
struct edac_device_ctl_info *edac_dev_ctl = edev_ctl; struct edac_device_ctl_info *edac_dev_ctl = edev_ctl;
struct llcc_drv_data *drv = edac_dev_ctl->pvt_info; struct llcc_drv_data *drv = edac_dev_ctl->dev->platform_data;
irqreturn_t irq_rc = IRQ_NONE; irqreturn_t irq_rc = IRQ_NONE;
u32 drp_error, trp_error, i; u32 drp_error, trp_error, i;
int ret; int ret;
...@@ -358,7 +358,6 @@ static int qcom_llcc_edac_probe(struct platform_device *pdev) ...@@ -358,7 +358,6 @@ static int qcom_llcc_edac_probe(struct platform_device *pdev)
edev_ctl->dev_name = dev_name(dev); edev_ctl->dev_name = dev_name(dev);
edev_ctl->ctl_name = "llcc"; edev_ctl->ctl_name = "llcc";
edev_ctl->panic_on_ue = LLCC_ERP_PANIC_ON_UE; edev_ctl->panic_on_ue = LLCC_ERP_PANIC_ON_UE;
edev_ctl->pvt_info = llcc_driv_data;
rc = edac_device_add_device(edev_ctl); rc = edac_device_add_device(edev_ctl);
if (rc) if (rc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment