@@ -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 <<IBV_VERSION > $dummy.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,
struct mlx5_srq **cur_srq,
uint32_t srqn_uidx)
- __attribute__((always_inline));
+ ALWAYS_INLINE;
static inline int get_srq_ctx(struct mlx5_context *mctx,
struct mlx5_srq **cur_srq,
uint32_t srqn)
@@ -662,7 +678,7 @@ static inline int get_srq_ctx(struct mlx5_context *mctx,
}
static inline void dump_cqe_debug(FILE *fp, struct mlx5_cqe64 *cqe64)
- __attribute__((always_inline));
+ ALWAYS_INLINE;
static inline void dump_cqe_debug(FILE *fp, struct mlx5_cqe64 *cqe64)
{
#ifdef MLX5_DEBUG
@@ -676,7 +692,7 @@ static inline void dump_cqe_debug(FILE *fp, struct mlx5_cqe64 *cqe64)
inline int mlx5_poll_one_cqe_req(struct mlx5_cq *cq,
struct mlx5_resource **cur_rsc,
void *cqe, uint32_t qpn, int cqe_ver,
- uint64_t *wr_id) __attribute__((always_inline));
+ uint64_t *wr_id) ALWAYS_INLINE;
inline int mlx5_poll_one_cqe_req(struct mlx5_cq *cq,
struct mlx5_resource **cur_rsc,
void *cqe, uint32_t qpn, int cqe_ver,
@@ -719,7 +735,7 @@ inline int mlx5_poll_one_cqe_resp(struct mlx5_context *mctx,
struct mlx5_srq **cur_srq,
struct mlx5_cqe64 *cqe64, int cqe_ver,
uint32_t qpn, int *is_srq)
- __attribute__((always_inline));
+ ALWAYS_INLINE;
inline int mlx5_poll_one_cqe_resp(struct mlx5_context *mctx,
struct mlx5_resource **cur_rsc,
struct mlx5_srq **cur_srq,
@@ -750,7 +766,7 @@ inline int mlx5_poll_one_cqe_err(struct mlx5_context *mctx,
uint32_t qpn, uint32_t *pwc_status,
uint32_t *pwc_vendor_err,
uint64_t *pwc_wr_id, uint8_t opcode)
- __attribute__((always_inline));
+ ALWAYS_INLINE;
inline int mlx5_poll_one_cqe_err(struct mlx5_context *mctx,
struct mlx5_resource **cur_rsc,
struct mlx5_srq **cur_srq,
@@ -833,7 +849,7 @@ static inline int mlx5_poll_one(struct mlx5_cq *cq,
struct mlx5_resource **cur_rsc,
struct mlx5_srq **cur_srq,
struct ibv_wc *wc, int cqe_ver)
- __attribute__((always_inline));
+ ALWAYS_INLINE;
static inline int mlx5_poll_one(struct mlx5_cq *cq,
struct mlx5_resource **cur_rsc,
struct mlx5_srq **cur_srq,
@@ -915,7 +931,7 @@ static inline int _mlx5_poll_one_ex(struct mlx5_cq *cq,
uint64_t wc_flags,
uint64_t wc_flags_yes, uint64_t wc_flags_no,
int cqe_ver)
- __attribute__((always_inline));
+ ALWAYS_INLINE;
static inline int _mlx5_poll_one_ex(struct mlx5_cq *cq,
struct mlx5_resource **cur_rsc,
struct mlx5_srq **cur_srq,
@@ -1221,7 +1237,7 @@ int (*mlx5_get_poll_one_fn(uint64_t wc_flags))(struct mlx5_cq *cq,
}
static inline void mlx5_poll_cq_stall_start(struct mlx5_cq *cq)
-__attribute__((always_inline));
+ALWAYS_INLINE;
static inline void mlx5_poll_cq_stall_start(struct mlx5_cq *cq)
{
if (cq->stall_enable) {
@@ -1236,7 +1252,7 @@ static inline void mlx5_poll_cq_stall_start(struct mlx5_cq *cq)
}
static inline void mlx5_poll_cq_stall_end(struct mlx5_cq *cq, int ne,
- int npolled, int err) __attribute__((always_inline));
+ int npolled, int err) ALWAYS_INLINE;
static inline void mlx5_poll_cq_stall_end(struct mlx5_cq *cq, int ne,
int npolled, int err)
{
@@ -1263,7 +1279,7 @@ static inline void mlx5_poll_cq_stall_end(struct mlx5_cq *cq, int ne,
static inline int poll_cq(struct ibv_cq *ibcq, int ne,
struct ibv_wc *wc, int cqe_ver)
- __attribute__((always_inline));
+ ALWAYS_INLINE;
static inline int poll_cq(struct ibv_cq *ibcq, int ne,
struct ibv_wc *wc, int cqe_ver)
{
@@ -114,6 +114,12 @@ enum {
IBV_WC_EX_WITH_COMPLETION_TIMESTAMP
};
+#ifdef HAVE_ALWAYS_INLINE
+#define ALWAYS_INLINE __attribute__((always_inline))
+#else
+#define ALWAYS_INLINE
+#endif
+
enum {
MLX5_IB_MMAP_CMD_SHIFT = 8,
MLX5_IB_MMAP_CMD_MASK = 0xff,
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 <matanb@mellanox.com> --- configure.ac | 17 +++++++++++++++++ src/cq.c | 42 +++++++++++++++++++++++++++++------------- src/mlx5.h | 6 ++++++ 3 files changed, 52 insertions(+), 13 deletions(-)