[lustre-devel] [PATCH 06/24] lustre: lnet: add sanity checks on ping-related constants

James Simmons jsimmons at infradead.org
Sun Oct 14 12:36:51 PDT 2018


> From: Olaf Weber <olaf at sgi.com>
> 
> Add sanity checks for LNet ping related data structures and
> constants to wirecheck.c, and update the generated code in
> lnet_assert_wire_constants().
> 
> In order for the structures and macros to be visible to
> wirecheck.c, which is a userspace program, they were moved
> from kernel-only lnet/lib-types.h to lnet/types.h

Reviewed-by: James Simmons <jsimmons at infradead.org>
 
> WC-bug-id: https://jira.whamcloud.com/browse/LU-9480
> Signed-off-by: Olaf Weber <olaf at sgi.com>
> Reviewed-on: https://review.whamcloud.com/25776
> Reviewed-by: Amir Shehata <amir.shehata at intel.com>
> Tested-by: Amir Shehata <amir.shehata at intel.com>
> Signed-off-by: NeilBrown <neilb at suse.com>
> ---
>  .../staging/lustre/include/linux/lnet/lib-types.h  |   30 ----------------
>  .../lustre/include/uapi/linux/lnet/lnet-types.h    |   30 ++++++++++++++++
>  drivers/staging/lustre/lnet/lnet/api-ni.c          |   38 ++++++++++++++++++++
>  3 files changed, 68 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/staging/lustre/include/linux/lnet/lib-types.h b/drivers/staging/lustre/include/linux/lnet/lib-types.h
> index f4467a3bbfd1..f28fa5342914 100644
> --- a/drivers/staging/lustre/include/linux/lnet/lib-types.h
> +++ b/drivers/staging/lustre/include/linux/lnet/lib-types.h
> @@ -378,36 +378,6 @@ struct lnet_ni {
>  
>  #define LNET_PROTO_PING_MATCHBITS	0x8000000000000000LL
>  
> -/*
> - * NB: value of these features equal to LNET_PROTO_PING_VERSION_x
> - * of old LNet, so there shouldn't be any compatibility issue
> - */
> -#define LNET_PING_FEAT_INVAL		(0)		/* no feature */
> -#define LNET_PING_FEAT_BASE		BIT(0)	/* just a ping */
> -#define LNET_PING_FEAT_NI_STATUS	BIT(1)	/* return NI status */
> -#define LNET_PING_FEAT_RTE_DISABLED	BIT(2)	/* Routing enabled */
> -#define LNET_PING_FEAT_MULTI_RAIL	BIT(3)	/* Multi-Rail aware */
> -#define LNET_PING_FEAT_DISCOVERY	BIT(4)	/* Supports Discovery */
> -
> -/*
> - * All ping feature bits fit to hit the wire.
> - * In lnet_assert_wire_constants() this is compared against its open-coded
> - * value, and in lnet_ping_target_update() it is used to verify that no
> - * unknown bits have been set.
> - * New feature bits can be added, just be aware that this does change the
> - * over-the-wire protocol.
> - */
> -#define LNET_PING_FEAT_BITS		(LNET_PING_FEAT_BASE | \
> -					 LNET_PING_FEAT_NI_STATUS | \
> -					 LNET_PING_FEAT_RTE_DISABLED | \
> -					 LNET_PING_FEAT_MULTI_RAIL | \
> -					 LNET_PING_FEAT_DISCOVERY)
> -
> -#define LNET_PING_INFO_SIZE(NNIDS) \
> -	offsetof(struct lnet_ping_info, pi_ni[NNIDS])
> -#define LNET_PING_INFO_LONI(PINFO)	((PINFO)->pi_ni[0].ns_nid)
> -#define LNET_PING_INFO_SEQNO(PINFO)	((PINFO)->pi_ni[0].ns_status)
> -
>  /*
>   * Descriptor of a ping info buffer: keep a separate indicator of the
>   * size and a reference count. The type is used both as a source and
> diff --git a/drivers/staging/lustre/include/uapi/linux/lnet/lnet-types.h b/drivers/staging/lustre/include/uapi/linux/lnet/lnet-types.h
> index 6ee60d07ff84..e0e4fd259795 100644
> --- a/drivers/staging/lustre/include/uapi/linux/lnet/lnet-types.h
> +++ b/drivers/staging/lustre/include/uapi/linux/lnet/lnet-types.h
> @@ -190,6 +190,31 @@ struct lnet_hdr {
>  	} msg;
>  } __packed;
>  
> +/*
> + * NB: value of these features equal to LNET_PROTO_PING_VERSION_x
> + * of old LNet, so there shouldn't be any compatibility issue
> + */
> +#define LNET_PING_FEAT_INVAL		(0)		/* no feature */
> +#define LNET_PING_FEAT_BASE		(1 << 0)	/* just a ping */
> +#define LNET_PING_FEAT_NI_STATUS	(1 << 1)	/* return NI status */
> +#define LNET_PING_FEAT_RTE_DISABLED	(1 << 2)	/* Routing enabled */
> +#define LNET_PING_FEAT_MULTI_RAIL	(1 << 3)	/* Multi-Rail aware */
> +#define LNET_PING_FEAT_DISCOVERY	(1 << 4)	/* Supports Discovery */
> +
> +/*
> + * All ping feature bits fit to hit the wire.
> + * In lnet_assert_wire_constants() this is compared against its open-coded
> + * value, and in lnet_ping_target_update() it is used to verify that no
> + * unknown bits have been set.
> + * New feature bits can be added, just be aware that this does change the
> + * over-the-wire protocol.
> + */
> +#define LNET_PING_FEAT_BITS		(LNET_PING_FEAT_BASE | \
> +					 LNET_PING_FEAT_NI_STATUS | \
> +					 LNET_PING_FEAT_RTE_DISABLED | \
> +					 LNET_PING_FEAT_MULTI_RAIL | \
> +					 LNET_PING_FEAT_DISCOVERY)
> +
>  /*
>   * A HELLO message contains a magic number and protocol version
>   * code in the header's dest_nid, the peer's NID in the src_nid, and
> @@ -246,6 +271,11 @@ struct lnet_ping_info {
>  	struct lnet_ni_status	pi_ni[0];
>  } __packed;
>  
> +#define LNET_PING_INFO_SIZE(NNIDS) \
> +	offsetof(struct lnet_ping_info, pi_ni[NNIDS])
> +#define LNET_PING_INFO_LONI(PINFO)	((PINFO)->pi_ni[0].ns_nid)
> +#define LNET_PING_INFO_SEQNO(PINFO)	((PINFO)->pi_ni[0].ns_status)
> +
>  struct lnet_counters {
>  	__u32	msgs_alloc;
>  	__u32	msgs_max;
> diff --git a/drivers/staging/lustre/lnet/lnet/api-ni.c b/drivers/staging/lustre/lnet/lnet/api-ni.c
> index 68af723bc6a1..d81501f4c282 100644
> --- a/drivers/staging/lustre/lnet/lnet/api-ni.c
> +++ b/drivers/staging/lustre/lnet/lnet/api-ni.c
> @@ -313,6 +313,44 @@ static void lnet_assert_wire_constants(void)
>  	BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.hello.incarnation) != 8);
>  	BUILD_BUG_ON((int)offsetof(struct lnet_hdr, msg.hello.type) != 40);
>  	BUILD_BUG_ON((int)sizeof(((struct lnet_hdr *)0)->msg.hello.type) != 4);
> +
> +	/* Checks for struct lnet_ni_status and related constants */
> +	BUILD_BUG_ON(LNET_NI_STATUS_INVALID != 0x00000000);
> +	BUILD_BUG_ON(LNET_NI_STATUS_UP != 0x15aac0de);
> +	BUILD_BUG_ON(LNET_NI_STATUS_DOWN != 0xdeadface);
> +
> +	/* Checks for struct lnet_ni_status */
> +	BUILD_BUG_ON((int)sizeof(struct lnet_ni_status) != 16);
> +	BUILD_BUG_ON((int)offsetof(struct lnet_ni_status, ns_nid) != 0);
> +	BUILD_BUG_ON((int)sizeof(((struct lnet_ni_status *)0)->ns_nid) != 8);
> +	BUILD_BUG_ON((int)offsetof(struct lnet_ni_status, ns_status) != 8);
> +	BUILD_BUG_ON((int)sizeof(((struct lnet_ni_status *)0)->ns_status) != 4);
> +	BUILD_BUG_ON((int)offsetof(struct lnet_ni_status, ns_unused) != 12);
> +	BUILD_BUG_ON((int)sizeof(((struct lnet_ni_status *)0)->ns_unused) != 4);
> +
> +	/* Checks for struct lnet_ping_info and related constants */
> +	BUILD_BUG_ON(LNET_PROTO_PING_MAGIC != 0x70696E67);
> +	BUILD_BUG_ON(LNET_PING_FEAT_INVAL != 0);
> +	BUILD_BUG_ON(LNET_PING_FEAT_BASE != 1);
> +	BUILD_BUG_ON(LNET_PING_FEAT_NI_STATUS != 2);
> +	BUILD_BUG_ON(LNET_PING_FEAT_RTE_DISABLED != 4);
> +	BUILD_BUG_ON(LNET_PING_FEAT_MULTI_RAIL != 8);
> +	BUILD_BUG_ON(LNET_PING_FEAT_DISCOVERY != 16);
> +	BUILD_BUG_ON(LNET_PING_FEAT_BITS != 31);
> +
> +	/* Checks for struct lnet_ping_info */
> +	BUILD_BUG_ON((int)sizeof(struct lnet_ping_info) != 16);
> +	BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_magic) != 0);
> +	BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_magic) != 4);
> +	BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_features) != 4);
> +	BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_features)
> +		     != 4);
> +	BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_pid) != 8);
> +	BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_pid) != 4);
> +	BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_nnis) != 12);
> +	BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_nnis) != 4);
> +	BUILD_BUG_ON((int)offsetof(struct lnet_ping_info, pi_ni) != 16);
> +	BUILD_BUG_ON((int)sizeof(((struct lnet_ping_info *)0)->pi_ni) != 0);
>  }
>  
>  static struct lnet_lnd *
> 
> 
> 


More information about the lustre-devel mailing list