Skip to content

Commit ab2f408

Browse files
committed
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
2 parents 2b299a1 + 977c6ba commit ab2f408

File tree

2 files changed

+9
-11
lines changed

2 files changed

+9
-11
lines changed

drivers/edac/edac_device.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
static DEFINE_MUTEX(device_ctls_mutex);
3535
static LIST_HEAD(edac_device_list);
3636

37+
/* Default workqueue processing interval on this instance, in msecs */
38+
#define DEFAULT_POLL_INTERVAL 1000
39+
3740
#ifdef CONFIG_EDAC_DEBUG
3841
static void edac_device_dump_device(struct edac_device_ctl_info *edac_dev)
3942
{
@@ -336,7 +339,7 @@ static void edac_device_workq_function(struct work_struct *work_req)
336339
* whole one second to save timers firing all over the period
337340
* between integral seconds
338341
*/
339-
if (edac_dev->poll_msec == 1000)
342+
if (edac_dev->poll_msec == DEFAULT_POLL_INTERVAL)
340343
edac_queue_work(&edac_dev->work, round_jiffies_relative(edac_dev->delay));
341344
else
342345
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,
366369
* timers firing on sub-second basis, while they are happy
367370
* to fire together on the 1 second exactly
368371
*/
369-
if (edac_dev->poll_msec == 1000)
372+
if (edac_dev->poll_msec == DEFAULT_POLL_INTERVAL)
370373
edac_queue_work(&edac_dev->work, round_jiffies_relative(edac_dev->delay));
371374
else
372375
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,
400403
edac_dev->delay = msecs_to_jiffies(msec);
401404

402405
/* See comment in edac_device_workq_setup() above */
403-
if (edac_dev->poll_msec == 1000)
406+
if (edac_dev->poll_msec == DEFAULT_POLL_INTERVAL)
404407
edac_mod_work(&edac_dev->work, round_jiffies_relative(edac_dev->delay));
405408
else
406409
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)
442445
/* This instance is NOW RUNNING */
443446
edac_dev->op_state = OP_RUNNING_POLL;
444447

445-
/*
446-
* enable workq processing on this instance,
447-
* default = 1000 msec
448-
*/
449-
edac_device_workq_setup(edac_dev, 1000);
448+
edac_device_workq_setup(edac_dev, edac_dev->poll_msec ?: DEFAULT_POLL_INTERVAL);
450449
} else {
451450
edac_dev->op_state = OP_RUNNING_INTERRUPT;
452451
}

drivers/edac/qcom_edac.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ dump_syn_reg_values(struct llcc_drv_data *drv, u32 bank, int err_type)
252252
static int
253253
dump_syn_reg(struct edac_device_ctl_info *edev_ctl, int err_type, u32 bank)
254254
{
255-
struct llcc_drv_data *drv = edev_ctl->pvt_info;
255+
struct llcc_drv_data *drv = edev_ctl->dev->platform_data;
256256
int ret;
257257

258258
ret = dump_syn_reg_values(drv, bank, err_type);
@@ -289,7 +289,7 @@ static irqreturn_t
289289
llcc_ecc_irq_handler(int irq, void *edev_ctl)
290290
{
291291
struct edac_device_ctl_info *edac_dev_ctl = edev_ctl;
292-
struct llcc_drv_data *drv = edac_dev_ctl->pvt_info;
292+
struct llcc_drv_data *drv = edac_dev_ctl->dev->platform_data;
293293
irqreturn_t irq_rc = IRQ_NONE;
294294
u32 drp_error, trp_error, i;
295295
int ret;
@@ -358,7 +358,6 @@ static int qcom_llcc_edac_probe(struct platform_device *pdev)
358358
edev_ctl->dev_name = dev_name(dev);
359359
edev_ctl->ctl_name = "llcc";
360360
edev_ctl->panic_on_ue = LLCC_ERP_PANIC_ON_UE;
361-
edev_ctl->pvt_info = llcc_driv_data;
362361

363362
rc = edac_device_add_device(edev_ctl);
364363
if (rc)

0 commit comments

Comments
 (0)