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

Commit e75fb87f authored by Doug Oucharek's avatar Doug Oucharek Committed by Greg Kroah-Hartman
Browse files

staging/lustre/lnet: Add LNet Router Priority parameter

This change adds a priority parameter to the route module settings.
This paramter can be >= 0. Like hops, the lower the prioirty number
the higher the priority.  So lower numbered priorities will be
selected over higher numbers.

Lustre-change: http://review.whamcloud.com/5663
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-2934


Signed-off-by: default avatarDoug Oucharek <doug.s.oucharek@intel.com>
Reviewed-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Reviewed-by: default avatarAmir Shehata <amir.shehata@intel.com>
Reviewed-by: default avatarIsaac Huang <he.huang@intel.com>
Reviewed-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarPeng Tao <bergwolf@gmail.com>
Signed-off-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 32d3b6de
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ struct libcfs_ioctl_data {
	char ioc_bulk[0];
};

#define ioc_priority ioc_u32[0]

struct libcfs_ioctl_hdr {
	__u32 ioc_len;
+3 −2
Original line number Diff line number Diff line
@@ -650,12 +650,13 @@ extern lnet_ni_t *lnet_net2ni(__u32 net);

int lnet_notify(lnet_ni_t *ni, lnet_nid_t peer, int alive, cfs_time_t when);
void lnet_notify_locked(lnet_peer_t *lp, int notifylnd, int alive, cfs_time_t when);
int lnet_add_route(__u32 net, unsigned int hops, lnet_nid_t gateway_nid);
int lnet_add_route(__u32 net, unsigned int 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);
void lnet_destroy_routes(void);
int lnet_get_route(int idx, __u32 *net, __u32 *hops,
		   lnet_nid_t *gateway, __u32 *alive);
		   lnet_nid_t *gateway, __u32 *alive, __u32 *priority);
void lnet_proc_init(void);
void lnet_proc_fini(void);
int  lnet_rtrpools_alloc(int im_a_router);
+1 −1
Original line number Diff line number Diff line
@@ -478,7 +478,6 @@ typedef struct lnet_peer {
	lnet_rc_data_t		*lp_rcd;	/* router checker state */
} lnet_peer_t;


/* peer hash size */
#define LNET_PEER_HASH_BITS     9
#define LNET_PEER_HASH_SIZE     (1 << LNET_PEER_HASH_BITS)
@@ -504,6 +503,7 @@ typedef struct {
	int			lr_seq;		/* sequence for round-robin */
	unsigned int		lr_downis;	/* number of down NIs */
	unsigned int		lr_hops;	/* how far I am */
	unsigned int            lr_priority;    /* route priority */
} lnet_route_t;

#define LNET_REMOTE_NETS_HASH_DEFAULT	(1U << 7)
+3 −2
Original line number Diff line number Diff line
@@ -1436,7 +1436,7 @@ LNetCtl(unsigned int cmd, void *arg)

	case IOC_LIBCFS_ADD_ROUTE:
		rc = lnet_add_route(data->ioc_net, data->ioc_count,
				    data->ioc_nid);
				    data->ioc_nid, data->ioc_priority);
		return (rc != 0) ? rc : lnet_check_routes();

	case IOC_LIBCFS_DEL_ROUTE:
@@ -1445,7 +1445,8 @@ LNetCtl(unsigned int cmd, void *arg)
	case IOC_LIBCFS_GET_ROUTE:
		return lnet_get_route(data->ioc_count,
				      &data->ioc_net, &data->ioc_count,
				      &data->ioc_nid, &data->ioc_flags);
				      &data->ioc_nid, &data->ioc_flags,
				      &data->ioc_priority);
	case IOC_LIBCFS_NOTIFY_ROUTER:
		return lnet_notify(NULL, data->ioc_nid, data->ioc_flags,
				   cfs_time_current() -
+38 −1
Original line number Diff line number Diff line
@@ -603,6 +603,37 @@ lnet_parse_hops(char *str, unsigned int *hops)
		*hops > 0 && *hops < 256);
}

#define LNET_PRIORITY_SEPARATOR (':')

int
lnet_parse_priority(char *str, unsigned int *priority, char **token)
{
	int   nob;
	char *sep;
	int   len;

	sep = strchr(str, LNET_PRIORITY_SEPARATOR);
	if (sep == NULL) {
		*priority = 0;
		return 0;
	}
	len = strlen(sep + 1);

	if ((sscanf((sep+1), "%u%n", priority, &nob) < 1) || (len != nob)) {
		/* Update the caller's token pointer so it treats the found
		   priority as the token to report in the error message. */
		*token += sep - str + 1;
		return -1;
	}

	CDEBUG(D_NET, "gateway %s, priority %d, nob %d\n", str, *priority, nob);

	/*
	 * Change priority separator to \0 to be able to parse NID
	 */
	*sep = '\0';
	return 0;
}

int
lnet_parse_route(char *str, int *im_a_router)
@@ -624,6 +655,7 @@ lnet_parse_route(char *str, int *im_a_router)
	int	       myrc = -1;
	unsigned int      hops;
	int	       got_hops = 0;
	unsigned int	  priority = 0;

	INIT_LIST_HEAD(&gateways);
	INIT_LIST_HEAD(&nets);
@@ -691,6 +723,11 @@ lnet_parse_route(char *str, int *im_a_router)
				    LNET_NETTYP(net) == LOLND)
					goto token_error;
			} else {
				rc = lnet_parse_priority(ltb->ltb_text,
							 &priority, &token);
				if (rc < 0)
					goto token_error;

				nid = libcfs_str2nid(ltb->ltb_text);
				if (nid == LNET_NID_ANY ||
				    LNET_NETTYP(LNET_NIDNET(nid)) == LOLND)
@@ -720,7 +757,7 @@ lnet_parse_route(char *str, int *im_a_router)
				continue;
			}

			rc = lnet_add_route(net, hops, nid);
			rc = lnet_add_route(net, hops, nid, priority);
			if (rc != 0) {
				CERROR("Can't create route to %s via %s\n",
				       libcfs_net2str(net),
Loading