Rob Johnston wrote:
> Cynthia McGuire wrote:



>>>
>>> 6. LIBTOPO ENHANCEMENTS
>>>
>>> To make the implementation of this project possible, a handful of
>>> extensions to both the libtopo enumerator module API and XML schema are
>>> necessary.
>>>
>>> Currently it is not possible to register module methods on nodes that
>>> are statically enumerated via XML map files.  Typically, node methods
>>> are registered onto a node by the enumerator module after the node is
>>> bound to the topology.  However, since statically enumerated modules
>>> aren't created by the enumerator module this registration doesn't occur.
>>>
>>> While there will be cases where we will be forced to statically define
>>> psu and fan topologies via XML, these nodes still need to support the
>>> node methods that are implemented by the ipmi enumerator module.  In
>>> order to allow these methods to be registered on statically defined
>>> nodes, the topo_modops_t struct will be extended with a new operation
>>> (tmo_meth_reg) as shown below:
>>>
>>> typedef int topo_meth_reg_f(topo_mod_t *, tnode_t *);
>>>
>>> typedef struct topo_modops {
>>>     topo_enum_f *tmo_enum;        /* enumeration op */
>>>     topo_release_f *tmo_release;    /* resource release op */
>>>     topo_meth_reg_f *tmo_meth_reg;    /* method registration op */
>>> } topo_modops_t;
>>>
>>> The tmo_meth_reg operation will be optional.  Enumerator modules
>>> which implement this operation will register the appropriate set of
>>> methods on the topo node that is passed in.
>>>
>>> To provide a connection between this new operation and nodes that are
>>> statically defined in XML, the syntax of the <node> element will be
>>> extended to include a new optional "mod" attribute.  The value of this
>>> attribute should be set to the name of an enumerator module, whose 
>>> methods
>>> should be registered on that node.  Below is an example usage of this
>>> new attribute:
>>>
>>>    <range name='fan' min='0' max='2'>
>>>          <node instance='0' mod='ipmi'>
>>>              . . .
>>>          </node>
>>>    </range>
>>>
>>
>> I don't see a need for the extra registration op nor the new attribute 
>> name, mod.  I prefer to see the XML extended to permit enumerators to 
>> be called after the XML parser has created the static node. The 
>> enumerators can then register their methods and perform any 
>> post-processing of the node (i.e. add other properties).  The 
>> attribute name should be 'enum' as for dynamically created nodes.
> 
> Ok - so along those lines an alternative approach could do something like:
> 
> <range name='fan' min='0' max='2'>
>    <node instance='0'>
>        . . .
>    </node>
>    ...
>   <enum-process name='ipmi' version='1'>
> </range>
> 
> This could invoke a new entry point in the module which would walk the 
> tree and post-process any nodes that it's responsible for (like fan and 
> psu nodes).  Is this closer to what you're thinking of?

Not exactly.  The XML should look like:

  <range name='fan' min='0' max='2'>
     <node instance='0'>
        <enum-method name='ipmi' version='1'>
         . . .
     </node>
     ...
  </range>

The topo XML parser should:

1) create the range 'fan' and reserve 0 - 2 nodes (code already in place)
2) create a node for instance 0: (code already in place)
3) topo_mod_load() the IPMI plugin (need to add this as part of 
pad_process())
4) call topo_mod_enumerate() on the node just created (need to add this 
as part of pad_process())

The IPMI module should:
1) register any methods for the node
2) decorate properties
3) it could also decide that the node should not exist and 
topo_node_unbind() it from the topo tree

This change should require 0 changes to the module API and a minor 
change to the DTD to permit an enum-method element for node.

> 
> 
>>> Additionally, the syntax of the <range> element will also be extended to
>>> allow a new "set" attribute.  The intention is to allow for conditional
>>> enumeration of a range of nodes based on the platform type.  This is
>>> analagous to the conditional specification of properties which is
>>> currently supported via the <propset> element.  Below is an example
>>> usage of this new attribute:
>>>
>>>    <range name='fanmodule' min='0' max='4' 
>>> set='Sun-Fire-X4500|Sun-Fire-X4540'>
>>>        . . .
>>>    </range>
>>>
>>
>> This looks backwards.  Shouldn't the set contain the range?
> 
> Effectively it does.  What I was trying to avoid was creating a brand 
> new element (ala <rangeset>).  By having the set that the range applies 
> to be just an attribute of the <range> element greatly simplifies the 
> actual code changes that I have to make to libtopo's parser.
> 
> I suppose an alternative would be to do something like this:
> 
> <rangeset type='product' set="Sun-Fire-X4500|Sun-Fire-X4540'>
>    <range name='fanmodule' min='0' max='4'>
>        . . .
>    </range>
> </range>
> 
> However this ends up being quite a bit more difficult to implement in 
> the parser wothout any functional benefit.  I also think the xml code 
> looks a bit cleaner the other way.
> 
>> You will also need to specify the set type (someplace) just as we do 
>> in propset.

The reason for the propset element is to permit groupings of properties 
by a some criteria (i.e. product name).  I can see that being useful for 
ranges as well.  For example, we may want to do this:

<rangeset type='product' set='Sun-Fire-X4500|Sun-Fire-X4540'>
        <range name='fanmodule' min='0' max='4'>
                ...
        </range>
        range name='psu' min='0' max='4'>
        </range>
</rangeset>

We may also want to define sets for nodes:

<range name='fanmodule' min='0' max='4'>
        <nodeset type='product' set='Sun-Fire-X4500|Sun-Fire-X4540'>
                <node instance='0' />
                <node instance='1' />
        </nodeset>
</range>

I'd like to see a common element defined for all sets rather than 
propset, rangeset and nodeset.  The set element should be defined in the 
DTD to include 0 or more propgroup, node or range elements.  I wanted to 
use the word, grouping, rather than propset, but it was already in use. 
  Perhaps you can come up with something more brilliant. :)

Cindi

_______________________________________________
fm-discuss mailing list
fm-discuss@opensolaris.org

Reply via email to