On Jan 19, 2010, at 3:20 AM, Brice Goglin wrote:

> I propose the following changes to the object attributes. struct
> hwloc_obj now contains a struct hwloc_memory pointer:

Is there any reason not to make this a sub-struct included in hwloc_obj (vs. a 
pointer that requires an additional malloc)?  I'm not saying that malloc 
performance and/or the cost of dereferencing the pointer is a big deal -- it 
just feels "un-tidy" to have another malloc for something that will be used in 
many situations.

> struct hwloc_memory {
>   unsigned long total_kB; /* Total memory in this object and its children */
>   unsigned long local_kB; /* Local memory in this object */

FWIW, I'm not wild about the capitol "B" at the end, but that's mainly because 
I'm lazy.  ;-)  How about total_mem and local_mem, and we specify that they are 
in units of bytes?

I say "bytes" instead of "kilobytes" because it might be easier to avoid 
getting into the "what does kilo mean -- 1000 or 1024?" arguments.  

Also, do we want to make them uint64_t's?  A system's total memory could get 
pretty large -- more than 4B bytes on 32 bit systems...?  Hmm.  I'm indecisive 
on this one -- I can think of reasons for and against...  I guess I just prefer 
future-proofing as much as possible.

>   struct hwloc_memory_pages {
>     unsigned long size;
>     unsigned long count;
>   } * local_pages; /* 0-terminated array of pages or hugepages sizes and 
> counts */
> }

In the worst case, we've added 2*sizeof(long)+sizeof(struct*) to the size of 
the hwloc_obj struct for objects that don't have memory.  But I don't think 
that's a big deal, right?

> This obj->memory could be NULL except for Node, Machine and maybe
> System.

Or maybe just total and local memory set to 0?

> > I'd say it can be valuable to support key=value pairs on any object so
> > that future object types can be extensible (e.g., vendor pci devices).
> > But common stuff should be accessible as struct members so that
> > there's no string parsing needed (I'm no doubt just voicing what we
> > all already think). I.e., esoteric stuff can start as a key=value
> > strings but as they get mature / popular, they can "graduate" to
> > become a struct member.
> 
> If we do the above, Node and System won't have any specific attribute
> anymore. Machine will still have DMI infos. But I am not sure they are
> common enough and deserve an actual struct field, they could stay in the
> array of stringified info.

I'm not sure I understand what you mean here -- are you thinking of moving the 
DMI fields to the general key=value arrays?  What is "DMI"?

> Actually, maybe obj->name should go there as well before it mixes to
> many meanings. It's mostly unused in trunk, except to store "Kerrighed"
> since very recently. We talked about using it to store the hostname of
> Machine objects. And the libpci branch uses it to store the PCI
> vendor/model string and OS device names. Maybe all these shouldn't be in
> obj->name and rather in the array of strings as OSName=Kerrighed,
> Hostname=foobar, PCIVendor=foo, PCIModel=bar, OSDevice=eth2, ...

How about both?  It can be useful to have a simple/common field to print a 
human-readable text field (even if it's only a summary and the real details are 
in key=value pairs).

-- 
Jeff Squyres
jsquy...@cisco.com


Reply via email to