]>
git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/ocf/src/concurrency/ocf_metadata_concurrency.h
2 * Copyright(c) 2019-2019 Intel Corporation
3 * SPDX-License-Identifier: BSD-3-Clause-Clear
5 #include "../ocf_cache_priv.h"
7 #ifndef __OCF_METADATA_CONCURRENCY_H__
8 #define __OCF_METADATA_CONCURRENCY_H__
10 #define OCF_METADATA_RD 0
11 #define OCF_METADATA_WR 1
13 int ocf_metadata_concurrency_init(struct ocf_metadata_lock
*metadata_lock
);
15 void ocf_metadata_concurrency_deinit(struct ocf_metadata_lock
*metadata_lock
);
17 int 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
);
21 void ocf_metadata_concurrency_attached_deinit(
22 struct ocf_metadata_lock
*metadata_lock
);
24 static inline void ocf_metadata_eviction_lock(
25 struct ocf_metadata_lock
*metadata_lock
)
27 env_spinlock_lock(&metadata_lock
->eviction
);
30 static inline void ocf_metadata_eviction_unlock(
31 struct ocf_metadata_lock
*metadata_lock
)
33 env_spinlock_unlock(&metadata_lock
->eviction
);
36 static inline void ocf_metadata_partition_lock(
37 struct ocf_metadata_lock
*metadata_lock
,
38 ocf_part_id_t part_id
)
40 env_spinlock_lock(&metadata_lock
->partition
[part_id
]);
43 static inline void ocf_metadata_partition_unlock(
44 struct ocf_metadata_lock
*metadata_lock
,
45 ocf_part_id_t part_id
)
47 env_spinlock_unlock(&metadata_lock
->partition
[part_id
]);
50 #define OCF_METADATA_EVICTION_LOCK() \
51 ocf_metadata_eviction_lock(&cache->metadata.lock)
53 #define OCF_METADATA_EVICTION_UNLOCK() \
54 ocf_metadata_eviction_unlock(&cache->metadata.lock)
56 void ocf_metadata_start_exclusive_access(
57 struct ocf_metadata_lock
*metadata_lock
);
59 int ocf_metadata_try_start_exclusive_access(
60 struct ocf_metadata_lock
*metadata_lock
);
62 void ocf_metadata_end_exclusive_access(
63 struct ocf_metadata_lock
*metadata_lock
);
65 int ocf_metadata_try_start_shared_access(
66 struct ocf_metadata_lock
*metadata_lock
);
68 void ocf_metadata_start_shared_access(
69 struct ocf_metadata_lock
*metadata_lock
);
71 void ocf_metadata_end_shared_access(
72 struct ocf_metadata_lock
*metadata_lock
);
74 static inline void ocf_metadata_status_bits_lock(
75 struct ocf_metadata_lock
*metadata_lock
, int rw
)
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
);
85 static inline void ocf_metadata_status_bits_unlock(
86 struct ocf_metadata_lock
*metadata_lock
, int rw
)
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
);
96 #define OCF_METADATA_BITS_LOCK_RD() \
97 ocf_metadata_status_bits_lock(&cache->metadata.lock, \
100 #define OCF_METADATA_BITS_UNLOCK_RD() \
101 ocf_metadata_status_bits_unlock(&cache->metadata.lock, \
104 #define OCF_METADATA_BITS_LOCK_WR() \
105 ocf_metadata_status_bits_lock(&cache->metadata.lock, \
108 #define OCF_METADATA_BITS_UNLOCK_WR() \
109 ocf_metadata_status_bits_unlock(&cache->metadata.lock, \
112 void ocf_metadata_hash_lock_rd(struct ocf_metadata_lock
*metadata_lock
,
113 uint32_t core_id
, uint64_t core_line
);
114 void ocf_metadata_hash_unlock_rd(struct ocf_metadata_lock
*metadata_lock
,
115 uint32_t core_id
, uint64_t core_line
);
116 void ocf_metadata_hash_lock_wr(struct ocf_metadata_lock
*metadata_lock
,
117 uint32_t core_id
, uint64_t core_line
);
118 void ocf_metadata_hash_unlock_wr(struct ocf_metadata_lock
*metadata_lock
,
119 uint32_t core_id
, uint64_t core_line
);
121 /* lock entire request in deadlock-free manner */
122 void ocf_req_hash_lock_rd(struct ocf_request
*req
);
123 void ocf_req_hash_unlock_rd(struct ocf_request
*req
);
124 void ocf_req_hash_lock_wr(struct ocf_request
*req
);
125 void ocf_req_hash_unlock_wr(struct ocf_request
*req
);
126 void ocf_req_hash_lock_upgrade(struct ocf_request
*req
);
128 /* collision table page lock interface */
129 void ocf_collision_start_shared_access(struct ocf_metadata_lock
*metadata_lock
,
131 void ocf_collision_end_shared_access(struct ocf_metadata_lock
*metadata_lock
,
133 void ocf_collision_start_exclusive_access(struct ocf_metadata_lock
*metadata_lock
,
135 void ocf_collision_end_exclusive_access(struct ocf_metadata_lock
*metadata_lock
,