Merge branch 'mlx5_tx_steering' into rdma.git for-next
[linux-block.git] / drivers / infiniband / hw / mlx5 / mlx5_ib.h
index 6fe01d6142aa853eea1b694bb8bea52ef30ccd3b..544b6392359e90a132c72e2b1b7e8f1abaf520ea 100644 (file)
@@ -64,8 +64,6 @@
        dev_warn(&(_dev)->ib_dev.dev, "%s:%d:(pid %d): " format, __func__,     \
                 __LINE__, current->pid, ##arg)
 
-#define field_avail(type, fld, sz) (offsetof(type, fld) +              \
-                                   sizeof(((type *)0)->fld) <= (sz))
 #define MLX5_IB_DEFAULT_UIDX 0xffffff
 #define MLX5_USER_ASSIGNED_UIDX_MASK __mlx5_mask(qpc, user_index)
 
@@ -126,11 +124,27 @@ enum {
 enum mlx5_ib_mmap_type {
        MLX5_IB_MMAP_TYPE_MEMIC = 1,
        MLX5_IB_MMAP_TYPE_VAR = 2,
+       MLX5_IB_MMAP_TYPE_UAR_WC = 3,
+       MLX5_IB_MMAP_TYPE_UAR_NC = 4,
 };
 
-#define MLX5_LOG_SW_ICM_BLOCK_SIZE(dev)                                        \
-       (MLX5_CAP_DEV_MEM(dev, log_sw_icm_alloc_granularity))
-#define MLX5_SW_ICM_BLOCK_SIZE(dev) (1 << MLX5_LOG_SW_ICM_BLOCK_SIZE(dev))
+struct mlx5_bfreg_info {
+       u32 *sys_pages;
+       int num_low_latency_bfregs;
+       unsigned int *count;
+
+       /*
+        * protect bfreg allocation data structs
+        */
+       struct mutex lock;
+       u32 ver;
+       u8 lib_uar_4k : 1;
+       u8 lib_uar_dyn : 1;
+       u32 num_sys_pages;
+       u32 num_static_sys_pages;
+       u32 total_num_bfregs;
+       u32 num_dyn_bfregs;
+};
 
 struct mlx5_ib_ucontext {
        struct ib_ucontext      ibucontext;
@@ -203,6 +217,11 @@ struct mlx5_ib_flow_matcher {
        u8                      match_criteria_enable;
 };
 
+struct mlx5_ib_pp {
+       u16 index;
+       struct mlx5_core_dev *mdev;
+};
+
 struct mlx5_ib_flow_db {
        struct mlx5_ib_flow_prio        prios[MLX5_IB_NUM_FLOW_FT];
        struct mlx5_ib_flow_prio        egress_prios[MLX5_IB_NUM_FLOW_FT];
@@ -618,8 +637,8 @@ struct mlx5_ib_mr {
        struct ib_umem         *umem;
        struct mlx5_shared_mr_info      *smr_info;
        struct list_head        list;
-       int                     order;
-       bool                    allocated_from_cache;
+       unsigned int            order;
+       struct mlx5_cache_ent  *cache_ent;
        int                     npages;
        struct mlx5_ib_dev     *dev;
        u32 out[MLX5_ST_SZ_DW(create_mkey_out)];
@@ -637,6 +656,7 @@ struct mlx5_ib_mr {
 
        /* For ODP and implicit */
        atomic_t                num_deferred_work;
+       wait_queue_head_t       q_deferred_work;
        struct xarray           implicit_children;
        union {
                struct rcu_head rcu;
@@ -700,22 +720,34 @@ struct mlx5_cache_ent {
        u32                     access_mode;
        u32                     page;
 
-       u32                     size;
-       u32                     cur;
+       u8 disabled:1;
+       u8 fill_to_high_water:1;
+
+       /*
+        * - available_mrs is the length of list head, ie the number of MRs
+        *   available for immediate allocation.
+        * - total_mrs is available_mrs plus all in use MRs that could be
+        *   returned to the cache.
+        * - limit is the low water mark for available_mrs, 2* limit is the
+        *   upper water mark.
+        * - pending is the number of MRs currently being created
+        */
+       u32 total_mrs;
+       u32 available_mrs;
+       u32 limit;
+       u32 pending;
+
+       /* Statistics */
        u32                     miss;
-       u32                     limit;
 
        struct mlx5_ib_dev     *dev;
        struct work_struct      work;
        struct delayed_work     dwork;
-       int                     pending;
-       struct completion       compl;
 };
 
 struct mlx5_mr_cache {
        struct workqueue_struct *wq;
        struct mlx5_cache_ent   ent[MAX_MR_CACHE_ENTRIES];
-       int                     stopped;
        struct dentry           *root;
        unsigned long           last_add;
 };
@@ -793,6 +825,7 @@ enum mlx5_ib_dbg_cc_types {
        MLX5_IB_DBG_CC_RP_BYTE_RESET,
        MLX5_IB_DBG_CC_RP_THRESHOLD,
        MLX5_IB_DBG_CC_RP_AI_RATE,
+       MLX5_IB_DBG_CC_RP_MAX_RATE,
        MLX5_IB_DBG_CC_RP_HAI_RATE,
        MLX5_IB_DBG_CC_RP_MIN_DEC_FAC,
        MLX5_IB_DBG_CC_RP_MIN_RATE,
@@ -802,6 +835,7 @@ enum mlx5_ib_dbg_cc_types {
        MLX5_IB_DBG_CC_RP_RATE_REDUCE_MONITOR_PERIOD,
        MLX5_IB_DBG_CC_RP_INITIAL_ALPHA_VALUE,
        MLX5_IB_DBG_CC_RP_GD,
+       MLX5_IB_DBG_CC_NP_MIN_TIME_BETWEEN_CNPS,
        MLX5_IB_DBG_CC_NP_CNP_DSCP,
        MLX5_IB_DBG_CC_NP_CNP_PRIO_MODE,
        MLX5_IB_DBG_CC_NP_CNP_PRIO,
@@ -985,19 +1019,16 @@ struct mlx5_ib_dev {
         */
        struct mutex                    cap_mask_mutex;
        u8                              ib_active:1;
-       u8                              fill_delay:1;
        u8                              is_rep:1;
        u8                              lag_active:1;
        u8                              wc_support:1;
+       u8                              fill_delay;
        struct umr_common               umrc;
        /* sync used page count stats
         */
        struct mlx5_ib_resources        devr;
 
-       /* protect mkey key part */
-       spinlock_t                      mkey_lock;
-       u8                              mkey_key;
-
+       atomic_t                        mkey_var;
        struct mlx5_mr_cache            cache;
        struct timer_list               delay_timer;
        /* Prevents soft lock on massive reg MRs */
@@ -1267,7 +1298,8 @@ int mlx5_ib_get_cqe_size(struct ib_cq *ibcq);
 int mlx5_mr_cache_init(struct mlx5_ib_dev *dev);
 int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev);
 
-struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev, int entry);
+struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev,
+                                      unsigned int entry);
 void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
 int mlx5_mr_cache_invalidate(struct mlx5_ib_mr *mr);
 
@@ -1387,6 +1419,7 @@ int mlx5_ib_fill_stat_entry(struct sk_buff *msg,
 
 extern const struct uapi_definition mlx5_ib_devx_defs[];
 extern const struct uapi_definition mlx5_ib_flow_defs[];
+extern const struct uapi_definition mlx5_ib_qos_defs[];
 
 #if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
 int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user);
@@ -1476,12 +1509,11 @@ static inline int get_qp_user_index(struct mlx5_ib_ucontext *ucontext,
 {
        u8 cqe_version = ucontext->cqe_version;
 
-       if (field_avail(struct mlx5_ib_create_qp, uidx, inlen) &&
-           !cqe_version && (ucmd->uidx == MLX5_IB_DEFAULT_UIDX))
+       if ((offsetofend(typeof(*ucmd), uidx) <= inlen) && !cqe_version &&
+           (ucmd->uidx == MLX5_IB_DEFAULT_UIDX))
                return 0;
 
-       if (!!(field_avail(struct mlx5_ib_create_qp, uidx, inlen) !=
-              !!cqe_version))
+       if ((offsetofend(typeof(*ucmd), uidx) <= inlen) != !!cqe_version)
                return -EINVAL;
 
        return verify_assign_uidx(cqe_version, ucmd->uidx, user_index);
@@ -1494,12 +1526,11 @@ static inline int get_srq_user_index(struct mlx5_ib_ucontext *ucontext,
 {
        u8 cqe_version = ucontext->cqe_version;
 
-       if (field_avail(struct mlx5_ib_create_srq, uidx, inlen) &&
-           !cqe_version && (ucmd->uidx == MLX5_IB_DEFAULT_UIDX))
+       if ((offsetofend(typeof(*ucmd), uidx) <= inlen) && !cqe_version &&
+           (ucmd->uidx == MLX5_IB_DEFAULT_UIDX))
                return 0;
 
-       if (!!(field_avail(struct mlx5_ib_create_srq, uidx, inlen) !=
-              !!cqe_version))
+       if ((offsetofend(typeof(*ucmd), uidx) <= inlen) != !!cqe_version)
                return -EINVAL;
 
        return verify_assign_uidx(cqe_version, ucmd->uidx, user_index);
@@ -1538,7 +1569,9 @@ static inline bool mlx5_ib_can_use_umr(struct mlx5_ib_dev *dev,
            MLX5_CAP_GEN(dev->mdev, umr_modify_atomic_disabled))
                return false;
 
-       if (access_flags & IB_ACCESS_RELAXED_ORDERING)
+       if (access_flags & IB_ACCESS_RELAXED_ORDERING &&
+           (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_write) ||
+            MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read)))
                return false;
 
        return true;