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

Off-load SMC 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-mc_56xx.c | 37 ++++++++++++++++++++++++++++++++-----
 1 file changed, 32 insertions(+), 5 deletions(-)

diff --git a/drivers/edac/axxia_edac-mc_56xx.c 
b/drivers/edac/axxia_edac-mc_56xx.c
index 5d91ba6..0866a8c 100644
--- a/drivers/edac/axxia_edac-mc_56xx.c
+++ b/drivers/edac/axxia_edac-mc_56xx.c
@@ -612,6 +612,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 sm_region;
@@ -1193,7 +1195,7 @@ static int intel_edac_mc_probe(struct platform_device 
*pdev)
        dev_info->data =
                devm_kzalloc(&pdev->dev, sizeof(*dev_info->data), GFP_KERNEL);
        if (!dev_info->data)
-               goto err_noctlinfo;
+               goto err_nomem;
 
        init_waitqueue_head(&dev_info->data->dump_wq);
        init_waitqueue_head(&dev_info->data->event_wq);
@@ -1335,20 +1337,34 @@ static int intel_edac_mc_probe(struct platform_device 
*pdev)
        if (edac_device_add_device(dev_info->edac_dev) != 0) {
                pr_info("Unable to add edac device for %s\n",
                        dev_info->ctl_name);
-               goto err_nosysfs;
+               goto err_noctlinfo;
        }
 
        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) {
@@ -1420,15 +1436,22 @@ err_noirq:
        if (dev_info->is_ddr4)
                cancel_work_sync(&dev_info->offload_alerts);
        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);
+
 err_noctlinfo:
        mutex_destroy(&dev_info->data->edac_sysfs_data_lock);
        atomic64_dec(&mc_counter);
        return 1;
+
 err_nomem:
        atomic64_dec(&mc_counter);
        return -ENOMEM;
@@ -1453,6 +1476,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