From 2ea87570f5b9d6cb43838040686773f91fe495b8 Mon Sep 17 00:00:00 2001 From: Ludwig Maier Date: Mon, 28 Oct 2013 03:08:26 +0100 Subject: [PATCH] fixed major lock bug --- pexor/kernel-module/pexor_trb.c | 65 ++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/pexor/kernel-module/pexor_trb.c b/pexor/kernel-module/pexor_trb.c index 0c1f4b9..227d39f 100644 --- a/pexor/kernel-module/pexor_trb.c +++ b/pexor/kernel-module/pexor_trb.c @@ -87,6 +87,12 @@ struct pexor_dma int nr_sglist; }; +struct pexor_locks { + struct semaphore sem_buf; /* lock semaphore for DMA buffer */ + struct semaphore sem_ioctl; /* lock semaphore for ioctl operations */ + spinlock_t spin_lock0; /* Spin Lock #0 */ +}; + struct pexor_privdata { atomic_t state; /* run state of device */ @@ -99,13 +105,12 @@ struct pexor_privdata unsigned long bases[6]; /* contains pci resource bases */ unsigned long reglen[6]; /* contains pci resource length */ void* iomem[6]; /* points to mapped io memory of the bars */ - struct semaphore sem_buf; /* lock semaphore for DMA buffer */ - struct semaphore sem_ioctl; /* lock semaphore for ioctl operations */ - spinlock_t spin_lock0; /* Spin Lock #0 */ - + struct pexor_dma dma; /* dma buffer */ u32* memwrite_buffer; /* buffer for register_write_mem */ int magic; /* magic number to identify irq */ + + struct pexor_locks locks; /* all Spin and Semaphore Locks */ }; /* ---------------------------------------------------------------------- */ @@ -477,10 +482,12 @@ void set_pexor(struct dev_pexor* pg, int probe(struct pci_dev* dev, const struct pci_device_id* id) { - int err = 0, ix = 0; + int err = 0; + int ix = 0; + struct pexor_privdata* priv = NULL; - struct pexor_privdata* priv; pexor_msg(KERN_NOTICE "PEXOR pci driver starts probe...\n"); + if ((err = pci_enable_device(dev)) != 0) { pexor_msg(KERN_ERR "PEXOR pci driver probe: Error %d enabling PCI device! \n", @@ -562,11 +569,11 @@ int probe(struct pci_dev* dev, /* Initialize Semaphore Locks */ - sema_init(&(priv->sem_buf), 1); - sema_init(&(priv->sem_ioctl), 1); + sema_init(&priv->locks.sem_buf, 1); + sema_init(&priv->locks.sem_ioctl, 1); /* Initialize Spin Locks, not needed at the moment */ - spin_lock_init(&(priv->spin_lock0)); + spin_lock_init(&(priv->locks.spin_lock0)); ////////////////// here chardev registering priv->devid = atomic_inc_return(&pexor_numdevs) - 1; @@ -675,17 +682,17 @@ ssize_t pexor_read(struct file* filp, pexor_dbg(KERN_NOTICE "** starting pexor_read for f_pos=%d count=%d\n", (int)*f_pos, (int)count); - /* Request Semaphore */ - if (down_interruptible(&priv->sem_buf) != 0) { - printk(KERN_ERR "pexor_read: could not get Semaphore sem_buf\n"); - return -ERESTARTSYS; - } - priv = get_privdata(filp); if (priv == NULL) { retval= -EFAULT; goto out_read; } + + /* Request Semaphore */ + if (down_interruptible(&priv->locks.sem_buf) != 0) { + printk(KERN_ERR "pexor_read: could not get Semaphore sem_buf\n"); + return -ERESTARTSYS; + } if (count > priv->dma.size * PAGE_SIZE) { pexor_msg(KERN_ERR "ERROR> pexor_read: requested count (%d) > Max: %d\n", @@ -712,7 +719,7 @@ ssize_t pexor_read(struct file* filp, retval = count; out_read: - up(&priv->sem_buf); + up(&priv->locks.sem_buf); return retval; } @@ -727,12 +734,6 @@ ssize_t pexor_write(struct file* filp, pexor_dbg(KERN_NOTICE "** starting pexor_write for f_pos=%d count=%d\n", (int)*f_pos, (int)count); - - /* Request Semaphore */ - if (down_interruptible(&priv->sem_buf) != 0) { - printk(KERN_ERR "pexor_write: could not get Semaphore sem_buf\n"); - return -ERESTARTSYS; - } /* u32 kbuf[lcount]; */ priv = get_privdata(filp); @@ -740,6 +741,12 @@ ssize_t pexor_write(struct file* filp, retval = -EFAULT; goto out_write; } + + /* Request Semaphore */ + if (down_interruptible(&priv->locks.sem_buf) != 0) { + printk(KERN_ERR "pexor_write: could not get Semaphore sem_buf\n"); + return -ERESTARTSYS; + } if (count > 4 * PEXOR_MEMWRITE_SIZE) { retval = -EFAULT; @@ -755,7 +762,7 @@ ssize_t pexor_write(struct file* filp, retval = count; out_write: - up(&priv->sem_buf); + up(&priv->locks.sem_buf); return retval; } @@ -825,7 +832,7 @@ int pexor_ioctl_read_register(struct pexor_privdata* priv, struct pexor_reg_io descriptor; /* Request Semaphore */ - if (down_interruptible(&priv->sem_ioctl) != 0) { + if (down_interruptible(&priv->locks.sem_ioctl) != 0) { printk(KERN_ERR "pexor_ioctl_read_register: could not get Semaphore sem_buf\n"); return -ERESTARTSYS; @@ -870,7 +877,7 @@ int pexor_ioctl_read_register(struct pexor_privdata* priv, retval = copy_to_user((void __user *)arg, &descriptor, sizeof(struct pexor_reg_io)); OUT_READ_REG: - up(&priv->sem_ioctl); + up(&priv->locks.sem_ioctl); return retval; } @@ -884,7 +891,7 @@ int pexor_ioctl_write_register(struct pexor_privdata* priv, struct pexor_reg_io descriptor; /* Request Semaphore */ - if (down_interruptible(&priv->sem_ioctl) != 0) { + if (down_interruptible(&priv->locks.sem_ioctl) != 0) { printk(KERN_ERR "pexor_ioctl_write_register: could not get Semaphore sem_buf\n"); return -ERESTARTSYS; @@ -923,7 +930,7 @@ int pexor_ioctl_write_register(struct pexor_privdata* priv, udelay(UDELAY_TIME); OUT_WRITE_REG: - up(&priv->sem_ioctl); + up(&priv->locks.sem_ioctl); return retval; } @@ -1219,7 +1226,7 @@ int pexor_ioctl_trbnet_request(struct pexor_privdata* priv, struct pexor_trbnet_io descriptor; /* Request Semaphore */ - if (down_interruptible(&priv->sem_ioctl) != 0) { + if (down_interruptible(&priv->locks.sem_ioctl) != 0) { printk(KERN_ERR "pexor_ioctl_trbnet_request: could not get Semaphore sem_buf\n"); return -ERESTARTSYS; @@ -1529,7 +1536,7 @@ int pexor_ioctl_trbnet_request(struct pexor_privdata* priv, } OUT_IOCTL: - up(&priv->sem_ioctl); + up(&priv->locks.sem_ioctl); return status; } -- 2.43.0