- Respect user-supplied polling value in the EDAC device code
- Fix a use-after-free issue in qcom_edac -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEzv7L6UO9uDPlPSfHEsHwGGHeVUoFAmPNJhsACgkQEsHwGGHe VUp5Rg//SAJS9LKvjRYKqA3ruJoSqdyb9wdp4EwvZNM9aScF5hbxcng3QT4KQbzX EQgn9FvSa3YurAEMj7q8I4B0qby+xuR2lcbWSwg2jkXgu6cPviJOw4o3lqaSJqxS yjfuaPpOCChmgOSfl9Yuk6Nj+mSD0nYZtK0i2qf03MGNXDWfNGokHQ1OCdrVONm7 ySBIPD2zamso8YYLcr/PjGEECw9DfNl6CwB97RfogUXfotCp0zNekCWTZNaIp/js rETcf5FDjKsCHrL4y9fy8CJ7Bb3BGcMA7p/Vtj62CT2rhBXLKKAKU/JFnQLUBFN1 vzdhC5P46BR+e+Iy90aUYuOFvuwyIjF/wySD/DcGcXZMbeeEKvRJMECWGzZ8otQm qyFgRoWAoIDXqxfUSS8XYAFoLoXq2KPdav2I4qt7ApW+6yovFiBRnNsbrI9fvjSo DH2mcgmjkSY3frbxhcI6XeS+oLXDiRKwlHOFV/8GWmrbm7TKXqOgXNLLUdaqFkAH vBTkMvxfHh4SMd6O/8KiH9dvhXgGWvJoapZpFQkVa3/c+5l0Sb1mi3YmXdaTDvtK s7PKsUpFwDGD+98+II4pRupHkCnXMcvQVlnn/lADiX8LD9N8VudFWEhX9Bou7/gV yVYm1sIp1t6cdKzznuaQh8rUNtwCbXOwePPua31A6V1OeieNvE4= =P94r -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
ab2f408731
@ -34,6 +34,9 @@
|
||||
static DEFINE_MUTEX(device_ctls_mutex);
|
||||
static LIST_HEAD(edac_device_list);
|
||||
|
||||
/* Default workqueue processing interval on this instance, in msecs */
|
||||
#define DEFAULT_POLL_INTERVAL 1000
|
||||
|
||||
#ifdef CONFIG_EDAC_DEBUG
|
||||
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)
|
||||
* whole one second to save timers firing all over the period
|
||||
* 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));
|
||||
else
|
||||
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,
|
||||
* timers firing on sub-second basis, while they are happy
|
||||
* 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));
|
||||
else
|
||||
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,
|
||||
edac_dev->delay = msecs_to_jiffies(msec);
|
||||
|
||||
/* 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));
|
||||
else
|
||||
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)
|
||||
/* This instance is NOW RUNNING */
|
||||
edac_dev->op_state = OP_RUNNING_POLL;
|
||||
|
||||
/*
|
||||
* enable workq processing on this instance,
|
||||
* default = 1000 msec
|
||||
*/
|
||||
edac_device_workq_setup(edac_dev, 1000);
|
||||
edac_device_workq_setup(edac_dev, edac_dev->poll_msec ?: DEFAULT_POLL_INTERVAL);
|
||||
} else {
|
||||
edac_dev->op_state = OP_RUNNING_INTERRUPT;
|
||||
}
|
||||
|
@ -252,7 +252,7 @@ clear:
|
||||
static int
|
||||
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;
|
||||
|
||||
ret = dump_syn_reg_values(drv, bank, err_type);
|
||||
@ -289,7 +289,7 @@ static irqreturn_t
|
||||
llcc_ecc_irq_handler(int irq, void *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;
|
||||
u32 drp_error, trp_error, i;
|
||||
int ret;
|
||||
@ -358,7 +358,6 @@ static int qcom_llcc_edac_probe(struct platform_device *pdev)
|
||||
edev_ctl->dev_name = dev_name(dev);
|
||||
edev_ctl->ctl_name = "llcc";
|
||||
edev_ctl->panic_on_ue = LLCC_ERP_PANIC_ON_UE;
|
||||
edev_ctl->pvt_info = llcc_driv_data;
|
||||
|
||||
rc = edac_device_add_device(edev_ctl);
|
||||
if (rc)
|
||||
|
Loading…
x
Reference in New Issue
Block a user