xref: /spdk/module/bdev/ocf/ctx.c (revision 3511bd0927b39cdab5f9554f081c06678a1a3fb9)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2018 Intel Corporation.
307fe6a43SSeth Howell  *   All rights reserved.
407fe6a43SSeth Howell  */
5a6dbe372Spaul luse 
607fe6a43SSeth Howell #include <ocf/ocf.h>
701452b1bSDuncan Bellamy #ifdef SPDK_HAVE_EXECINFO_H
807fe6a43SSeth Howell #include <execinfo.h>
901452b1bSDuncan Bellamy #endif
1007fe6a43SSeth Howell 
1107fe6a43SSeth Howell #include "spdk/env.h"
124e8e97c8STomasz Zawadzki #include "spdk/log.h"
1307fe6a43SSeth Howell 
1407fe6a43SSeth Howell #include "ctx.h"
1507fe6a43SSeth Howell #include "data.h"
1607fe6a43SSeth Howell 
1707fe6a43SSeth Howell ocf_ctx_t vbdev_ocf_ctx;
1807fe6a43SSeth Howell 
1907fe6a43SSeth Howell static ctx_data_t *
2007fe6a43SSeth Howell vbdev_ocf_ctx_data_alloc(uint32_t pages)
2107fe6a43SSeth Howell {
2207fe6a43SSeth Howell 	struct bdev_ocf_data *data;
2307fe6a43SSeth Howell 	void *buf;
2407fe6a43SSeth Howell 	uint32_t sz;
2507fe6a43SSeth Howell 
2607fe6a43SSeth Howell 	data = vbdev_ocf_data_alloc(1);
279c274912SAmir Haroush 	if (data == NULL) {
289c274912SAmir Haroush 		return NULL;
299c274912SAmir Haroush 	}
3007fe6a43SSeth Howell 
3107fe6a43SSeth Howell 	sz = pages * PAGE_SIZE;
3207fe6a43SSeth Howell 	buf = spdk_malloc(sz, PAGE_SIZE, NULL,
3307fe6a43SSeth Howell 			  SPDK_ENV_LCORE_ID_ANY, SPDK_MALLOC_DMA);
3407fe6a43SSeth Howell 	if (buf == NULL) {
359c274912SAmir Haroush 		vbdev_ocf_data_free(data);
3607fe6a43SSeth Howell 		return NULL;
3707fe6a43SSeth Howell 	}
3807fe6a43SSeth Howell 
3907fe6a43SSeth Howell 	vbdev_ocf_iovs_add(data, buf, sz);
4007fe6a43SSeth Howell 
4107fe6a43SSeth Howell 	data->size = sz;
4207fe6a43SSeth Howell 
4307fe6a43SSeth Howell 	return data;
4407fe6a43SSeth Howell }
4507fe6a43SSeth Howell 
4607fe6a43SSeth Howell static void
4707fe6a43SSeth Howell vbdev_ocf_ctx_data_free(ctx_data_t *ctx_data)
4807fe6a43SSeth Howell {
4907fe6a43SSeth Howell 	struct bdev_ocf_data *data = ctx_data;
5007fe6a43SSeth Howell 	int i;
5107fe6a43SSeth Howell 
5207fe6a43SSeth Howell 	if (!data) {
5307fe6a43SSeth Howell 		return;
5407fe6a43SSeth Howell 	}
5507fe6a43SSeth Howell 
5607fe6a43SSeth Howell 	for (i = 0; i < data->iovcnt; i++) {
5707fe6a43SSeth Howell 		spdk_free(data->iovs[i].iov_base);
5807fe6a43SSeth Howell 	}
5907fe6a43SSeth Howell 
6007fe6a43SSeth Howell 	vbdev_ocf_data_free(data);
6107fe6a43SSeth Howell }
6207fe6a43SSeth Howell 
6307fe6a43SSeth Howell static int
6407fe6a43SSeth Howell vbdev_ocf_ctx_data_mlock(ctx_data_t *ctx_data)
6507fe6a43SSeth Howell {
6607fe6a43SSeth Howell 	/* TODO [mlock]: add mlock option */
6707fe6a43SSeth Howell 	return 0;
6807fe6a43SSeth Howell }
6907fe6a43SSeth Howell 
7007fe6a43SSeth Howell static void
7107fe6a43SSeth Howell vbdev_ocf_ctx_data_munlock(ctx_data_t *ctx_data)
7207fe6a43SSeth Howell {
7307fe6a43SSeth Howell 	/* TODO [mlock]: add mlock option */
7407fe6a43SSeth Howell }
7507fe6a43SSeth Howell 
7607fe6a43SSeth Howell static size_t
7707fe6a43SSeth Howell iovec_flatten(struct iovec *iov, size_t iovcnt, void *buf, size_t size, size_t offset)
7807fe6a43SSeth Howell {
7907fe6a43SSeth Howell 	size_t i, len, done = 0;
8007fe6a43SSeth Howell 
8107fe6a43SSeth Howell 	for (i = 0; i < iovcnt; i++) {
8207fe6a43SSeth Howell 		if (offset >= iov[i].iov_len) {
8307fe6a43SSeth Howell 			offset -= iov[i].iov_len;
8407fe6a43SSeth Howell 			continue;
8507fe6a43SSeth Howell 		}
8607fe6a43SSeth Howell 
8707fe6a43SSeth Howell 		if (iov[i].iov_base == NULL) {
8807fe6a43SSeth Howell 			continue;
8907fe6a43SSeth Howell 		}
9007fe6a43SSeth Howell 
9107fe6a43SSeth Howell 		if (done >= size) {
9207fe6a43SSeth Howell 			break;
9307fe6a43SSeth Howell 		}
9407fe6a43SSeth Howell 
9507fe6a43SSeth Howell 		len = MIN(size - done, iov[i].iov_len - offset);
9607fe6a43SSeth Howell 		memcpy(buf, iov[i].iov_base + offset, len);
9707fe6a43SSeth Howell 		buf += len;
9807fe6a43SSeth Howell 		done += len;
9907fe6a43SSeth Howell 		offset = 0;
10007fe6a43SSeth Howell 	}
10107fe6a43SSeth Howell 
10207fe6a43SSeth Howell 	return done;
10307fe6a43SSeth Howell }
10407fe6a43SSeth Howell 
10507fe6a43SSeth Howell static uint32_t
10607fe6a43SSeth Howell vbdev_ocf_ctx_data_rd(void *dst, ctx_data_t *src, uint32_t size)
10707fe6a43SSeth Howell {
10807fe6a43SSeth Howell 	struct bdev_ocf_data *s = src;
10907fe6a43SSeth Howell 	uint32_t size_local;
11007fe6a43SSeth Howell 
11107fe6a43SSeth Howell 	size_local = iovec_flatten(s->iovs, s->iovcnt, dst, size, s->seek);
11207fe6a43SSeth Howell 	s->seek += size_local;
11307fe6a43SSeth Howell 
11407fe6a43SSeth Howell 	return size_local;
11507fe6a43SSeth Howell }
11607fe6a43SSeth Howell 
11707fe6a43SSeth Howell static size_t
11807fe6a43SSeth Howell buf_to_iovec(const void *buf, size_t size, struct iovec *iov, size_t iovcnt, size_t offset)
11907fe6a43SSeth Howell {
12007fe6a43SSeth Howell 	size_t i, len, done = 0;
12107fe6a43SSeth Howell 
12207fe6a43SSeth Howell 	for (i = 0; i < iovcnt; i++) {
12307fe6a43SSeth Howell 		if (offset >= iov[i].iov_len) {
12407fe6a43SSeth Howell 			offset -= iov[i].iov_len;
12507fe6a43SSeth Howell 			continue;
12607fe6a43SSeth Howell 		}
12707fe6a43SSeth Howell 
12807fe6a43SSeth Howell 		if (iov[i].iov_base == NULL) {
12907fe6a43SSeth Howell 			continue;
13007fe6a43SSeth Howell 		}
13107fe6a43SSeth Howell 
13207fe6a43SSeth Howell 		if (done >= size) {
13307fe6a43SSeth Howell 			break;
13407fe6a43SSeth Howell 		}
13507fe6a43SSeth Howell 
13607fe6a43SSeth Howell 		len = MIN(size - done, iov[i].iov_len - offset);
13707fe6a43SSeth Howell 		memcpy(iov[i].iov_base + offset, buf, len);
13807fe6a43SSeth Howell 		buf += len;
13907fe6a43SSeth Howell 		done += len;
14007fe6a43SSeth Howell 		offset = 0;
14107fe6a43SSeth Howell 	}
14207fe6a43SSeth Howell 
14307fe6a43SSeth Howell 	return done;
14407fe6a43SSeth Howell }
14507fe6a43SSeth Howell 
14607fe6a43SSeth Howell static uint32_t
14707fe6a43SSeth Howell vbdev_ocf_ctx_data_wr(ctx_data_t *dst, const void *src, uint32_t size)
14807fe6a43SSeth Howell {
14907fe6a43SSeth Howell 	struct bdev_ocf_data *d = dst;
15007fe6a43SSeth Howell 	uint32_t size_local;
15107fe6a43SSeth Howell 
15207fe6a43SSeth Howell 	size_local = buf_to_iovec(src, size, d->iovs, d->iovcnt, d->seek);
15307fe6a43SSeth Howell 	d->seek += size_local;
15407fe6a43SSeth Howell 
15507fe6a43SSeth Howell 	return size_local;
15607fe6a43SSeth Howell }
15707fe6a43SSeth Howell 
15807fe6a43SSeth Howell static size_t
15907fe6a43SSeth Howell iovset(struct iovec *iov, size_t iovcnt, int byte, size_t size, size_t offset)
16007fe6a43SSeth Howell {
16107fe6a43SSeth Howell 	size_t i, len, done = 0;
16207fe6a43SSeth Howell 
16307fe6a43SSeth Howell 	for (i = 0; i < iovcnt; i++) {
16407fe6a43SSeth Howell 		if (offset >= iov[i].iov_len) {
16507fe6a43SSeth Howell 			offset -= iov[i].iov_len;
16607fe6a43SSeth Howell 			continue;
16707fe6a43SSeth Howell 		}
16807fe6a43SSeth Howell 
16907fe6a43SSeth Howell 		if (iov[i].iov_base == NULL) {
17007fe6a43SSeth Howell 			continue;
17107fe6a43SSeth Howell 		}
17207fe6a43SSeth Howell 
17307fe6a43SSeth Howell 		if (done >= size) {
17407fe6a43SSeth Howell 			break;
17507fe6a43SSeth Howell 		}
17607fe6a43SSeth Howell 
17707fe6a43SSeth Howell 		len = MIN(size - done, iov[i].iov_len - offset);
17807fe6a43SSeth Howell 		memset(iov[i].iov_base + offset, byte, len);
17907fe6a43SSeth Howell 		done += len;
18007fe6a43SSeth Howell 		offset = 0;
18107fe6a43SSeth Howell 	}
18207fe6a43SSeth Howell 
18307fe6a43SSeth Howell 	return done;
18407fe6a43SSeth Howell }
18507fe6a43SSeth Howell 
18607fe6a43SSeth Howell static uint32_t
18707fe6a43SSeth Howell vbdev_ocf_ctx_data_zero(ctx_data_t *dst, uint32_t size)
18807fe6a43SSeth Howell {
18907fe6a43SSeth Howell 	struct bdev_ocf_data *d = dst;
19007fe6a43SSeth Howell 	uint32_t size_local;
19107fe6a43SSeth Howell 
19207fe6a43SSeth Howell 	size_local = iovset(d->iovs, d->iovcnt, 0, size, d->seek);
19307fe6a43SSeth Howell 	d->seek += size_local;
19407fe6a43SSeth Howell 
19507fe6a43SSeth Howell 	return size_local;
19607fe6a43SSeth Howell }
19707fe6a43SSeth Howell 
19807fe6a43SSeth Howell static uint32_t
19907fe6a43SSeth Howell vbdev_ocf_ctx_data_seek(ctx_data_t *dst, ctx_data_seek_t seek, uint32_t offset)
20007fe6a43SSeth Howell {
20107fe6a43SSeth Howell 	struct bdev_ocf_data *d = dst;
20207fe6a43SSeth Howell 	uint32_t off = 0;
20307fe6a43SSeth Howell 
20407fe6a43SSeth Howell 	switch (seek) {
20507fe6a43SSeth Howell 	case ctx_data_seek_begin:
20607fe6a43SSeth Howell 		off = MIN(offset, d->size);
20707fe6a43SSeth Howell 		d->seek = off;
20807fe6a43SSeth Howell 		break;
20907fe6a43SSeth Howell 	case ctx_data_seek_current:
21007fe6a43SSeth Howell 		off = MIN(offset, d->size - d->seek);
21107fe6a43SSeth Howell 		d->seek += off;
21207fe6a43SSeth Howell 		break;
21307fe6a43SSeth Howell 	}
21407fe6a43SSeth Howell 
21507fe6a43SSeth Howell 	return off;
21607fe6a43SSeth Howell }
21707fe6a43SSeth Howell 
21807fe6a43SSeth Howell static uint64_t
21907fe6a43SSeth Howell vbdev_ocf_ctx_data_cpy(ctx_data_t *dst, ctx_data_t *src, uint64_t to,
22007fe6a43SSeth Howell 		       uint64_t from, uint64_t bytes)
22107fe6a43SSeth Howell {
22207fe6a43SSeth Howell 	struct bdev_ocf_data *s = src;
22307fe6a43SSeth Howell 	struct bdev_ocf_data *d = dst;
22407fe6a43SSeth Howell 	uint32_t it_iov = 0;
22507fe6a43SSeth Howell 	uint32_t it_off = 0;
22607fe6a43SSeth Howell 	uint32_t n, sz;
22707fe6a43SSeth Howell 
22807fe6a43SSeth Howell 	bytes = MIN(bytes, s->size - from);
22907fe6a43SSeth Howell 	bytes = MIN(bytes, d->size - to);
23007fe6a43SSeth Howell 	sz = bytes;
23107fe6a43SSeth Howell 
23207fe6a43SSeth Howell 	while (from || bytes) {
23307fe6a43SSeth Howell 		if (s->iovs[it_iov].iov_len == it_off) {
23407fe6a43SSeth Howell 			it_iov++;
23507fe6a43SSeth Howell 			it_off = 0;
23607fe6a43SSeth Howell 			continue;
23707fe6a43SSeth Howell 		}
23807fe6a43SSeth Howell 
23907fe6a43SSeth Howell 		if (from) {
24007fe6a43SSeth Howell 			n = MIN(from, s->iovs[it_iov].iov_len);
24107fe6a43SSeth Howell 			from -= n;
24207fe6a43SSeth Howell 		} else {
24307fe6a43SSeth Howell 			n = MIN(bytes, s->iovs[it_iov].iov_len);
24407fe6a43SSeth Howell 			buf_to_iovec(s->iovs[it_iov].iov_base + it_off, n, d->iovs, d->iovcnt, to);
24507fe6a43SSeth Howell 			bytes -= n;
24607fe6a43SSeth Howell 			to += n;
24707fe6a43SSeth Howell 		}
24807fe6a43SSeth Howell 
24907fe6a43SSeth Howell 		it_off += n;
25007fe6a43SSeth Howell 	}
25107fe6a43SSeth Howell 
25207fe6a43SSeth Howell 	return sz;
25307fe6a43SSeth Howell }
25407fe6a43SSeth Howell 
25507fe6a43SSeth Howell static void
25607fe6a43SSeth Howell vbdev_ocf_ctx_data_secure_erase(ctx_data_t *ctx_data)
25707fe6a43SSeth Howell {
25807fe6a43SSeth Howell 	struct bdev_ocf_data *data = ctx_data;
25907fe6a43SSeth Howell 	struct iovec *iovs = data->iovs;
26007fe6a43SSeth Howell 	int i;
26107fe6a43SSeth Howell 
26207fe6a43SSeth Howell 	for (i = 0; i < data->iovcnt; i++) {
26307fe6a43SSeth Howell 		if (env_memset(iovs[i].iov_base, iovs[i].iov_len, 0)) {
26407fe6a43SSeth Howell 			assert(false);
26507fe6a43SSeth Howell 		}
26607fe6a43SSeth Howell 	}
26707fe6a43SSeth Howell }
26807fe6a43SSeth Howell 
2698dd1cd21SBen Walker int
2708dd1cd21SBen Walker vbdev_ocf_queue_create(ocf_cache_t cache, ocf_queue_t *queue, const struct ocf_queue_ops *ops)
27107fe6a43SSeth Howell {
27207fe6a43SSeth Howell 
273*3511bd09SRafal Stefanowski 	return ocf_queue_create(cache, queue, ops);
274*3511bd09SRafal Stefanowski }
275*3511bd09SRafal Stefanowski 
276*3511bd09SRafal Stefanowski int
277*3511bd09SRafal Stefanowski vbdev_ocf_queue_create_mngt(ocf_cache_t cache, ocf_queue_t *queue, const struct ocf_queue_ops *ops)
278*3511bd09SRafal Stefanowski {
279*3511bd09SRafal Stefanowski 	return ocf_queue_create_mngt(cache, queue, ops);
28007fe6a43SSeth Howell }
28107fe6a43SSeth Howell 
2828dd1cd21SBen Walker void
2838dd1cd21SBen Walker vbdev_ocf_queue_put(ocf_queue_t queue)
28407fe6a43SSeth Howell {
28507fe6a43SSeth Howell 	ocf_queue_put(queue);
28607fe6a43SSeth Howell }
28707fe6a43SSeth Howell 
2888dd1cd21SBen Walker void
2898dd1cd21SBen Walker vbdev_ocf_cache_ctx_put(struct vbdev_ocf_cache_ctx *ctx)
29007fe6a43SSeth Howell {
29107fe6a43SSeth Howell 	if (env_atomic_dec_return(&ctx->refcnt) == 0) {
29207fe6a43SSeth Howell 		free(ctx);
29307fe6a43SSeth Howell 	}
29407fe6a43SSeth Howell }
29507fe6a43SSeth Howell 
2968dd1cd21SBen Walker void
2978dd1cd21SBen Walker vbdev_ocf_cache_ctx_get(struct vbdev_ocf_cache_ctx *ctx)
29807fe6a43SSeth Howell {
29907fe6a43SSeth Howell 	env_atomic_inc(&ctx->refcnt);
30007fe6a43SSeth Howell }
30107fe6a43SSeth Howell 
30207fe6a43SSeth Howell struct cleaner_priv {
30307fe6a43SSeth Howell 	struct spdk_poller *poller;
3049579995cSAmir Haroush 	ocf_queue_t         mngt_queue;
30507fe6a43SSeth Howell 	uint64_t            next_run;
30607fe6a43SSeth Howell };
30707fe6a43SSeth Howell 
30807fe6a43SSeth Howell static int
30907fe6a43SSeth Howell cleaner_poll(void *arg)
31007fe6a43SSeth Howell {
31107fe6a43SSeth Howell 	ocf_cleaner_t cleaner = arg;
31207fe6a43SSeth Howell 	struct cleaner_priv *priv = ocf_cleaner_get_priv(cleaner);
31307fe6a43SSeth Howell 
31407fe6a43SSeth Howell 	if (spdk_get_ticks() >= priv->next_run) {
3159579995cSAmir Haroush 		ocf_cleaner_run(cleaner, priv->mngt_queue);
316eb05cbd6SMaciej Szwed 		return SPDK_POLLER_BUSY;
31707fe6a43SSeth Howell 	}
31807fe6a43SSeth Howell 
319eb05cbd6SMaciej Szwed 	return SPDK_POLLER_IDLE;
32007fe6a43SSeth Howell }
32107fe6a43SSeth Howell 
32207fe6a43SSeth Howell static void
32307fe6a43SSeth Howell cleaner_cmpl(ocf_cleaner_t c, uint32_t interval)
32407fe6a43SSeth Howell {
32507fe6a43SSeth Howell 	struct cleaner_priv *priv = ocf_cleaner_get_priv(c);
32607fe6a43SSeth Howell 
32707fe6a43SSeth Howell 	priv->next_run = spdk_get_ticks() + ((interval * spdk_get_ticks_hz()) / 1000);
32807fe6a43SSeth Howell }
32907fe6a43SSeth Howell 
33007fe6a43SSeth Howell static int
33107fe6a43SSeth Howell vbdev_ocf_ctx_cleaner_init(ocf_cleaner_t c)
33207fe6a43SSeth Howell {
33307fe6a43SSeth Howell 	struct cleaner_priv        *priv  = calloc(1, sizeof(*priv));
33407fe6a43SSeth Howell 	ocf_cache_t                 cache = ocf_cleaner_get_cache(c);
33507fe6a43SSeth Howell 	struct vbdev_ocf_cache_ctx *cctx  = ocf_cache_get_priv(cache);
33607fe6a43SSeth Howell 
33707fe6a43SSeth Howell 	if (priv == NULL) {
33807fe6a43SSeth Howell 		return -ENOMEM;
33907fe6a43SSeth Howell 	}
34007fe6a43SSeth Howell 
3419579995cSAmir Haroush 	priv->mngt_queue = cctx->mngt_queue;
34207fe6a43SSeth Howell 
34307fe6a43SSeth Howell 	ocf_cleaner_set_cmpl(c, cleaner_cmpl);
34407fe6a43SSeth Howell 	ocf_cleaner_set_priv(c, priv);
34507fe6a43SSeth Howell 
34607fe6a43SSeth Howell 	return 0;
34707fe6a43SSeth Howell }
34807fe6a43SSeth Howell 
34907fe6a43SSeth Howell static void
35007fe6a43SSeth Howell vbdev_ocf_ctx_cleaner_stop(ocf_cleaner_t c)
35107fe6a43SSeth Howell {
35207fe6a43SSeth Howell 	struct cleaner_priv *priv = ocf_cleaner_get_priv(c);
35307fe6a43SSeth Howell 
3549579995cSAmir Haroush 	if (priv) {
3559579995cSAmir Haroush 		spdk_poller_unregister(&priv->poller);
3569579995cSAmir Haroush 		free(priv);
3579579995cSAmir Haroush 	}
35807fe6a43SSeth Howell }
35907fe6a43SSeth Howell 
36007fe6a43SSeth Howell static void
36107fe6a43SSeth Howell vbdev_ocf_ctx_cleaner_kick(ocf_cleaner_t cleaner)
36207fe6a43SSeth Howell {
36307fe6a43SSeth Howell 	struct cleaner_priv *priv  = ocf_cleaner_get_priv(cleaner);
36407fe6a43SSeth Howell 
36507fe6a43SSeth Howell 	if (priv->poller) {
36607fe6a43SSeth Howell 		return;
36707fe6a43SSeth Howell 	}
36807fe6a43SSeth Howell 
36907fe6a43SSeth Howell 	/* We start cleaner poller at the same thread where cache was created
37007fe6a43SSeth Howell 	 * TODO: allow user to specify core at which cleaner should run */
371ab0bc5c2SShuhei Matsumoto 	priv->poller = SPDK_POLLER_REGISTER(cleaner_poll, cleaner, 0);
37207fe6a43SSeth Howell }
37307fe6a43SSeth Howell 
37407fe6a43SSeth Howell /* This function is main way by which OCF communicates with user
37507fe6a43SSeth Howell  * We don't want to use SPDK_LOG here because debugging information that is
37607fe6a43SSeth Howell  * associated with every print message is not helpful in callback that only prints info
37707fe6a43SSeth Howell  * while the real source is somewhere in OCF code */
37807fe6a43SSeth Howell static int
37907fe6a43SSeth Howell vbdev_ocf_ctx_log_printf(ocf_logger_t logger, ocf_logger_lvl_t lvl,
38007fe6a43SSeth Howell 			 const char *fmt, va_list args)
38107fe6a43SSeth Howell {
382257734a1SVitaliy Mysak 	int spdk_lvl;
38307fe6a43SSeth Howell 
384257734a1SVitaliy Mysak 	switch (lvl) {
385257734a1SVitaliy Mysak 	case log_emerg:
386257734a1SVitaliy Mysak 	case log_alert:
387257734a1SVitaliy Mysak 	case log_crit:
388257734a1SVitaliy Mysak 	case log_err:
389257734a1SVitaliy Mysak 		spdk_lvl = SPDK_LOG_ERROR;
390257734a1SVitaliy Mysak 		break;
391257734a1SVitaliy Mysak 
392257734a1SVitaliy Mysak 	case log_warn:
393257734a1SVitaliy Mysak 		spdk_lvl = SPDK_LOG_WARN;
394257734a1SVitaliy Mysak 		break;
395257734a1SVitaliy Mysak 
396257734a1SVitaliy Mysak 	case log_notice:
397257734a1SVitaliy Mysak 		spdk_lvl = SPDK_LOG_NOTICE;
398257734a1SVitaliy Mysak 		break;
399257734a1SVitaliy Mysak 
400257734a1SVitaliy Mysak 	case log_info:
401257734a1SVitaliy Mysak 	case log_debug:
402f7a4356bSyidong0635 	default:
403257734a1SVitaliy Mysak 		spdk_lvl = SPDK_LOG_INFO;
404257734a1SVitaliy Mysak 	}
405257734a1SVitaliy Mysak 
406257734a1SVitaliy Mysak 	spdk_vlog(spdk_lvl, NULL, -1, NULL, fmt, args);
40707fe6a43SSeth Howell 	return 0;
40807fe6a43SSeth Howell }
40907fe6a43SSeth Howell 
41007fe6a43SSeth Howell static const struct ocf_ctx_config vbdev_ocf_ctx_cfg = {
41107fe6a43SSeth Howell 	.name = "OCF SPDK",
41207fe6a43SSeth Howell 
41307fe6a43SSeth Howell 	.ops = {
41407fe6a43SSeth Howell 		.data = {
41507fe6a43SSeth Howell 			.alloc = vbdev_ocf_ctx_data_alloc,
41607fe6a43SSeth Howell 			.free = vbdev_ocf_ctx_data_free,
41707fe6a43SSeth Howell 			.mlock = vbdev_ocf_ctx_data_mlock,
41807fe6a43SSeth Howell 			.munlock = vbdev_ocf_ctx_data_munlock,
41907fe6a43SSeth Howell 			.read = vbdev_ocf_ctx_data_rd,
42007fe6a43SSeth Howell 			.write = vbdev_ocf_ctx_data_wr,
42107fe6a43SSeth Howell 			.zero = vbdev_ocf_ctx_data_zero,
42207fe6a43SSeth Howell 			.seek = vbdev_ocf_ctx_data_seek,
42307fe6a43SSeth Howell 			.copy = vbdev_ocf_ctx_data_cpy,
42407fe6a43SSeth Howell 			.secure_erase = vbdev_ocf_ctx_data_secure_erase,
42507fe6a43SSeth Howell 		},
42607fe6a43SSeth Howell 
42707fe6a43SSeth Howell 		.cleaner = {
42807fe6a43SSeth Howell 			.init = vbdev_ocf_ctx_cleaner_init,
42907fe6a43SSeth Howell 			.stop = vbdev_ocf_ctx_cleaner_stop,
43007fe6a43SSeth Howell 			.kick = vbdev_ocf_ctx_cleaner_kick,
43107fe6a43SSeth Howell 		},
43207fe6a43SSeth Howell 
43307fe6a43SSeth Howell 		.logger = {
43407fe6a43SSeth Howell 			.print = vbdev_ocf_ctx_log_printf,
43507fe6a43SSeth Howell 			.dump_stack = NULL,
43607fe6a43SSeth Howell 		},
43707fe6a43SSeth Howell 
43807fe6a43SSeth Howell 	},
43907fe6a43SSeth Howell };
44007fe6a43SSeth Howell 
44107fe6a43SSeth Howell int
44207fe6a43SSeth Howell vbdev_ocf_ctx_init(void)
44307fe6a43SSeth Howell {
44407fe6a43SSeth Howell 	int ret;
44507fe6a43SSeth Howell 
44620894340SMarcin Dziegielewski 	ret = ocf_ctx_create(&vbdev_ocf_ctx, &vbdev_ocf_ctx_cfg);
44707fe6a43SSeth Howell 	if (ret < 0) {
44807fe6a43SSeth Howell 		return ret;
44907fe6a43SSeth Howell 	}
45007fe6a43SSeth Howell 
45107fe6a43SSeth Howell 	return 0;
45207fe6a43SSeth Howell }
45307fe6a43SSeth Howell 
45407fe6a43SSeth Howell void
45507fe6a43SSeth Howell vbdev_ocf_ctx_cleanup(void)
45607fe6a43SSeth Howell {
45720894340SMarcin Dziegielewski 	ocf_ctx_put(vbdev_ocf_ctx);
45807fe6a43SSeth Howell 	vbdev_ocf_ctx = NULL;
45907fe6a43SSeth Howell }
460