@@ -717,26 +717,42 @@ static void cxl_cper_post_event(enum cxl_event_type event_type,
schedule_work(cxl_cper_work);
}
-int cxl_cper_register_event_work(struct work_struct *work)
+static int cxl_cper_register_work(struct work_struct **work_ptr,
+ spinlock_t *lock,
+ struct work_struct *work)
{
- if (cxl_cper_work)
+ if (*work_ptr)
return -EINVAL;
- guard(spinlock)(&cxl_cper_work_lock);
- cxl_cper_work = work;
+ guard(spinlock)(lock);
+ *work_ptr = work;
return 0;
}
-EXPORT_SYMBOL_NS_GPL(cxl_cper_register_event_work, CXL);
-int cxl_cper_unregister_event_work(struct work_struct *work)
+static int cxl_cper_unregister_work(struct work_struct **work_ptr,
+ spinlock_t *lock,
+ struct work_struct *work)
{
- if (cxl_cper_work != work)
+ if (*work_ptr != work)
return -EINVAL;
- guard(spinlock)(&cxl_cper_work_lock);
- cxl_cper_work = NULL;
+ guard(spinlock)(lock);
+ *work_ptr = NULL;
return 0;
}
+
+int cxl_cper_register_event_work(struct work_struct *work)
+{
+ return cxl_cper_register_work(&cxl_cper_work, &cxl_cper_work_lock,
+ work);
+}
+EXPORT_SYMBOL_NS_GPL(cxl_cper_register_event_work, CXL);
+
+int cxl_cper_unregister_event_work(struct work_struct *work)
+{
+ return cxl_cper_unregister_work(&cxl_cper_work, &cxl_cper_work_lock,
+ work);
+}
EXPORT_SYMBOL_NS_GPL(cxl_cper_unregister_event_work, CXL);
int cxl_cper_kfifo_get(struct cxl_cper_work_data *wd)
Refactor the work registration and unregistration functions in GHES to enable reuse across different workqueues. This update lays the foundation for integrating additional workqueues in the CXL subsystem for better modularity and code reuse. Signed-off-by: Smita Koralahalli <Smita.KoralahalliChannabasappa@amd.com> --- drivers/acpi/apei/ghes.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-)