Messages in this thread | | | Date | Wed, 10 Aug 2011 10:42:35 +1000 | From | Ryan Mallon <> | Subject | Re: kernel panic with simple driver |
| |
On 10/08/11 10:16, Murali K. Vemuri wrote: > Hello there, > > I have a small driver code with which I am randomly receiving kernel > panic. Can someone help me what is the mistake here? > The kernel panic is exactly caught to be at "add_timer (&my_timer) ". > I am able to get the print "Kicking off the timer" when the panic > happens.
It helps to post the panic message. Its hard to debug problems without them.
Where in add_timer is the panic occurring? It's only two lines, and one of those is a BUG_ON. Are you hitting that? The other line is a call to mod_timer and dereferences the timer pointer. Is the timer_list struct you are passing to add_timer sane?
> Also, I could not observe any specific pattern in which the panic > occurs. But it is purely random. So far I was able to reproduce the > panic thrice out of 100+ attempts.
Do you have any concurrent access to the timer? If so you may be racing on the between the test of timer_pending and the call to timer_add. In general, I think you should call mod_timer rather than add_timer (see the documentation in kernel/timer.c).
~Ryan
> In all other attempts, my_dev_ioctl is called correctly and works correctly. > > struct timer_list my_timer; > > static int my_dev_ioctl(struct inode *inode, struct file *file, > unsigned int cmd, unsigned long arg) > { > switch(cmd) > { > case MATCH_CASE: > if (timer_pending (&my_timer)) > { > printk(KERN_ERR "Timer currently pending, not adding > any more\n"); > } > else > { > printk(KERN_ERR "Kicking off the timer\n"); > add_timer(&my_timer); > } > break; > default: > break; > } > return 0; > } > > static struct miscdevice my_dummy_dev = > { > .minor = MISC_DYNAMIC_MINOR, > .name = "dummy_dev", > .fops =&my_dev_fops, > }; > > static int __init my_dev_init(void) > { > /*initialize some GPIOs */ > init_timer (&my_timer); > my_timer.data = 0; > my_timer.expires = jiffies + msecs_to_jiffies(500); > my_timer.function = ring_led_detect_timer; > misc_register(&mbi5025_dev); > } > module_init(my_dev_init); > > > Thanks in advance > Murali > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/
| |