[Crash-utility] [PATCH] Support cpu_map/cpu_mask changes in 2.6.29
Michael Holzheu
holzheu at linux.vnet.ibm.com
Mon Apr 27 16:07:44 UTC 2009
Hi Dave,
Am Montag, den 27.04.2009, 11:58 -0400 schrieb Dave Anderson:
> ----- "Robin Holt" <holt at sgi.com> wrote:
>
> > On Mon, Apr 27, 2009 at 10:27:22AM -0400, Dave Anderson wrote:
> > >
> > > ----- "Michael Holzheu" <holzheu at linux.vnet.ibm.com> wrote:
> > >
> > > > > So yes, while STRUCT_SIZE("cpumask_t") would always be appropriate for that
> > > > > data type, it would fail for the older kernel types which don't use it.
> > > >
> > > > So if for older kernels it was an unsigned long, the function should
> > > > work:
> > > >
> > > > +static int
> > > > +cpu_map_size(void)
> > > > +{
> > > > + int len;
> > > > +
> > > > + len = STRUCT_SIZE("cpumask_t");
> > > > + if (len < 0)
> > > > + return sizeof(ulong);
> > > > + else
> > > > + return len;
> > > > +}
> > >
> > > Yeah, you're right, that will probably work. There were definitions for
> > > "cpumask_t" that existed prior to the transition of cpu_online_map symbol
> > > from being an unsigned long to a cpumask_t. But except for mips64 (unsupported)
> > > they all appear to have been unsigned longs anyway.
> >
> > IIRC, cpumask_t on ia64 hasn't been an unsigned long for a very long time.
> > The generic_defconfig was at 512 until it recently jumped to 2048.
> > Only some configs limited it down to an unsigned long. Unfortunately,
> > I don't have much time to test this week. Maybe next, but a quick code
> > inspection should raise flags if I am remembering correctly.
> >
> > Thanks,
> > Robin
>
> OK, so then there are two functions in Michael's patch that are
> primarily relevant to maintaining backwards compatibility, cpu_map_addr()
> and cpu_map_size().
>
> cpu_map_addr() basically replaces the hardwired usage of the relevant
> symbol address as an argument to kernel_symbol_exists("cpu_xxxx_map").
> But when the pre-2.6.29 "cpu_xxxx_map" symbols exist, the code still
> does the right thing:
>
> +ulong
> +cpu_map_addr(const char *type)
> +{
> + char cpu_map_symbol[32];
> +
> + sprintf(cpu_map_symbol, "cpu_%s_map", type);
> + if (symbol_exists(cpu_map_symbol))
> + return symbol_value(cpu_map_symbol);
> + else
> + return get_cpu_map_addr_from_mask(type);
> +}
>
> Although, for safety's sake above, the symbol_value() call should
> be replaced with kernel_symbol_value() in order to rule out the
> invalid usage of stray module symbols of the same name.
>
> The cpu_map_size() function is the real bone of contention:
>
> +static int
> +cpu_map_size(void)
> +{
> + int len;
> +
> + len = STRUCT_SIZE("cpumask_t");
> + if (len < 0)
> + return sizeof(ulong);
> + else
> + return len;
> +}
>
> because it is used like so:
>
> - if (LKCD_KERNTYPES()) {
> - if ((len = STRUCT_SIZE("cpumask_t")) < 0)
> - error(FATAL, "cannot determine type cpumask_t\n");
> - } else
> - len = get_symbol_type("cpu_online_map", NULL, &req) ==
> - TYPE_CODE_UNDEF ? sizeof(ulong) : req.length;
> + len = cpu_map_size();
>
> So to cover all bases, perhaps cpu_map_size() should still incorporate
> the get_symbol_type() mechanism *if* the "cpu_xxxx_map" symbol still
> exists?
>
> Michael, does that make sense?
Yes, this makes sense. Will you change the patch accordingly?
Michael
More information about the Crash-utility
mailing list