Lines Matching defs:workspace

42 struct workspace {
61 * workspace.
63 * Getting a workspace is done by using the bitmap to identify the levels that
65 * workspaces because of the monotonic memory guarantee. A workspace's
67 * level. Putting a workspace involves adding it back to the appropriate places
89 static inline struct workspace *list_to_workspace(struct list_head *list)
91 return container_of(list, struct workspace, list);
102 * This scans the lru_list and attempts to reclaim any workspace that hasn't
120 struct workspace *victim = container_of(pos, struct workspace,
127 /* workspace is in use */
151 * workspace uses less memory than a lower level workspace. In order to reuse
193 "BTRFS: cannot preallocate zstd compression workspace\n");
202 struct workspace *workspace;
208 workspace = container_of(wsm.idle_ws[i].next,
209 struct workspace, list);
210 list_del(&workspace->list);
211 list_del(&workspace->lru_list);
212 zstd_free_workspace(&workspace->list);
221 * zstd_find_workspace - find workspace
226 * allocating a new one. If the workspace is of a larger size, it is used, but
228 * offer the opportunity to reclaim the workspace in favor of allocating an
234 struct workspace *workspace;
241 workspace = list_to_workspace(ws);
244 workspace->req_level = level;
245 if (level == workspace->level)
246 list_del(&workspace->lru_list);
264 * attempt to allocate a new workspace. If we fail to allocate one due to
265 * memory pressure, go to sleep waiting for the max level workspace to free up.
272 /* level == 0 means we can use any workspace */
300 * @ws: list_head for the workspace
302 * When putting back a workspace, we only need to update the LRU if we are of
304 * max level workspace or update last_used accordingly. If the reclaim timer
305 * isn't set, it is also set here. Only the max level workspace tries and wakes
310 struct workspace *workspace = list_to_workspace(ws);
315 if (workspace->req_level == workspace->level) {
316 /* Hide a max level workspace from reclaim */
318 INIT_LIST_HEAD(&workspace->lru_list);
320 workspace->last_used = jiffies;
321 list_add(&workspace->lru_list, &wsm.lru_list);
328 set_bit(workspace->level - 1, &wsm.active_map);
329 list_add(&workspace->list, &wsm.idle_ws[workspace->level - 1]);
330 workspace->req_level = 0;
334 if (workspace->level == ZSTD_BTRFS_MAX_LEVEL)
340 struct workspace *workspace = list_entry(ws, struct workspace, list);
342 kvfree(workspace->mem);
343 kfree(workspace->buf);
344 kfree(workspace);
349 struct workspace *workspace;
351 workspace = kzalloc(sizeof(*workspace), GFP_KERNEL);
352 if (!workspace)
355 workspace->size = zstd_ws_mem_sizes[level - 1];
356 workspace->level = level;
357 workspace->req_level = level;
358 workspace->last_used = jiffies;
359 workspace->mem = kvmalloc(workspace->size, GFP_KERNEL | __GFP_NOWARN);
360 workspace->buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
361 if (!workspace->mem || !workspace->buf)
364 INIT_LIST_HEAD(&workspace->list);
365 INIT_LIST_HEAD(&workspace->lru_list);
367 return &workspace->list;
369 zstd_free_workspace(&workspace->list);
377 struct workspace *workspace = list_entry(ws, struct workspace, list);
388 zstd_parameters params = zstd_get_btrfs_parameters(workspace->req_level,
396 stream = zstd_init_cstream(&params, len, workspace->mem,
397 workspace->size);
406 workspace->in_buf.src = kmap_local_page(in_page);
407 workspace->in_buf.pos = 0;
408 workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE);
418 workspace->out_buf.dst = page_address(out_page);
419 workspace->out_buf.pos = 0;
420 workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
425 ret2 = zstd_compress_stream(stream, &workspace->out_buf,
426 &workspace->in_buf);
435 if (tot_in + workspace->in_buf.pos > 8192 &&
436 tot_in + workspace->in_buf.pos <
437 tot_out + workspace->out_buf.pos) {
443 if (workspace->out_buf.pos >= max_out) {
444 tot_out += workspace->out_buf.pos;
450 if (workspace->out_buf.pos == workspace->out_buf.size) {
463 workspace->out_buf.dst = page_address(out_page);
464 workspace->out_buf.pos = 0;
465 workspace->out_buf.size = min_t(size_t, max_out,
470 if (workspace->in_buf.pos >= len) {
471 tot_in += workspace->in_buf.pos;
476 if (workspace->in_buf.pos == workspace->in_buf.size) {
478 kunmap_local(workspace->in_buf.src);
483 workspace->in_buf.src = kmap_local_page(in_page);
484 workspace->in_buf.pos = 0;
485 workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE);
491 ret2 = zstd_end_stream(stream, &workspace->out_buf);
499 tot_out += workspace->out_buf.pos;
502 if (workspace->out_buf.pos >= max_out) {
503 tot_out += workspace->out_buf.pos;
520 workspace->out_buf.dst = page_address(out_page);
521 workspace->out_buf.pos = 0;
522 workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
535 if (workspace->in_buf.src) {
536 kunmap_local(workspace->in_buf.src);
544 struct workspace *workspace = list_entry(ws, struct workspace, list);
555 ZSTD_BTRFS_MAX_INPUT, workspace->mem, workspace->size);
562 workspace->in_buf.src = kmap_local_page(pages_in[page_in_index]);
563 workspace->in_buf.pos = 0;
564 workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
566 workspace->out_buf.dst = workspace->buf;
567 workspace->out_buf.pos = 0;
568 workspace->out_buf.size = PAGE_SIZE;
573 ret2 = zstd_decompress_stream(stream, &workspace->out_buf,
574 &workspace->in_buf);
582 total_out += workspace->out_buf.pos;
583 workspace->out_buf.pos = 0;
585 ret = btrfs_decompress_buf2page(workspace->out_buf.dst,
590 if (workspace->in_buf.pos >= srclen)
597 if (workspace->in_buf.pos == workspace->in_buf.size) {
598 kunmap_local(workspace->in_buf.src);
601 workspace->in_buf.src = NULL;
606 workspace->in_buf.src = kmap_local_page(pages_in[page_in_index]);
607 workspace->in_buf.pos = 0;
608 workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
613 if (workspace->in_buf.src)
614 kunmap_local(workspace->in_buf.src);
622 struct workspace *workspace = list_entry(ws, struct workspace, list);
630 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 = PAGE_SIZE;
649 && workspace->in_buf.pos < workspace->in_buf.size) {
660 ret2 = zstd_decompress_stream(stream, &workspace->out_buf,
661 &workspace->in_buf);
670 total_out += workspace->out_buf.pos;
671 workspace->out_buf.pos = 0;
682 workspace->out_buf.size - buf_offset);
685 workspace->out_buf.dst + buf_offset, bytes);
698 /* ZSTD uses own workspace manager */