Skip to contentSkip to conversation

saa7146 memory leakage in pagetable-handling, v2

PATCH Applied Michael Hunold 2 participants 2 messages Oct 7, 2009 – Oct 31, 2009 Media (V4L/DVB)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 saa7146 memory leakage in pagetable-handling, v2

Hello Mauro,

on Mon, 28 Sep 2009 Johann Friedrichs sent a patch to linux-media in order to fix a memory leak in my saa7146 driver.

He contacted me and together we have come up with a new patch that fixes the problem more explicitely.

Would you please be so kind and manually pick up this patch and provide it upstream?

All kudos belong to Johann Friedrich for finding the bug and providing the initial fix.

Best regards
Michael Hunold.

V4L: saa7146: fix memory leak when buffer properties change or buffer
is released

From: Johann Friedrichs <[email protected]>

In buffer_release() the previously allocated pagetables are not freed, which might result in a memory leak in certain application use-cases, where the frame format is changed from planar format to non-planar format. The fix explicitely frees the page tables when a format change is done and when buffer_release() is called.

drivers/media/common/saa7146_video.c +11 -5
index 552dab4..becbaad 100644
@@ -1205,6 +1205,13 @@ static int buffer_activate (struct saa7146_dev *dev,
 	return 0;
 }
 
+static void release_all_pagetables(struct saa7146_dev *dev, struct saa7146_buf *buf)
+{
+	saa7146_pgtable_free(dev->pci, &buf->pt[0]);
+	saa7146_pgtable_free(dev->pci, &buf->pt[1]);
+	saa7146_pgtable_free(dev->pci, &buf->pt[2]);
+}
+
 static int buffer_prepare(struct videobuf_queue *q,
 			  struct videobuf_buffer *vb, enum v4l2_field field)
 {
@@ -1257,16 +1264,12 @@ static int buffer_prepare(struct videobuf_queue *q,
 
 		sfmt = format_by_fourcc(dev,buf->fmt->pixelformat);
 
+		release_all_pagetables(dev, buf);
 		if( 0 != IS_PLANAR(sfmt->trans)) {
-			saa7146_pgtable_free(dev->pci, &buf->pt[0]);
-			saa7146_pgtable_free(dev->pci, &buf->pt[1]);
-			saa7146_pgtable_free(dev->pci, &buf->pt[2]);
-
 			saa7146_pgtable_alloc(dev->pci, &buf->pt[0]);
 			saa7146_pgtable_alloc(dev->pci, &buf->pt[1]);
 			saa7146_pgtable_alloc(dev->pci, &buf->pt[2]);
 		} else {
-			saa7146_pgtable_free(dev->pci, &buf->pt[0]);
 			saa7146_pgtable_alloc(dev->pci, &buf->pt[0]);
 		}
 
@@ -1329,6 +1332,9 @@ static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
 	struct saa7146_buf *buf = (struct saa7146_buf *)vb;
 
 	DEB_CAP(("vbuf:%p\n",vb));
+
+	release_all_pagetables(dev, buf);
+
 	saa7146_dma_free(dev,q,buf);
 }
 
#1 lore raw

Michael Hunold escreveu:

Quoted 11 lines

Hello Mauro,

on Mon, 28 Sep 2009 Johann Friedrichs sent a patch to linux-media in order to fix a memory leak in my saa7146 driver.

He contacted me and together we have come up with a new patch that fixes the problem more explicitely.

Would you please be so kind and manually pick up this patch and provide it upstream?

No problem.

Applied, thanks!

Quoted 8 lines

All kudos belong to Johann Friedrich for finding the bug and providing the initial fix.

Best regards
Michael Hunold.