[PATCH] kexec,x86: code optimization and adjustment for add_memmap and delete_memmap

Simon Horman simon at horms.net
Mon Mar 4 21:25:28 EST 2013


On Tue, Feb 26, 2013 at 09:58:14AM +0900, HATAYAMA Daisuke wrote:
> From: Zhang Yanfei <zhangyanfei at cn.fujitsu.com>
> Subject: [PATCH] kexec,x86: code optimization and adjustment for add_memmap and delete_memmap
> Date: Mon, 25 Feb 2013 20:38:41 +0800
> 
> > The code in the two functions seems a little messy, So I modify
> > some of them, trying to make the logic more clearly.
> > 
> > For example,
> > code before:
> > 
> >          for (i = 0; i < CRASH_MAX_MEMMAP_NR;  i++) {
> >                  mstart = memmap_p[i].start;
> >                  mend = memmap_p[i].end;
> >                  if (mstart == 0 && mend == 0)
> >                          break;
> > 
> > for we already have nr_entries for this memmap_p array, so we needn't
> > have a check in every loop to see if we have go through the whole array.
> > code after:
> > 
> >          for (i = 0; i < nr_entries; i++) {
> >  		mstart = memmap_p[i].start;
> >  		mend = memmap_p[i].end;
> > 
> 
> Then, but even if doing so, times of the loop is unchanged after your
> fix. The loop doesn't always look up a whole part of memmap_p; it
> looks up until it reaches the end of elements with 0 in their members.
> Also, CRASH_MAX_MEMMAP_NR is 17 on i386. Is it problematic in
> performance?
> 
> Rather, it seems problematic to me how length of memmap_p is handled
> here. It is initialized first here:
> 
>         /* Memory regions which panic kernel can safely use to boot into */
>         sz = (sizeof(struct memory_range) * (KEXEC_MAX_SEGMENTS + 1));
>         memmap_p = xmalloc(sz);
>         memset(memmaSp_p, 0, sz);
> 
> and then it is passed to add_memmap,
> 
>         add_memmap(memmap_p, info->backup_src_start, info->backup_src_size);
> 
> and there the passed memmap_p is assumed to have length of
> CRASH_MAX_MEMMAP_NR that is defined as (KEXEC_MAX_SEGMENTS + 1)
> according to the condition of the for loop above. (The
> (KEXEC_MAX_SEGMENTS + 1) in the allocation should also be
> CRASH_MAX_MEMMAP_NR for clarification?)
> 
> The ideas I have for cleaning up here, are for example:
> 
> - introduce specific for-each statement to iterate memmap_p just like:
> 
>   for_each_memmap(memmap_p, start, end) {
>     ...
>   }
> 
>   or
> 
> - use struct memory_ranges instead of struct memory_range and pass it
>   to add_memmap; the former has size member in addition to ranges
>   member, and then in add_memmap:
> 
>   for (i = 0; i < ranges.size; i++) {
>     mstart = ranges.ranges[i].start;
>     mend = ranges.ranges[i].end;
>   }
> 
> The former hides actual length of memmap_p from users because they
> don't need to care about it, while the latter makes length of memmap_p
> explicitly handled even in add_memmp.
> 
> But sorry, this idea comes from some minuts look on the code around.
> 
> Also, you should have divided the patch into two: nr_entires part and
> the others.

For the record, I am not taking this change unless some
consensus is reached.



More information about the kexec mailing list