1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39#ifndef __LST_CONSOLE_H__
40#define __LST_CONSOLE_H__
41
42#include "../../include/linux/libcfs/libcfs.h"
43#include "../../include/linux/lnet/lnet.h"
44#include "../../include/linux/lnet/lib-types.h"
45#include "../../include/linux/lnet/lnetst.h"
46#include "selftest.h"
47#include "conrpc.h"
48
49
50struct lstcon_node {
51 lnet_process_id_t nd_id;
52 int nd_ref;
53 int nd_state;
54 int nd_timeout;
55 unsigned long nd_stamp;
56 struct lstcon_rpc nd_ping;
57};
58
59
60struct lstcon_ndlink {
61 struct list_head ndl_link;
62 struct list_head ndl_hlink;
63 struct lstcon_node *ndl_node;
64};
65
66
67struct lstcon_group {
68 struct list_head grp_link;
69
70 int grp_ref;
71 int grp_userland;
72 int grp_nnode;
73 char grp_name[LST_NAME_SIZE];
74
75 struct list_head grp_trans_list;
76 struct list_head grp_ndl_list;
77 struct list_head grp_ndl_hash[0];
78};
79
80#define LST_BATCH_IDLE 0xB0
81#define LST_BATCH_RUNNING 0xB1
82
83struct lstcon_tsb_hdr {
84 lst_bid_t tsb_id;
85 int tsb_index;
86};
87
88
89struct lstcon_batch {
90 struct lstcon_tsb_hdr bat_hdr;
91 struct list_head bat_link;
92 int bat_ntest;
93 int bat_state;
94 int bat_arg;
95
96 char bat_name[LST_NAME_SIZE];
97
98 struct list_head bat_test_list;
99
100 struct list_head bat_trans_list;
101 struct list_head bat_cli_list;
102
103 struct list_head *bat_cli_hash;
104 struct list_head bat_srv_list;
105 struct list_head *bat_srv_hash;
106};
107
108
109struct lstcon_test {
110 struct lstcon_tsb_hdr tes_hdr;
111 struct list_head tes_link;
112 struct lstcon_batch *tes_batch;
113
114 int tes_type;
115 int tes_stop_onerr;
116 int tes_oneside;
117 int tes_concur;
118 int tes_loop;
119 int tes_dist;
120 int tes_span;
121 int tes_cliidx;
122
123 struct list_head tes_trans_list;
124 struct lstcon_group *tes_src_grp;
125 struct lstcon_group *tes_dst_grp;
126
127 int tes_paramlen;
128 char tes_param[0];
129};
130
131#define LST_GLOBAL_HASHSIZE 503
132#define LST_NODE_HASHSIZE 239
133
134#define LST_SESSION_NONE 0x0
135#define LST_SESSION_ACTIVE 0x1
136
137#define LST_CONSOLE_TIMEOUT 300
138
139struct lstcon_session {
140 struct mutex ses_mutex;
141 lst_sid_t ses_id;
142 int ses_key;
143 int ses_state;
144 int ses_timeout;
145 time64_t ses_laststamp;
146
147 unsigned ses_features;
148
149 unsigned ses_feats_updated:1;
150
151 unsigned ses_force:1;
152 unsigned ses_shutdown:1;
153 unsigned ses_expired:1;
154 __u64 ses_id_cookie;
155 char ses_name[LST_NAME_SIZE];
156 struct lstcon_rpc_trans *ses_ping;
157 struct stt_timer ses_ping_timer;
158 lstcon_trans_stat_t ses_trans_stat;
159
160 struct list_head ses_trans_list;
161 struct list_head ses_grp_list;
162 struct list_head ses_bat_list;
163 struct list_head ses_ndl_list;
164 struct list_head *ses_ndl_hash;
165
166 spinlock_t ses_rpc_lock;
167 atomic_t ses_rpc_counter;
168 struct list_head ses_rpc_freelist;
169};
170
171extern struct lstcon_session console_session;
172
173static inline lstcon_trans_stat_t *
174lstcon_trans_stat(void)
175{
176 return &console_session.ses_trans_stat;
177}
178
179static inline struct list_head *
180lstcon_id2hash(lnet_process_id_t id, struct list_head *hash)
181{
182 unsigned int idx = LNET_NIDADDR(id.nid) % LST_NODE_HASHSIZE;
183
184 return &hash[idx];
185}
186
187int lstcon_ioctl_entry(unsigned int cmd, struct libcfs_ioctl_hdr *hdr);
188int lstcon_console_init(void);
189int lstcon_console_fini(void);
190int lstcon_session_match(lst_sid_t sid);
191int lstcon_session_new(char *name, int key, unsigned version,
192 int timeout, int flags, lst_sid_t __user *sid_up);
193int lstcon_session_info(lst_sid_t __user *sid_up, int __user *key,
194 unsigned __user *verp, lstcon_ndlist_ent_t __user *entp,
195 char __user *name_up, int len);
196int lstcon_session_end(void);
197int lstcon_session_debug(int timeout, struct list_head __user *result_up);
198int lstcon_session_feats_check(unsigned feats);
199int lstcon_batch_debug(int timeout, char *name,
200 int client, struct list_head __user *result_up);
201int lstcon_group_debug(int timeout, char *name,
202 struct list_head __user *result_up);
203int lstcon_nodes_debug(int timeout, int nnd, lnet_process_id_t __user *nds_up,
204 struct list_head __user *result_up);
205int lstcon_group_add(char *name);
206int lstcon_group_del(char *name);
207int lstcon_group_clean(char *name, int args);
208int lstcon_group_refresh(char *name, struct list_head __user *result_up);
209int lstcon_nodes_add(char *name, int nnd, lnet_process_id_t __user *nds_up,
210 unsigned *featp, struct list_head __user *result_up);
211int lstcon_nodes_remove(char *name, int nnd, lnet_process_id_t __user *nds_up,
212 struct list_head __user *result_up);
213int lstcon_group_info(char *name, lstcon_ndlist_ent_t __user *gent_up,
214 int *index_p, int *ndent_p,
215 lstcon_node_ent_t __user *ndents_up);
216int lstcon_group_list(int idx, int len, char __user *name_up);
217int lstcon_batch_add(char *name);
218int lstcon_batch_run(char *name, int timeout,
219 struct list_head __user *result_up);
220int lstcon_batch_stop(char *name, int force,
221 struct list_head __user *result_up);
222int lstcon_test_batch_query(char *name, int testidx,
223 int client, int timeout,
224 struct list_head __user *result_up);
225int lstcon_batch_del(char *name);
226int lstcon_batch_list(int idx, int namelen, char __user *name_up);
227int lstcon_batch_info(char *name, lstcon_test_batch_ent_t __user *ent_up,
228 int server, int testidx, int *index_p,
229 int *ndent_p, lstcon_node_ent_t __user *dents_up);
230int lstcon_group_stat(char *grp_name, int timeout,
231 struct list_head __user *result_up);
232int lstcon_nodes_stat(int count, lnet_process_id_t __user *ids_up,
233 int timeout, struct list_head __user *result_up);
234int lstcon_test_add(char *batch_name, int type, int loop,
235 int concur, int dist, int span,
236 char *src_name, char *dst_name,
237 void *param, int paramlen, int *retp,
238 struct list_head __user *result_up);
239#endif
240