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,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License version 2 for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; If not, see
17 * http://www.gnu.org/licenses/gpl-2.0.html
22 * Copyright (C) 2013 DataDirect Networks, Inc.
24 * Copyright (c) 2014, Intel Corporation.
28 * Network Request Scheduler (NRS) Token Bucket Filter(TBF) policy
32 #ifndef _LUSTRE_NRS_TBF_H
33 #define _LUSTRE_NRS_TBF_H
45 struct nrs_tbf_jobid {
47 struct list_head tj_linkage;
50 struct nrs_tbf_client {
51 /** Resource object for policy instance. */
52 struct ptlrpc_nrs_resource tc_res;
53 /** Node in the hash table. */
54 struct hlist_node tc_hnode;
55 /** NID of the client. */
57 /** Jobid of the client. */
58 char tc_jobid[LUSTRE_JOBID_SIZE];
59 /** opcode of the client. */
61 /** Reference number of the client. */
63 /** Lock to protect rule and linkage. */
64 spinlock_t tc_rule_lock;
65 /** Linkage to rule. */
66 struct list_head tc_linkage;
67 /** Pointer to rule. */
68 struct nrs_tbf_rule *tc_rule;
69 /** Generation of the rule matched. */
70 __u64 tc_rule_generation;
71 /** Limit of RPC rate. */
73 /** Time to wait for next token. */
75 /** RPC token number. */
77 /** Token bucket depth. */
79 /** Time check-point. */
81 /** List of queued requests. */
82 struct list_head tc_list;
83 /** Node in binary heap. */
84 struct cfs_binheap_node tc_node;
85 /** Whether the client is in heap. */
87 /** Sequence of the newest rule. */
88 __u32 tc_rule_sequence;
90 * Linkage into LRU list. Protected bucket lock of
91 * nrs_tbf_head::th_cli_hash.
93 struct list_head tc_lru;
96 #define MAX_TBF_NAME (16)
98 #define NTRS_STOPPING 0x0000001
99 #define NTRS_DEFAULT 0x0000002
101 struct nrs_tbf_rule {
102 /** Name of the rule. */
103 char tr_name[MAX_TBF_NAME];
104 /** Head belongs to. */
105 struct nrs_tbf_head *tr_head;
106 /** Likage to head. */
107 struct list_head tr_linkage;
108 /** Nid list of the rule. */
109 struct list_head tr_nids;
110 /** Nid list string of the rule.*/
112 /** Jobid list of the rule. */
113 struct list_head tr_jobids;
114 /** Jobid list string of the rule.*/
116 /** Opcode bitmap of the rule. */
117 struct cfs_bitmap *tr_opcodes;
118 /** Opcode list string of the rule.*/
119 char *tr_opcodes_str;
122 /** Time to wait for next token. */
124 /** Token bucket depth. */
126 /** Lock to protect the list of clients. */
127 spinlock_t tr_rule_lock;
128 /** List of client. */
129 struct list_head tr_cli_list;
130 /** Flags of the rule. */
132 /** Usage Reference count taken on the rule. */
134 /** Generation of the rule. */
140 int (*o_startup)(struct ptlrpc_nrs_policy *, struct nrs_tbf_head *);
141 struct nrs_tbf_client *(*o_cli_find)(struct nrs_tbf_head *,
142 struct ptlrpc_request *);
143 struct nrs_tbf_client *(*o_cli_findadd)(struct nrs_tbf_head *,
144 struct nrs_tbf_client *);
145 void (*o_cli_put)(struct nrs_tbf_head *, struct nrs_tbf_client *);
146 void (*o_cli_init)(struct nrs_tbf_client *, struct ptlrpc_request *);
147 int (*o_rule_init)(struct ptlrpc_nrs_policy *,
148 struct nrs_tbf_rule *,
149 struct nrs_tbf_cmd *);
150 int (*o_rule_dump)(struct nrs_tbf_rule *, struct seq_file *);
151 int (*o_rule_match)(struct nrs_tbf_rule *,
152 struct nrs_tbf_client *);
153 void (*o_rule_fini)(struct nrs_tbf_rule *);
156 #define NRS_TBF_TYPE_JOBID "jobid"
157 #define NRS_TBF_TYPE_NID "nid"
158 #define NRS_TBF_TYPE_OPCODE "opcode"
159 #define NRS_TBF_TYPE_MAX_LEN 20
162 NRS_TBF_FLAG_INVALID = 0x0000000,
163 NRS_TBF_FLAG_JOBID = 0x0000001,
164 NRS_TBF_FLAG_NID = 0x0000002,
165 NRS_TBF_FLAG_OPCODE = 0x0000004,
168 struct nrs_tbf_type {
169 const char *ntt_name;
170 enum nrs_tbf_flag ntt_flag;
171 struct nrs_tbf_ops *ntt_ops;
174 struct nrs_tbf_bucket {
176 * LRU list, updated on each access to client. Protected by
177 * bucket lock of nrs_tbf_head::th_cli_hash.
179 struct list_head ntb_lru;
183 * Private data structure for the TBF policy
185 struct nrs_tbf_head {
187 * Resource object for policy instance.
189 struct ptlrpc_nrs_resource th_res;
193 struct list_head th_list;
195 * Lock to protect the list of rules.
197 spinlock_t th_rule_lock;
199 * Generation of rules.
201 atomic_t th_rule_sequence;
205 struct nrs_tbf_rule *th_rule;
207 * Timer for next token.
209 struct hrtimer th_timer;
211 * Deadline of the timer.
215 * Sequence of requests.
221 struct cfs_binheap *th_binheap;
225 struct cfs_hash *th_cli_hash;
227 * Type of TBF policy.
229 char th_type[NRS_TBF_TYPE_MAX_LEN + 1];
233 struct nrs_tbf_ops *th_ops;
239 * Index of bucket on hash table while purging.
244 enum nrs_tbf_cmd_type {
245 NRS_CTL_TBF_START_RULE = 0,
246 NRS_CTL_TBF_STOP_RULE,
247 NRS_CTL_TBF_CHANGE_RULE,
251 enum nrs_tbf_cmd_type tc_cmd;
254 struct nrs_tbf_cmd_start {
256 struct list_head ts_nids;
258 struct list_head ts_jobids;
260 struct cfs_bitmap *ts_opcodes;
261 char *ts_opcodes_str;
266 struct nrs_tbf_cmd_change {
277 struct list_head tr_list;
279 * Sequence of the request.
285 * TBF policy operations.
289 * Read the the data of a TBF policy.
291 NRS_CTL_TBF_RD_RULE = PTLRPC_NRS_CTL_1ST_POL_SPEC,
293 * Write the the data of a TBF policy.
297 * Read the TBF policy type preset by proc entry "nrs_policies".
299 NRS_CTL_TBF_RD_TYPE_FLAG,