xref: /linux/drivers/md/dm-vdo/indexer/index-session.h (revision 4b660dbd9ee2059850fd30e0df420ca7a38a1856)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright 2023 Red Hat
4  */
5 
6 #ifndef UDS_INDEX_SESSION_H
7 #define UDS_INDEX_SESSION_H
8 
9 #include <linux/atomic.h>
10 #include <linux/cache.h>
11 
12 #include "thread-utils.h"
13 
14 #include "config.h"
15 #include "indexer.h"
16 
17 /*
18  * The index session mediates all interactions with a UDS index. Once the index session is created,
19  * it can be used to open, close, suspend, or recreate an index. It implements the majority of the
20  * functions in the top-level UDS API.
21  *
22  * If any deduplication request fails due to an internal error, the index is marked disabled. It
23  * will not accept any further requests and can only be closed. Closing the index will clear the
24  * disabled flag, and the index can then be reopened and recovered using the same index session.
25  */
26 
27 struct __aligned(L1_CACHE_BYTES) session_stats {
28 	/* Post requests that found an entry */
29 	u64 posts_found;
30 	/* Post requests found in the open chapter */
31 	u64 posts_found_open_chapter;
32 	/* Post requests found in the dense index */
33 	u64 posts_found_dense;
34 	/* Post requests found in the sparse index */
35 	u64 posts_found_sparse;
36 	/* Post requests that did not find an entry */
37 	u64 posts_not_found;
38 	/* Update requests that found an entry */
39 	u64 updates_found;
40 	/* Update requests that did not find an entry */
41 	u64 updates_not_found;
42 	/* Delete requests that found an entry */
43 	u64 deletions_found;
44 	/* Delete requests that did not find an entry */
45 	u64 deletions_not_found;
46 	/* Query requests that found an entry */
47 	u64 queries_found;
48 	/* Query requests that did not find an entry */
49 	u64 queries_not_found;
50 	/* Total number of requests */
51 	u64 requests;
52 };
53 
54 enum index_suspend_status {
55 	/* An index load has started but the index is not ready for use. */
56 	INDEX_OPENING = 0,
57 	/* The index is able to handle requests. */
58 	INDEX_READY,
59 	/* The index is attempting to suspend a rebuild. */
60 	INDEX_SUSPENDING,
61 	/* An index rebuild has been suspended. */
62 	INDEX_SUSPENDED,
63 	/* An index rebuild is being stopped in order to shut down. */
64 	INDEX_FREEING,
65 };
66 
67 struct index_load_context {
68 	struct mutex mutex;
69 	struct cond_var cond;
70 	enum index_suspend_status status;
71 };
72 
73 struct uds_index_session {
74 	unsigned int state;
75 	struct uds_index *index;
76 	struct uds_request_queue *callback_queue;
77 	struct uds_parameters parameters;
78 	struct index_load_context load_context;
79 	struct mutex request_mutex;
80 	struct cond_var request_cond;
81 	int request_count;
82 	struct session_stats stats;
83 };
84 
85 #endif /* UDS_INDEX_SESSION_H */
86