Date: Sat, 23 Aug 2008 00:51:19 +0200 From: Luigi Rizzo <rizzo@iet.unipi.it> To: "M. Warner Losh" <imp@bsdimp.com> Cc: brooks@FreeBSD.org, ivoras@FreeBSD.org, brueffer@FreeBSD.org, freebsd-arch@FreeBSD.org Subject: Re: Magic symlinks redux Message-ID: <20080822225119.GA65119@onelab2.iet.unipi.it> In-Reply-To: <20080822.160107.511563083.imp@bsdimp.com> References: <20080822193657.GB63527@onelab2.iet.unipi.it> <20080822.141312.732640662.imp@bsdimp.com> <20080822214118.GA64725@onelab2.iet.unipi.it> <20080822.160107.511563083.imp@bsdimp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Aug 22, 2008 at 04:01:07PM -0600, M. Warner Losh wrote: > In message: <20080822214118.GA64725@onelab2.iet.unipi.it> > Luigi Rizzo <rizzo@iet.unipi.it> writes: ... > : Hooking a write callback on a node, e.g. to driverparms. > : if_re.devid would allow the driver to update its own internal > : table of descriptors upon a change, and retain the current match > : code (and speed) essentially unchanged in all drivers. > > You're going to have to give me a much more detailed description than > this, because the driver getting a callback to update its information > is very handwavy. take if_re as an example. When if_re loads, it would call object_store_register("driverparms.if_re.devids", if_re_update_devid_table, if_re_devid_table_root); which in turn puts the string-function-arg tuple in a hash table using the string as a search key. Optionally, it could also call a routine to pre-fill the object store subtree with static content supplied by if_re.c or so. When (from the upper part of the kernel, so it can sleep etc.) the subtree is written to, the object store calls if_re_update_devid_table(if_re_devid_table_root) which in turn would scan the subtree using the api supplied by the object store itself, and rebuilds the table, quirks, whatever used by if_re for its own purposes. Clearly, this is specific for if_re. umass will likely have a more complex structure with quirks etc, uscanner is just a table of device ids, etc. > lot of work to make sure that their tables are dynamic. Today, they > are static, or in code (eg, switch statements). this sounds like a > very complex solution to the problem, without really a clear vision > for how it would draw together different devices. ... > : perhaps you are pointing to an ideal solution, which however would > : still require significant work on each driver to adapt the current, > : ad-hoc tables to the solution supplied by the bus. > : > : The approach i suggest above allows incremental deployment and i believe > : it still scales well. > > Actually, the solution that I propose requires *NO* changes to any > leaf drivers. None. It only requires changes in the bus level code > to do the lookup and substitution. They are totally ignorant of the > changes that are going on behind the scenes and can treat a new card > just like a card they already support without even knowing that they > are doing this. sorry but now i am the one who doesn't understand how you can move, with *NO* changes to the leaf drivers, from a bunch of drivers using ad-hoc solutions (static tables with variable number of fields, or lookups hardwired in the code, which don't use just the vendor/device fields but also other info e.g. subdevice as in if_re) to one that relies on the bus code for the matching. At the very least you need to replace the part of the *_probe routines with something that uses the bus routines -- and implement something that lets you manipulate the mapping/quirks table at runtime so that if a compatible device with different IDs comes out you don't have to recompile and reload a module. That's the same kind of changes that I expect to be necessary with the way I have in mind. i am sorry i cannot expand this more as i am about to leave for holidays, but will try to come up with some proof-of-concept code when i am back. cheers luigi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080822225119.GA65119>