]> jspc29.x-matter.uni-frankfurt.de Git - trbnettools.git/commitdiff
fixed major lock bug
authorLudwig Maier <lmaier@brett.e12.ph.tum.de>
Mon, 28 Oct 2013 02:08:26 +0000 (03:08 +0100)
committerLudwig Maier <lmaier@brett.e12.ph.tum.de>
Mon, 28 Oct 2013 02:08:26 +0000 (03:08 +0100)
pexor/kernel-module/pexor_trb.c

index 0c1f4b9037c58c76364b00e18fcc9464c0ec58f8..227d39f573d7a55cb070cbd0d2e6531fa404a064 100644 (file)
@@ -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;
 }