Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b9bbb61c authored by Amir Shehata's avatar Amir Shehata Committed by Greg Kroah-Hartman
Browse files

staging: lustre: Ignore hops if not explicitly set



Since the # of hops is not a mandatory parameter the LU-6060
patch will cause problems to already existing systems since it
changes the behavior by which a route is determined down.

To fix this case the # of hops now defaults to LNET_UNDEFINED_HOPS
if no hop count is specified.

LNET_UNDEFINED_HOPS is defined to ((__u32)-1). When it's printed as
%d, it displays as -1.

__u32 is used through out the call stack for hop count to explicitly
define the size of the hop count and to avoid any sizing issues when
passing data to and from the kernel.

To keep existing behavior both lnet_compare_routes() and LNetDist()
will treat undefined hop count as hop count 1.

When executing the logic in lnet_parse_rc_info() there is no
longer an assumption that the default hop count is 1. If
the hop count is 1 then it must've been explicitly set by
the user.

Signed-off-by: default avatarAmir Shehata <amir.shehata@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-6851
Reviewed-on: http://review.whamcloud.com/15719


Reviewed-by: default avatarOlaf Weber <olaf@sgi.com>
Reviewed-by: default avatarDoug Oucharek <doug.s.oucharek@intel.com>
Reviewed-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5b16d52b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -456,7 +456,7 @@ void lnet_lib_exit(void);
int lnet_notify(lnet_ni_t *ni, lnet_nid_t peer, int alive, unsigned long when);
void lnet_notify_locked(lnet_peer_t *lp, int notifylnd, int alive,
			unsigned long when);
int lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway_nid,
int lnet_add_route(__u32 net, __u32 hops, lnet_nid_t gateway_nid,
		   unsigned int priority);
int lnet_check_routes(void);
int lnet_del_route(__u32 net, lnet_nid_t gw_nid);
+1 −1
Original line number Diff line number Diff line
@@ -371,7 +371,7 @@ typedef struct {
	__u32			 lr_net;	/* remote network number */
	int			 lr_seq;	/* sequence for round-robin */
	unsigned int		 lr_downis;	/* number of down NIs */
	unsigned int		 lr_hops;	/* how far I am */
	__u32			 lr_hops;	/* how far I am */
	unsigned int             lr_priority;	/* route priority */
} lnet_route_t;

+6 −2
Original line number Diff line number Diff line
@@ -664,7 +664,7 @@ lnet_parse_route(char *str, int *im_a_router)
	char *token = str;
	int ntokens = 0;
	int myrc = -1;
	unsigned int hops;
	__u32 hops;
	int got_hops = 0;
	unsigned int priority = 0;

@@ -747,8 +747,12 @@ lnet_parse_route(char *str, int *im_a_router)
		}
	}

	/**
	 * if there are no hops set then we want to flag this value as
	 * unset since hops is an optional parameter
	 */
	if (!got_hops)
		hops = 1;
		hops = LNET_UNDEFINED_HOPS;

	LASSERT(!list_empty(&nets));
	LASSERT(!list_empty(&gateways));
+13 −4
Original line number Diff line number Diff line
@@ -1160,6 +1160,8 @@ lnet_compare_routes(lnet_route_t *r1, lnet_route_t *r2)
{
	lnet_peer_t *p1 = r1->lr_gateway;
	lnet_peer_t *p2 = r2->lr_gateway;
	int r1_hops = (r1->lr_hops == LNET_UNDEFINED_HOPS) ? 1 : r1->lr_hops;
	int r2_hops = (r2->lr_hops == LNET_UNDEFINED_HOPS) ? 1 : r2->lr_hops;

	if (r1->lr_priority < r2->lr_priority)
		return 1;
@@ -1167,10 +1169,10 @@ lnet_compare_routes(lnet_route_t *r1, lnet_route_t *r2)
	if (r1->lr_priority > r2->lr_priority)
		return -1;

	if (r1->lr_hops < r2->lr_hops)
	if (r1_hops < r2_hops)
		return 1;

	if (r1->lr_hops > r2->lr_hops)
	if (r1_hops > r2_hops)
		return -1;

	if (p1->lp_txqnob < p2->lp_txqnob)
@@ -2512,18 +2514,25 @@ LNetDist(lnet_nid_t dstnid, lnet_nid_t *srcnidp, __u32 *orderp)
		if (rnet->lrn_net == dstnet) {
			lnet_route_t *route;
			lnet_route_t *shortest = NULL;
			__u32 shortest_hops = LNET_UNDEFINED_HOPS;
			__u32 route_hops;

			LASSERT(!list_empty(&rnet->lrn_routes));

			list_for_each_entry(route, &rnet->lrn_routes,
					    lr_list) {
				route_hops = route->lr_hops;
				if (route_hops == LNET_UNDEFINED_HOPS)
					route_hops = 1;
				if (!shortest ||
				    route->lr_hops < shortest->lr_hops)
				    route_hops < shortest_hops) {
					shortest = route;
					shortest_hops = route_hops;
				}
			}

			LASSERT(shortest);
			hops = shortest->lr_hops;
			hops = shortest_hops;
			if (srcnidp)
				*srcnidp = shortest->lr_gateway->lp_ni->ni_nid;
			if (orderp)
+3 −3
Original line number Diff line number Diff line
@@ -294,7 +294,7 @@ lnet_add_route_to_rnet(lnet_remotenet_t *rnet, lnet_route_t *route)
}

int
lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway,
lnet_add_route(__u32 net, __u32 hops, lnet_nid_t gateway,
	       unsigned int priority)
{
	struct list_head *e;
@@ -305,7 +305,7 @@ lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway,
	int add_route;
	int rc;

	CDEBUG(D_NET, "Add route: net %s hops %u priority %u gw %s\n",
	CDEBUG(D_NET, "Add route: net %s hops %d priority %u gw %s\n",
	       libcfs_net2str(net), hops, priority, libcfs_nid2str(gateway));

	if (gateway == LNET_NID_ANY ||
@@ -313,7 +313,7 @@ lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway,
	    net == LNET_NIDNET(LNET_NID_ANY) ||
	    LNET_NETTYP(net) == LOLND ||
	    LNET_NIDNET(gateway) == net ||
	    hops < 1 || hops > 255)
	    (hops != LNET_UNDEFINED_HOPS && (hops < 1 || hops > 255)))
		return -EINVAL;

	if (lnet_islocalnet(net))	       /* it's a local network */
Loading