for (i = 0; i < ARRAY_SIZE(l->b); i++) if (l->b[i] == dev_bucket) { int v = atomic_sub_return(lock_val, &l->l[i]);
BUG_ON(v && sign(v) != lock_val); if (!v)
closure_wake_up(&l->wait); return;
}
BUG();
}
bool __bch2_bucket_nocow_trylock(struct nocow_lock_bucket *l,
u64 dev_bucket, int flags)
{ int v, lock_val = flags ? 1 : -1; unsigned i;
spin_lock(&l->lock);
for (i = 0; i < ARRAY_SIZE(l->b); i++) if (l->b[i] == dev_bucket) goto got_entry;
for (i = 0; i < ARRAY_SIZE(l->b); i++) if (!atomic_read(&l->l[i])) {
l->b[i] = dev_bucket; goto take_lock;
}
fail:
spin_unlock(&l->lock); returnfalse;
got_entry:
v = atomic_read(&l->l[i]); if (lock_val > 0 ? v < 0 : v > 0) goto fail;
take_lock:
v = atomic_read(&l->l[i]); /* Overflow? */ if (v && sign(v + lock_val) != sign(v)) goto fail;
{ unsigned i, nr_zero = 0; struct nocow_lock_bucket *l;
for (l = t->l; l < t->l + ARRAY_SIZE(t->l); l++) { unsigned v = 0;
for (i = 0; i < ARRAY_SIZE(l->l); i++)
v |= atomic_read(&l->l[i]);
if (!v) {
nr_zero++; continue;
}
if (nr_zero)
prt_printf(out, "(%u empty entries)\n", nr_zero);
nr_zero = 0;
for (i = 0; i < ARRAY_SIZE(l->l); i++) { int v = atomic_read(&l->l[i]); if (v) {
bch2_bpos_to_text(out, u64_to_bucket(l->b[i]));
prt_printf(out, ": %s %u ", v < 0 ? "copy" : "update", abs(v));
}
}
prt_newline(out);
}
if (nr_zero)
prt_printf(out, "(%u empty entries)\n", nr_zero);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.