[media] DVB: dvb_frontend: update locking in dvb_frontend_{add, get_event}
authorAndreas Oberritter <obi@linuxtv.org>
Thu, 4 Aug 2011 15:33:15 +0000 (12:33 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 3 Sep 2011 11:49:07 +0000 (08:49 -0300)
  - fepriv->parameters_out isn't protected by events->mtx, so
    move the call to fe->ops.get_frontend out of the locked area.
  - move the assignment of e->status into the locked area.

  - use direct assignment instead of memcpy.

  - use mutex_lock instead of mutex_lock_interruptible, because
    all code paths protected by this mutex won't block.

Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/dvb-core/dvb_frontend.c

index 4102311..d02c32e 100644 (file)
@@ -149,30 +149,25 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
 
        dprintk ("%s\n", __func__);
 
-       if (mutex_lock_interruptible (&events->mtx))
-               return;
+       if ((status & FE_HAS_LOCK) && fe->ops.get_frontend)
+               fe->ops.get_frontend(fe, &fepriv->parameters_out);
 
-       wp = (events->eventw + 1) % MAX_EVENT;
+       mutex_lock(&events->mtx);
 
+       wp = (events->eventw + 1) % MAX_EVENT;
        if (wp == events->eventr) {
                events->overflow = 1;
                events->eventr = (events->eventr + 1) % MAX_EVENT;
        }
 
        e = &events->events[events->eventw];
-
-       if (status & FE_HAS_LOCK)
-               if (fe->ops.get_frontend)
-                       fe->ops.get_frontend(fe, &fepriv->parameters_out);
-
+       e->status = status;
        e->parameters = fepriv->parameters_out;
 
        events->eventw = wp;
 
        mutex_unlock(&events->mtx);
 
-       e->status = status;
-
        wake_up_interruptible (&events->wait_queue);
 }
 
@@ -207,14 +202,9 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe,
                        return ret;
        }
 
-       if (mutex_lock_interruptible (&events->mtx))
-               return -ERESTARTSYS;
-
-       memcpy (event, &events->events[events->eventr],
-               sizeof(struct dvb_frontend_event));
-
+       mutex_lock(&events->mtx);
+       *event = events->events[events->eventr];
        events->eventr = (events->eventr + 1) % MAX_EVENT;
-
        mutex_unlock(&events->mtx);
 
        return 0;