After talking with Ed, we have converged. He suggested that the spec should be updated to replace the proposed ddi_ssoft_state_init(9F) 'hash_sz' argument with an 'n_items' hint-type argument (like ddi_soft_state(9F)) to avoid exposing details of a modhash implementation below. This change to a 'hint' facilitates the implementation switching from a modhash to an avl tree if performance becomes an issue.
I still need to talk more with Garret. If that does not occur before/at PSARC today, we will need to extend the timer. In either case a new spec will be required. -Chris > Hi Ed > > >> hey chris, >> >> the current ddi soft state interfaces are "special" in my mind because i >> thought they were designed to be "fast". (note that i wasn't around for >> the original design, so my opinion is based off the implmentation.) >> their implementation uses direct array indexing, avoids locking, and >> avoids free memory, all seemingly in the name of soft state lookup >> speed. i guess i'm worried that other people may be making the same >> assumptions about the performance of the ddi soft state interfaces, and >> these assumptions don't really carry over to the new interfaces since >> they are really a thin wrapper around modhash. >> > > > Yes, performance is an issue for interfaces used in the per-IO code > path. For the intended use case, the proposed ddi_ssoft_state will not > be 'directly' involved in the performance path. In the intended use > case, the performance path 'indirectly' gains access to the > "target-port" granularity ddi_ssoft_state via a private pointer > maintained in the finer-grained "target-port,lun" per-scsi_device(9S) > hba private soft state (PSARC/2008/675). At tran_tgt_init(9E) time of > a scsi_device(9S), the hba driver is expected to > ddi_ssoft_state_get(9F) the coarser "target-port" softstate, and > increment a private "target-port" softstate reference count to account > for storing a "target-port" softstate pointer in the finer-grained > per-scsi_device(9S) hba private softstate. > > > >> hence, i'd rather see something more straitforward, like some >> version/subset of the modhash interfaces promoted to public, or some new >> ddi*hash* interfaces. >> > > I want the ability to say "its a softstate, but you feed it strings > instead of integers". With that simple statement, I believe that anyone > who has written a solaris driver would "get it". I don't want to loose > that. > > Keep in mind that any part of the device tree that has multiple complex > addressing levels compressed into a single devinfo node unit-address > ("@<component-a>,<component-b>,<component-c>") will face this problem - > which is why I thought the ddi_ssoft_* prefix was warranted. The solution > to performance path issues will likely involve a private ref_count > approach similar to our use case above. > > If the above explanation is insufficient, to make progress, I am > willing to change the interface prefix from ddi_ssoft_state_* to > scsi_taddr_ssoft_state_*, indicating a more restricted use case > that meets immediate needs. > > Thanks > -Chris > from ddi_ssoft_state(9F) proposed man page... >>> int ddi_ssoft_state_init(ddi_ssoft_state **state_p, >>> size_t size, size_t hash_sz); >>> >>> hash_sz The number of hashed lists which will be allocated; >>> zero is not allowed. There is a performance >>> .vs. space tradeoff in the selection of a hash_sz >>> value: for 'n' soft state structures, on average each >>> ddi_ssoft_state_get will need to traverse 'n'/hash_sz/2 >>> entries to locate the requested soft state structure. >>> >>> Change to int ddi_ssoft_state_init(ddi_ssoft_state **state_p, size_t size, size_t n_items); ... n_items A hint of the number of items which will be allocated.