Re: timer interrupt

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Peter, Matthias et al,

Sorry for the delay. Thanks for all your feedback so far !
I'll try to give a better description of the problem and what I think
I've learnt so far :

First, my small test module code has always used del_timer_sync() on
exit. The SAM9260 platform is a single CPU however, thus CONFIG_SMP is
not defined. As far as I can tell from kernel source, on a non-SMP
system del_timer_sync() is equated to del_timer() anyway.

Because I'm not used yet to set up a module through makefile (wrt
pulling in all the autoconfig defines etc) I'm manually including this.

I should note that it's possible the Kernel config is not set right for
my target, since the (factory default) examples show the build of a
executable, but that wouldn't work until I rebuilt the kernel with
CONFIG_EABI defined....


Here's the gist of my test code :

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
<all my defines here, see below>
<all my includes here>

static int timer_tick = 1;
static void timer_fire(unsigned long);
static DEFINE_TIMER(timer_ticktock, 0, 0, 0);

module_param(timer_tick, int, 0);
MODULE_PARM_DESC(timer_tick, "Timer delay");


static void timer_fire(unsigned long data)
{
  mod_timer(&timer_ticktock, jiffies + (timer_tick*HZ));
  printk ("Timer fired at %lu jiffies [%lX]\n", jiffies, data);
}


static int __init timer_init(void)
{
  timer_ticktock.data = (unsigned long) current;
  unsigned long expire = (timer_tick*HZ) + jiffies;
  init_timer(&timer_ticktock);
  timer_ticktock.expires = expire;
  timer_ticktock.data = (unsigned long) current;
  timer_ticktock.function = timer_fire;
  add_timer(&timer_ticktock);

// mod_timer(&timer_ticktock, jiffies + (timer_tick*HZ));

  printk("start PID = %u\n",timer_ticktock.start_pid);
  return 0;
}


static void __exit timer_exit(void)
{
  del_timer_sync(&timer_ticktock);
}


// Module Entry and Exit
//======================

static int __init hello_init(void)
{
  printk("The process is \"%s\" (pid %i)\n",
      current->comm, current->pid);
  timer_init();
  return 0;
}

static void __exit hello_exit(void)
{
  timer_exit();
  printk("Timer module Exited\n");
}


MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Skeleton timer callbacks");
MODULE_AUTHOR("Kris De Vos");
MODULE_INFO(vermagic, VERMAGIC_STRING);

module_init (hello_init);
module_exit (hello_exit);


struct module __this_module
__attribute__((section(".gnu.linkonce.this_module"))) = {
 .name = "hello_timer",
 .init = hello_init,
#ifdef CONFIG_MODULE_UNLOAD
 .exit = hello_exit,
#endif
 .arch = MODULE_ARCH_INIT,
};

static const char __module_depends[]
__used
__attribute__((section(".modinfo"))) =
"depends=";


<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Note that I tried TWO variations for the timer init :
First I had this =>
   
static DEFINE_TIMER(timer_ticktock, timer_fire, 0, 0);

  and in timer_init :

static int __init timer_init(void)
{
  mod_timer(&timer_ticktock, jiffies + (timer_tick*HZ));
  return 0;
}

The code for my test module shown above shows the way I thought maybe
dynamic timers are supposed to be initialised. (ie. using init_timer(),
add_timer() etc ). Is there a difference ?
Both ways seem to yield the same hick ups.

My defines are :
#define __LINUX_ARM_ARCH__   5
#define LINUX_ARM_ARCH
#define __KERNEL__
#define	MODULE
#define	CONFIG_MODULES
#define CONFIG_MODULE_UNLOAD
#define CONFIG_RWSEM_GENERIC_SPINLOCK
#define CONFIG_SCHED_DEBUG
#define CONFIG_DEBUG_PREEMPT
#define CONFIG_LOCK_KERNEL 
#define CONFIG_DEBUG_KERNEL 
#define CONFIG_PREEMPT
#define CONFIG_HZ 100
#define CONFIG_AEABI
#define CONFIG_ARCH_AT91
#define CONFIG_ARCH_AT91SAM9260
#define CONFIG_AT91_PMC_UNIT
#define CONFIG_MACH_SAM9_L9260
#define CONFIG_PRINTK
#define CONFIG_TIMER_STATS
#define CONFIG_BROKEN_ON_SMP
#define	CONFIG_BUG
#define CONFIG_DEBUG_BUGVERBOSE

(I added in TIMER_STATS afterwards in the kernel for debug)

Note that CONFIG_BROKEN_ON_SMP is defined in the default target setup,
but CONFIG_SMP isn't ???? (is that right ???)

The sort of occasional errors/warnings are get are eg. :

sam9-l9260:/mnt/kris/olimex# insmod hello_timer
Timer fired at 4114 jiffies [C3C4D9C0]
rmmod hello_timer
Timer module Exited
traps_kernel BUG at kernel/module.c:473!
Trying to vfree() bad address (636b5f5f)
------------[ cut here ]------------
WARNING: at mm/vmalloc.c:385 __vunmap+0x64/0xec()
Modules linked in: [last unloaded: hello_timer]
[<c0029244>] (dump_stack+0x0/0x14) from [<c003cca8>] (warn_on_slowpath
+0x4c/0x68)
[<c003cc5c>] (warn_on_slowpath+0x0/0x68) from [<c0084b50>] (__vunmap
+0x64/0xec)
 r6:c0349812 r5:636b5f5f r4:00000f5f
[<c0084aec>] (__vunmap+0x0/0xec) from [<c0084cd0>] (vfree+0x40/0x48)
 r7:00000880 r6:c0349812 r5:000001d9 r4:c034ee50
[<c0084c90>] (vfree+0x0/0x48) from [<c002991c>] (module_free+0x14/0x18)
[<c0029908>] (module_free+0x0/0x18) from [<c005ffbc>] (free_module
+0xd4/0xe0)
[<c005fee8>] (free_module+0x0/0xe0) from [<c00618d0>] (sys_delete_module
+0x1e4/0x20c)
 r5:c344e000 r4:bf0006c0
[<c00616ec>] (sys_delete_module+0x0/0x20c) from [<c0024b00>]
(ret_fast_syscall+0x0/0x2c)
 r7:00000081 r6:be7ff570 r5:be7ff558 r4:be801d70
---[ end trace d30994dbcef2d362 ]---
ERROR: Removing 'hello_timer': Function not implemented
sam9-l9260:/mnt/kris/olimex# 



IMPORTANT (I think) :
=====================
the traps.c BUG call to __bug() is from this line in module.c (473) :

static inline void percpu_modfree(void *pcpuptr)
{
  BUG();
}


If CONFIG_SMP is not defined, why then do I get a BUG() call from
function percpu_modfree() ?????

I'm wondering if there's something screwy in the way the kernel has been
compiled.

Also, when I get a segmentation fault, it seems to be caused by a
deliberate call from a NULL pointer dereference (ie. a BUG check in the
kernel).
When I get such a fault, lsmod and the likes doesn't work anymore, the
target hangs and I have to reboot it.


If anybody can shed some light on this, I would be very grateful.


Best Regards,
Kris



--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux