aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/gspca.h
diff options
context:
space:
mode:
authorJean-François Moine <moinejf@free.fr>2010-07-06 03:32:27 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-08-02 15:42:48 -0400
commitf7059eaa285c0460569ffd26c43ae07e3f03cd6c (patch)
tree4f31450a63b1460fcdf3b79e8f47d8b824683a60 /drivers/media/video/gspca/gspca.h
parent02bbcb9d863df10b5a4b91ba5b4c76eaf1340883 (diff)
V4L/DVB: gspca - main: Don't use the frame buffer flags
This patch fixes possible race conditions in queue management with SMP: when a frame was completed, the irq function tried to use the next frame buffer. At this time, it was possible that the application on an other processor updated the frame pointer, making the image to point to a bad buffer. The patch contains two main changes: - the image transfer uses the queue indexes which are protected against simultaneous memory access, - the image pointer which is used for image concatenation is only set at interrupt level. Some subdrivers which used the image pointer have been updated. Reported-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Jean-François Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/gspca.h')
-rw-r--r--drivers/media/video/gspca/gspca.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/media/video/gspca/gspca.h b/drivers/media/video/gspca/gspca.h
index 453e43d66a8..17e55580631 100644
--- a/drivers/media/video/gspca/gspca.h
+++ b/drivers/media/video/gspca/gspca.h
@@ -178,11 +178,11 @@ struct gspca_dev {
178 u8 *image; /* image beeing filled */ 178 u8 *image; /* image beeing filled */
179 __u32 frsz; /* frame size */ 179 __u32 frsz; /* frame size */
180 u32 image_len; /* current length of image */ 180 u32 image_len; /* current length of image */
181 char nframes; /* number of frames */ 181 atomic_t fr_q; /* next frame to queue */
182 char fr_i; /* frame being filled */ 182 atomic_t fr_i; /* frame being filled */
183 char fr_q; /* next frame to queue */
184 char fr_o; /* next frame to dequeue */
185 signed char fr_queue[GSPCA_MAX_FRAMES]; /* frame queue */ 183 signed char fr_queue[GSPCA_MAX_FRAMES]; /* frame queue */
184 char nframes; /* number of frames */
185 u8 fr_o; /* next frame to dequeue */
186 __u8 last_packet_type; 186 __u8 last_packet_type;
187 __s8 empty_packet; /* if (-1) don't check empty packets */ 187 __s8 empty_packet; /* if (-1) don't check empty packets */
188 __u8 streaming; 188 __u8 streaming;