diff options
author | Andreas Oberritter <obi@linuxtv.org> | 2011-08-04 11:33:15 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-09-03 07:49:07 -0400 |
commit | 77b1e2fbbdfa0ee5cdf6c928b711493a3738468e (patch) | |
tree | 01ea38d60c3e1e32589eb0151f63700e35e28cc8 /drivers/media/dvb/dvb-core | |
parent | 20640bea87c31a823dba3756b1a5248197f0905f (diff) |
[media] DVB: dvb_frontend: update locking in dvb_frontend_{add, get_event}
- 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>
Diffstat (limited to 'drivers/media/dvb/dvb-core')
-rw-r--r-- | drivers/media/dvb/dvb-core/dvb_frontend.c | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 410231112204..d02c32e754f4 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
@@ -149,30 +149,25 @@ static void dvb_frontend_add_event(struct dvb_frontend *fe, fe_status_t status) | |||
149 | 149 | ||
150 | dprintk ("%s\n", __func__); | 150 | dprintk ("%s\n", __func__); |
151 | 151 | ||
152 | if (mutex_lock_interruptible (&events->mtx)) | 152 | if ((status & FE_HAS_LOCK) && fe->ops.get_frontend) |
153 | return; | 153 | fe->ops.get_frontend(fe, &fepriv->parameters_out); |
154 | 154 | ||
155 | wp = (events->eventw + 1) % MAX_EVENT; | 155 | mutex_lock(&events->mtx); |
156 | 156 | ||
157 | wp = (events->eventw + 1) % MAX_EVENT; | ||
157 | if (wp == events->eventr) { | 158 | if (wp == events->eventr) { |
158 | events->overflow = 1; | 159 | events->overflow = 1; |
159 | events->eventr = (events->eventr + 1) % MAX_EVENT; | 160 | events->eventr = (events->eventr + 1) % MAX_EVENT; |
160 | } | 161 | } |
161 | 162 | ||
162 | e = &events->events[events->eventw]; | 163 | e = &events->events[events->eventw]; |
163 | 164 | e->status = status; | |
164 | if (status & FE_HAS_LOCK) | ||
165 | if (fe->ops.get_frontend) | ||
166 | fe->ops.get_frontend(fe, &fepriv->parameters_out); | ||
167 | |||
168 | e->parameters = fepriv->parameters_out; | 165 | e->parameters = fepriv->parameters_out; |
169 | 166 | ||
170 | events->eventw = wp; | 167 | events->eventw = wp; |
171 | 168 | ||
172 | mutex_unlock(&events->mtx); | 169 | mutex_unlock(&events->mtx); |
173 | 170 | ||
174 | e->status = status; | ||
175 | |||
176 | wake_up_interruptible (&events->wait_queue); | 171 | wake_up_interruptible (&events->wait_queue); |
177 | } | 172 | } |
178 | 173 | ||
@@ -207,14 +202,9 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe, | |||
207 | return ret; | 202 | return ret; |
208 | } | 203 | } |
209 | 204 | ||
210 | if (mutex_lock_interruptible (&events->mtx)) | 205 | mutex_lock(&events->mtx); |
211 | return -ERESTARTSYS; | 206 | *event = events->events[events->eventr]; |
212 | |||
213 | memcpy (event, &events->events[events->eventr], | ||
214 | sizeof(struct dvb_frontend_event)); | ||
215 | |||
216 | events->eventr = (events->eventr + 1) % MAX_EVENT; | 207 | events->eventr = (events->eventr + 1) % MAX_EVENT; |
217 | |||
218 | mutex_unlock(&events->mtx); | 208 | mutex_unlock(&events->mtx); |
219 | 209 | ||
220 | return 0; | 210 | return 0; |