ChangeSet 1.1267.20.2, 2003/12/19 10:52:08-08:00, oliver@neukum.org

[PATCH] USB: memory allocations in storage code path for 2.4

in block io or error paths we must use GFP_NOIO instead of GFP_KERNEL.
Under 2.4 we cannot tell and must assume the worst, hence always use GFP_NOIO.
This cset against your 2.4 BK tree does that for hcd drivers.

  -fix deadlocks with storage


 drivers/usb/host/sl811.c    |    4 ++--
 drivers/usb/host/usb-ohci.c |    2 +-
 drivers/usb/host/usb-ohci.h |    2 +-
 drivers/usb/host/usb-uhci.c |    4 ++--
 4 files changed, 6 insertions(+), 6 deletions(-)


diff -Nru a/drivers/usb/host/sl811.c b/drivers/usb/host/sl811.c
--- a/drivers/usb/host/sl811.c	Wed Jan 28 13:37:00 2004
+++ b/drivers/usb/host/sl811.c	Wed Jan 28 13:37:00 2004
@@ -652,7 +652,7 @@
 {
 	struct sl811_urb_priv *urbp;
 	
-	urbp = kmalloc(sizeof(*urbp), GFP_KERNEL);
+	urbp = kmalloc(sizeof(*urbp), GFP_ATOMIC);
 	if (!urbp)
 		return NULL;
 	
@@ -763,7 +763,7 @@
 	struct sl811_urb_priv *urbp = urb->hcpriv;
 	struct sl811_td *td;
 	
-	td = kmalloc(sizeof (*td), GFP_KERNEL);
+	td = kmalloc(sizeof (*td), GFP_ATOMIC);
 	if (!td)
 		return NULL;
 	
diff -Nru a/drivers/usb/host/usb-ohci.c b/drivers/usb/host/usb-ohci.c
--- a/drivers/usb/host/usb-ohci.c	Wed Jan 28 13:37:00 2004
+++ b/drivers/usb/host/usb-ohci.c	Wed Jan 28 13:37:00 2004
@@ -628,7 +628,7 @@
 
 	/* allocate the private part of the URB */
 	urb_priv = kmalloc (sizeof (urb_priv_t) + size * sizeof (td_t *), 
-							in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
+							in_interrupt() ? GFP_ATOMIC : GFP_NOIO);
 	if (!urb_priv) {
 		usb_dec_dev_use (urb->dev);	
 		return -ENOMEM;
diff -Nru a/drivers/usb/host/usb-ohci.h b/drivers/usb/host/usb-ohci.h
--- a/drivers/usb/host/usb-ohci.h	Wed Jan 28 13:37:00 2004
+++ b/drivers/usb/host/usb-ohci.h	Wed Jan 28 13:37:00 2004
@@ -439,7 +439,7 @@
 
 /*-------------------------------------------------------------------------*/
 
-#define ALLOC_FLAGS (in_interrupt () || current->state != TASK_RUNNING ? GFP_ATOMIC : GFP_KERNEL)
+#define ALLOC_FLAGS (in_interrupt () || current->state != TASK_RUNNING ? GFP_ATOMIC : GFP_NOIO)
 
 #ifdef DEBUG
 #	define OHCI_MEM_FLAGS	SLAB_POISON
diff -Nru a/drivers/usb/host/usb-uhci.c b/drivers/usb/host/usb-uhci.c
--- a/drivers/usb/host/usb-uhci.c	Wed Jan 28 13:37:00 2004
+++ b/drivers/usb/host/usb-uhci.c	Wed Jan 28 13:37:00 2004
@@ -88,8 +88,8 @@
 	static kmem_cache_t *urb_priv_kmem;
 #endif
 
-#define SLAB_FLAG     (in_interrupt () || current->state != TASK_RUNNING ? SLAB_ATOMIC : SLAB_KERNEL)
-#define KMALLOC_FLAG  (in_interrupt () || current->state != TASK_RUNNING ? GFP_ATOMIC : GFP_KERNEL)
+#define SLAB_FLAG     (in_interrupt () || current->state != TASK_RUNNING ? SLAB_ATOMIC : SLAB_NOIO)
+#define KMALLOC_FLAG  (in_interrupt () || current->state != TASK_RUNNING ? GFP_ATOMIC : GFP_NOIO)
 
 /* CONFIG_USB_UHCI_HIGH_BANDWITH turns on Full Speed Bandwidth
  * Reclamation: feature that puts loop on descriptor loop when
