[PATCH][2.4] convert atm_dev_lock from spinlock to semaphore From: chas williams (chas@locutus.cmf.nrl.navy.mil) Date: Tue Feb 18 2003 - 16:31:55 EST same as the 2.5 patch just for 2.4 kernels. Index: linux/net/atm/addr.c =================================================================== RCS file: /afs/cmf/project/cvsroot/linux/net/atm/addr.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -b -w -r1.2 -r1.3 --- linux/net/atm/addr.c 5 Mar 2002 13:41:26 -0000 1.2 +++ linux/net/atm/addr.c 14 Feb 2003 17:02:40 -0000 1.3 @@ -42,7 +42,6 @@ */ static DECLARE_MUTEX(local_lock); -extern spinlock_t atm_dev_lock; static void notify_sigd(struct atm_dev *dev) { Index: linux/net/atm/common.c =================================================================== RCS file: /afs/cmf/project/cvsroot/linux/net/atm/common.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -b -w -r1.5 -r1.6 --- linux/net/atm/common.c 14 Feb 2003 16:59:38 -0000 1.5 +++ linux/net/atm/common.c 14 Feb 2003 17:02:40 -0000 1.6 @@ -18,6 +18,7 @@ #include #include /* verify_area */ #include +#include #include /* struct timeval */ #include #include @@ -27,6 +28,7 @@ #include #include #include +#include #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE) #include @@ -86,7 +88,7 @@ #define DPRINTK(format,args...) #endif -spinlock_t atm_dev_lock = SPIN_LOCK_UNLOCKED; +DECLARE_MUTEX(atm_dev_sem); static struct sk_buff *alloc_tx(struct atm_vcc *vcc,unsigned int size) { @@ -154,7 +156,7 @@ vcc->dev->ops->free_rx_skb(vcc,skb); else kfree_skb(skb); } - spin_lock (&atm_dev_lock); + down(&atm_dev_sem); fops_put (vcc->dev->ops); if (atomic_read(&vcc->rx_inuse)) printk(KERN_WARNING "atm_release_vcc: strange ... " @@ -162,11 +164,11 @@ atomic_read(&vcc->rx_inuse)); bind_vcc(vcc,NULL); } else - spin_lock (&atm_dev_lock); + down(&atm_dev_sem); if (free_sk) free_atm_vcc_sk(sk); - spin_unlock (&atm_dev_lock); + up(&atm_dev_sem); } @@ -277,14 +279,14 @@ struct atm_dev *dev; int return_val; - spin_lock (&atm_dev_lock); + down(&atm_dev_sem); dev = atm_find_dev(itf); if (!dev) return_val = -ENODEV; else return_val = atm_do_connect_dev(vcc,dev,vpi,vci); - spin_unlock (&atm_dev_lock); + up(&atm_dev_sem); return return_val; } @@ -316,10 +318,10 @@ else { struct atm_dev *dev; - spin_lock (&atm_dev_lock); + down(&atm_dev_sem); for (dev = atm_devs; dev; dev = dev->next) if (!atm_do_connect_dev(vcc,dev,vpi,vci)) break; - spin_unlock (&atm_dev_lock); + up(&atm_dev_sem); if (!dev) return -ENODEV; } if (vpi == ATM_VPI_UNSPEC || vci == ATM_VCI_UNSPEC) @@ -561,7 +563,7 @@ int error,len,size,number, ret_val; ret_val = 0; - spin_lock (&atm_dev_lock); + down(&atm_dev_sem); vcc = ATM_SD(sock); switch (cmd) { case SIOCOUTQ: @@ -961,7 +963,7 @@ ret_val = 0; done: - spin_unlock (&atm_dev_lock); + up(&atm_dev_sem); return ret_val; } Index: linux/net/atm/resources.c =================================================================== RCS file: /afs/cmf/project/cvsroot/linux/net/atm/resources.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -b -w -r1.2 -r1.3 --- linux/net/atm/resources.c 2 May 2002 16:56:23 -0000 1.2 +++ linux/net/atm/resources.c 14 Feb 2003 17:02:40 -0000 1.3 @@ -25,7 +25,7 @@ struct atm_dev *atm_devs = NULL; static struct atm_dev *last_dev = NULL; struct atm_vcc *nodev_vccs = NULL; -extern spinlock_t atm_dev_lock; +extern struct semaphore atm_dev_sem; static struct atm_dev *alloc_atm_dev(const char *type) @@ -72,7 +72,7 @@ { struct atm_dev *dev = NULL; - spin_lock(&atm_dev_lock); + down(&atm_dev_sem); dev = alloc_atm_dev(type); if (!dev) { @@ -110,7 +110,7 @@ #endif done: - spin_unlock(&atm_dev_lock); + up(&atm_dev_sem); return dev; } @@ -120,9 +120,9 @@ #ifdef CONFIG_PROC_FS if (dev->ops->proc_read) atm_proc_dev_deregister(dev); #endif - spin_lock(&atm_dev_lock); + down(&atm_dev_sem); __free_atm_dev(dev); - spin_unlock(&atm_dev_lock); + up(&atm_dev_sem); } void shutdown_atm_dev(struct atm_dev *dev) Index: linux/net/atm/signaling.c =================================================================== RCS file: /afs/cmf/project/cvsroot/linux/net/atm/signaling.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -b -w -r1.2 -r1.3 --- linux/net/atm/signaling.c 12 Feb 2003 20:57:47 -0000 1.2 +++ linux/net/atm/signaling.c 14 Feb 2003 17:02:40 -0000 1.3 @@ -33,7 +33,7 @@ struct atm_vcc *sigd = NULL; static DECLARE_WAIT_QUEUE_HEAD(sigd_sleep); -extern spinlock_t atm_dev_lock; +extern struct semaphore atm_dev_sem; static void sigd_put_skb(struct sk_buff *skb) { @@ -220,9 +220,9 @@ skb_queue_purge(&vcc->recvq); purge_vccs(nodev_vccs); - spin_lock (&atm_dev_lock); + down(&atm_dev_sem); for (dev = atm_devs; dev; dev = dev->next) purge_vccs(dev->vccs); - spin_unlock (&atm_dev_lock); + up(&atm_dev_sem); } To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [8]majordomo@vger.kernel.org More majordomo info at [9]http://vger.kernel.org/majordomo-info.html Please read the FAQ at [10]http://www.tux.org/lkml/