migrate_disable();
gbuf = &z_erofs_gbufpool[z_erofs_gbuf_id()];
spin_lock(&gbuf->lock); /* check if the buffer is too small */ if (requiredpages > gbuf->nrpages) {
spin_unlock(&gbuf->lock);
migrate_enable(); /* (for sparse checker) pretend gbuf->lock is still taken */
__acquire(gbuf->lock); return NULL;
} return gbuf->ptr;
}
int z_erofs_gbuf_growsize(unsignedint nrpages)
{ static DEFINE_MUTEX(gbuf_resize_mutex); struct page **tmp_pages = NULL; struct z_erofs_gbuf *gbuf; void *ptr, *old_ptr; int last, i, j;
mutex_lock(&gbuf_resize_mutex); /* avoid shrinking gbufs, since no idea how many fses rely on */ if (nrpages <= z_erofs_gbuf_nrpages) {
mutex_unlock(&gbuf_resize_mutex); return0;
}
for (i = 0; i < z_erofs_gbuf_count; ++i) {
gbuf = &z_erofs_gbufpool[i];
tmp_pages = kcalloc(nrpages, sizeof(*tmp_pages), GFP_KERNEL); if (!tmp_pages) goto out;
for (j = 0; j < gbuf->nrpages; ++j)
tmp_pages[j] = gbuf->pages[j]; do {
last = j;
j = alloc_pages_bulk(GFP_KERNEL, nrpages,
tmp_pages); if (last == j) goto out;
} while (j != nrpages);
ptr = vmap(tmp_pages, nrpages, VM_MAP, PAGE_KERNEL); if (!ptr) goto out;
unsignedlong nr = sc->nr_to_scan; unsignedint run_no; unsignedlong freed = 0;
spin_lock(&erofs_sb_list_lock); do {
run_no = ++shrinker_run_no;
} while (run_no == 0);
/* Iterate over all mounted superblocks and try to shrink them */
p = erofs_sb_list.next; while (p != &erofs_sb_list) {
sbi = list_entry(p, struct erofs_sb_info, list);
/* *Wemovetheoneswedototheendofthelist,sowestop *whenweseeonewehavealreadydone.
*/ if (sbi->shrinker_run_no == run_no) break;
if (!mutex_trylock(&sbi->umount_mutex)) {
p = p->next; continue;
}
spin_unlock(&erofs_sb_list_lock);
sbi->shrinker_run_no = run_no;
freed += z_erofs_shrink_scan(sbi, nr - freed);
spin_lock(&erofs_sb_list_lock); /* Get the next list element before we move this one */
p = p->next;
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.