Re: [PATCH 0/4]Diskdump Update

From: Takao Indoh
Date: Mon Jun 14 2004 - 09:25:39 EST


On Fri, 11 Jun 2004 20:34:01 +0900, Takao Indoh wrote:

>On Thu, 27 May 2004 14:51:34 +0100, Christoph Hellwig wrote:
>
>>> +/******************************** Disk dump ****************************
>>> *******/
>>> +#if defined(CONFIG_DISKDUMP) || defined(CONFIG_DISKDUMP_MODULE)
>>> +#undef add_timer
>>> +#define add_timer diskdump_add_timer
>>> +#undef del_timer_sync
>>> +#define del_timer_sync diskdump_del_timer
>>> +#undef del_timer
>>> +#define del_timer diskdump_del_timer
>>> +#undef mod_timer
>>> +#define mod_timer diskdump_mod_timer
>>> +
>>> +#define tasklet_schedule diskdump_tasklet_schedule
>>> +#endif
>>
>>Yikes. No way in hell we'll place code like this in drivers. This needs
>>to be handled in common code.
>
>Another approach is insering some codes into the core timer and tasklet
>routines.
>
>For example,
>
>static inline void add_timer(struct timer_list * timer)
>{
> if(crashdump_mode())
> __diskdump_add_timer(timer);
> else
> __mod_timer(timer, timer->expires);
>}
>
>But I do not want to make common codes dirty...
>Please let me know more good idea!


I forgot to explain what is problem. At first, I explain how diskdump
writes the system memory to the disk.

disk_dump() in drivers/block/diskdump.c is main routine of diskdump.
It is called from die()/panic().

First, disk_dump() silences system as follows.

local_save_flags(flags);
local_irq_disable();
smp_call_function(freeze_cpu, NULL, 1, 0);

Diskdump disables interrupt and stops other cpus.
Next, after preparing for dump, diskdump starts dumping. Diskdump calls
driver's handler via scis_dump module. Driver's handler writes data to
the disk with polling mode.


What is a problem? Scsi driver uses timer/tasklet to complete I/O.
But, diskdump disables interrupt, so timer/taslket doesn't work!

The current diskdump uses the following macros to solve this problem.

#define add_timer diskdump_add_timer
#define del_timer_sync diskdump_del_timer
#define del_timer diskdump_del_timer
#define mod_timer diskdump_mod_timer
#define tasklet_schedule diskdump_tasklet_schedule

ex.
static inline void diskdump_add_timer(struct timer_list *timer)
{
if (crashdump_mode())
_diskdump_add_timer(timer);
else
add_timer(timer);
}

It's very easy way. If diskdump is working, timer is registered with
diskdump. Otherwise timer is registered with normal kernel timer. The
timer registered with diskdump is called by diskdump itself during
dumping.

This way is easy but ugly. Another way is add new codes into the core
timer and tasklet routines as I wrote in the previous mail. I wondered
whether it is possible to insert general-purpose hooks into the timer/
taslket routine.

Please let me know if there is another good idea!


Best Regards,
Takao Indoh
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/