diff options
Diffstat (limited to 'svc_dev.c')
-rw-r--r-- | svc_dev.c | 58 |
1 files changed, 26 insertions, 32 deletions
@@ -38,28 +38,21 @@ static void devlist_free(void *x) free(devlist); } -static size_t devid_hash(const void *x, size_t tablesize) -{ - const struct mog_dev *dev = x; - - return dev->devid % tablesize; -} - -static bool devid_cmp(const void *a, const void *b) -{ - const struct mog_dev *dev_a = a; - const struct mog_dev *dev_b = b; - - return dev_a->devid == dev_b->devid; -} - static struct mog_devlist * mog_devlist_new(dev_t st_dev) { struct mog_devlist *devlist = xmalloc(sizeof(struct mog_devlist)); devlist->st_dev = st_dev; devlist->by_mogdevid = hash_initialize(7, NULL, - devid_hash, devid_cmp, free); + mog_dev_hash, mog_dev_cmp, + + /* + * elements are freed when + * svc->by_mog_devid is freed + */ + NULL); + + mog_oom_if_null(devlist->by_mogdevid); return devlist; } @@ -99,8 +92,7 @@ static void svc_init_dev_hash(struct mog_svc *svc) svc->by_st_dev = hash_initialize(7, NULL, devlist_hash, devlist_cmp, devlist_free); - if (!svc->by_st_dev) - mog_oom(); + mog_oom_if_null(svc->by_st_dev); } static int svc_scandev(struct mog_svc *svc, size_t *nr, mog_scandev_cb cb) @@ -108,9 +100,6 @@ static int svc_scandev(struct mog_svc *svc, size_t *nr, mog_scandev_cb cb) struct dirent *ent; int rc = 0; - if (svc->mgmt_fd < 0) - return 0; - CHECK(int, 0, pthread_mutex_lock(&svc->devstats_lock)); svc_init_dev_hash(svc); rewinddir(svc->dir); @@ -127,15 +116,17 @@ static int svc_scandev(struct mog_svc *svc, size_t *nr, mog_scandev_cb cb) mog_devid = strtoul(ent->d_name + 3, &end, 10); if (*end != 0) continue; - if (mog_devid > 0xffffff) continue; /* MEDIUMINT in DB */ + if (mog_devid > MOG_DEVID_MAX) continue; - dev = mog_dev_new(svc, (uint32_t)mog_devid); + dev = mog_dev_for(svc, (uint32_t)mog_devid); if (!dev) continue; devlist = svc_devlist(svc, dev->st_dev); devhash = devlist->by_mogdevid; - if (cb) rc |= cb(dev, svc); /* mog_dev_mkusage */ + if (cb) + rc |= cb(dev, svc); /* mog_dev_mkusage */ + switch (hash_insert_if_absent(devhash, dev, NULL)) { case 0: free(dev); @@ -284,18 +275,21 @@ void mog_svc_dev_shutdown(void) mog_svc_each(devstats_shutdown_i, NULL); } -static bool svc_mkusage_each(void *svc, void *nr) +static bool svc_mkusage_each(void *svcptr, void *ignored) { - svc_scandev((struct mog_svc *)svc, nr, mog_dev_mkusage); + struct mog_svc *svc = svcptr; + size_t ndev = 0; + + svc_scandev(svc, &ndev, mog_dev_mkusage); + + if (svc->queue && (svc->nmogdev != ndev)) + mog_svc_thrpool_rescale(svc, ndev); + svc->nmogdev = ndev; return true; } -size_t mog_mkusage_all(void) +void mog_mkusage_all(void) { - size_t nr = 0; - - mog_svc_each(svc_mkusage_each, &nr); - - return nr; + mog_svc_each(svc_mkusage_each, NULL); } |