Re: [PATCH libmlx5 V1 6/6] Add always_inline check
On Mon, Dec 7, 2015 at 3:07 PM, Haggai Eranwrote: > On 12/03/2015 06:02 PM, Matan Barak wrote: >> Always inline isn't supported by every compiler. Adding it to >> configure.ac in order to support it only when possible. >> Inline other poll_one data path functions in order to eliminate >> "ifs". >> >> Signed-off-by: Matan Barak >> --- >> configure.ac | 17 + >> src/cq.c | 42 +- >> src/mlx5.h | 6 ++ >> 3 files changed, 52 insertions(+), 13 deletions(-) >> >> diff --git a/configure.ac b/configure.ac >> index fca0b46..50b4f9c 100644 >> --- a/configure.ac >> +++ b/configure.ac >> @@ -65,6 +65,23 @@ AC_CHECK_FUNC(ibv_read_sysfs_file, [], >> AC_MSG_ERROR([ibv_read_sysfs_file() not found. libmlx5 requires >> libibverbs >= 1.0.3.])) >> AC_CHECK_FUNCS(ibv_dontfork_range ibv_dofork_range ibv_register_driver) >> >> +AC_MSG_CHECKING("always inline") > Did you consider using an existing script like AX_GCC_FUNC_ATTRIBUTE [1]? > That's probably better, I'll change. >> +CFLAGS_BAK="$CFLAGS" >> +CFLAGS="$CFLAGS -Werror" >> +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ >> + static inline int f(void) >> + __attribute__((always_inline)); >> + static inline int f(void) >> + { >> + return 1; >> + } >> +]],[[ >> + int a = f(); >> + a = a; >> +]])], [AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_ALWAYS_INLINE], [1], [Define if >> __attribute((always_inline)).])] > The description here doesn't look right. How about "Define if > __attribute__((always_inline) is supported"? > If I use AX_GCC_FUNC_ATTRIBUTE, I don't need this anymore. > Regards, > Haggai > > [1] https://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html Thanks for the review. Regards, Matan > -- > To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH libmlx5 V1 6/6] Add always_inline check
On 12/03/2015 06:02 PM, Matan Barak wrote: > Always inline isn't supported by every compiler. Adding it to > configure.ac in order to support it only when possible. > Inline other poll_one data path functions in order to eliminate > "ifs". > > Signed-off-by: Matan Barak> --- > configure.ac | 17 + > src/cq.c | 42 +- > src/mlx5.h | 6 ++ > 3 files changed, 52 insertions(+), 13 deletions(-) > > diff --git a/configure.ac b/configure.ac > index fca0b46..50b4f9c 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -65,6 +65,23 @@ AC_CHECK_FUNC(ibv_read_sysfs_file, [], > AC_MSG_ERROR([ibv_read_sysfs_file() not found. libmlx5 requires > libibverbs >= 1.0.3.])) > AC_CHECK_FUNCS(ibv_dontfork_range ibv_dofork_range ibv_register_driver) > > +AC_MSG_CHECKING("always inline") Did you consider using an existing script like AX_GCC_FUNC_ATTRIBUTE [1]? > +CFLAGS_BAK="$CFLAGS" > +CFLAGS="$CFLAGS -Werror" > +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ > + static inline int f(void) > + __attribute__((always_inline)); > + static inline int f(void) > + { > + return 1; > + } > +]],[[ > + int a = f(); > + a = a; > +]])], [AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_ALWAYS_INLINE], [1], [Define if > __attribute((always_inline)).])] The description here doesn't look right. How about "Define if __attribute__((always_inline) is supported"? Regards, Haggai [1] https://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH libmlx5 V1 6/6] Add always_inline check
Always inline isn't supported by every compiler. Adding it to configure.ac in order to support it only when possible. Inline other poll_one data path functions in order to eliminate "ifs". Signed-off-by: Matan Barak--- configure.ac | 17 + src/cq.c | 42 +- src/mlx5.h | 6 ++ 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/configure.ac b/configure.ac index fca0b46..50b4f9c 100644 --- a/configure.ac +++ b/configure.ac @@ -65,6 +65,23 @@ AC_CHECK_FUNC(ibv_read_sysfs_file, [], AC_MSG_ERROR([ibv_read_sysfs_file() not found. libmlx5 requires libibverbs >= 1.0.3.])) AC_CHECK_FUNCS(ibv_dontfork_range ibv_dofork_range ibv_register_driver) +AC_MSG_CHECKING("always inline") +CFLAGS_BAK="$CFLAGS" +CFLAGS="$CFLAGS -Werror" +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + static inline int f(void) + __attribute__((always_inline)); + static inline int f(void) + { + return 1; + } +]],[[ + int a = f(); + a = a; +]])], [AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_ALWAYS_INLINE], [1], [Define if __attribute((always_inline)).])], +[AC_MSG_RESULT([no])]) +CFLAGS="$CFLAGS_BAK" + dnl Now check if for libibverbs 1.0 vs 1.1 dummy=if$$ cat < $dummy.c diff --git a/src/cq.c b/src/cq.c index fcb4237..41751b7 100644 --- a/src/cq.c +++ b/src/cq.c @@ -218,6 +218,14 @@ static inline void handle_good_req_ex(struct ibv_wc_ex *wc_ex, uint64_t wc_flags_yes, uint64_t wc_flags_no, uint32_t qpn, uint64_t *wc_flags_out) + ALWAYS_INLINE; +static inline void handle_good_req_ex(struct ibv_wc_ex *wc_ex, + union wc_buffer *pwc_buffer, + struct mlx5_cqe64 *cqe, + uint64_t wc_flags, + uint64_t wc_flags_yes, + uint64_t wc_flags_no, + uint32_t qpn, uint64_t *wc_flags_out) { union wc_buffer wc_buffer = *pwc_buffer; @@ -367,6 +375,14 @@ static inline int handle_responder_ex(struct ibv_wc_ex *wc_ex, uint64_t wc_flags, uint64_t wc_flags_yes, uint64_t wc_flags_no, uint32_t qpn, uint64_t *wc_flags_out) + ALWAYS_INLINE; +static inline int handle_responder_ex(struct ibv_wc_ex *wc_ex, + union wc_buffer *pwc_buffer, + struct mlx5_cqe64 *cqe, + struct mlx5_qp *qp, struct mlx5_srq *srq, + uint64_t wc_flags, uint64_t wc_flags_yes, + uint64_t wc_flags_no, uint32_t qpn, + uint64_t *wc_flags_out) { uint16_t wqe_ctr; struct mlx5_wq *wq; @@ -573,7 +589,7 @@ static void mlx5_get_cycles(uint64_t *cycles) static inline struct mlx5_qp *get_req_context(struct mlx5_context *mctx, struct mlx5_resource **cur_rsc, uint32_t rsn, int cqe_ver) - __attribute__((always_inline)); + ALWAYS_INLINE; static inline struct mlx5_qp *get_req_context(struct mlx5_context *mctx, struct mlx5_resource **cur_rsc, uint32_t rsn, int cqe_ver) @@ -589,7 +605,7 @@ static inline int get_resp_cxt_v1(struct mlx5_context *mctx, struct mlx5_resource **cur_rsc, struct mlx5_srq **cur_srq, uint32_t uidx, int *is_srq) - __attribute__((always_inline)); + ALWAYS_INLINE; static inline int get_resp_cxt_v1(struct mlx5_context *mctx, struct mlx5_resource **cur_rsc, struct mlx5_srq **cur_srq, @@ -625,7 +641,7 @@ static inline int get_resp_cxt_v1(struct mlx5_context *mctx, static inline int get_resp_ctx(struct mlx5_context *mctx, struct mlx5_resource **cur_rsc, uint32_t qpn) - __attribute__((always_inline)); + ALWAYS_INLINE; static inline int get_resp_ctx(struct mlx5_context *mctx, struct mlx5_resource **cur_rsc, uint32_t qpn) @@ -647,7 +663,7 @@ static inline int get_resp_ctx(struct mlx5_context *mctx, static inline int get_srq_ctx(struct mlx5_context *mctx,