Whamcloud - gitweb
LU-9679 nrs: remove ts_opcodes bitmap.
[fs/lustre-release.git] / lustre / include / lustre_nrs_tbf.h
index 0a3baa5..e4bbf8a 100644 (file)
@@ -6,22 +6,22 @@
  * 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 COPYING file that accompanied this code.
-
+ * GNU General Public License version 2 for more details.
+ *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * along with this program; If not, see
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
 /*
  * Copyright (C) 2013 DataDirect Networks, Inc.
  *
+ * Copyright (c) 2014, Intel Corporation.
  */
 /*
  *
@@ -31,7 +31,6 @@
 
 #ifndef _LUSTRE_NRS_TBF_H
 #define _LUSTRE_NRS_TBF_H
-#include <lustre_net.h>
 
 /* \name tbf
  *
 struct nrs_tbf_head;
 struct nrs_tbf_cmd;
 
+#define NRS_TBF_MATCH_FULL     0x0000001
+#define NRS_TBF_MATCH_WILDCARD 0x0000002
+
 struct nrs_tbf_jobid {
        char            *tj_id;
-       cfs_list_t       tj_linkage;
+       __u32            tj_match_flag;
+       struct list_head tj_linkage;
+};
+
+#define MAX_U32_STR_LEN        10
+#define NRS_TBF_KEY_LEN        (LNET_NIDSTR_SIZE + LUSTRE_JOBID_SIZE + \
+                        MAX_U32_STR_LEN + MAX_U32_STR_LEN + 3 + 2)
+
+enum nrs_tbf_flag {
+       NRS_TBF_FLAG_INVALID    = 0x0000000,
+       NRS_TBF_FLAG_JOBID      = 0x0000001,
+       NRS_TBF_FLAG_NID        = 0x0000002,
+       NRS_TBF_FLAG_OPCODE     = 0x0000004,
+       NRS_TBF_FLAG_GENERIC    = 0x0000008,
+       NRS_TBF_FLAG_UID        = 0x0000010,
+       NRS_TBF_FLAG_GID        = 0x0000020,
+};
+
+struct tbf_id {
+       enum nrs_tbf_flag       ti_type;
+       u32                     ti_uid;
+       u32                     ti_gid;
+};
+
+struct nrs_tbf_id {
+       struct tbf_id           nti_id;
+       struct list_head        nti_linkage;
 };
 
 struct nrs_tbf_client {
        /** Resource object for policy instance. */
        struct ptlrpc_nrs_resource       tc_res;
        /** Node in the hash table. */
-       cfs_hlist_node_t                 tc_hnode;
+       struct hlist_node                tc_hnode;
        /** NID of the client. */
        lnet_nid_t                       tc_nid;
        /** Jobid of the client. */
-       char                             tc_jobid[JOBSTATS_JOBID_SIZE];
+       char                             tc_jobid[LUSTRE_JOBID_SIZE];
+       /** opcode of the client. */
+       __u32                            tc_opcode;
+       /** gid or uid of the client. */
+       struct tbf_id                   tc_id;
+       /** Hash key of the client. */
+       char                             tc_key[NRS_TBF_KEY_LEN];
        /** Reference number of the client. */
        atomic_t                         tc_ref;
-       /** Likage to rule. */
-       cfs_list_t                       tc_linkage;
+       /** Lock to protect rule and linkage. */
+       spinlock_t                       tc_rule_lock;
+       /** Linkage to rule. */
+       struct list_head                 tc_linkage;
        /** Pointer to rule. */
        struct nrs_tbf_rule             *tc_rule;
        /** Generation of the rule matched. */
        __u64                            tc_rule_generation;
        /** Limit of RPC rate. */
-       __u64                            tc_rpc_rate;
+       u32                              tc_rpc_rate;
        /** Time to wait for next token. */
        __u64                            tc_nsecs;
        /** RPC token number. */
@@ -75,10 +111,17 @@ struct nrs_tbf_client {
        __u64                            tc_depth;
        /** Time check-point. */
        __u64                            tc_check_time;
+       /** Deadline of a class */
+       __u64                            tc_deadline;
+       /**
+        * Time residue: the remainder of elapsed time
+        * divided by nsecs when dequeue a request.
+        */
+       __u64                            tc_nsecs_resid;
        /** List of queued requests. */
-       cfs_list_t                       tc_list;
+       struct list_head                 tc_list;
        /** Node in binary heap. */
-       cfs_binheap_node_t               tc_node;
+       struct cfs_binheap_node          tc_node;
        /** Whether the client is in heap. */
        bool                             tc_in_heap;
        /** Sequence of the newest rule. */
@@ -87,13 +130,16 @@ struct nrs_tbf_client {
         * Linkage into LRU list. Protected bucket lock of
         * nrs_tbf_head::th_cli_hash.
         */
-       cfs_list_t                       tc_lru;
+       struct list_head                 tc_lru;
 };
 
 #define MAX_TBF_NAME (16)
 
-#define NTRS_STOPPING  0x0000001
-#define NTRS_DEFAULT   0x0000002
+enum nrs_rule_flags {
+       NTRS_STOPPING   = 0x00000001,
+       NTRS_DEFAULT    = 0x00000002,
+       NTRS_REALTIME   = 0x00000004,
+};
 
 struct nrs_tbf_rule {
        /** Name of the rule. */
@@ -101,25 +147,39 @@ struct nrs_tbf_rule {
        /** Head belongs to. */
        struct nrs_tbf_head             *tr_head;
        /** Likage to head. */
-       cfs_list_t                       tr_linkage;
+       struct list_head                 tr_linkage;
        /** Nid list of the rule. */
-       cfs_list_t                       tr_nids;
+       struct list_head                 tr_nids;
        /** Nid list string of the rule.*/
        char                            *tr_nids_str;
        /** Jobid list of the rule. */
-       cfs_list_t                       tr_jobids;
+       struct list_head                 tr_jobids;
        /** Jobid list string of the rule.*/
        char                            *tr_jobids_str;
+       /** uid/gid list of the rule. */
+       struct list_head                tr_ids;
+       /** uid/gid list string of the rule. */
+       char                            *tr_ids_str;
+       /** Opcode bitmap of the rule. */
+       struct cfs_bitmap               *tr_opcodes;
+       /** Opcode list string of the rule.*/
+       char                            *tr_opcodes_str;
+       /** Condition list of the rule.*/
+       struct list_head                tr_conds;
+       /** Generic condition string of the rule. */
+       char                            *tr_conds_str;
        /** RPC/s limit. */
-       __u64                            tr_rpc_rate;
+       u32                              tr_rpc_rate;
        /** Time to wait for next token. */
-       __u64                            tr_nsecs;
+       u64                              tr_nsecs_per_rpc;
        /** Token bucket depth. */
        __u64                            tr_depth;
+       /** Lock to protect the list of clients. */
+       spinlock_t                       tr_rule_lock;
        /** List of client. */
-       cfs_list_t                       tr_cli_list;
+       struct list_head                 tr_cli_list;
        /** Flags of the rule. */
-       __u32                            tr_flags;
+       enum nrs_rule_flags              tr_flags;
        /** Usage Reference count taken on the rule. */
        atomic_t                         tr_ref;
        /** Generation of the rule. */
@@ -146,16 +206,24 @@ struct nrs_tbf_ops {
 
 #define NRS_TBF_TYPE_JOBID     "jobid"
 #define NRS_TBF_TYPE_NID       "nid"
+#define NRS_TBF_TYPE_OPCODE    "opcode"
+#define NRS_TBF_TYPE_GENERIC   "generic"
+#define NRS_TBF_TYPE_UID       "uid"
+#define NRS_TBF_TYPE_GID       "gid"
 #define NRS_TBF_TYPE_MAX_LEN   20
-#define NRS_TBF_FLAG_JOBID     0x0000001
-#define NRS_TBF_FLAG_NID       0x0000002
+
+struct nrs_tbf_type {
+       const char              *ntt_name;
+       enum nrs_tbf_flag        ntt_flag;
+       struct nrs_tbf_ops      *ntt_ops;
+};
 
 struct nrs_tbf_bucket {
        /**
         * LRU list, updated on each access to client. Protected by
         * bucket lock of nrs_tbf_head::th_cli_hash.
         */
-       cfs_list_t      ntb_lru;
+       struct list_head        ntb_lru;
 };
 
 /**
@@ -169,7 +237,7 @@ struct nrs_tbf_head {
        /**
         * List of rules.
         */
-       cfs_list_t                       th_list;
+       struct list_head                 th_list;
        /**
         * Lock to protect the list of rules.
         */
@@ -185,9 +253,7 @@ struct nrs_tbf_head {
        /**
         * Timer for next token.
         */
-#if defined(__KERNEL__) && defined(__linux__)
        struct hrtimer                   th_timer;
-#endif
        /**
         * Deadline of the timer.
         */
@@ -199,11 +265,11 @@ struct nrs_tbf_head {
        /**
         * Heap of queues.
         */
-       cfs_binheap_t                   *th_binheap;
+       struct cfs_binheap              *th_binheap;
        /**
         * Hash of clients.
         */
-       cfs_hash_t                      *th_cli_hash;
+       struct cfs_hash                 *th_cli_hash;
        /**
         * Type of TBF policy.
         */
@@ -225,26 +291,67 @@ struct nrs_tbf_head {
 enum nrs_tbf_cmd_type {
        NRS_CTL_TBF_START_RULE = 0,
        NRS_CTL_TBF_STOP_RULE,
-       NRS_CTL_TBF_CHANGE_RATE,
+       NRS_CTL_TBF_CHANGE_RULE,
 };
 
 struct nrs_tbf_cmd {
-       enum nrs_tbf_cmd_type    tc_cmd;
-       char                    *tc_name;
-       __u64                    tc_rpc_rate;
-       cfs_list_t               tc_nids;
-       char                    *tc_nids_str;
-       cfs_list_t               tc_jobids;
-       char                    *tc_jobids_str;
-       __u32                    tc_valid_types;
-       __u32                    tc_rule_flags;
+       enum nrs_tbf_cmd_type                    tc_cmd;
+       char                                    *tc_name;
+       union {
+               struct nrs_tbf_cmd_start {
+                       __u64                    ts_rpc_rate;
+                       struct list_head         ts_nids;
+                       char                    *ts_nids_str;
+                       struct list_head         ts_jobids;
+                       char                    *ts_jobids_str;
+                       struct list_head         ts_ids;
+                       char                    *ts_ids_str;
+                       char                    *ts_opcodes_str;
+                       struct list_head         ts_conds;
+                       char                    *ts_conds_str;
+                       __u32                    ts_valid_type;
+                       enum nrs_rule_flags      ts_rule_flags;
+                       char                    *ts_next_name;
+               } tc_start;
+               struct nrs_tbf_cmd_change {
+                       __u64                    tc_rpc_rate;
+                       char                    *tc_next_name;
+               } tc_change;
+       } u;
+};
+
+enum nrs_tbf_field {
+       NRS_TBF_FIELD_NID,
+       NRS_TBF_FIELD_JOBID,
+       NRS_TBF_FIELD_OPCODE,
+       NRS_TBF_FIELD_UID,
+       NRS_TBF_FIELD_GID,
+       NRS_TBF_FIELD_MAX
+};
+
+struct nrs_tbf_expression {
+       enum nrs_tbf_field       te_field;
+       struct list_head         te_cond;
+       struct cfs_bitmap       *te_opcodes;
+       struct list_head         te_linkage;
+};
+
+struct nrs_tbf_conjunction {
+       /**
+        * link to disjunction.
+        */
+       struct list_head tc_linkage;
+       /**
+        * list of logical conjunction
+        */
+       struct list_head tc_expressions;
 };
 
 struct nrs_tbf_req {
        /**
         * Linkage to queue.
         */
-       cfs_list_t              tr_list;
+       struct list_head        tr_list;
        /**
         * Sequence of the request.
         */
@@ -263,6 +370,10 @@ enum nrs_ctl_tbf {
         * Write the the data of a TBF policy.
         */
        NRS_CTL_TBF_WR_RULE,
+       /**
+        * Read the TBF policy type preset by proc entry "nrs_policies".
+        */
+       NRS_CTL_TBF_RD_TYPE_FLAG,
 };
 
 /** @} tbf */