Skip to contentSkip to conversation

net/ibmtr: remove interruptible_sleep_on_timeout() usage

PATCH New Nishanth Aravamudan 1 participant 1 message Feb 2, 2005

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 4/20 net/ibmtr: remove interruptible_sleep_on_timeout() usage

Hello,

Please consider applying. This patch supersedes the recent patch "net/ibmtr:
remove sleep_on*() usage"

Description: Replace deprecated sleep_on*() function calls with direct wait-queue usage. Patch is compile-tested. The patch also fixes a potentially racy conditional in tok_open(), whereby msleep_interruptible() could receive a signal within the last jiffy, thus returning 0, but signal_pending(current) would be true.

drivers/net/tokenring/ibmtr.c +11 -3
@@ -109,6 +109,7 @@ in the event that chatty debug messages 
 
 #include <linux/module.h>
 #include <linux/delay.h>
+#include <linux/wait.h>
 
 #ifdef PCMCIA		/* required for ibmtr_cs.c to build */
 #undef MODULE		/* yes, really */
@@ -847,6 +848,7 @@ static int __devinit trdev_init(struct n
 
 static int tok_init_card(struct net_device *dev)
 {
+	DEFINE_WAIT(wait);
 	struct tok_info *ti;
 	short PIOaddr;
 	unsigned long i;
@@ -867,13 +869,16 @@ static int tok_init_card(struct net_devi
 		writeb(SRPR_ENABLE_PAGING,ti->mmio+ACA_OFFSET+ACA_RW+SRPR_EVEN);
 #endif
 	writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
-	i = sleep_on_timeout(&ti->wait_for_reset, 4 * HZ);
+	prepare_to_wait(&ti->wait_for_reset, &wait, TASK_UNINTERRUPTIBLE);
+	i = schedule_timeout(4*HZ);
+	finish_wait(&ti->wait_for_reset, &wait);
 	return i? 0 : -EAGAIN;
 }
 
 /*****************************************************************************/
 static int tok_open(struct net_device *dev)
 {
+	DEFINE_WAIT(wait);
 	struct tok_info *ti = (struct tok_info *) dev->priv;
 	int i;
 
@@ -903,7 +908,9 @@ static int tok_open(struct net_device *d
 
 	while (1){
 		tok_open_adapter((unsigned long) dev);
-		i= interruptible_sleep_on_timeout(&ti->wait_for_reset, 25 * HZ);
+		prepare_to_wait(&ti->wait_for_reset, &wait, TASK_INTERRUPTIBLE);
+		i = schedule_timeout(25 * HZ);
+		finish_wait(&ti->wait_for_reset, &wait);
 		/* sig catch: estimate opening adapter takes more than .5 sec*/
 		if (i>(245*HZ)/10) break; /* fancier than if (i==25*HZ) */
 		if (i==0) break;
@@ -912,7 +919,8 @@ static int tok_open(struct net_device *d
 			DPRINTK("Adapter is up and running\n");
 			return 0;
 		}
-		if(msleep_interruptible(jiffies_to_msecs(TR_RETRY_INTERVAL)))
+		msleep_interruptible(jiffies_to_msecs(TR_RETRY_INTERVAL));
+		if (signal_pending(current))
 			break; /*prob. a signal, like the i>24*HZ case above */
 	}
 	outb(0, dev->base_addr + ADAPTRESET);/* kill pending interrupts*/

_______________________________________________
Kernel-janitors mailing list
[email protected]
http://lists.osdl.org/mailman/listinfo/kernel-janitors