4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21 * CA 95054 USA or visit www.sun.com if you need additional information or
27 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28 * Use is subject to license terms.
30 * Copyright (c) 2011, 2012, Intel Corporation.
33 * This file is part of Lustre, http://www.lustre.org/
34 * Lustre is a trademark of Sun Microsystems, Inc.
36 * lnet/selftest/console.h
38 * kernel structure for LST console
40 * Author: Liang Zhen <liangzhen@clusterfs.com>
43 #ifndef __LST_CONSOLE_H__
44 #define __LST_CONSOLE_H__
46 #include "../../include/linux/libcfs/libcfs.h"
47 #include "../../include/linux/lnet/lnet.h"
48 #include "../../include/linux/lnet/lib-types.h"
49 #include "../../include/linux/lnet/lnetst.h"
53 typedef struct lstcon_node
{
54 lnet_process_id_t nd_id
; /* id of the node */
55 int nd_ref
; /* reference count */
56 int nd_state
; /* state of the node */
57 int nd_timeout
; /* session timeout */
58 unsigned long nd_stamp
; /* timestamp of last replied RPC */
59 struct lstcon_rpc nd_ping
; /* ping rpc */
60 } lstcon_node_t
; /* node descriptor */
63 struct list_head ndl_link
; /* chain on list */
64 struct list_head ndl_hlink
; /* chain on hash */
65 lstcon_node_t
*ndl_node
; /* pointer to node */
66 } lstcon_ndlink_t
; /* node link descriptor */
69 struct list_head grp_link
; /* chain on global group list
71 int grp_ref
; /* reference count */
72 int grp_userland
; /* has userland nodes */
73 int grp_nnode
; /* # of nodes */
74 char grp_name
[LST_NAME_SIZE
]; /* group name */
76 struct list_head grp_trans_list
; /* transaction list */
77 struct list_head grp_ndl_list
; /* nodes list */
78 struct list_head grp_ndl_hash
[0]; /* hash table for nodes */
79 } lstcon_group_t
; /* (alias of nodes) group descriptor */
81 #define LST_BATCH_IDLE 0xB0 /* idle batch */
82 #define LST_BATCH_RUNNING 0xB1 /* running batch */
84 typedef struct lstcon_tsb_hdr
{
85 lst_bid_t tsb_id
; /* batch ID */
86 int tsb_index
; /* test index */
90 lstcon_tsb_hdr_t bat_hdr
; /* test_batch header */
91 struct list_head bat_link
; /* chain on session's batches list */
92 int bat_ntest
; /* # of test */
93 int bat_state
; /* state of the batch */
94 int bat_arg
; /* parameter for run|stop, timeout
95 * for run, force for stop */
96 char bat_name
[LST_NAME_SIZE
];/* name of batch */
98 struct list_head bat_test_list
; /* list head of tests (lstcon_test_t)
100 struct list_head bat_trans_list
; /* list head of transaction */
101 struct list_head bat_cli_list
; /* list head of client nodes
103 struct list_head
*bat_cli_hash
; /* hash table of client nodes */
104 struct list_head bat_srv_list
; /* list head of server nodes */
105 struct list_head
*bat_srv_hash
; /* hash table of server nodes */
106 } lstcon_batch_t
; /* (tests ) batch descriptor */
108 typedef struct lstcon_test
{
109 lstcon_tsb_hdr_t tes_hdr
; /* test batch header */
110 struct list_head tes_link
; /* chain on batch's tests list */
111 lstcon_batch_t
*tes_batch
; /* pointer to batch */
113 int tes_type
; /* type of the test, i.e: bulk, ping */
114 int tes_stop_onerr
; /* stop on error */
115 int tes_oneside
; /* one-sided test */
116 int tes_concur
; /* concurrency */
117 int tes_loop
; /* loop count */
118 int tes_dist
; /* nodes distribution of target group */
119 int tes_span
; /* nodes span of target group */
120 int tes_cliidx
; /* client index, used for RPC creating */
122 struct list_head tes_trans_list
; /* transaction list */
123 lstcon_group_t
*tes_src_grp
; /* group run the test */
124 lstcon_group_t
*tes_dst_grp
; /* target group */
126 int tes_paramlen
; /* test parameter length */
127 char tes_param
[0]; /* test parameter */
128 } lstcon_test_t
; /* a single test descriptor */
130 #define LST_GLOBAL_HASHSIZE 503 /* global nodes hash table size */
131 #define LST_NODE_HASHSIZE 239 /* node hash table (for batch or group) */
133 #define LST_SESSION_NONE 0x0 /* no session */
134 #define LST_SESSION_ACTIVE 0x1 /* working session */
136 #define LST_CONSOLE_TIMEOUT 300 /* default console timeout */
138 struct lstcon_session
{
139 struct mutex ses_mutex
; /* only 1 thread in session */
140 lst_sid_t ses_id
; /* global session id */
141 int ses_key
; /* local session key */
142 int ses_state
; /* state of session */
143 int ses_timeout
; /* timeout in seconds */
144 time64_t ses_laststamp
; /* last operation stamp (seconds)
146 unsigned ses_features
; /* tests features of the session
148 unsigned ses_feats_updated
:1; /* features are synced with
149 * remote test nodes */
150 unsigned ses_force
:1; /* force creating */
151 unsigned ses_shutdown
:1; /* session is shutting down */
152 unsigned ses_expired
:1; /* console is timedout */
153 __u64 ses_id_cookie
; /* batch id cookie */
154 char ses_name
[LST_NAME_SIZE
];/* session name */
155 lstcon_rpc_trans_t
*ses_ping
; /* session pinger */
156 stt_timer_t ses_ping_timer
; /* timer for pinger */
157 lstcon_trans_stat_t ses_trans_stat
; /* transaction stats */
159 struct list_head ses_trans_list
; /* global list of transaction */
160 struct list_head ses_grp_list
; /* global list of groups */
161 struct list_head ses_bat_list
; /* global list of batches */
162 struct list_head ses_ndl_list
; /* global list of nodes */
163 struct list_head
*ses_ndl_hash
; /* hash table of nodes */
165 spinlock_t ses_rpc_lock
; /* serialize */
166 atomic_t ses_rpc_counter
; /* # of initialized RPCs */
167 struct list_head ses_rpc_freelist
; /* idle console rpc */
168 }; /* session descriptor */
170 extern struct lstcon_session console_session
;
172 static inline lstcon_trans_stat_t
*
173 lstcon_trans_stat(void)
175 return &console_session
.ses_trans_stat
;
178 static inline struct list_head
*
179 lstcon_id2hash(lnet_process_id_t id
, struct list_head
*hash
)
181 unsigned int idx
= LNET_NIDADDR(id
.nid
) % LST_NODE_HASHSIZE
;
186 int lstcon_console_init(void);
187 int lstcon_console_fini(void);
188 int lstcon_session_match(lst_sid_t sid
);
189 int lstcon_session_new(char *name
, int key
, unsigned version
,
190 int timeout
, int flags
, lst_sid_t __user
*sid_up
);
191 int lstcon_session_info(lst_sid_t __user
*sid_up
, int __user
*key
,
192 unsigned __user
*verp
, lstcon_ndlist_ent_t __user
*entp
,
193 char __user
*name_up
, int len
);
194 int lstcon_session_end(void);
195 int lstcon_session_debug(int timeout
, struct list_head __user
*result_up
);
196 int lstcon_session_feats_check(unsigned feats
);
197 int lstcon_batch_debug(int timeout
, char *name
,
198 int client
, struct list_head __user
*result_up
);
199 int lstcon_group_debug(int timeout
, char *name
,
200 struct list_head __user
*result_up
);
201 int lstcon_nodes_debug(int timeout
, int nnd
, lnet_process_id_t __user
*nds_up
,
202 struct list_head __user
*result_up
);
203 int lstcon_group_add(char *name
);
204 int lstcon_group_del(char *name
);
205 int lstcon_group_clean(char *name
, int args
);
206 int lstcon_group_refresh(char *name
, struct list_head __user
*result_up
);
207 int lstcon_nodes_add(char *name
, int nnd
, lnet_process_id_t __user
*nds_up
,
208 unsigned *featp
, struct list_head __user
*result_up
);
209 int lstcon_nodes_remove(char *name
, int nnd
, lnet_process_id_t __user
*nds_up
,
210 struct list_head __user
*result_up
);
211 int lstcon_group_info(char *name
, lstcon_ndlist_ent_t __user
*gent_up
,
212 int *index_p
, int *ndent_p
,
213 lstcon_node_ent_t __user
*ndents_up
);
214 int lstcon_group_list(int idx
, int len
, char __user
*name_up
);
215 int lstcon_batch_add(char *name
);
216 int lstcon_batch_run(char *name
, int timeout
,
217 struct list_head __user
*result_up
);
218 int lstcon_batch_stop(char *name
, int force
,
219 struct list_head __user
*result_up
);
220 int lstcon_test_batch_query(char *name
, int testidx
,
221 int client
, int timeout
,
222 struct list_head __user
*result_up
);
223 int lstcon_batch_del(char *name
);
224 int lstcon_batch_list(int idx
, int namelen
, char __user
*name_up
);
225 int lstcon_batch_info(char *name
, lstcon_test_batch_ent_t __user
*ent_up
,
226 int server
, int testidx
, int *index_p
,
227 int *ndent_p
, lstcon_node_ent_t __user
*dents_up
);
228 int lstcon_group_stat(char *grp_name
, int timeout
,
229 struct list_head __user
*result_up
);
230 int lstcon_nodes_stat(int count
, lnet_process_id_t __user
*ids_up
,
231 int timeout
, struct list_head __user
*result_up
);
232 int lstcon_test_add(char *batch_name
, int type
, int loop
,
233 int concur
, int dist
, int span
,
234 char *src_name
, char *dst_name
,
235 void *param
, int paramlen
, int *retp
,
236 struct list_head __user
*result_up
);