Merge branch 'vuplus-1.6' of 192.168.102.66:/var/ikseong/repo/openembedded into test_0921
[vuplus_openembedded] / recipes / v4l-dvb / files / backport-c.patch
1 commit 94ba346ef539ded9c717cabd05d1b482673da0be
2 Author: Andreas Oberritter <obi@linuxtv.org>
3 Date:   Thu Aug 4 13:24:28 2011 +0000
4
5     DVB: dvb_frontend: update locking in dvb_frontend_{add,get_event}
6     
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.
11     
12     - dvb_frontend_get_event:
13       - use direct assignment instead of memcpy.
14     
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.
18     
19     Signed-off-by: Andreas Oberritter <obi@linuxtv.org>
20     Signed-off-by: ghost <andreas.monzner@multimedia-labs.de>
21
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)
27  
28         dprintk ("%s\n", __func__);
29  
30 -       if (mutex_lock_interruptible (&events->mtx))
31 -               return;
32 +       if ((status & FE_HAS_LOCK) && fe->ops.get_frontend)
33 +               fe->ops.get_frontend(fe, &fepriv->parameters_out);
34  
35 -       wp = (events->eventw + 1) % MAX_EVENT;
36 +       mutex_lock(&events->mtx);
37  
38 +       wp = (events->eventw + 1) % MAX_EVENT;
39         if (wp == events->eventr) {
40                 events->overflow = 1;
41                 events->eventr = (events->eventr + 1) % MAX_EVENT;
42         }
43  
44         e = &events->events[events->eventw];
45 -
46 -       if (status & FE_HAS_LOCK)
47 -               if (fe->ops.get_frontend)
48 -                       fe->ops.get_frontend(fe, &fepriv->parameters_out);
49 -
50 +       e->status = status;
51         e->parameters = fepriv->parameters_out;
52  
53         events->eventw = wp;
54  
55         mutex_unlock(&events->mtx);
56  
57 -       e->status = status;
58 -
59         wake_up_interruptible (&events->wait_queue);
60  }
61  
62 @@ -209,14 +209,9 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe,
63                         return ret;
64         }
65  
66 -       if (mutex_lock_interruptible (&events->mtx))
67 -               return -ERESTARTSYS;
68 -
69 -       memcpy (event, &events->events[events->eventr],
70 -               sizeof(struct dvb_frontend_event));
71 -
72 +       mutex_lock(&events->mtx);
73 +       *event = events->events[events->eventr];
74         events->eventr = (events->eventr + 1) % MAX_EVENT;
75 -
76         mutex_unlock(&events->mtx);
77  
78         return 0;