Lines Matching full:bd
144 #define BD_LOCKPTR(bd) (&(bd)->bd_cleanq->bq_lock)
145 #define BD_LOCK(bd) mtx_lock(BD_LOCKPTR((bd)))
146 #define BD_UNLOCK(bd) mtx_unlock(BD_LOCKPTR((bd)))
147 #define BD_ASSERT_LOCKED(bd) mtx_assert(BD_LOCKPTR((bd)), MA_OWNED)
148 #define BD_RUN_LOCKPTR(bd) (&(bd)->bd_run_lock)
149 #define BD_RUN_LOCK(bd) mtx_lock(BD_RUN_LOCKPTR((bd)))
150 #define BD_RUN_UNLOCK(bd) mtx_unlock(BD_RUN_LOCKPTR((bd)))
151 #define BD_DOMAIN(bd) (bd - bdomain)
200 static void bd_init(struct bufdomain *bd);
201 static int bd_flushall(struct bufdomain *bd);
543 bd_clear(struct bufdomain *bd)
547 if (bd->bd_numdirtybuffers <= bd->bd_lodirtybuffers)
548 BIT_CLR(BUF_DOMAINS, BD_DOMAIN(bd), &bdlodirty);
549 if (bd->bd_numdirtybuffers <= bd->bd_hidirtybuffers)
550 BIT_CLR(BUF_DOMAINS, BD_DOMAIN(bd), &bdhidirty);
561 bd_set(struct bufdomain *bd)
565 if (bd->bd_numdirtybuffers > bd->bd_lodirtybuffers)
566 BIT_SET(BUF_DOMAINS, BD_DOMAIN(bd), &bdlodirty);
567 if (bd->bd_numdirtybuffers > bd->bd_hidirtybuffers)
568 BIT_SET(BUF_DOMAINS, BD_DOMAIN(bd), &bdhidirty);
581 struct bufdomain *bd;
584 bd = bufdomain(bp);
585 num = atomic_fetchadd_int(&bd->bd_numdirtybuffers, -1);
586 if (num == (bd->bd_lodirtybuffers + bd->bd_hidirtybuffers) / 2)
588 if (num == bd->bd_lodirtybuffers || num == bd->bd_hidirtybuffers)
589 bd_clear(bd);
601 struct bufdomain *bd;
608 bd = bufdomain(bp);
609 num = atomic_fetchadd_int(&bd->bd_numdirtybuffers, 1);
610 if (num == (bd->bd_lodirtybuffers + bd->bd_hidirtybuffers) / 2)
612 if (num == bd->bd_lodirtybuffers || num == bd->bd_hidirtybuffers)
613 bd_set(bd);
622 bufspace_daemon_wakeup(struct bufdomain *bd)
628 if (atomic_fetchadd_int(&bd->bd_running, 1) == 0) {
629 BD_RUN_LOCK(bd);
630 atomic_store_int(&bd->bd_running, 1);
631 wakeup(&bd->bd_running);
632 BD_RUN_UNLOCK(bd);
645 struct bufdomain *bd;
651 bd = bufdomain(bp);
654 atomic_subtract_long(&bd->bd_bufspace, -diff);
656 space = atomic_fetchadd_long(&bd->bd_bufspace, diff);
658 if (space < bd->bd_bufspacethresh &&
659 space + diff >= bd->bd_bufspacethresh)
660 bufspace_daemon_wakeup(bd);
672 bufspace_reserve(struct bufdomain *bd, int size, bool metadata)
678 limit = bd->bd_maxbufspace;
680 limit = bd->bd_hibufspace;
681 space = atomic_fetchadd_long(&bd->bd_bufspace, size);
684 atomic_subtract_long(&bd->bd_bufspace, size);
689 if (space < bd->bd_bufspacethresh && new >= bd->bd_bufspacethresh)
690 bufspace_daemon_wakeup(bd);
701 bufspace_release(struct bufdomain *bd, int size)
704 atomic_subtract_long(&bd->bd_bufspace, size);
715 bufspace_wait(struct bufdomain *bd, struct vnode *vp, int gbflags,
725 BD_LOCK(bd);
726 while (bd->bd_wanted) {
729 BD_UNLOCK(bd);
750 fl = buf_flush(vp, bd, flushbufqtarget);
752 BD_LOCK(bd);
755 if (bd->bd_wanted == 0)
758 error = msleep(&bd->bd_wanted, BD_LOCKPTR(bd),
763 BD_UNLOCK(bd);
769 struct bufdomain *bd = arg;
775 BD_RUN_LOCK(bd);
776 bd->bd_shutdown = true;
777 wakeup(&bd->bd_running);
778 error = msleep(&bd->bd_shutdown, BD_RUN_LOCKPTR(bd), 0,
780 BD_RUN_UNLOCK(bd);
795 struct bufdomain *bd = arg;
797 EVENTHANDLER_REGISTER(shutdown_pre_sync, bufspace_daemon_shutdown, bd,
800 BD_RUN_LOCK(bd);
801 while (!bd->bd_shutdown) {
802 BD_RUN_UNLOCK(bd);
829 while (bd->bd_bufspace > bd->bd_lobufspace ||
830 bd->bd_freebuffers < bd->bd_hifreebuffers) {
831 if (buf_recycle(bd, false) != 0) {
832 if (bd_flushall(bd))
843 BD_LOCK(bd);
844 if (bd->bd_wanted) {
845 msleep(&bd->bd_wanted, BD_LOCKPTR(bd),
848 BD_UNLOCK(bd);
859 BD_RUN_LOCK(bd);
860 if (bd->bd_shutdown)
862 atomic_store_int(&bd->bd_running, 0);
863 if (bd->bd_bufspace < bd->bd_bufspacethresh &&
864 bd->bd_freebuffers > bd->bd_lofreebuffers) {
865 msleep(&bd->bd_running, BD_RUN_LOCKPTR(bd),
869 atomic_store_int(&bd->bd_running, 1);
872 wakeup(&bd->bd_shutdown);
873 BD_RUN_UNLOCK(bd);
1330 struct bufdomain *bd;
1332 bd = &bdomain[i];
1333 bd_init(bd);
1334 bd->bd_freebuffers = nbuf / buf_domains;
1335 bd->bd_hifreebuffers = hifreebuffers / buf_domains;
1336 bd->bd_lofreebuffers = lofreebuffers / buf_domains;
1337 bd->bd_bufspace = 0;
1338 bd->bd_maxbufspace = maxbufspace / buf_domains;
1339 bd->bd_hibufspace = hibufspace / buf_domains;
1340 bd->bd_lobufspace = lobufspace / buf_domains;
1341 bd->bd_bufspacethresh = bufspacethresh / buf_domains;
1342 bd->bd_numdirtybuffers = 0;
1343 bd->bd_hidirtybuffers = hidirtybuffers / buf_domains;
1344 bd->bd_lodirtybuffers = lodirtybuffers / buf_domains;
1345 bd->bd_dirtybufthresh = dirtybufthresh / buf_domains;
1347 bd->bd_lim = nbuf / buf_domains / 50 / mp_ncpus;
1606 struct bufdomain *bd;
1627 bd = bufdomain(bp);
1629 if (bd->bd_lim != 0)
1630 bq = &bd->bd_subq[PCPU_GET(cpuid)];
1632 bq = bd->bd_cleanq;
1634 bq = &bd->bd_dirtyq;
1726 buf_alloc(struct bufdomain *bd)
1737 freebufs = atomic_fetchadd_int(&bd->bd_freebuffers, -1);
1741 atomic_add_int(&bd->bd_freebuffers, 1);
1742 bufspace_daemon_wakeup(bd);
1749 if (freebufs == bd->bd_lofreebuffers)
1750 bufspace_daemon_wakeup(bd);
1769 bp->b_domain = BD_DOMAIN(bd);
1801 buf_recycle(struct bufdomain *bd, bool kva)
1809 bq = bd->bd_cleanq;
1811 KASSERT(BQ_LOCKPTR(bq) == BD_LOCKPTR(bd),
1859 KASSERT(bp->b_domain == BD_DOMAIN(bd),
1861 bp->b_domain, (int)BD_DOMAIN(bd)));
1883 bd->bd_wanted = 1;
1937 bd_init(struct bufdomain *bd)
1942 bd->bd_subq = mallocarray(mp_maxid + 2, sizeof(struct bufqueue),
1944 bd->bd_cleanq = &bd->bd_subq[mp_maxid + 1];
1945 bq_init(bd->bd_cleanq, QUEUE_CLEAN, mp_maxid + 1, "bufq clean lock");
1946 bq_init(&bd->bd_dirtyq, QUEUE_DIRTY, -1, "bufq dirty lock");
1948 bq_init(&bd->bd_subq[i], QUEUE_CLEAN, i,
1950 mtx_init(&bd->bd_run_lock, "bufspace daemon run lock", NULL, MTX_DEF);
1983 bd_flush(struct bufdomain *bd, struct bufqueue *bq)
1988 if (bq != bd->bd_cleanq) {
1989 BD_LOCK(bd);
1992 TAILQ_INSERT_TAIL(&bd->bd_cleanq->bq_queue, bp,
1994 bp->b_subqueue = bd->bd_cleanq->bq_subqueue;
1996 bd->bd_cleanq->bq_len += bq->bq_len;
1999 if (bd->bd_wanted) {
2000 bd->bd_wanted = 0;
2001 wakeup(&bd->bd_wanted);
2003 if (bq != bd->bd_cleanq)
2004 BD_UNLOCK(bd);
2008 bd_flushall(struct bufdomain *bd)
2014 if (bd->bd_lim == 0)
2018 bq = &bd->bd_subq[i];
2022 bd_flush(bd, bq);
2033 struct bufdomain *bd;
2038 bd = bufdomain(bp);
2042 bq = bd->bd_cleanq;
2065 if (bd->bd_wanted || (bq != bd->bd_cleanq &&
2066 bq->bq_len >= bd->bd_lim))
2067 bd_flush(bd, bq);
2403 struct bufdomain *bd;
2405 bd = &bdomain[bo->bo_domain];
2406 if (bo->bo_dirty.bv_cnt > bd->bd_dirtybufthresh + 10) {
2409 } else if (bo->bo_dirty.bv_cnt > bd->bd_dirtybufthresh) {
3356 struct bufdomain *bd;
3372 bd = &bdomain[0];
3374 bd = &bdomain[vp->v_bufobj.bo_domain];
3380 bufspace_reserve(bd, maxsize, metadata) != 0) {
3385 if ((bp = buf_alloc(bd)) == NULL) {
3392 } while (buf_recycle(bd, false) == 0);
3395 bufspace_release(bd, maxsize);
3400 bufspace_wait(bd, vp, gbflags, slpflag, slptimeo);
3420 buf_flush(struct vnode *vp, struct bufdomain *bd, int target)
3424 flushed = flushbufqueues(vp, bd, target, 0);
3433 flushbufqueues(vp, bd, target, 1);
3459 struct bufdomain *bd;
3503 bd = &bdomain[i];
3505 lodirty = bd->bd_numdirtybuffers / 2;
3507 lodirty = bd->bd_lodirtybuffers;
3508 while (bd->bd_numdirtybuffers > lodirty) {
3509 if (buf_flush(NULL, bd,
3510 bd->bd_numdirtybuffers - lodirty) == 0)
3572 flushbufqueues(struct vnode *lvp, struct bufdomain *bd, int target,
3586 bq = &bd->bd_dirtyq;
5543 struct bufdomain *bd;
5551 bd = &bdomain[i];
5553 db_printf("\tfreebufs\t%d\n", bd->bd_freebuffers);
5554 db_printf("\tlofreebufs\t%d\n", bd->bd_lofreebuffers);
5555 db_printf("\thifreebufs\t%d\n", bd->bd_hifreebuffers);
5557 db_printf("\tbufspace\t%ld\n", bd->bd_bufspace);
5558 db_printf("\tmaxbufspace\t%ld\n", bd->bd_maxbufspace);
5559 db_printf("\thibufspace\t%ld\n", bd->bd_hibufspace);
5560 db_printf("\tlobufspace\t%ld\n", bd->bd_lobufspace);
5561 db_printf("\tbufspacethresh\t%ld\n", bd->bd_bufspacethresh);
5563 db_printf("\tnumdirtybuffers\t%d\n", bd->bd_numdirtybuffers);
5564 db_printf("\tlodirtybuffers\t%d\n", bd->bd_lodirtybuffers);
5565 db_printf("\thidirtybuffers\t%d\n", bd->bd_hidirtybuffers);
5566 db_printf("\tdirtybufthresh\t%d\n", bd->bd_dirtybufthresh);
5569 TAILQ_FOREACH(bp, &bd->bd_cleanq->bq_queue, b_freelist)
5572 bd->bd_cleanq->bq_len, total);
5574 TAILQ_FOREACH(bp, &bd->bd_dirtyq.bq_queue, b_freelist)
5577 bd->bd_dirtyq.bq_len, total);
5578 db_printf("\twakeup\t\t%d\n", bd->bd_wanted);
5579 db_printf("\tlim\t\t%d\n", bd->bd_lim);
5582 db_printf("%d, ", bd->bd_subq[j].bq_len);