<html><body><div style="color:#000; background-color:#fff; font-family:lucida console, sans-serif;font-size:10pt"><div><span></span>&nbsp;</div><div><span>Hi All,</span></div><div><span></span>&nbsp;</div><div><span>While building the new kernel their are many option for kernel debugging </span></div><div><span></span>&nbsp;</div><div><span>please refer the below link.</span></div><div><span></span>&nbsp;</div><div><span><a href="http://my.safaribooksonline.com/book/operating-systems-and-server-administration/linux/9780137072446/kernel-hacking-config-options/ch11">http://my.safaribooksonline.com/book/operating-systems-and-server-administration/linux/9780137072446/kernel-hacking-config-options/ch11</a></span></div><div><span></span>&nbsp;</div><div><span>Hope this will help you catch the lock problem.</span></div><div>&nbsp;</div><div>-Anand Moon</div>  <div style="font-family: lucida console, sans-serif; font-size: 10pt;"> <div style="font-family: times
 new roman, new york, times, serif; font-size: 12pt;"> <div dir="ltr"> <font size="2" face="Arial"> <div style="margin: 5px 0px; padding: 0px; border: 1px solid rgb(204, 204, 204); height: 0px; line-height: 0; font-size: 0px;" class="hr" contentEditable="false" readonly="true"></div>  <b><span style="font-weight: bold;">From:</span></b> Vladimir Murzin &lt;murzin.v@gmail.com&gt;<br> <b><span style="font-weight: bold;">To:</span></b> Kumar amit mehta &lt;gmate.amit@gmail.com&gt; <br><b><span style="font-weight: bold;">Cc:</span></b> Srivatsa Bhat &lt;bhat.srivatsa@gmail.com&gt;; kernelnewbies@kernelnewbies.org <br> <b><span style="font-weight: bold;">Sent:</span></b> Monday, November 5, 2012 11:21 AM<br> <b><span style="font-weight: bold;">Subject:</span></b> Re: Tools for checking incorrect usage of locking techniques in k-space<br> </font> </div> <br>
On Tue, Oct 30, 2012 at 9:41 AM, Kumar amit mehta &lt;<a href="mailto:gmate.amit@gmail.com" ymailto="mailto:gmate.amit@gmail.com">gmate.amit@gmail.com</a>&gt; wrote:<br>&gt; On Mon, Oct 29, 2012 at 12:03:08AM +0530, Srivatsa Bhat wrote:<br>&gt;&gt; You'll need CONFIG_LOCKDEP=y as well. An easy way to configure lock debugging<br>&gt;&gt; checks is to run 'make menuconfig' and enable the required options under the<br>&gt;&gt; "Kernel hacking" section.<br>&gt;&gt;<br>&gt;&gt; &gt;<br>&gt;&gt; &gt; If above configuration is all that I need, then should I be seeing warning/error<br>&gt;&gt; &gt; messages in kernel logs(/var/log/kern.log) when there is inconsistency in<br>&gt;&gt; &gt; locking ? To test my hypothesis, I modified my simple kernel module to<br>&gt;&gt; &gt; deliberately induce locking error (After initializing read-write semaphore, I call<br>&gt;&gt; &gt; down_write() and do not free this semaphore lock by commenting out up_write()<br>&gt;&gt;
 &gt; invocation). But still I don't see any error or warning message trace in kernel<br>&gt;&gt; &gt; logs, I think, I'm missing something.<br>&gt;<br>&gt; Hi Srivatsa,<br>&gt;<br>&gt; Thank you for your mail. As per your suggestion, this time I've enabled<br>&gt; CONFIG_LOCKDEP aslo in my running kernel and did the same experiment, but still<br>&gt; I dont't see any warning/error messages in the kernel log. To give you more idea<br>&gt; about what I'm doing, Please see the code below.(This is a simple char driver<br>&gt; based on LDD3 examples)<br>&gt;<br>&gt; &lt;echo.c&gt;<br>&gt;<br>&gt; #include &lt;linux/module.h&gt;<br>&gt; #include &lt;linux/init.h&gt;<br>&gt; #include &lt;linux/types.h&gt; //MAJOR, MINOR<br>&gt; #include &lt;linux/fs.h&gt; //register_chrdev_region, file_operations<br>&gt; #include &lt;linux/moduleparam.h&gt;<br>&gt; #include &lt;linux/kernel.h&gt; //container_of<br>&gt; #include &lt;linux/slab.h&gt; //kmalloc<br>&gt; #include
 &lt;linux/cdev.h&gt; //struct cdev<br>&gt; #include &lt;linux/version.h&gt;<br>&gt; #include &lt;linux/uaccess.h&gt; //copy_from/to_user()<br>&gt; #include &lt;linux/errno.h&gt; //error code<br>&gt;<br>&gt; ssize_t echo_read(struct file *, char __user *, size_t, loff_t *);<br>&gt; ssize_t echo_write(struct file *, const char __user *, size_t, loff_t *);<br>&gt; int echo_open(struct inode *, struct file *);<br>&gt; int echo_release(struct inode *, struct file *);<br>&gt;<br>&gt; struct echo_cdev {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  char *data;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  unsigned long size; //amount of data stored<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  struct semaphore sem;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  struct cdev cdev;<br>&gt; };<br>&gt; MODULE_LICENSE("GPL v2");<br>&gt; MODULE_AUTHOR("amit");<br>&gt;<br>&gt; int nr_major;<br>&gt; module_param(nr_major, int, S_IRUGO);<br>&gt; MODULE_PARM_DESC(nr_major, "major number");<br>&gt;<br>&gt; int
 nr_minor;<br>&gt; char *chrdev_name = "echo";<br>&gt;<br>&gt; static dev_t device;<br>&gt; static int echo_dev_count = 1;<br>&gt; struct echo_cdev *echo_dev = NULL;<br>&gt;<br>&gt; static struct file_operations echo_fs_ops = {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  .open = echo_open,<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  .release = echo_release,<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  .read = echo_read,<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  .write = echo_write,<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  .owner = THIS_MODULE,<br>&gt; };<br>&gt;<br>&gt; int echo_open(struct inode *inode, struct file *filp)<br>&gt; {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  struct echo_cdev *dev;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  pr_debug("%s: f_flags: 0x%x\n",__FUNCTION__,filp-&gt;f_flags);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //container_of(pointer, container_type, container_field);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  dev = container_of(inode-&gt;i_cdev, struct echo_cdev, cdev);<br>&gt;&nbsp;
 &nbsp; &nbsp; &nbsp;  filp-&gt;private_data = dev;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if ((filp-&gt;f_flags &amp; O_ACCMODE) == O_WRONLY) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  //trim the device size to 0<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  dev-&gt;size = 0;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  return 0;<br>&gt; }<br>&gt;<br>&gt; int echo_release(struct inode *inode, struct file *filp)<br>&gt; {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  return 0;<br>&gt; }<br>&gt;<br>&gt; ssize_t echo_read(struct file *filp, char __user *ubuff, size_t count, loff_t *poffset)<br>&gt; {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  struct echo_cdev *dev = filp-&gt;private_data;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  pr_debug("%s: f_flags: 0x%x\n",__FUNCTION__,filp-&gt;f_flags);<br>&gt;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //user trying to access an offset which is beyond the end of file<br>&gt;&nbsp;
 &nbsp; &nbsp; &nbsp;  if (down_interruptible(&amp;dev-&gt;sem))<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return -ERESTARTSYS;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if (*poffset &gt;= dev-&gt;size) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  up(&amp;dev-&gt;sem);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return 0;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //user trying to access more than eof, return bytes read till the eof<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if (*poffset + count &gt;= dev-&gt;size)<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  //count = dev-&gt;size - *poffset;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  count = dev-&gt;size;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //kspace --&gt; uspace<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if (copy_to_user(ubuff, (dev-&gt;data + *poffset), count) &lt; 0)
 {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  up(&amp;dev-&gt;sem);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return -EFAULT;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //update the offset<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  *poffset += count;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  up(&amp;dev-&gt;sem);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  return count;<br>&gt; }<br>&gt;<br>&gt; //count is the size of requested data transfer<br>&gt; ssize_t echo_write(struct file *filp, const char __user *ubuff, size_t count, loff_t *poffset)<br>&gt; {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  int ret;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  struct echo_cdev *dev = filp-&gt;private_data;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  pr_debug("%s: f_flags: 0x%x\n",__FUNCTION__,filp-&gt;f_flags);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if (down_interruptible(&amp;dev-&gt;sem))<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
 &nbsp; &nbsp;  return -ERESTARTSYS;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if (dev-&gt;data == NULL) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  dev-&gt;data = (char *)kmalloc(count, GFP_KERNEL);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  if (!dev-&gt;data) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  up(&amp;dev-&gt;sem);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return -ENOMEM;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  } else {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  memset(dev-&gt;data, 0, sizeof(count));<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  dev-&gt;size = count;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //uspace --&gt; kspace<br>&gt;&nbsp;
 &nbsp; &nbsp; &nbsp;  if (copy_from_user(dev-&gt;data, ubuff, count) &lt; 0) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  up(&amp;dev-&gt;sem);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return -EFAULT;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  *poffset += count;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  ret = count;<br>&gt;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if (dev-&gt;size &lt; *poffset)<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  dev-&gt;size = *poffset;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //Force lock error<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //up(&amp;dev-&gt;sem);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  return ret;<br>&gt; }<br>&gt;<br>&gt; static int __init echo_init(void)<br>&gt; {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  int ret;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  printk(KERN_EMERG "entering %s\n",__FUNCTION__);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //let
 the user provide the major number.<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if (nr_major) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  device = MKDEV(nr_major, nr_minor);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  if ((ret = register_chrdev_region(device, echo_dev_count, chrdev_name)) &lt; 0) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  pr_debug("%s: failed to register %s\n",__FUNCTION__,<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  chrdev_name);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return ret;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  } else {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ret = alloc_chrdev_region(&amp;device, 0,
 echo_dev_count, chrdev_name);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  if (ret &lt; 0) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  pr_debug("%s: failed to register %s\n",__FUNCTION__,<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  chrdev_name);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return ret;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  nr_major = MAJOR(device);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  nr_minor = MINOR(device);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //print the major and minor numbers<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  pr_debug("%s: major/minor:: %d/%d\n",__FUNCTION__,<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  nr_major, nr_minor);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  echo_dev = (struct echo_cdev *)kmalloc(sizeof(struct echo_cdev), GFP_KERNEL);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if (!echo_dev) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  printk(KERN_EMERG "Not enough memory\n");<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  unregister_chrdev_region(device, echo_dev_count);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return -ENOMEM;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  memset(echo_dev, 0, sizeof(struct echo_cdev));<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  echo_dev-&gt;cdev.owner = THIS_MODULE;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  echo_dev-&gt;cdev.ops = &amp;echo_fs_ops;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //initialize the semaphore, before it is presented to the world<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; 
 sema_init(&amp;echo_dev-&gt;sem,1);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  cdev_init(&amp;echo_dev-&gt;cdev, &amp;echo_fs_ops);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  device = MKDEV(nr_major, nr_minor);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //tell the kernel about this char device<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  //telling the VFS layer to associate echo driver's fs operation for file r/w etc.<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  ret = cdev_add(&amp;echo_dev-&gt;cdev, device, 1);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if (ret) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  kfree(echo_dev);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  unregister_chrdev_region(device, echo_dev_count);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return ret;<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  return 0;<br>&gt; }<br>&gt;<br>&gt; static void __exit echo_exit(void)<br>&gt; {<br>&gt;&nbsp;
 &nbsp; &nbsp; &nbsp;  printk(KERN_EMERG "entering %s\n",__FUNCTION__);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  if (echo_dev-&gt;data) {<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  printk("Inside %s: kfree()\n",__FUNCTION__);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  kfree(echo_dev-&gt;data);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  }<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  cdev_del(&amp;echo_dev-&gt;cdev);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  kfree(echo_dev);<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  unregister_chrdev_region(device, echo_dev_count);<br>&gt; }<br>&gt;<br>&gt; module_init(echo_init);<br>&gt; module_exit(echo_exit);<br>&gt;<br>&gt; &lt;echo.c&gt;<br>&gt;<br>&gt; &lt;Makefile&gt;<br>&gt; obj-m := echo.o<br>&gt; CFLAGS_echo.o := -DDEBUG -Wall -Werror -Wmissing-prototypes \<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  -Wstrict-prototypes -Wunused-variable -O2 \<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  -Wunused-function
 -g<br>&gt;<br>&gt; modules:<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  make -C /lib/modules/`uname -r`/build M=`pwd`<br>&gt; clean:<br>&gt;&nbsp; &nbsp; &nbsp; &nbsp;  make -C /lib/modules/`uname -r`/build M=`pwd` clean<br>&gt; &lt;Makefile&gt;<br>&gt;<br>&gt; Logs:<br>&gt; root@ubuntu:/boot# egrep -i "debug_kernel|lockdep"<br>&gt; config-3.7.0-rc3-next-20121029<br>&gt; CONFIG_LOCKDEP_SUPPORT=y<br>&gt; CONFIG_DEBUG_KERNEL=y<br>&gt; CONFIG_LOCKDEP=y<br>&gt; # CONFIG_DEBUG_LOCKDEP is not set<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# uname -a<br>&gt; Linux ubuntu 3.7.0-rc3-next-20121029 #1 SMP Mon Oct 29 21:42:20 PDT 2012 i686<br>&gt; i686 i386 GNU/Linux<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# dmesg<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# insmod echo.ko<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# dmesg<br>&gt; [ 1156.704072] entering echo_init<br>&gt; [ 1156.704914] echo_init:
 major/minor:: 249/0<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# mknod /dev/echo c 249 0<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# ll /dev/echo<br>&gt; crw-r--r-- 1 root root 249, 0 Oct 29 22:29 /dev/echo<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# echo "kernel newbiee" &gt;/dev/echo<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# dmesg<br>&gt; [ 1156.704072] entering echo_init<var id="yui-ie-cursor"></var><br>&gt; [ 1156.704914] echo_init: major/minor:: 249/0<br>&gt; [ 1237.377205] echo_open: f_flags: 0x8241<br>&gt; [ 1237.377392] echo_write: f_flags: 0x8001<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# cat /dev/echo<br>&gt; --&gt; Here the driver read routine gets stuck as I've not reliquished the<br>&gt; semaphore lock<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# cat /dev/echo<br>&gt; ^C &lt;-- killing the user process<br>&gt;<br>&gt;
 root@ubuntu:/home/amit/ldd3/misc-modules/echo# rmmod echo<br>&gt;<br>&gt; root@ubuntu:/home/amit/ldd3/misc-modules/echo# dmesg<br>&gt; [ 1156.704072] entering echo_init<br>&gt; [ 1156.704914] echo_init: major/minor:: 249/0<br>&gt; [ 1237.377205] echo_open: f_flags: 0x8241<br>&gt; [ 1237.377392] echo_write: f_flags: 0x8001<br>&gt; [ 1270.622337] echo_open: f_flags: 0x8000<br>&gt; [ 1270.622477] echo_read: f_flags: 0x8000<br>&gt; [ 1394.180962] entering echo_exit<br>&gt; [ 1394.180996] Inside echo_exit: kfree()<br>&gt;<br>&gt; As you can see, no warning/error messages reported by kernel.<br>&gt; -Amit<br>&gt;<br>&gt; _______________________________________________<br>&gt; Kernelnewbies mailing list<br>&gt; <a href="mailto:Kernelnewbies@kernelnewbies.org" ymailto="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>&gt; <a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies"
 target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br><br>Hi<br><br>I've not tried your module, but I suppose that you should get warning<br>as soon as you try to take write semaphore once again.<br><br>Best wishes<br>Vladimir Murzin<br><br>_______________________________________________<br>Kernelnewbies mailing list<br><a href="mailto:Kernelnewbies@kernelnewbies.org" ymailto="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br><a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br><br><br> </div> </div>&nbsp; </div></body></html>