aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/lustre/lnet/selftest/conrpc.h
blob: 374a5f31ef6f066f31c52fc4ad6507291125bf7d (plain) (blame)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// SPDX-License-Identifier: GPL-2.0
/*
 * GPL HEADER START
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 only,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License version 2 for more details (a copy is included
 * in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU General Public License
 * version 2 along with this program; If not, see
 * http://www.gnu.org/licenses/gpl-2.0.html
 *
 * GPL HEADER END
 */
/*
 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 *
 * Copyright (c) 2011, Intel Corporation.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 * Lustre is a trademark of Sun Microsystems, Inc.
 *
 * /lnet/selftest/conrpc.h
 *
 * Console rpc
 *
 * Author: Liang Zhen <liang@whamcloud.com>
 */

#ifndef __LST_CONRPC_H__
#define __LST_CONRPC_H__

#include <linux/libcfs/libcfs.h>
#include <linux/lnet/lib-types.h>
#include <uapi/linux/lnet/lnetst.h>
#include "rpc.h"
#include "selftest.h"

/* Console rpc and rpc transaction */
#define LST_TRANS_TIMEOUT	30
#define LST_TRANS_MIN_TIMEOUT	3

#define LST_VALIDATE_TIMEOUT(t) min(max(t, LST_TRANS_MIN_TIMEOUT), LST_TRANS_TIMEOUT)

#define LST_PING_INTERVAL	8

struct lstcon_rpc_trans;
struct lstcon_tsb_hdr;
struct lstcon_test;
struct lstcon_node;

struct lstcon_rpc {
	struct list_head	 crp_link;	/* chain on rpc transaction */
	struct srpc_client_rpc	*crp_rpc;	/* client rpc */
	struct lstcon_node	*crp_node;	/* destination node */
	struct lstcon_rpc_trans *crp_trans;	/* conrpc transaction */

	unsigned int		 crp_posted:1;	/* rpc is posted */
	unsigned int		 crp_finished:1; /* rpc is finished */
	unsigned int		 crp_unpacked:1; /* reply is unpacked */
	/** RPC is embedded in other structure and can't free it */
	unsigned int		 crp_embedded:1;
	int			 crp_status;	/* console rpc errors */
	unsigned long		 crp_stamp;	/* replied time stamp */
};

struct lstcon_rpc_trans {
	struct list_head  tas_olink;	     /* link chain on owner list */
	struct list_head  tas_link;	     /* link chain on global list */
	int		  tas_opc;	     /* operation code of transaction */
	unsigned int	  tas_feats_updated; /* features mask is uptodate */
	unsigned int	  tas_features;      /* test features mask */
	wait_queue_head_t tas_waitq;	     /* wait queue head */
	atomic_t	  tas_remaining;     /* # of un-scheduled rpcs */
	struct list_head  tas_rpcs_list;     /* queued requests */
};

#define LST_TRANS_PRIVATE	0x1000

#define LST_TRANS_SESNEW	(LST_TRANS_PRIVATE | 0x01)
#define LST_TRANS_SESEND	(LST_TRANS_PRIVATE | 0x02)
#define LST_TRANS_SESQRY	0x03
#define LST_TRANS_SESPING	0x04

#define LST_TRANS_TSBCLIADD	(LST_TRANS_PRIVATE | 0x11)
#define LST_TRANS_TSBSRVADD	(LST_TRANS_PRIVATE | 0x12)
#define LST_TRANS_TSBRUN	(LST_TRANS_PRIVATE | 0x13)
#define LST_TRANS_TSBSTOP	(LST_TRANS_PRIVATE | 0x14)
#define LST_TRANS_TSBCLIQRY	0x15
#define LST_TRANS_TSBSRVQRY	0x16

#define LST_TRANS_STATQRY	0x21

typedef int (*lstcon_rpc_cond_func_t)(int, struct lstcon_node *, void *);
typedef int (*lstcon_rpc_readent_func_t)(int, struct srpc_msg *,
					 struct lstcon_rpc_ent __user *);

int  lstcon_sesrpc_prep(struct lstcon_node *nd, int transop,
			unsigned int version, struct lstcon_rpc **crpc);
int  lstcon_dbgrpc_prep(struct lstcon_node *nd,
			unsigned int version, struct lstcon_rpc **crpc);
int  lstcon_batrpc_prep(struct lstcon_node *nd, int transop,
			unsigned int version, struct lstcon_tsb_hdr *tsb,
			struct lstcon_rpc **crpc);
int  lstcon_testrpc_prep(struct lstcon_node *nd, int transop,
			 unsigned int version, struct lstcon_test *test,
			 struct lstcon_rpc **crpc);
int  lstcon_statrpc_prep(struct lstcon_node *nd, unsigned int version,
			 struct lstcon_rpc **crpc);
void lstcon_rpc_put(struct lstcon_rpc *crpc);
int  lstcon_rpc_trans_prep(struct list_head *translist,
			   int transop, struct lstcon_rpc_trans **transpp);
int  lstcon_rpc_trans_ndlist(struct list_head *ndlist,
			     struct list_head *translist, int transop,
			     void *arg, lstcon_rpc_cond_func_t condition,
			     struct lstcon_rpc_trans **transpp);
void lstcon_rpc_trans_stat(struct lstcon_rpc_trans *trans,
			   struct lstcon_trans_stat *stat);
int  lstcon_rpc_trans_interpreter(struct lstcon_rpc_trans *trans,
				  struct list_head __user *head_up,
				  lstcon_rpc_readent_func_t readent);
void lstcon_rpc_trans_abort(struct lstcon_rpc_trans *trans, int error);
void lstcon_rpc_trans_destroy(struct lstcon_rpc_trans *trans);
void lstcon_rpc_trans_addreq(struct lstcon_rpc_trans *trans,
			     struct lstcon_rpc *req);
int  lstcon_rpc_trans_postwait(struct lstcon_rpc_trans *trans, int timeout);
int  lstcon_rpc_pinger_start(void);
void lstcon_rpc_pinger_stop(void);
void lstcon_rpc_cleanup_wait(void);
int  lstcon_rpc_module_init(void);
void lstcon_rpc_module_fini(void);

#endif