Skip to content

Commit

Permalink
[media] DVB: dvb_frontend: update locking in dvb_frontend_{add, get_e…
Browse files Browse the repository at this point in the history
…vent}

  - 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>
  • Loading branch information
Andreas Oberritter authored and Mauro Carvalho Chehab committed Sep 3, 2011
1 parent 20640be commit 77b1e2f
Showing 1 changed file with 7 additions and 17 deletions.
24 changes: 7 additions & 17 deletions drivers/media/dvb/dvb-core/dvb_frontend.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 77b1e2f

Please sign in to comment.