return -ENOENT;
        }
 
-       spin_lock(&sdei_list_lock);
-       event->reenable = true;
-       spin_unlock(&sdei_list_lock);
 
+       cpus_read_lock();
        if (event->type == SDEI_EVENT_TYPE_SHARED)
                err = sdei_api_event_enable(event->event_num);
        else
                err = sdei_do_cross_call(_local_event_enable, event);
+
+       if (!err) {
+               spin_lock(&sdei_list_lock);
+               event->reenable = true;
+               spin_unlock(&sdei_list_lock);
+       }
+       cpus_read_unlock();
        mutex_unlock(&sdei_events_lock);
 
        return err;
                        break;
                }
 
-               spin_lock(&sdei_list_lock);
-               event->reregister = true;
-               spin_unlock(&sdei_list_lock);
-
+               cpus_read_lock();
                err = _sdei_event_register(event);
                if (err) {
-                       spin_lock(&sdei_list_lock);
-                       event->reregister = false;
-                       event->reenable = false;
-                       spin_unlock(&sdei_list_lock);
-
                        sdei_event_destroy(event);
                        pr_warn("Failed to register event %u: %d\n", event_num,
                                err);
+               } else {
+                       spin_lock(&sdei_list_lock);
+                       event->reregister = true;
+                       spin_unlock(&sdei_list_lock);
                }
+               cpus_read_unlock();
        } while (0);
        mutex_unlock(&sdei_events_lock);