]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - fs/cifsd/ksmbd_work.c
cifsd: remove wrappers of kvmalloc/kvfree
[mirror_ubuntu-jammy-kernel.git] / fs / cifsd / ksmbd_work.c
CommitLineData
0626e664
NJ
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) 2019 Samsung Electronics Co., Ltd.
4 */
5
6#include <linux/list.h>
7#include <linux/mm.h>
8#include <linux/slab.h>
9#include <linux/workqueue.h>
10
11#include "server.h"
12#include "connection.h"
13#include "ksmbd_work.h"
14#include "buffer_pool.h"
15#include "mgmt/ksmbd_ida.h"
16
17/* @FIXME */
18#include "ksmbd_server.h"
19
20static struct kmem_cache *work_cache;
21static struct workqueue_struct *ksmbd_wq;
22
23struct ksmbd_work *ksmbd_alloc_work_struct(void)
24{
25 struct ksmbd_work *work = kmem_cache_zalloc(work_cache, GFP_KERNEL);
26
27 if (work) {
28 work->compound_fid = KSMBD_NO_FID;
29 work->compound_pfid = KSMBD_NO_FID;
30 INIT_LIST_HEAD(&work->request_entry);
31 INIT_LIST_HEAD(&work->async_request_entry);
32 INIT_LIST_HEAD(&work->fp_entry);
33 INIT_LIST_HEAD(&work->interim_entry);
34 }
35 return work;
36}
37
38void ksmbd_free_work_struct(struct ksmbd_work *work)
39{
40 WARN_ON(work->saved_cred != NULL);
41 if (server_conf.flags & KSMBD_GLOBAL_FLAG_CACHE_TBUF &&
42 work->set_trans_buf)
e5066499 43 ksmbd_release_buffer(work->response_buf);
0626e664 44 else
79f6b11a 45 kvfree(work->response_buf);
0626e664
NJ
46
47 if (server_conf.flags & KSMBD_GLOBAL_FLAG_CACHE_RBUF &&
48 work->set_read_buf)
e5066499 49 ksmbd_release_buffer(work->aux_payload_buf);
0626e664 50 else
79f6b11a 51 kvfree(work->aux_payload_buf);
0626e664 52
79f6b11a
NJ
53 kfree(work->tr_buf);
54 kvfree(work->request_buf);
0626e664
NJ
55 if (work->async_id)
56 ksmbd_release_id(work->conn->async_ida, work->async_id);
57 kmem_cache_free(work_cache, work);
58}
59
60void ksmbd_work_pool_destroy(void)
61{
62 kmem_cache_destroy(work_cache);
63}
64
65int ksmbd_work_pool_init(void)
66{
67 work_cache = kmem_cache_create("ksmbd_work_cache",
68 sizeof(struct ksmbd_work), 0,
69 SLAB_HWCACHE_ALIGN, NULL);
70 if (!work_cache)
71 return -ENOMEM;
72 return 0;
73}
74
75int ksmbd_workqueue_init(void)
76{
77 ksmbd_wq = alloc_workqueue("ksmbd-io", 0, 0);
78 if (!ksmbd_wq)
79 return -ENOMEM;
80 return 0;
81}
82
83void ksmbd_workqueue_destroy(void)
84{
85 flush_workqueue(ksmbd_wq);
86 destroy_workqueue(ksmbd_wq);
87 ksmbd_wq = NULL;
88}
89
90bool ksmbd_queue_work(struct ksmbd_work *work)
91{
92 return queue_work(ksmbd_wq, &work->work);
93}