From: Marek Majtyka <marekx.majt...@intel.com>

Off-load CMC isr functionality improved. Shared system work queue has been
replaces with private work queues (two wq per memory controller in order
to handle 'events' and 'alerts' separately).

Signed-off-by: Marek Majtyka <marekx.majt...@intel.com>
---
 drivers/edac/axxia_edac-cmc_56xx.c | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/drivers/edac/axxia_edac-cmc_56xx.c 
b/drivers/edac/axxia_edac-cmc_56xx.c
index 690d31f..d72e618 100644
--- a/drivers/edac/axxia_edac-cmc_56xx.c
+++ b/drivers/edac/axxia_edac-cmc_56xx.c
@@ -439,6 +439,8 @@ struct intel_edac_dev_info {
        char *blk_name;
        struct work_struct offload_alerts;
        struct work_struct offload_events;
+       struct workqueue_struct *wq_alerts;
+       struct workqueue_struct *wq_events;
        int is_ddr4;
        int edac_idx;
        u32 cm_region;
@@ -1118,14 +1120,26 @@ static int intel_edac_mc_probe(struct platform_device 
*pdev)
        snprintf(&dev_info->data->irq_name[0], IRQ_NAME_LEN,
                        "%s-mon", dev_info->ctl_name);
 
+       dev_info->wq_events = alloc_workqueue("%s-events", WQ_MEM_RECLAIM, 1,
+                                               (dev_info->ctl_name));
+       if (!dev_info->wq_events)
+               goto err_nosysfs;
+
+       if (dev_info->is_ddr4) {
+               dev_info->wq_alerts =
+                       alloc_workqueue("%s-alerts", WQ_MEM_RECLAIM, 1,
+                                       (dev_info->ctl_name));
+               if (!dev_info->wq_alerts)
+                       goto err_noevents;
+       }
        if (dev_info->is_ddr4)
                INIT_WORK(&dev_info->offload_alerts, axxia_alerts_work);
 
        INIT_WORK(&dev_info->offload_events, axxia_events_work);
 
        if (dev_info->is_ddr4)
-               schedule_work(&dev_info->offload_alerts);
-       schedule_work(&dev_info->offload_events);
+               queue_work(dev_info->wq_alerts, &dev_info->offload_alerts);
+       queue_work(dev_info->wq_events, &dev_info->offload_events);
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0) {
@@ -1177,6 +1191,11 @@ err_noirq:
        cancel_work_sync(&dev_info->offload_events);
 
        edac_device_del_device(&dev_info->pdev->dev);
+       if (dev_info->is_ddr4)
+               destroy_workqueue(dev_info->wq_alerts);
+
+err_noevents:
+       destroy_workqueue(dev_info->wq_events);
 
 err_nosysfs:
        edac_device_free_ctl_info(dev_info->edac_dev);
@@ -1208,6 +1227,10 @@ static int intel_edac_mc_remove(struct platform_device 
*pdev)
                        if (dev_info->is_ddr4)
                                cancel_work_sync(&dev_info->offload_alerts);
                        cancel_work_sync(&dev_info->offload_events);
+
+                       if (dev_info->is_ddr4)
+                               destroy_workqueue(dev_info->wq_alerts);
+                       destroy_workqueue(dev_info->wq_events);
                }
 
                if (dev_info->edac_dev != NULL) {
-- 
2.7.4

-- 
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to