All of lore.kernel.org
 help / color / mirror / Atom feed
From: Parag Warudkar <kernel-stuff@comcast.net>
To: bcollins@debian.org, linux-kernel <linux-kernel@vger.kernel.org>,
	linux1394-devel@lists.sourceforge.net,
	Andrew Morton <akpm@osdl.org>
Subject: [PATCH] ohci1394: dma_pool_destroy while in_atomic() && irqs_disabled()
Date: Sun, 30 Jan 2005 15:54:36 -0500	[thread overview]
Message-ID: <41FD498C.9000708@comcast.net> (raw)

[-- Attachment #1: Type: text/plain, Size: 1555 bytes --]

Problem - ohci1394.c:ohci_devctl ends up calling dma_pool_destroy from 
invalid context. Below is the dmesg output when I exit Kino after video 
capture -

Debug: sleeping function called from invalid context at 
include/asm/semaphore.h:107
in_atomic():1, irqs_disabled():1
 [<c0104c2e>] dump_stack+0x1e/0x20
 [<c011f8a2>] __might_sleep+0xa2/0xc0
 [<c028c660>] dma_pool_destroy+0x20/0x140
 [<f0b7affe>] free_dma_rcv_ctx+0x8e/0x150 [ohci1394]
 [<f0b774a4>] ohci_devctl+0x214/0x9b0 [ohci1394]
 [<f0e7aa99>] handle_iso_listen+0x2d9/0x310 [raw1394]
 [<f0e7f22b>] state_connected+0x29b/0x2b0 [raw1394]
 [<f0e7f2de>] raw1394_write+0x9e/0xd0 [raw1394]
 [<c0183ef2>] vfs_write+0xc2/0x170
 [<c018406b>] sys_write+0x4b/0x80
 [<c0103cb1>] sysenter_past_esp+0x52/0x75

Attached patch against 2.6.11-rc2 (tested to work normally with a  
camcorder device) enables ohci_devctl to defer the work of destroying 
the dma pool by using a work queue, so the dma pool is destroyed in a 
valid context and we no longer get an error in dmesg (duh :)

Note : There still exists  one more similar problem with ohci1394 - that 
is with dma_pool_create being called from invalid context - this happens 
in response to ISO_LISTEN_CHANNEL. I get dmesg debug for this case which 
is similar to the above. My analysis is that this one is non-trivial to 
fix. More on this in a separate mail.

Patch is attached since T'Bird messes up with the inlined one. (Pls. 
suggest a good email client for kernel patch stuff :)

Signed-off-by: Parag Warudkar (kernel-stuff@comcast.net)


Parag



[-- Attachment #2: patch-ohci1394 --]
[-- Type: text/plain, Size: 1596 bytes --]

--- drivers/ieee1394/ohci1394.c.orig	2004-12-24 16:35:25.000000000 -0500
+++ drivers/ieee1394/ohci1394.c	2005-01-30 15:46:34.000000000 -0500
@@ -99,6 +99,7 @@
 #include <asm/uaccess.h>
 #include <linux/delay.h>
 #include <linux/spinlock.h>
+#include <linux/workqueue.h>
 
 #include <asm/pgtable.h>
 #include <asm/page.h>
@@ -164,6 +165,7 @@
 static char version[] __devinitdata =
 	"$Rev: 1223 $ Ben Collins <bcollins@debian.org>";
 
+
 /* Module Parameters */
 static int phys_dma = 1;
 module_param(phys_dma, int, 0644);
@@ -184,6 +186,8 @@
 
 static void ohci1394_pci_remove(struct pci_dev *pdev);
 
+static void ohci_free_dma_work_fn(void* data);
+
 #ifndef __LITTLE_ENDIAN
 static unsigned hdr_sizes[] =
 {
@@ -1130,6 +1134,13 @@
 	return retval;
 }
 
+static void ohci_free_dma_work_fn(void* data)
+{
+	struct pci_pool* prg_pool = (struct pci_pool*) data;
+	pci_pool_destroy(prg_pool);
+	OHCI_DMA_FREE("dma_rcv prg pool");
+}
+
 /***********************************
  * rawiso ISO reception            *
  ***********************************/
@@ -2898,13 +2909,14 @@
 		kfree(d->buf_bus);
 	}
 	if (d->prg_cpu) {
+		struct work_struct ohci_free_dma_work;
 		for (i=0; i<d->num_desc; i++)
 			if (d->prg_cpu[i] && d->prg_bus[i]) {
 				pci_pool_free(d->prg_pool, d->prg_cpu[i], d->prg_bus[i]);
 				OHCI_DMA_FREE("consistent dma_rcv prg[%d]", i);
 			}
-		pci_pool_destroy(d->prg_pool);
-		OHCI_DMA_FREE("dma_rcv prg pool");
+		INIT_WORK(&ohci_free_dma_work, ohci_free_dma_work_fn, (void*) d->prg_pool);
+		schedule_work(&ohci_free_dma_work);
 		kfree(d->prg_cpu);
 		kfree(d->prg_bus);
 	}

             reply	other threads:[~2005-01-30 20:54 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-01-30 20:54 Parag Warudkar [this message]
2005-01-30 21:17 ` [PATCH] ohci1394: dma_pool_destroy while in_atomic() && irqs_disabled() Andrew Morton
2005-01-30 22:49   ` Parag Warudkar
2005-01-30 23:02     ` Andrew Morton
2005-01-31  1:19       ` Parag Warudkar
2005-01-31 23:26         ` Parag Warudkar
2005-02-11 15:35         ` Dan Dennedy
2005-02-11 18:43           ` Jody McIntyre
2005-02-12  3:54             ` Parag Warudkar
2005-02-18 15:32               ` Dan Dennedy
2005-02-18 15:42                 ` Parag Warudkar
2005-02-19  6:36                   ` Jody McIntyre
2005-02-19 15:06                     ` Parag Warudkar
  -- strict thread matches above, loose matches on Subject: below --
2005-02-19 19:36 David Brownell
2005-02-19 20:50 ` Parag Warudkar
2005-02-19 21:13   ` David Brownell
2005-02-19 22:55 ` Jody McIntyre

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41FD498C.9000708@comcast.net \
    --to=kernel-stuff@comcast.net \
    --cc=akpm@osdl.org \
    --cc=bcollins@debian.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux1394-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.