drm/nouveau/core: Allow asymmetric nouveau_event_get/_put
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / nouveau / core / core / event.c
index e69c463e66e25540c16bbd67a87965d1261229ec..9393c37b71c9c1886460c99c0677501882fc8940 100644 (file)
@@ -27,11 +27,13 @@ static void
 nouveau_event_put_locked(struct nouveau_event *event, int index,
                         struct nouveau_eventh *handler)
 {
-       if (!--event->index[index].refs) {
-               if (event->disable)
-                       event->disable(event, index);
+       if (__test_and_clear_bit(NVKM_EVENT_ENABLE, &handler->flags)) {
+               if (!--event->index[index].refs) {
+                       if (event->disable)
+                               event->disable(event, index);
+               }
+               list_del(&handler->head);
        }
-       list_del(&handler->head);
 }
 
 void
@@ -58,10 +60,12 @@ nouveau_event_get(struct nouveau_event *event, int index,
                return;
 
        spin_lock_irqsave(&event->lock, flags);
-       list_add(&handler->head, &event->index[index].list);
-       if (!event->index[index].refs++) {
-               if (event->enable)
-                       event->enable(event, index);
+       if (!__test_and_set_bit(NVKM_EVENT_ENABLE, &handler->flags)) {
+               list_add(&handler->head, &event->index[index].list);
+               if (!event->index[index].refs++) {
+                       if (event->enable)
+                               event->enable(event, index);
+               }
        }
        spin_unlock_irqrestore(&event->lock, flags);
 }