]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mei: vsc: Event notifier fixes
authorHans de Goede <hansg@kernel.org>
Mon, 23 Jun 2025 08:50:48 +0000 (10:50 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 24 Jun 2025 15:39:01 +0000 (16:39 +0100)
vsc_tp_register_event_cb() can race with vsc_tp_thread_isr(), add a mutex
to protect against this.

Fixes: 566f5ca97680 ("mei: Add transport driver for IVSC device")
Signed-off-by: Hans de Goede <hansg@kernel.org>
Link: https://lore.kernel.org/r/20250623085052.12347-7-hansg@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/vsc-tp.c

index 0feebffabdb38144360cd3e1c1f7c0f8d8207451..76a6aa606a26f9b4f348253b273fdca26aed7e1c 100644 (file)
@@ -79,9 +79,8 @@ struct vsc_tp {
 
        vsc_tp_event_cb_t event_notify;
        void *event_notify_context;
-
-       /* used to protect command download */
-       struct mutex mutex;
+       struct mutex event_notify_mutex;        /* protects event_notify + context */
+       struct mutex mutex;                     /* protects command download */
 };
 
 /* GPIO resources */
@@ -113,6 +112,8 @@ static irqreturn_t vsc_tp_thread_isr(int irq, void *data)
 {
        struct vsc_tp *tp = data;
 
+       guard(mutex)(&tp->event_notify_mutex);
+
        if (tp->event_notify)
                tp->event_notify(tp->event_notify_context);
 
@@ -399,6 +400,8 @@ EXPORT_SYMBOL_NS_GPL(vsc_tp_need_read, "VSC_TP");
 int vsc_tp_register_event_cb(struct vsc_tp *tp, vsc_tp_event_cb_t event_cb,
                            void *context)
 {
+       guard(mutex)(&tp->event_notify_mutex);
+
        tp->event_notify = event_cb;
        tp->event_notify_context = context;
 
@@ -499,6 +502,7 @@ static int vsc_tp_probe(struct spi_device *spi)
                return ret;
 
        mutex_init(&tp->mutex);
+       mutex_init(&tp->event_notify_mutex);
 
        /* only one child acpi device */
        ret = acpi_dev_for_each_child(ACPI_COMPANION(dev),
@@ -523,6 +527,7 @@ static int vsc_tp_probe(struct spi_device *spi)
 err_destroy_lock:
        free_irq(spi->irq, tp);
 
+       mutex_destroy(&tp->event_notify_mutex);
        mutex_destroy(&tp->mutex);
 
        return ret;
@@ -537,6 +542,7 @@ static void vsc_tp_remove(struct spi_device *spi)
 
        free_irq(spi->irq, tp);
 
+       mutex_destroy(&tp->event_notify_mutex);
        mutex_destroy(&tp->mutex);
 }