Whamcloud - gitweb
LU-10391 lnet: extend rspt_next_hop_nid in lnet_rsp_tracker
[fs/lustre-release.git] / lnet / include / lnet / lib-types.h
index f0f4181..ddcc68d 100644 (file)
@@ -27,7 +27,6 @@
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
  *
  * lnet/include/lnet/lib-types.h
  *
 #include <linux/uio.h>
 #include <linux/semaphore.h>
 #include <linux/types.h>
+#include <linux/kref.h>
+#include <net/genetlink.h>
 
+#include <uapi/linux/lnet/lnet-nl.h>
 #include <uapi/linux/lnet/lnet-dlc.h>
 #include <uapi/linux/lnet/lnetctl.h>
 #include <uapi/linux/lnet/nidstr.h>
 /* Max payload size */
 #define LNET_MAX_PAYLOAD       LNET_MTU
 
-#define LNET_MAX_IOV           (LNET_MAX_PAYLOAD >> PAGE_SHIFT)
+/** limit on the number of fragments in discontiguous MDs */
+#define LNET_MAX_IOV   256
 
 /*
  * This is the maximum health value.
  * All local and peer NIs created have their health default to this value.
  */
 #define LNET_MAX_HEALTH_VALUE 1000
+#define LNET_MAX_SELECTION_PRIORITY UINT_MAX
 
 /* forward refs */
 struct lnet_libmd;
@@ -86,7 +90,7 @@ struct lnet_rsp_tracker {
        /* cpt to lock */
        int rspt_cpt;
        /* nid of next hop */
-       lnet_nid_t rspt_next_hop_nid;
+       struct lnet_nid rspt_next_hop_nid;
        /* deadline of the REPLY/ACK */
        ktime_t rspt_deadline;
        /* parent MD */
@@ -121,6 +125,8 @@ struct lnet_msg {
        enum lnet_msg_hstatus   msg_health_status;
        /* This is a recovery message */
        bool                    msg_recovery;
+       /* force an RDMA even if the message size is < 4K */
+       bool                    msg_rdma_force;
        /* the number of times a transmission has been retried */
        int                     msg_retry_count;
        /* flag to indicate that we do not want to resend this message */
@@ -216,6 +222,16 @@ struct lnet_libmd {
 #define LNET_MD_FLAG_ZOMBIE     BIT(0)
 #define LNET_MD_FLAG_AUTO_UNLINK BIT(1)
 #define LNET_MD_FLAG_ABORTED    BIT(2)
+/* LNET_MD_FLAG_HANDLING is set when a non-unlink event handler
+ * is being called for an event relating to the md.
+ * It ensures only one such handler runs at a time.
+ * The final "unlink" event is only called once the
+ * md_refcount has reached zero, and this flag has been cleared,
+ * ensuring that it doesn't race with any other event handler
+ * call.
+ */
+#define LNET_MD_FLAG_HANDLING   BIT(3)
+#define LNET_MD_FLAG_DISCARD    BIT(4)
 
 struct lnet_test_peer {
        /* info about peers we are trying to fail */
@@ -230,6 +246,25 @@ struct lnet_test_peer {
 #define LNET_COOKIE_TYPE_BITS  2
 #define LNET_COOKIE_MASK       ((1ULL << LNET_COOKIE_TYPE_BITS) - 1ULL)
 
+struct netstrfns {
+       u32     nf_type;
+       char    *nf_name;
+       char    *nf_modname;
+       void    (*nf_addr2str)(u32 addr, char *str, size_t size);
+       void    (*nf_addr2str_size)(const __be32 *addr, size_t asize,
+                                   char *str, size_t size);
+       int     (*nf_str2addr)(const char *str, int nob, u32 *addr);
+       int     (*nf_str2addr_size)(const char *str, int nob,
+                                   __be32 *addr, size_t *asize);
+       int     (*nf_parse_addrlist)(char *str, int len,
+                                    struct list_head *list);
+       int     (*nf_print_addrlist)(char *buffer, int count,
+                                    struct list_head *list);
+       int     (*nf_match_addr)(u32 addr, struct list_head *list);
+       int     (*nf_min_max)(struct list_head *nidlist, u32 *min_nid,
+                             u32 *max_nid);
+};
+
 struct lnet_ni;                                         /* forward ref */
 struct socket;
 
@@ -280,6 +315,10 @@ struct lnet_lnd {
 
        /* accept a new connection */
        int (*lnd_accept)(struct lnet_ni *ni, struct socket *sock);
+
+       /* get dma_dev priority */
+       unsigned int (*lnd_get_dev_prio)(struct lnet_ni *ni,
+                                        unsigned int dev_idx);
 };
 
 struct lnet_tx_queue {
@@ -358,8 +397,8 @@ struct lnet_net {
         * lnet/include/lnet/nidstr.h */
        __u32                   net_id;
 
-       /* priority of the network */
-       __u32                   net_prio;
+       /* round robin selection */
+       __u32                   net_seq;
 
        /* total number of CPTs in the array */
        __u32                   net_ncpts;
@@ -367,6 +406,9 @@ struct lnet_net {
        /* cumulative CPTs of all NIs in this net */
        __u32                   *net_cpts;
 
+       /* relative net selection priority */
+       __u32                   net_sel_priority;
+
        /* network tunables */
        struct lnet_ioctl_config_lnd_cmn_tunables net_tunables;
 
@@ -393,6 +435,9 @@ struct lnet_net {
 
        /* protects access to net_last_alive */
        spinlock_t              net_lock;
+
+       /* list of router nids preferred for this network */
+       struct list_head        net_rtr_pref_nids;
 };
 
 struct lnet_ni {
@@ -414,7 +459,7 @@ struct lnet_ni {
        __u32                   *ni_cpts;
 
        /* interface's NID */
-       lnet_nid_t              ni_nid;
+       struct lnet_nid         ni_nid;
 
        /* instance-specific data */
        void                    *ni_data;
@@ -440,6 +485,13 @@ struct lnet_ni {
        /* Recovery state. Protected by lnet_ni_lock() */
        __u32                   ni_recovery_state;
 
+       /* When to send the next recovery ping */
+       time64_t                ni_next_ping;
+       /* How many pings sent during current recovery period did not receive
+        * a reply. NB: reset whenever _any_ message arrives on this NI
+        */
+       unsigned int            ni_ping_count;
+
        /* per NI LND tunables */
        struct lnet_lnd_tunables ni_lnd_tunables;
 
@@ -472,11 +524,13 @@ struct lnet_ni {
         */
        atomic_t                ni_fatal_error_on;
 
+       /* the relative selection priority of this NI */
+       __u32                   ni_sel_priority;
+
        /*
-        * equivalent interfaces to use
-        * This is an array because socklnd bonding can still be configured
+        * equivalent interface to use
         */
-       char                    *ni_interfaces[LNET_INTERFACES_NUM];
+       char                    *ni_interface;
        struct net              *ni_net_ns;     /* original net namespace */
 };
 
@@ -503,6 +557,11 @@ struct lnet_ping_buffer {
 #define LNET_PING_INFO_TO_BUFFER(PINFO)        \
        container_of((PINFO), struct lnet_ping_buffer, pb_info)
 
+struct lnet_nid_list {
+       struct list_head nl_list;
+       lnet_nid_t nl_nid;
+};
+
 struct lnet_peer_ni {
        /* chain on lpn_peer_nis */
        struct list_head        lpni_peer_nis;
@@ -538,13 +597,19 @@ struct lnet_peer_ni {
        /* network peer is on */
        struct lnet_net         *lpni_net;
        /* peer's NID */
-       lnet_nid_t              lpni_nid;
+       struct lnet_nid         lpni_nid;
        /* # refs */
-       atomic_t                lpni_refcount;
+       struct kref             lpni_kref;
        /* health value for the peer */
        atomic_t                lpni_healthv;
        /* recovery ping mdh */
        struct lnet_handle_md   lpni_recovery_ping_mdh;
+       /* When to send the next recovery ping */
+       time64_t                lpni_next_ping;
+       /* How many pings sent during current recovery period did not receive
+        * a reply. NB: reset whenever _any_ message arrives from this peer NI
+        */
+       unsigned int            lpni_ping_count;
        /* CPT this peer attached on */
        int                     lpni_cpt;
        /* state flags -- protected by lpni_lock */
@@ -562,8 +627,12 @@ struct lnet_peer_ni {
        /* preferred local nids: if only one, use lpni_pref.nid */
        union lpni_pref {
                lnet_nid_t      nid;
-               lnet_nid_t      *nids;
+               struct list_head nids;
        } lpni_pref;
+       /* list of router nids preferred for this peer NI */
+       struct list_head        lpni_rtr_pref_nids;
+       /* The relative selection priority of this peer NI */
+       __u32                   lpni_sel_priority;
        /* number of preferred NIDs in lnpi_pref_nids */
        __u32                   lpni_pref_nnids;
 };
@@ -591,7 +660,12 @@ struct lnet_peer {
        struct list_head        lp_rtr_list;
 
        /* primary NID of the peer */
-       lnet_nid_t              lp_primary_nid;
+       struct lnet_nid         lp_primary_nid;
+
+       /* source NID to use during discovery */
+       struct lnet_nid         lp_disc_src_nid;
+       /* destination NID to use during discovery */
+       struct lnet_nid         lp_disc_dst_nid;
 
        /* net to perform discovery on */
        __u32                   lp_disc_net_id;
@@ -731,6 +805,15 @@ struct lnet_peer {
 
 /* peer is marked for deletion */
 #define LNET_PEER_MARK_DELETION                BIT(18)
+/* lnet_peer_del()/lnet_peer_del_locked() has been called on the peer */
+#define LNET_PEER_MARK_DELETED         BIT(19)
+/* lock primary NID to what's requested by ULP */
+#define LNET_PEER_LOCK_PRIMARY         BIT(20)
+/* this is for informational purposes only. It is set if a peer gets
+ * configured from Lustre with a primary NID which belongs to another peer
+ * which is also configured by Lustre as the primary NID.
+ */
+#define LNET_PEER_BAD_CONFIG           BIT(21)
 
 struct lnet_peer_net {
        /* chain on lp_peer_nets */
@@ -748,12 +831,15 @@ struct lnet_peer_net {
        /* peer net health */
        int                     lpn_healthv;
 
-       /* time of last router net check attempt */
-       time64_t                lpn_rtrcheck_timestamp;
+       /* time of next router ping on this net */
+       time64_t                lpn_next_ping;
 
        /* selection sequence number */
        __u32                   lpn_seq;
 
+       /* relative peer net selection priority */
+       __u32                   lpn_sel_priority;
+
        /* reference count */
        atomic_t                lpn_refcount;
 };
@@ -797,13 +883,13 @@ struct lnet_route {
        struct list_head        lr_list;        /* chain on net */
        struct list_head        lr_gwlist;      /* chain on gateway */
        struct lnet_peer        *lr_gateway;    /* router node */
-       lnet_nid_t              lr_nid;         /* NID used to add route */
+       struct lnet_nid         lr_nid;         /* NID used to add route */
        __u32                   lr_net;         /* remote network number */
        __u32                   lr_lnet;        /* local network number */
        int                     lr_seq;         /* sequence for round-robin */
        __u32                   lr_hops;        /* how far I am */
        unsigned int            lr_priority;    /* route priority */
-       bool                    lr_alive;       /* cached route aliveness */
+       atomic_t                lr_alive;       /* cached route aliveness */
        bool                    lr_single_hop;  /* this route is single-hop */
 };
 
@@ -965,6 +1051,49 @@ struct lnet_msg_container {
        void                    **msc_resenders;
 };
 
+/* This UDSP structures need to match the user space liblnetconfig structures
+ * in order for the marshall and unmarshall functions to be common.
+ */
+
+/* Net is described as a
+ *  1. net type
+ *  2. num range
+ */
+struct lnet_ud_net_descr {
+       __u32 udn_net_type;
+       struct list_head udn_net_num_range;
+};
+
+/* each NID range is defined as
+ *  1. net descriptor
+ *  2. address range descriptor
+ */
+struct lnet_ud_nid_descr {
+       struct lnet_ud_net_descr ud_net_id;
+       struct list_head ud_addr_range;
+       __u32 ud_mem_size;
+};
+
+/* a UDSP rule can have up to three user defined NID descriptors
+ *     - src: defines the local NID range for the rule
+ *     - dst: defines the peer NID range for the rule
+ *     - rte: defines the router NID range for the rule
+ *
+ * An action union defines the action to take when the rule
+ * is matched
+ */
+struct lnet_udsp {
+       struct list_head udsp_on_list;
+       __u32 udsp_idx;
+       struct lnet_ud_nid_descr udsp_src;
+       struct lnet_ud_nid_descr udsp_dst;
+       struct lnet_ud_nid_descr udsp_rte;
+       enum lnet_udsp_action_type udsp_action_type;
+       union {
+               __u32 udsp_priority;
+       } udsp_action;
+};
+
 /* Peer Discovery states */
 #define LNET_DC_STATE_SHUTDOWN         0       /* not started */
 #define LNET_DC_STATE_RUNNING          1       /* started up OK */
@@ -1140,6 +1269,48 @@ struct lnet {
         * work loops
         */
        struct completion               ln_started;
+       /* UDSP list */
+       struct list_head                ln_udsp_list;
+};
+
+static const struct nla_policy scalar_attr_policy[LN_SCALAR_CNT + 1] = {
+       [LN_SCALAR_ATTR_LIST]           = { .type = NLA_NESTED },
+       [LN_SCALAR_ATTR_LIST_SIZE]      = { .type = NLA_U16 },
+       [LN_SCALAR_ATTR_INDEX]          = { .type = NLA_U16 },
+       [LN_SCALAR_ATTR_NLA_TYPE]       = { .type = NLA_U16 },
+       [LN_SCALAR_ATTR_VALUE]          = { .type = NLA_STRING },
+       [LN_SCALAR_ATTR_KEY_FORMAT]     = { .type = NLA_U16 },
 };
 
+int lnet_genl_send_scalar_list(struct sk_buff *msg, u32 portid, u32 seq,
+                              const struct genl_family *family, int flags,
+                              u8 cmd, const struct ln_key_list *data[]);
+
+/* Special workaround for pre-4.19 kernels to send error messages
+ * from dumpit routines. Newer kernels will send message with
+ * NL_SET_ERR_MSG information by default if NETLINK_EXT_ACK is set.
+ */
+static inline int lnet_nl_send_error(struct sk_buff *msg, int portid, int seq,
+                                    int error)
+{
+#ifndef HAVE_NL_DUMP_WITH_EXT_ACK
+       struct nlmsghdr *nlh;
+
+       if (!error)
+               return 0;
+
+       nlh = nlmsg_put(msg, portid, seq, NLMSG_ERROR, sizeof(error), 0);
+       if (!nlh)
+               return -ENOMEM;
+#ifdef HAVE_NL_PARSE_WITH_EXT_ACK
+       netlink_ack(msg, nlh, error, NULL);
+#else
+       netlink_ack(msg, nlh, error);
+#endif
+       return nlmsg_len(nlh);
+#else
+       return error;
+#endif
+}
+
 #endif