O create process -> assign master proc struct + fqps for each disk present O create disk -> walk all master proc struct and add new fqp for new disk O -> also keep some list on what disks are associated to the scheduler destroy disk -> walk all master proc struct and remove new fqp; cancel all bios -> remove from global list of disks with this scheduler zombie process -> cancel all reads in all fqps; push all writes in all fqps to disk O new buf -> assign master proc struct using curthread/curproc O queue -> find actual fqp in master proc struct of buf master proc ref count: O + create process O + new buf - zombie process - queue fqp ref count: O + queue O - completed master proc list (kept globally): O + create process - zombie process fqp list (kept per proc): O + create disk (walk master list, create fqps) O + create process (one fqp per disk on create process) - destroy disk (walk master list, destroy fqps) - zombie process (destroy all fqps in master proc struct) so how do we do buckets? option 1) - each process has a member pointing to a bucket - bucket has also a list of all processes that are members - per-disk list of buckets - each bucket is allocated a proportional amount of total throughput - each fqp in each bucket gets a fair share of the bucket's proportional amount => so when do we instantiate them? -> each fq disk has a list of all buckets that exist -> but buckets are marked either active or inactive -> inactive buckets are skipped and not accounted for in bandwidth allocation. if fqp has references and is in flight but disk is destroyed? -> set to inactive -> on completion see if it's cancelled (?) subr_dsched: stuff to iterate through disks with a particular scheduler http://pcca.ath.cx/updatedb.php ------------------------ calculate budget in respective thread Andrew File System Benchmark TPC-B database benchmark