]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/ocf/src/concurrency/ocf_metadata_concurrency.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / spdk / ocf / src / concurrency / ocf_metadata_concurrency.h
CommitLineData
f67539c2
TL
1/*
2 * Copyright(c) 2019-2019 Intel Corporation
3 * SPDX-License-Identifier: BSD-3-Clause-Clear
4 */
5#include "../ocf_cache_priv.h"
6
7#ifndef __OCF_METADATA_CONCURRENCY_H__
8#define __OCF_METADATA_CONCURRENCY_H__
9
10#define OCF_METADATA_RD 0
11#define OCF_METADATA_WR 1
12
13int ocf_metadata_concurrency_init(struct ocf_metadata_lock *metadata_lock);
14
15void ocf_metadata_concurrency_deinit(struct ocf_metadata_lock *metadata_lock);
16
17int ocf_metadata_concurrency_attached_init(
18 struct ocf_metadata_lock *metadata_lock, ocf_cache_t cache,
19 uint32_t hash_table_entries, uint32_t colision_table_pages);
20
21void ocf_metadata_concurrency_attached_deinit(
22 struct ocf_metadata_lock *metadata_lock);
23
24static inline void ocf_metadata_eviction_lock(
25 struct ocf_metadata_lock *metadata_lock)
26{
27 env_spinlock_lock(&metadata_lock->eviction);
28}
29
30static inline void ocf_metadata_eviction_unlock(
31 struct ocf_metadata_lock *metadata_lock)
32{
33 env_spinlock_unlock(&metadata_lock->eviction);
34}
35
36static inline void ocf_metadata_partition_lock(
37 struct ocf_metadata_lock *metadata_lock,
38 ocf_part_id_t part_id)
39{
40 env_spinlock_lock(&metadata_lock->partition[part_id]);
41}
42
43static inline void ocf_metadata_partition_unlock(
44 struct ocf_metadata_lock *metadata_lock,
45 ocf_part_id_t part_id)
46{
47 env_spinlock_unlock(&metadata_lock->partition[part_id]);
48}
49
50#define OCF_METADATA_EVICTION_LOCK() \
51 ocf_metadata_eviction_lock(&cache->metadata.lock)
52
53#define OCF_METADATA_EVICTION_UNLOCK() \
54 ocf_metadata_eviction_unlock(&cache->metadata.lock)
55
56void ocf_metadata_start_exclusive_access(
57 struct ocf_metadata_lock *metadata_lock);
58
59int ocf_metadata_try_start_exclusive_access(
60 struct ocf_metadata_lock *metadata_lock);
61
62void ocf_metadata_end_exclusive_access(
63 struct ocf_metadata_lock *metadata_lock);
64
65int ocf_metadata_try_start_shared_access(
66 struct ocf_metadata_lock *metadata_lock);
67
68void ocf_metadata_start_shared_access(
69 struct ocf_metadata_lock *metadata_lock);
70
71void ocf_metadata_end_shared_access(
72 struct ocf_metadata_lock *metadata_lock);
73
74static inline void ocf_metadata_status_bits_lock(
75 struct ocf_metadata_lock *metadata_lock, int rw)
76{
77 if (rw == OCF_METADATA_WR)
78 env_rwlock_write_lock(&metadata_lock->status);
79 else if (rw == OCF_METADATA_RD)
80 env_rwlock_read_lock(&metadata_lock->status);
81 else
82 ENV_BUG();
83}
84
85static inline void ocf_metadata_status_bits_unlock(
86 struct ocf_metadata_lock *metadata_lock, int rw)
87{
88 if (rw == OCF_METADATA_WR)
89 env_rwlock_write_unlock(&metadata_lock->status);
90 else if (rw == OCF_METADATA_RD)
91 env_rwlock_read_unlock(&metadata_lock->status);
92 else
93 ENV_BUG();
94}
95
96#define OCF_METADATA_BITS_LOCK_RD() \
97 ocf_metadata_status_bits_lock(&cache->metadata.lock, \
98 OCF_METADATA_RD)
99
100#define OCF_METADATA_BITS_UNLOCK_RD() \
101 ocf_metadata_status_bits_unlock(&cache->metadata.lock, \
102 OCF_METADATA_RD)
103
104#define OCF_METADATA_BITS_LOCK_WR() \
105 ocf_metadata_status_bits_lock(&cache->metadata.lock, \
106 OCF_METADATA_WR)
107
108#define OCF_METADATA_BITS_UNLOCK_WR() \
109 ocf_metadata_status_bits_unlock(&cache->metadata.lock, \
110 OCF_METADATA_WR)
111
112void ocf_metadata_hash_lock_rd(struct ocf_metadata_lock *metadata_lock,
113 uint32_t core_id, uint64_t core_line);
114void ocf_metadata_hash_unlock_rd(struct ocf_metadata_lock *metadata_lock,
115 uint32_t core_id, uint64_t core_line);
116void ocf_metadata_hash_lock_wr(struct ocf_metadata_lock *metadata_lock,
117 uint32_t core_id, uint64_t core_line);
118void ocf_metadata_hash_unlock_wr(struct ocf_metadata_lock *metadata_lock,
119 uint32_t core_id, uint64_t core_line);
120
121/* lock entire request in deadlock-free manner */
122void ocf_req_hash_lock_rd(struct ocf_request *req);
123void ocf_req_hash_unlock_rd(struct ocf_request *req);
124void ocf_req_hash_lock_wr(struct ocf_request *req);
125void ocf_req_hash_unlock_wr(struct ocf_request *req);
126void ocf_req_hash_lock_upgrade(struct ocf_request *req);
127
128/* collision table page lock interface */
129void ocf_collision_start_shared_access(struct ocf_metadata_lock *metadata_lock,
130 uint32_t page);
131void ocf_collision_end_shared_access(struct ocf_metadata_lock *metadata_lock,
132 uint32_t page);
133void ocf_collision_start_exclusive_access(struct ocf_metadata_lock *metadata_lock,
134 uint32_t page);
135void ocf_collision_end_exclusive_access(struct ocf_metadata_lock *metadata_lock,
136 uint32_t page);
137#endif