+ if (atomic_read(&lpni->lpni_healthv) == value)
+ return;
+ atomic_set(&lpni->lpni_healthv, value);
+ lnet_update_peer_net_healthv(lpni);
+}
+
+static inline bool
+lnet_atomic_add_unless_max(atomic_t *v, int a, int u)
+{
+ int c = atomic_read(v);
+ bool mod = false;
+ int old;
+ int m;
+
+ if (c == u)
+ return mod;
+
+ for (;;) {
+ if (c + a >= u)
+ m = u;
+ else
+ m = c + a;
+ old = atomic_cmpxchg(v, c, m);
+
+ if (old == u)
+ break;
+
+ if (old == c) {
+ mod = true;
+ break;
+ }
+ c = old;
+ }
+
+ return mod;
+}
+
+static inline void
+lnet_inc_lpni_healthv_locked(struct lnet_peer_ni *lpni, int value)
+{
+ /* only adjust the net health if the lpni health value changed */
+ if (lnet_atomic_add_unless_max(&lpni->lpni_healthv, value,
+ LNET_MAX_HEALTH_VALUE))
+ lnet_update_peer_net_healthv(lpni);
+}
+
+static inline void
+lnet_inc_healthv(atomic_t *healthv, int value)
+{
+ lnet_atomic_add_unless_max(healthv, value, LNET_MAX_HEALTH_VALUE);
+}
+
+static inline int
+lnet_get_list_len(struct list_head *list)
+{
+ struct list_head *l;
+ int count = 0;
+
+ list_for_each(l, list)
+ count++;
+
+ return count;