Re: Wrong RSS field in ps

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

 




----- Original Message -----
> 
> 
> ----- Original Message -----
> > On Tue, 4 Aug 2015 16:57:35 -0400 (EDT)
> > Dave Anderson <anderson@xxxxxxxxxx> wrote:
> > 
> > > 
> > > 
> > > ----- Original Message -----
> > > 
> > > > > Michael
> > > > 
> > > > OK, so it would seem to be somewhere in the trail from
> > > > enumerator_value()
> > > > into the gdb_command_funnel() via the GNU_GET_DATATYPE req->command in
> > > > datatype_info().
> > > > 
> > > > I'm having a hard time provisioning an s390x machine internally at this
> > > > time.
> > > > When I get one, I'll see if the problem has been there all along.
> > > > 
> > > > Dave
> > > > 
> > > 
> > > Michael,
> > > 
> > > I finally got access to an s390x and I see the same thing.  In fact it
> > > also
> > > happens on a RHEL6 2.6.32-based kernel, so it appears it's always been an
> > > issue.  I'll look into it tomorrow.
> > 
> > Great, thanks!
> > 
> > Michael
> > 
> 
> The problem is in gdb-7.6/gdb/symtab.c, in the eval_enum() function that
> gets created/added by the crash utility's gdb-7.6.patch:
> 
> static void
> eval_enum(struct type *type, struct gnu_request *req)
> {
>         register int i;
>         int len;
>         int lastval;
> 
>         len = TYPE_NFIELDS (type);
>         lastval = 0;
> 
>         for (i = 0; i < len; i++) {
>                 if (lastval != TYPE_FIELD_BITPOS (type, i)) {
>                         lastval = TYPE_FIELD_BITPOS (type, i);
>                 }
>                 if (STREQ(TYPE_FIELD_NAME(type, i), req->name)) {
>                         req->tagname = "(unknown)";
>                         req->value = lastval;
>                         return;
>                 }
>                 lastval++;
>         }
> }
> 
> The function is only used for anonymous (nameless) enums like MM_ANONPAGES.
> It simply walks through the enumerator fields and looks for a matching string,
> having captured the value of each enumerator in "lastval".  This function hasn't
> changed, and has simply been forward-ported with each upgrade of gdb.  What has
> changed, though, is gdb itself between gdb-7.3.1 and gdb-7.6, which added a new
> TYPE_FIELD_ENUMVAL() macro, which should replace the two instances of
> TYPE_FIELD_BITPOS() above.
> 
> I'm thinking that this is an endian issue, where the generic TYPE_FIELD_BITPOS()
> macro works OK for little-endian machines, and probably has always failed for big-endian
> machines.  I'm provisioning a big-endian ppc64 to verify that.  (Although I'm not sure
> what macro should have been used in the older gdb versions that didn't have a TYPE_FIELD_ENUMVAL()?)
> 
> Anyway, that's the resolution -- I'll be updating the gdb-7.6.patch upstream later today
> or tomorrow.
> 
> Dave

FYI, this is an endian issue.  Fortunately very few anonymous enums are utilized by
the crash utility:

  MM_ANONPAGES/MM_FILEPAGES  (2.6.34 and later) 
  ZONE_ALL_UNRECLAIMABLE     (pre-2.6.34)
  WORK_CPU_UNBOUND           (2.6.36 and later)

The ZONE_ALL_UNRECLAIMABLE enum value is 0, so that works OK by mistake.  The WORK_CPU_UNBOUND
enum is used for kt->kernel_NR_CPUS, but if it gets set to 0 by mistake, all users of it in
the crash utility will utilize the per-arch NR_CPUS value compiled into the crash utility, 
so it's a benign problem. 

So what this boils down to is a faulty "ps" RSS value when analyzing 2.6.34 and later big-endian
kernels.

Dave











fghfghfgh




> 
> 
> 
> 
> 
> 
> 

--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility



[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux