aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/dvb-core
diff options
context:
space:
mode:
authorAndreas Oberritter <obi@linuxtv.org>2011-08-04 11:33:15 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-09-03 07:49:07 -0400
commit77b1e2fbbdfa0ee5cdf6c928b711493a3738468e (patch)
tree01ea38d60c3e1e32589eb0151f63700e35e28cc8 /drivers/media/dvb/dvb-core
parent20640bea87c31a823dba3756b1a5248197f0905f (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.c24
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;