diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index 4477755..9a66ed5 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -239,6 +239,17 @@ struct mlx5_dev_spawn_data {
 		.free = rte_free,
 		.type = "mlx5_port_id_ipool",
 	},
+	{
+		.size = sizeof(struct mlx5_flow_tbl_data_entry),
+		.trunk_size = 64,
+		.grow_trunk = 3,
+		.grow_shift = 2,
+		.need_lock = 0,
+		.release_mem_en = 1,
+		.malloc = rte_malloc_socket,
+		.free = rte_free,
+		.type = "mlx5_jump_ipool",
+	},
 };
 
 
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 5f38587..2a05c09 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -56,6 +56,7 @@ enum mlx5_ipool_index {
 	MLX5_IPOOL_PUSH_VLAN, /* Pool for push vlan resource. */
 	MLX5_IPOOL_TAG, /* Pool for tag resource. */
 	MLX5_IPOOL_PORT_ID, /* Pool for port id resource. */
+	MLX5_IPOOL_JUMP, /* Pool for jump resource. */
 	MLX5_IPOOL_MAX,
 };
 
diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
index 5cd9d67..ce7e929 100644
--- a/drivers/net/mlx5/mlx5_flow.h
+++ b/drivers/net/mlx5/mlx5_flow.h
@@ -463,6 +463,7 @@ struct mlx5_flow_tbl_data_entry {
 	/**< matchers' header associated with the flow table. */
 	struct mlx5_flow_dv_jump_tbl_resource jump;
 	/**< jump resource, at most one for each table created. */
+	uint32_t idx; /**< index for the indexed mempool. */
 };
 
 /* Verbs specification header. */
@@ -487,10 +488,10 @@ struct mlx5_flow_handle_dv {
 	/**< Index to encap/decap resource in cache. */
 	struct mlx5_flow_dv_modify_hdr_resource *modify_hdr;
 	/**< Pointer to modify header resource in cache. */
-	struct mlx5_flow_dv_jump_tbl_resource *jump;
-	/**< Pointer to the jump action resource. */
+	uint32_t jump;
+	/**< Index to the jump action resource. */
 	uint32_t port_id_action;
-	/**< Pointer to port ID action resource. */
+	/**< Index to port ID action resource. */
 	struct mlx5_vf_vlan vf_vlan;
 	/**< Structure for VF VLAN workaround. */
 	uint32_t push_vlan_res;
@@ -549,9 +550,11 @@ struct mlx5_flow_dv_workspace {
 	struct mlx5_flow_dv_push_vlan_action_resource *push_vlan_res;
 	/**< Pointer to push VLAN action resource in cache. */
 	struct mlx5_flow_dv_tag_resource *tag_resource;
+	/**< pointer to the tag action. */
 	struct mlx5_flow_dv_port_id_action_resource *port_id_action;
 	/**< Pointer to port ID action resource. */
-	/**< pointer to the tag action. */
+	struct mlx5_flow_dv_jump_tbl_resource *jump;
+	/**< Pointer to the jump action resource. */
 	struct mlx5_flow_dv_match_params value;
 	/**< Holds the value that the packet is compared to. */
 };
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index 49c0a6d..9fe0446 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -2540,7 +2540,8 @@ struct field_modify_info modify_tcp[] = {
 			(void *)&tbl_data->jump, cnt);
 	}
 	rte_atomic32_inc(&tbl_data->jump.refcnt);
-	dev_flow->handle->dvh.jump = &tbl_data->jump;
+	dev_flow->handle->dvh.jump = tbl_data->idx;
+	dev_flow->dv.jump = &tbl_data->jump;
 	return 0;
 }
 
@@ -6856,6 +6857,7 @@ struct field_modify_info modify_tcp[] = {
 	struct mlx5_hlist_entry *pos = mlx5_hlist_lookup(sh->flow_tbls,
 							 table_key.v64);
 	struct mlx5_flow_tbl_data_entry *tbl_data;
+	uint32_t idx = 0;
 	int ret;
 	void *domain;
 
@@ -6866,7 +6868,7 @@ struct field_modify_info modify_tcp[] = {
 		rte_atomic32_inc(&tbl->refcnt);
 		return tbl;
 	}
-	tbl_data = rte_zmalloc(NULL, sizeof(*tbl_data), 0);
+	tbl_data = mlx5_ipool_zmalloc(sh->ipool[MLX5_IPOOL_JUMP], &idx);
 	if (!tbl_data) {
 		rte_flow_error_set(error, ENOMEM,
 				   RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
@@ -6874,6 +6876,7 @@ struct field_modify_info modify_tcp[] = {
 				   "cannot allocate flow table data entry");
 		return NULL;
 	}
+	tbl_data->idx = idx;
 	tbl = &tbl_data->tbl;
 	pos = &tbl_data->entry;
 	if (transfer)
@@ -6887,7 +6890,7 @@ struct field_modify_info modify_tcp[] = {
 		rte_flow_error_set(error, ENOMEM,
 				   RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
 				   NULL, "cannot create flow table object");
-		rte_free(tbl_data);
+		mlx5_ipool_free(sh->ipool[MLX5_IPOOL_JUMP], idx);
 		return NULL;
 	}
 	/*
@@ -6904,7 +6907,7 @@ struct field_modify_info modify_tcp[] = {
 				   RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
 				   "cannot insert flow table data entry");
 		mlx5_glue->dr_destroy_flow_tbl(tbl->obj);
-		rte_free(tbl_data);
+		mlx5_ipool_free(sh->ipool[MLX5_IPOOL_JUMP], idx);
 	}
 	rte_atomic32_inc(&tbl->refcnt);
 	return tbl;
@@ -6939,7 +6942,8 @@ struct field_modify_info modify_tcp[] = {
 		tbl->obj = NULL;
 		/* remove the entry from the hash list and free memory. */
 		mlx5_hlist_remove(sh->flow_tbls, pos);
-		rte_free(tbl_data);
+		mlx5_ipool_free(priv->sh->ipool[MLX5_IPOOL_JUMP],
+				tbl_data->idx);
 		return 0;
 	}
 	return 1;
@@ -7673,7 +7677,7 @@ struct field_modify_info modify_tcp[] = {
 						 "cannot create jump action.");
 			}
 			dev_flow->dv.actions[actions_n++] =
-					handle->dvh.jump->action;
+					dev_flow->dv.jump->action;
 			action_flags |= MLX5_FLOW_ACTION_JUMP;
 			break;
 		case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC:
@@ -8248,12 +8252,15 @@ struct field_modify_info modify_tcp[] = {
 flow_dv_jump_tbl_resource_release(struct rte_eth_dev *dev,
 				  struct mlx5_flow_handle *handle)
 {
-	struct mlx5_flow_dv_jump_tbl_resource *cache_resource =
-							handle->dvh.jump;
-	struct mlx5_flow_tbl_data_entry *tbl_data =
-			container_of(cache_resource,
-				     struct mlx5_flow_tbl_data_entry, jump);
+	struct mlx5_priv *priv = dev->data->dev_private;
+	struct mlx5_flow_dv_jump_tbl_resource *cache_resource;
+	struct mlx5_flow_tbl_data_entry *tbl_data;
 
+	tbl_data = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_JUMP],
+			     handle->dvh.jump);
+	if (!tbl_data)
+		return 0;
+	cache_resource = &tbl_data->jump;
 	MLX5_ASSERT(cache_resource->action);
 	DRV_LOG(DEBUG, "jump table resource %p: refcnt %d--",
 		(void *)cache_resource,
