1 commit 94ba346ef539ded9c717cabd05d1b482673da0be
2 Author: Andreas Oberritter <obi@linuxtv.org>
3 Date: Thu Aug 4 13:24:28 2011 +0000
5 DVB: dvb_frontend: update locking in dvb_frontend_{add,get_event}
7 - dvb_frontend_add_event:
8 - fepriv->parameters_out isn't protected by events->mtx, so
9 move the call to fe->ops.get_frontend out of the locked area.
10 - move the assignment of e->status into the locked area.
12 - dvb_frontend_get_event:
13 - use direct assignment instead of memcpy.
15 - dvb_frontend_add_event and dvb_frontend_get_event:
16 - use mutex_lock instead of mutex_lock_interruptible, because
17 all code paths protected by this mutex won't block.
19 Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
20 Signed-off-by: ghost <andreas.monzner@multimedia-labs.de>
22 diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
23 index 9f39581..c03acdb 100644
24 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c
25 +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
26 @@ -156,30 +156,25 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status)
28 dprintk ("%s\n", __func__);
30 - if (mutex_lock_interruptible (&events->mtx))
32 + if ((status & FE_HAS_LOCK) && fe->ops.get_frontend)
33 + fe->ops.get_frontend(fe, &fepriv->parameters_out);
35 - wp = (events->eventw + 1) % MAX_EVENT;
36 + mutex_lock(&events->mtx);
38 + wp = (events->eventw + 1) % MAX_EVENT;
39 if (wp == events->eventr) {
41 events->eventr = (events->eventr + 1) % MAX_EVENT;
44 e = &events->events[events->eventw];
46 - if (status & FE_HAS_LOCK)
47 - if (fe->ops.get_frontend)
48 - fe->ops.get_frontend(fe, &fepriv->parameters_out);
51 e->parameters = fepriv->parameters_out;
55 mutex_unlock(&events->mtx);
59 wake_up_interruptible (&events->wait_queue);
62 @@ -209,14 +209,9 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe,
66 - if (mutex_lock_interruptible (&events->mtx))
67 - return -ERESTARTSYS;
69 - memcpy (event, &events->events[events->eventr],
70 - sizeof(struct dvb_frontend_event));
72 + mutex_lock(&events->mtx);
73 + *event = events->events[events->eventr];
74 events->eventr = (events->eventr + 1) % MAX_EVENT;
76 mutex_unlock(&events->mtx);