Lines Matching defs:workspace

43 struct workspace {
62 * workspace.
64 * Getting a workspace is done by using the bitmap to identify the levels that
66 * workspaces because of the monotonic memory guarantee. A workspace's
68 * level. Putting a workspace involves adding it back to the appropriate places
90 static inline struct workspace *list_to_workspace(struct list_head *list)
92 return container_of(list, struct workspace, list);
103 * This scans the lru_list and attempts to reclaim any workspace that hasn't
121 struct workspace *victim = container_of(pos, struct workspace,
128 /* workspace is in use */
152 * workspace uses less memory than a lower level workspace. In order to reuse
194 "BTRFS: cannot preallocate zstd compression workspace\n");
203 struct workspace *workspace;
209 workspace = container_of(wsm.idle_ws[i].next,
210 struct workspace, list);
211 list_del(&workspace->list);
212 list_del(&workspace->lru_list);
213 zstd_free_workspace(&workspace->list);
222 * Find workspace for given level.
228 * allocating a new one. If the workspace is of a larger size, it is used, but
230 * offer the opportunity to reclaim the workspace in favor of allocating an
236 struct workspace *workspace;
243 workspace = list_to_workspace(ws);
246 workspace->req_level = level;
247 if (level == workspace->level)
248 list_del(&workspace->lru_list);
267 * attempt to allocate a new workspace. If we fail to allocate one due to
268 * memory pressure, go to sleep waiting for the max level workspace to free up.
275 /* level == 0 means we can use any workspace */
304 * @ws: list_head for the workspace
306 * When putting back a workspace, we only need to update the LRU if we are of
308 * max level workspace or update last_used accordingly. If the reclaim timer
309 * isn't set, it is also set here. Only the max level workspace tries and wakes
314 struct workspace *workspace = list_to_workspace(ws);
319 if (workspace->req_level == workspace->level) {
320 /* Hide a max level workspace from reclaim */
322 INIT_LIST_HEAD(&workspace->lru_list);
324 workspace->last_used = jiffies;
325 list_add(&workspace->lru_list, &wsm.lru_list);
332 set_bit(workspace->level - 1, &wsm.active_map);
333 list_add(&workspace->list, &wsm.idle_ws[workspace->level - 1]);
334 workspace->req_level = 0;
338 if (workspace->level == ZSTD_BTRFS_MAX_LEVEL)
344 struct workspace *workspace = list_entry(ws, struct workspace, list);
346 kvfree(workspace->mem);
347 kfree(workspace->buf);
348 kfree(workspace);
353 struct workspace *workspace;
355 workspace = kzalloc(sizeof(*workspace), GFP_KERNEL);
356 if (!workspace)
359 workspace->size = zstd_ws_mem_sizes[level - 1];
360 workspace->level = level;
361 workspace->req_level = level;
362 workspace->last_used = jiffies;
363 workspace->mem = kvmalloc(workspace->size, GFP_KERNEL | __GFP_NOWARN);
364 workspace->buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
365 if (!workspace->mem || !workspace->buf)
368 INIT_LIST_HEAD(&workspace->list);
369 INIT_LIST_HEAD(&workspace->lru_list);
371 return &workspace->list;
373 zstd_free_workspace(&workspace->list);
381 struct workspace *workspace = list_entry(ws, struct workspace, list);
392 zstd_parameters params = zstd_get_btrfs_parameters(workspace->req_level,
400 stream = zstd_init_cstream(&params, len, workspace->mem,
401 workspace->size);
410 workspace->in_buf.src = kmap_local_page(in_page);
411 workspace->in_buf.pos = 0;
412 workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE);
421 workspace->out_buf.dst = page_address(out_page);
422 workspace->out_buf.pos = 0;
423 workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
428 ret2 = zstd_compress_stream(stream, &workspace->out_buf,
429 &workspace->in_buf);
438 if (tot_in + workspace->in_buf.pos > 8192 &&
439 tot_in + workspace->in_buf.pos <
440 tot_out + workspace->out_buf.pos) {
446 if (workspace->out_buf.pos >= max_out) {
447 tot_out += workspace->out_buf.pos;
453 if (workspace->out_buf.pos == workspace->out_buf.size) {
466 workspace->out_buf.dst = page_address(out_page);
467 workspace->out_buf.pos = 0;
468 workspace->out_buf.size = min_t(size_t, max_out,
473 if (workspace->in_buf.pos >= len) {
474 tot_in += workspace->in_buf.pos;
479 if (workspace->in_buf.pos == workspace->in_buf.size) {
481 kunmap_local(workspace->in_buf.src);
486 workspace->in_buf.src = kmap_local_page(in_page);
487 workspace->in_buf.pos = 0;
488 workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE);
494 ret2 = zstd_end_stream(stream, &workspace->out_buf);
502 tot_out += workspace->out_buf.pos;
505 if (workspace->out_buf.pos >= max_out) {
506 tot_out += workspace->out_buf.pos;
523 workspace->out_buf.dst = page_address(out_page);
524 workspace->out_buf.pos = 0;
525 workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
538 if (workspace->in_buf.src) {
539 kunmap_local(workspace->in_buf.src);
547 struct workspace *workspace = list_entry(ws, struct workspace, list);
558 ZSTD_BTRFS_MAX_INPUT, workspace->mem, workspace->size);
565 workspace->in_buf.src = kmap_local_page(pages_in[page_in_index]);
566 workspace->in_buf.pos = 0;
567 workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
569 workspace->out_buf.dst = workspace->buf;
570 workspace->out_buf.pos = 0;
571 workspace->out_buf.size = PAGE_SIZE;
576 ret2 = zstd_decompress_stream(stream, &workspace->out_buf,
577 &workspace->in_buf);
585 total_out += workspace->out_buf.pos;
586 workspace->out_buf.pos = 0;
588 ret = btrfs_decompress_buf2page(workspace->out_buf.dst,
593 if (workspace->in_buf.pos >= srclen)
600 if (workspace->in_buf.pos == workspace->in_buf.size) {
601 kunmap_local(workspace->in_buf.src);
604 workspace->in_buf.src = NULL;
609 workspace->in_buf.src = kmap_local_page(pages_in[page_in_index]);
610 workspace->in_buf.pos = 0;
611 workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
616 if (workspace->in_buf.src)
617 kunmap_local(workspace->in_buf.src);
625 struct workspace *workspace = list_entry(ws, struct workspace, list);
633 ZSTD_BTRFS_MAX_INPUT, workspace->mem, workspace->size);
639 workspace->in_buf.src = data_in;
640 workspace->in_buf.pos = 0;
641 workspace->in_buf.size = srclen;
643 workspace->out_buf.dst = workspace->buf;
644 workspace->out_buf.pos = 0;
645 workspace->out_buf.size = sectorsize;
651 ret = zstd_decompress_stream(stream, &workspace->out_buf, &workspace->in_buf);
657 to_copy = workspace->out_buf.pos;
658 memcpy_to_page(dest_page, dest_pgoff, workspace->out_buf.dst, to_copy);
669 /* ZSTD uses own workspace manager */