Skip to content

Commit 9cc8288

Browse files
author
Rafal Stefanowski
committed
OCF module v2
Change-Id: I58f0fa973cc78b1c7bfefd9ffd783a6f752baba3 Signed-off-by: Rafal Stefanowski <rafal.stefanowski@huawei.com>
1 parent 3f18e3c commit 9cc8288

File tree

17 files changed

+2764
-321
lines changed

17 files changed

+2764
-321
lines changed

module/bdev/ocf/ctx.c

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* SPDX-License-Identifier: BSD-3-Clause
22
* Copyright (C) 2018 Intel Corporation.
3+
* Copyright (C) 2025 Huawei Technologies
34
* All rights reserved.
45
*/
56

@@ -13,13 +14,14 @@
1314

1415
#include "ctx.h"
1516
#include "data.h"
17+
#include "vbdev_ocf_cache.h"
1618

1719
ocf_ctx_t vbdev_ocf_ctx;
1820

1921
static ctx_data_t *
2022
vbdev_ocf_ctx_data_alloc(uint32_t pages)
2123
{
22-
struct bdev_ocf_data *data;
24+
struct vbdev_ocf_data *data;
2325
void *buf;
2426
uint32_t sz;
2527

@@ -46,7 +48,7 @@ vbdev_ocf_ctx_data_alloc(uint32_t pages)
4648
static void
4749
vbdev_ocf_ctx_data_free(ctx_data_t *ctx_data)
4850
{
49-
struct bdev_ocf_data *data = ctx_data;
51+
struct vbdev_ocf_data *data = ctx_data;
5052
int i;
5153

5254
if (!data) {
@@ -105,7 +107,7 @@ iovec_flatten(struct iovec *iov, size_t iovcnt, void *buf, size_t size, size_t o
105107
static uint32_t
106108
vbdev_ocf_ctx_data_rd(void *dst, ctx_data_t *src, uint32_t size)
107109
{
108-
struct bdev_ocf_data *s = src;
110+
struct vbdev_ocf_data *s = src;
109111
uint32_t size_local;
110112

111113
size_local = iovec_flatten(s->iovs, s->iovcnt, dst, size, s->seek);
@@ -146,7 +148,7 @@ buf_to_iovec(const void *buf, size_t size, struct iovec *iov, size_t iovcnt, siz
146148
static uint32_t
147149
vbdev_ocf_ctx_data_wr(ctx_data_t *dst, const void *src, uint32_t size)
148150
{
149-
struct bdev_ocf_data *d = dst;
151+
struct vbdev_ocf_data *d = dst;
150152
uint32_t size_local;
151153

152154
size_local = buf_to_iovec(src, size, d->iovs, d->iovcnt, d->seek);
@@ -186,7 +188,7 @@ iovset(struct iovec *iov, size_t iovcnt, int byte, size_t size, size_t offset)
186188
static uint32_t
187189
vbdev_ocf_ctx_data_zero(ctx_data_t *dst, uint32_t size)
188190
{
189-
struct bdev_ocf_data *d = dst;
191+
struct vbdev_ocf_data *d = dst;
190192
uint32_t size_local;
191193

192194
size_local = iovset(d->iovs, d->iovcnt, 0, size, d->seek);
@@ -198,7 +200,7 @@ vbdev_ocf_ctx_data_zero(ctx_data_t *dst, uint32_t size)
198200
static uint32_t
199201
vbdev_ocf_ctx_data_seek(ctx_data_t *dst, ctx_data_seek_t seek, uint32_t offset)
200202
{
201-
struct bdev_ocf_data *d = dst;
203+
struct vbdev_ocf_data *d = dst;
202204
uint32_t off = 0;
203205

204206
switch (seek) {
@@ -219,8 +221,8 @@ static uint64_t
219221
vbdev_ocf_ctx_data_cpy(ctx_data_t *dst, ctx_data_t *src, uint64_t to,
220222
uint64_t from, uint64_t bytes)
221223
{
222-
struct bdev_ocf_data *s = src;
223-
struct bdev_ocf_data *d = dst;
224+
struct vbdev_ocf_data *s = src;
225+
struct vbdev_ocf_data *d = dst;
224226
uint32_t it_iov = 0;
225227
uint32_t it_off = 0;
226228
uint32_t n, sz;
@@ -255,7 +257,7 @@ vbdev_ocf_ctx_data_cpy(ctx_data_t *dst, ctx_data_t *src, uint64_t to,
255257
static void
256258
vbdev_ocf_ctx_data_secure_erase(ctx_data_t *ctx_data)
257259
{
258-
struct bdev_ocf_data *data = ctx_data;
260+
struct vbdev_ocf_data *data = ctx_data;
259261
struct iovec *iovs = data->iovs;
260262
int i;
261263

@@ -285,18 +287,19 @@ vbdev_ocf_queue_put(ocf_queue_t queue)
285287
ocf_queue_put(queue);
286288
}
287289

288-
void
289-
vbdev_ocf_cache_ctx_put(struct vbdev_ocf_cache_ctx *ctx)
290+
int
291+
vbdev_ocf_queue_poller(void *ctx)
290292
{
291-
if (env_atomic_dec_return(&ctx->refcnt) == 0) {
292-
free(ctx);
293+
ocf_queue_t queue = ctx;
294+
int i, queue_runs;
295+
296+
queue_runs = spdk_min(ocf_queue_pending_io(queue), VBDEV_OCF_QUEUE_RUN_MAX);
297+
298+
for (i = 0; i < queue_runs; i++) {
299+
ocf_queue_run_single(queue);
293300
}
294-
}
295301

296-
void
297-
vbdev_ocf_cache_ctx_get(struct vbdev_ocf_cache_ctx *ctx)
298-
{
299-
env_atomic_inc(&ctx->refcnt);
302+
return queue_runs ? SPDK_POLLER_BUSY : SPDK_POLLER_IDLE;
300303
}
301304

302305
struct cleaner_priv {
@@ -332,13 +335,13 @@ vbdev_ocf_ctx_cleaner_init(ocf_cleaner_t c)
332335
{
333336
struct cleaner_priv *priv = calloc(1, sizeof(*priv));
334337
ocf_cache_t cache = ocf_cleaner_get_cache(c);
335-
struct vbdev_ocf_cache_ctx *cctx = ocf_cache_get_priv(cache);
338+
struct vbdev_ocf_cache *vbdev_ocf_cache = ocf_cache_get_priv(cache);
336339

337340
if (priv == NULL) {
338341
return -ENOMEM;
339342
}
340343

341-
priv->mngt_queue = cctx->mngt_queue;
344+
priv->mngt_queue = vbdev_ocf_cache->ocf_cache_mngt_q;
342345

343346
ocf_cleaner_set_cmpl(c, cleaner_cmpl);
344347
ocf_cleaner_set_priv(c, priv);
@@ -353,10 +356,12 @@ vbdev_ocf_ctx_cleaner_stop(ocf_cleaner_t c)
353356

354357
if (priv) {
355358
spdk_poller_unregister(&priv->poller);
359+
vbdev_ocf_queue_put(priv->mngt_queue);
356360
free(priv);
357361
}
358362
}
359363

364+
// this one should only set next_run to "now" and poller registration should be move to _init with saved thread
360365
static void
361366
vbdev_ocf_ctx_cleaner_kick(ocf_cleaner_t cleaner)
362367
{
@@ -408,7 +413,7 @@ vbdev_ocf_ctx_log_printf(ocf_logger_t logger, ocf_logger_lvl_t lvl,
408413
}
409414

410415
static const struct ocf_ctx_config vbdev_ocf_ctx_cfg = {
411-
.name = "OCF SPDK",
416+
.name = "SPDK_OCF",
412417

413418
.ops = {
414419
.data = {

module/bdev/ocf/ctx.h

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,22 @@
11
/* SPDX-License-Identifier: BSD-3-Clause
22
* Copyright (C) 2018 Intel Corporation.
3+
* Copyright (C) 2025 Huawei Technologies
34
* All rights reserved.
45
*/
56

67
#ifndef VBDEV_OCF_CTX_H
78
#define VBDEV_OCF_CTX_H
89

910
#include <ocf/ocf.h>
10-
#include "ocf_env.h"
11-
#include "spdk/thread.h"
1211

1312
extern ocf_ctx_t vbdev_ocf_ctx;
1413

1514
#define OCF_WRITE_FLUSH 11
1615

1716
#define SPDK_OBJECT 1
1817

19-
/* Context of cache instance */
20-
struct vbdev_ocf_cache_ctx {
21-
ocf_queue_t mngt_queue;
22-
env_atomic refcnt;
23-
};
24-
25-
void vbdev_ocf_cache_ctx_put(struct vbdev_ocf_cache_ctx *ctx);
26-
void vbdev_ocf_cache_ctx_get(struct vbdev_ocf_cache_ctx *ctx);
18+
// why?
19+
#define VBDEV_OCF_QUEUE_RUN_MAX 32
2720

2821
int vbdev_ocf_ctx_init(void);
2922
void vbdev_ocf_ctx_cleanup(void);
@@ -34,5 +27,6 @@ int vbdev_ocf_queue_create(ocf_cache_t cache, ocf_queue_t *queue, const struct o
3427
int vbdev_ocf_queue_create_mngt(ocf_cache_t cache, ocf_queue_t *queue,
3528
const struct ocf_queue_ops *ops);
3629
void vbdev_ocf_queue_put(ocf_queue_t queue);
30+
int vbdev_ocf_queue_poller(void *ctx);
3731

3832
#endif

module/bdev/ocf/data.c

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
/* SPDX-License-Identifier: BSD-3-Clause
22
* Copyright (C) 2018 Intel Corporation.
3+
* Copyright (C) 2025 Huawei Technologies
34
* All rights reserved.
45
*/
56

67
#include <ocf/ocf.h>
78
#include "spdk/bdev.h"
89
#include "data.h"
910

10-
struct bdev_ocf_data *
11+
struct vbdev_ocf_data *
1112
vbdev_ocf_data_alloc(uint32_t iovcnt)
1213
{
13-
struct bdev_ocf_data *data;
14+
struct vbdev_ocf_data *data;
1415

1516
data = env_malloc(sizeof(*data), ENV_MEM_NOIO);
1617
if (!data) {
@@ -34,7 +35,7 @@ vbdev_ocf_data_alloc(uint32_t iovcnt)
3435
}
3536

3637
void
37-
vbdev_ocf_data_free(struct bdev_ocf_data *data)
38+
vbdev_ocf_data_free(struct vbdev_ocf_data *data)
3839
{
3940
if (!data) {
4041
return;
@@ -48,7 +49,7 @@ vbdev_ocf_data_free(struct bdev_ocf_data *data)
4849
}
4950

5051
void
51-
vbdev_ocf_iovs_add(struct bdev_ocf_data *data, void *base, size_t len)
52+
vbdev_ocf_iovs_add(struct vbdev_ocf_data *data, void *base, size_t len)
5253
{
5354
assert(NULL != data);
5455
assert(data->iovalloc != -1);
@@ -62,33 +63,3 @@ vbdev_ocf_iovs_add(struct bdev_ocf_data *data, void *base, size_t len)
6263
data->iovs[data->iovcnt].iov_len = len;
6364
data->iovcnt++;
6465
}
65-
66-
struct bdev_ocf_data *
67-
vbdev_ocf_data_from_spdk_io(struct spdk_bdev_io *bdev_io)
68-
{
69-
struct bdev_ocf_data *data;
70-
71-
if (bdev_io == NULL) {
72-
return NULL;
73-
}
74-
75-
switch (bdev_io->type) {
76-
case SPDK_BDEV_IO_TYPE_WRITE:
77-
case SPDK_BDEV_IO_TYPE_READ:
78-
assert(bdev_io->u.bdev.iovs);
79-
break;
80-
case SPDK_BDEV_IO_TYPE_FLUSH:
81-
case SPDK_BDEV_IO_TYPE_UNMAP:
82-
break;
83-
default:
84-
SPDK_ERRLOG("Unsupported IO type %d\n", bdev_io->type);
85-
return NULL;
86-
}
87-
88-
data = (struct bdev_ocf_data *)bdev_io->driver_ctx;
89-
data->iovs = bdev_io->u.bdev.iovs;
90-
data->iovcnt = bdev_io->u.bdev.iovcnt;
91-
data->size = bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen;
92-
93-
return data;
94-
}

module/bdev/ocf/data.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* SPDX-License-Identifier: BSD-3-Clause
22
* Copyright (C) 2018 Intel Corporation.
3+
* Copyright (C) 2025 Huawei Technologies
34
* All rights reserved.
45
*/
56

@@ -9,22 +10,20 @@
910
#include "ocf_env.h"
1011
#include "spdk/bdev_module.h"
1112

12-
struct bdev_ocf_data {
13+
struct vbdev_ocf_data {
1314
struct iovec *iovs;
1415
int iovcnt;
1516
int iovalloc;
1617
uint32_t size;
1718
uint32_t seek;
1819
};
1920

20-
struct bdev_ocf_data *vbdev_ocf_data_from_spdk_io(struct spdk_bdev_io *bdev_io);
21+
struct vbdev_ocf_data *vbdev_ocf_data_alloc(uint32_t nvecs);
2122

22-
struct bdev_ocf_data *vbdev_ocf_data_alloc(uint32_t nvecs);
23+
void vbdev_ocf_data_free(struct vbdev_ocf_data *data);
2324

24-
void vbdev_ocf_data_free(struct bdev_ocf_data *data);
25+
struct vbdev_ocf_data *vbdev_ocf_data_from_iov(struct iovec *iovs);
2526

26-
struct bdev_ocf_data *vbdev_ocf_data_from_iov(struct iovec *iovs);
27-
28-
void vbdev_ocf_iovs_add(struct bdev_ocf_data *data, void *base, size_t len);
27+
void vbdev_ocf_iovs_add(struct vbdev_ocf_data *data, void *base, size_t len);
2928

3029
#endif

module/bdev/ocf/utils.c

Lines changed: 1 addition & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
/* SPDX-License-Identifier: BSD-3-Clause
22
* Copyright (C) 2018 Intel Corporation.
3+
* Copyright (C) 2025 Huawei Technologies
34
* All rights reserved.
45
*/
56

67
#include "spdk/stdinc.h"
78
#include "spdk/log.h"
89

910
#include "utils.h"
10-
#include "vbdev_ocf.h"
1111

1212
static char *cache_modes[ocf_cache_mode_max] = {
1313
[ocf_cache_mode_wt] = "wt",
@@ -66,69 +66,3 @@ ocf_get_seqcutoff_policy(const char *policy_name)
6666

6767
return ocf_seq_cutoff_policy_max;
6868
}
69-
70-
int
71-
vbdev_ocf_mngt_start(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *path,
72-
vbdev_ocf_mngt_callback cb, void *cb_arg)
73-
{
74-
if (vbdev->mngt_ctx.current_step) {
75-
return -EBUSY;
76-
}
77-
78-
memset(&vbdev->mngt_ctx, 0, sizeof(vbdev->mngt_ctx));
79-
80-
vbdev->mngt_ctx.current_step = path;
81-
vbdev->mngt_ctx.cb = cb;
82-
vbdev->mngt_ctx.cb_arg = cb_arg;
83-
84-
(*vbdev->mngt_ctx.current_step)(vbdev);
85-
86-
return 0;
87-
}
88-
89-
void
90-
vbdev_ocf_mngt_stop(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *rollback_path, int status)
91-
{
92-
if (status) {
93-
vbdev->mngt_ctx.status = status;
94-
}
95-
96-
if (vbdev->mngt_ctx.status && rollback_path) {
97-
vbdev->mngt_ctx.poller_fn = NULL;
98-
vbdev->mngt_ctx.current_step = rollback_path;
99-
(*vbdev->mngt_ctx.current_step)(vbdev);
100-
return;
101-
}
102-
103-
if (vbdev->mngt_ctx.cb) {
104-
vbdev->mngt_ctx.cb(vbdev->mngt_ctx.status, vbdev, vbdev->mngt_ctx.cb_arg);
105-
}
106-
107-
memset(&vbdev->mngt_ctx, 0, sizeof(vbdev->mngt_ctx));
108-
}
109-
110-
void
111-
vbdev_ocf_mngt_continue(struct vbdev_ocf *vbdev, int status)
112-
{
113-
if (vbdev->mngt_ctx.current_step == NULL) {
114-
return;
115-
}
116-
117-
assert((*vbdev->mngt_ctx.current_step) != NULL);
118-
119-
vbdev->mngt_ctx.status = status;
120-
121-
vbdev->mngt_ctx.current_step++;
122-
if (*vbdev->mngt_ctx.current_step) {
123-
(*vbdev->mngt_ctx.current_step)(vbdev);
124-
return;
125-
}
126-
127-
vbdev_ocf_mngt_stop(vbdev, NULL, 0);
128-
}
129-
130-
int
131-
vbdev_ocf_mngt_get_status(struct vbdev_ocf *vbdev)
132-
{
133-
return vbdev->mngt_ctx.status;
134-
}

0 commit comments

Comments
 (0)