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);
100 * This scans the lru_list and attempts to reclaim any workspace that hasn't
116 struct workspace *victim = container_of(pos, struct workspace,
123 /* workspace is in use */
147 * workspace uses less memory than a lower level workspace. In order to reuse
189 "BTRFS: cannot preallocate zstd compression workspace\n");
198 struct workspace *workspace;
204 workspace = container_of(wsm.idle_ws[i].next,
205 struct workspace, list);
206 list_del(&workspace->list);
207 list_del(&workspace->lru_list);
208 zstd_free_workspace(&workspace->list);
217 * zstd_find_workspace - find workspace
222 * allocating a new one. If the workspace is of a larger size, it is used, but
224 * offer the opportunity to reclaim the workspace in favor of allocating an
230 struct workspace *workspace;
237 workspace = list_to_workspace(ws);
240 workspace->req_level = level;
241 if (level == workspace->level)
242 list_del(&workspace->lru_list);
260 * attempt to allocate a new workspace. If we fail to allocate one due to
261 * memory pressure, go to sleep waiting for the max level workspace to free up.
268 /* level == 0 means we can use any workspace */
296 * @ws: list_head for the workspace
298 * When putting back a workspace, we only need to update the LRU if we are of
300 * max level workspace or update last_used accordingly. If the reclaim timer
301 * isn't set, it is also set here. Only the max level workspace tries and wakes
306 struct workspace *workspace = list_to_workspace(ws);
311 if (workspace->req_level == workspace->level) {
312 /* Hide a max level workspace from reclaim */
314 INIT_LIST_HEAD(&workspace->lru_list);
316 workspace->last_used = jiffies;
317 list_add(&workspace->lru_list, &wsm.lru_list);
324 set_bit(workspace->level - 1, &wsm.active_map);
325 list_add(&workspace->list, &wsm.idle_ws[workspace->level - 1]);
326 workspace->req_level = 0;
330 if (workspace->level == ZSTD_BTRFS_MAX_LEVEL)
336 struct workspace *workspace = list_entry(ws, struct workspace, list);
338 kvfree(workspace->mem);
339 kfree(workspace->buf);
340 kfree(workspace);
345 struct workspace *workspace;
347 workspace = kzalloc(sizeof(*workspace), GFP_KERNEL);
348 if (!workspace)
351 workspace->size = zstd_ws_mem_sizes[level - 1];
352 workspace->level = level;
353 workspace->req_level = level;
354 workspace->last_used = jiffies;
355 workspace->mem = kvmalloc(workspace->size, GFP_KERNEL);
356 workspace->buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
357 if (!workspace->mem || !workspace->buf)
360 INIT_LIST_HEAD(&workspace->list);
361 INIT_LIST_HEAD(&workspace->lru_list);
363 return &workspace->list;
365 zstd_free_workspace(&workspace->list);
373 struct workspace *workspace = list_entry(ws, struct workspace, list);
384 ZSTD_parameters params = zstd_get_btrfs_parameters(workspace->req_level,
392 stream = ZSTD_initCStream(params, len, workspace->mem,
393 workspace->size);
402 workspace->in_buf.src = kmap(in_page);
403 workspace->in_buf.pos = 0;
404 workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE);
414 workspace->out_buf.dst = kmap(out_page);
415 workspace->out_buf.pos = 0;
416 workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
421 ret2 = ZSTD_compressStream(stream, &workspace->out_buf,
422 &workspace->in_buf);
431 if (tot_in + workspace->in_buf.pos > 8192 &&
432 tot_in + workspace->in_buf.pos <
433 tot_out + workspace->out_buf.pos) {
439 if (workspace->out_buf.pos >= max_out) {
440 tot_out += workspace->out_buf.pos;
446 if (workspace->out_buf.pos == workspace->out_buf.size) {
461 workspace->out_buf.dst = kmap(out_page);
462 workspace->out_buf.pos = 0;
463 workspace->out_buf.size = min_t(size_t, max_out,
468 if (workspace->in_buf.pos >= len) {
469 tot_in += workspace->in_buf.pos;
474 if (workspace->in_buf.pos == workspace->in_buf.size) {
482 workspace->in_buf.src = kmap(in_page);
483 workspace->in_buf.pos = 0;
484 workspace->in_buf.size = min_t(size_t, len, PAGE_SIZE);
490 ret2 = ZSTD_endStream(stream, &workspace->out_buf);
498 tot_out += workspace->out_buf.pos;
501 if (workspace->out_buf.pos >= max_out) {
502 tot_out += workspace->out_buf.pos;
521 workspace->out_buf.dst = kmap(out_page);
522 workspace->out_buf.pos = 0;
523 workspace->out_buf.size = min_t(size_t, max_out, PAGE_SIZE);
548 struct workspace *workspace = list_entry(ws, struct workspace, list);
561 ZSTD_BTRFS_MAX_INPUT, workspace->mem, workspace->size);
568 workspace->in_buf.src = kmap(pages_in[page_in_index]);
569 workspace->in_buf.pos = 0;
570 workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
572 workspace->out_buf.dst = workspace->buf;
573 workspace->out_buf.pos = 0;
574 workspace->out_buf.size = PAGE_SIZE;
579 ret2 = ZSTD_decompressStream(stream, &workspace->out_buf,
580 &workspace->in_buf);
588 total_out += workspace->out_buf.pos;
589 workspace->out_buf.pos = 0;
591 ret = btrfs_decompress_buf2page(workspace->out_buf.dst,
596 if (workspace->in_buf.pos >= srclen)
603 if (workspace->in_buf.pos == workspace->in_buf.size) {
606 workspace->in_buf.src = NULL;
611 workspace->in_buf.src = kmap(pages_in[page_in_index]);
612 workspace->in_buf.pos = 0;
613 workspace->in_buf.size = min_t(size_t, srclen, PAGE_SIZE);
619 if (workspace->in_buf.src)
628 struct workspace *workspace = list_entry(ws, struct workspace, list);
637 ZSTD_BTRFS_MAX_INPUT, workspace->mem, workspace->size);
646 workspace->in_buf.src = data_in;
647 workspace->in_buf.pos = 0;
648 workspace->in_buf.size = srclen;
650 workspace->out_buf.dst = workspace->buf;
651 workspace->out_buf.pos = 0;
652 workspace->out_buf.size = PAGE_SIZE;
656 && workspace->in_buf.pos < workspace->in_buf.size) {
667 ret2 = ZSTD_decompressStream(stream, &workspace->out_buf,
668 &workspace->in_buf);
677 total_out += workspace->out_buf.pos;
678 workspace->out_buf.pos = 0;
689 workspace->out_buf.size - buf_offset);
692 memcpy(kaddr + pg_offset, workspace->out_buf.dst + buf_offset,
709 /* ZSTD uses own workspace manager */