Merge branches 'acpi-scan' and 'acpi-prm'
[linux-2.6-microblaze.git] / include / net / nexthop.h
index a10a319..10e1777 100644 (file)
@@ -40,6 +40,12 @@ struct nh_config {
 
        struct nlattr   *nh_grp;
        u16             nh_grp_type;
+       u16             nh_grp_res_num_buckets;
+       unsigned long   nh_grp_res_idle_timer;
+       unsigned long   nh_grp_res_unbalanced_timer;
+       bool            nh_grp_res_has_num_buckets;
+       bool            nh_grp_res_has_idle_timer;
+       bool            nh_grp_res_has_unbalanced_timer;
 
        struct nlattr   *nh_encap;
        u16             nh_encap_type;
@@ -63,6 +69,32 @@ struct nh_info {
        };
 };
 
+struct nh_res_bucket {
+       struct nh_grp_entry __rcu *nh_entry;
+       atomic_long_t           used_time;
+       unsigned long           migrated_time;
+       bool                    occupied;
+       u8                      nh_flags;
+};
+
+struct nh_res_table {
+       struct net              *net;
+       u32                     nhg_id;
+       struct delayed_work     upkeep_dw;
+
+       /* List of NHGEs that have too few buckets ("uw" for underweight).
+        * Reclaimed buckets will be given to entries in this list.
+        */
+       struct list_head        uw_nh_entries;
+       unsigned long           unbalanced_since;
+
+       u32                     idle_timer;
+       u32                     unbalanced_timer;
+
+       u16                     num_nh_buckets;
+       struct nh_res_bucket    nh_buckets[];
+};
+
 struct nh_grp_entry {
        struct nexthop  *nh;
        u8              weight;
@@ -70,7 +102,14 @@ struct nh_grp_entry {
        union {
                struct {
                        atomic_t        upper_bound;
-               } mpath;
+               } hthr;
+               struct {
+                       /* Member on uw_nh_entries. */
+                       struct list_head        uw_nh_entry;
+
+                       u16                     count_buckets;
+                       u16                     wants_buckets;
+               } res;
        };
 
        struct list_head nh_list;
@@ -80,9 +119,13 @@ struct nh_grp_entry {
 struct nh_group {
        struct nh_group         *spare; /* spare group for removals */
        u16                     num_nh;
-       bool                    mpath;
+       bool                    is_multipath;
+       bool                    hash_threshold;
+       bool                    resilient;
        bool                    fdb_nh;
        bool                    has_v4;
+
+       struct nh_res_table __rcu *res_table;
        struct nh_grp_entry     nh_entries[];
 };
 
@@ -112,11 +155,15 @@ struct nexthop {
 enum nexthop_event_type {
        NEXTHOP_EVENT_DEL,
        NEXTHOP_EVENT_REPLACE,
+       NEXTHOP_EVENT_RES_TABLE_PRE_REPLACE,
+       NEXTHOP_EVENT_BUCKET_REPLACE,
 };
 
 enum nh_notifier_info_type {
        NH_NOTIFIER_INFO_TYPE_SINGLE,
        NH_NOTIFIER_INFO_TYPE_GRP,
+       NH_NOTIFIER_INFO_TYPE_RES_TABLE,
+       NH_NOTIFIER_INFO_TYPE_RES_BUCKET,
 };
 
 struct nh_notifier_single_info {
@@ -143,6 +190,19 @@ struct nh_notifier_grp_info {
        struct nh_notifier_grp_entry_info nh_entries[];
 };
 
+struct nh_notifier_res_bucket_info {
+       u16 bucket_index;
+       unsigned int idle_timer_ms;
+       bool force;
+       struct nh_notifier_single_info old_nh;
+       struct nh_notifier_single_info new_nh;
+};
+
+struct nh_notifier_res_table_info {
+       u16 num_nh_buckets;
+       struct nh_notifier_single_info nhs[];
+};
+
 struct nh_notifier_info {
        struct net *net;
        struct netlink_ext_ack *extack;
@@ -151,6 +211,8 @@ struct nh_notifier_info {
        union {
                struct nh_notifier_single_info *nh;
                struct nh_notifier_grp_info *nh_grp;
+               struct nh_notifier_res_table_info *nh_res_table;
+               struct nh_notifier_res_bucket_info *nh_res_bucket;
        };
 };
 
@@ -158,6 +220,10 @@ int register_nexthop_notifier(struct net *net, struct notifier_block *nb,
                              struct netlink_ext_ack *extack);
 int unregister_nexthop_notifier(struct net *net, struct notifier_block *nb);
 void nexthop_set_hw_flags(struct net *net, u32 id, bool offload, bool trap);
+void nexthop_bucket_set_hw_flags(struct net *net, u32 id, u16 bucket_index,
+                                bool offload, bool trap);
+void nexthop_res_grp_activity_update(struct net *net, u32 id, u16 num_buckets,
+                                    unsigned long *activity);
 
 /* caller is holding rcu or rtnl; no reference taken to nexthop */
 struct nexthop *nexthop_find_by_id(struct net *net, u32 id);
@@ -212,7 +278,7 @@ static inline bool nexthop_is_multipath(const struct nexthop *nh)
                struct nh_group *nh_grp;
 
                nh_grp = rcu_dereference_rtnl(nh->nh_grp);
-               return nh_grp->mpath;
+               return nh_grp->is_multipath;
        }
        return false;
 }
@@ -227,7 +293,7 @@ static inline unsigned int nexthop_num_path(const struct nexthop *nh)
                struct nh_group *nh_grp;
 
                nh_grp = rcu_dereference_rtnl(nh->nh_grp);
-               if (nh_grp->mpath)
+               if (nh_grp->is_multipath)
                        rc = nh_grp->num_nh;
        }
 
@@ -308,7 +374,7 @@ struct fib_nh_common *nexthop_fib_nhc(struct nexthop *nh, int nhsel)
                struct nh_group *nh_grp;
 
                nh_grp = rcu_dereference_rtnl(nh->nh_grp);
-               if (nh_grp->mpath) {
+               if (nh_grp->is_multipath) {
                        nh = nexthop_mpath_select(nh_grp, nhsel);
                        if (!nh)
                                return NULL;