aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYishai Hadas <yishaih@mellanox.com>2016-09-15 15:48:10 +0300
committerDoug Ledford <dledford@redhat.com>2016-09-15 14:16:49 -0400
commit30dd3cf63c4552f80a8b1764634ff216f9197c3c (patch)
treebe83ee81c9158b0c0e5004f21414394dad54c26a
parentd0ac81c60e12276efb0c094761a82bb388bb134b (diff)
Expose RSS related capabilities
Expose RSS related capabilities, it includes: - QP types that support RSS on the device. - Max number of receive work queue indirection tables that could be opened on the device. - Max size of a receive work queue indirection table. - Max number of work queues of receive type that could be opened on the device. - Bit mask of the supported types of hash functions. - Bit mask of the supported RX fields that can participate in the RX hashing. Signed-off-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--examples/devinfo.c24
-rw-r--r--include/infiniband/kern-abi.h10
-rw-r--r--include/infiniband/verbs.h10
-rw-r--r--src/cmd.c19
4 files changed, 63 insertions, 0 deletions
diff --git a/examples/devinfo.c b/examples/devinfo.c
index c497650..1d0c2db 100644
--- a/examples/devinfo.c
+++ b/examples/devinfo.c
@@ -364,6 +364,28 @@ static void print_tso_caps(const struct ibv_tso_caps *caps)
}
}
+static void print_rss_caps(const struct ibv_rss_caps *caps)
+{
+ uint32_t unknown_general_caps = ~(1 << IBV_QPT_RAW_PACKET |
+ 1 << IBV_QPT_UD);
+ printf("\trss_caps:\n");
+ printf("\t\tmax_rwq_indirection_tables:\t\t\t%u\n", caps->max_rwq_indirection_tables);
+ printf("\t\tmax_rwq_indirection_table_size:\t\t\t%u\n", caps->max_rwq_indirection_table_size);
+ printf("\t\trx_hash_function:\t\t\t\t0x%x\n", caps->rx_hash_function);
+ printf("\t\trx_hash_fields_mask:\t\t\t\t0x%" PRIX64 "\n", caps->rx_hash_fields_mask);
+
+ if (caps->supported_qpts) {
+ printf("\t\tsupported_qp:\n");
+ if (ibv_is_qpt_supported(caps->supported_qpts, IBV_QPT_RAW_PACKET))
+ printf("\t\t\t\t\tSUPPORT_RAW_PACKET\n");
+ if (ibv_is_qpt_supported(caps->supported_qpts, IBV_QPT_UD))
+ printf("\t\t\t\t\tSUPPORT_UD\n");
+ if (caps->supported_qpts & unknown_general_caps)
+ printf("\t\t\t\t\tUnknown flags: 0x%" PRIX32 "\n",
+ caps->supported_qpts & unknown_general_caps);
+ }
+}
+
static int print_hca_cap(struct ibv_device *ib_dev, uint8_t ib_port)
{
struct ibv_context *ctx;
@@ -465,6 +487,8 @@ static int print_hca_cap(struct ibv_device *ib_dev, uint8_t ib_port)
printf("\tdevice_cap_flags_ex:\t\t0x%" PRIX64 "\n", device_attr.device_cap_flags_ex);
print_device_cap_flags_ex(device_attr.device_cap_flags_ex);
print_tso_caps(&device_attr.tso_caps);
+ print_rss_caps(&device_attr.rss_caps);
+ printf("\tmax_wq_type_rq:\t\t\t%u\n", device_attr.max_wq_type_rq);
}
for (port = 1; port <= device_attr.orig_attr.phys_port_cnt; ++port) {
diff --git a/include/infiniband/kern-abi.h b/include/infiniband/kern-abi.h
index 9f7964e..381fd50 100644
--- a/include/infiniband/kern-abi.h
+++ b/include/infiniband/kern-abi.h
@@ -271,6 +271,13 @@ struct ibv_odp_caps_resp {
__u32 reserved;
};
+struct ibv_rss_caps_resp {
+ __u32 supported_qpts;
+ __u32 max_rwq_indirection_tables;
+ __u32 max_rwq_indirection_table_size;
+ __u32 reserved;
+};
+
struct ibv_query_device_resp_ex {
struct ibv_query_device_resp base;
__u32 comp_mask;
@@ -279,6 +286,9 @@ struct ibv_query_device_resp_ex {
__u64 timestamp_mask;
__u64 hca_core_clock;
__u64 device_cap_flags_ex;
+ struct ibv_rss_caps_resp rss_caps;
+ __u32 max_wq_type_rq;
+ __u32 reserved;
};
struct ibv_query_port {
diff --git a/include/infiniband/verbs.h b/include/infiniband/verbs.h
index eab5d1b..e994c21 100644
--- a/include/infiniband/verbs.h
+++ b/include/infiniband/verbs.h
@@ -238,6 +238,14 @@ enum ibv_rx_hash_fields {
IBV_RX_HASH_DST_PORT_UDP = 1 << 7
};
+struct ibv_rss_caps {
+ uint32_t supported_qpts;
+ uint32_t max_rwq_indirection_tables;
+ uint32_t max_rwq_indirection_table_size;
+ uint64_t rx_hash_fields_mask; /* enum ibv_rx_hash_fields */
+ uint8_t rx_hash_function; /* enum ibv_rx_hash_function_flags */
+};
+
struct ibv_device_attr_ex {
struct ibv_device_attr orig_attr;
uint32_t comp_mask;
@@ -246,6 +254,8 @@ struct ibv_device_attr_ex {
uint64_t hca_core_clock;
uint64_t device_cap_flags_ex;
struct ibv_tso_caps tso_caps;
+ struct ibv_rss_caps rss_caps;
+ uint32_t max_wq_type_rq;
};
enum ibv_mtu {
diff --git a/src/cmd.c b/src/cmd.c
index 21f972a..11f6509 100644
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -213,6 +213,25 @@ int ibv_cmd_query_device_ex(struct ibv_context *context,
attr->device_cap_flags_ex = resp->device_cap_flags_ex;
}
+ if (attr_size >= offsetof(struct ibv_device_attr_ex, rss_caps) +
+ sizeof(attr->rss_caps)) {
+ if (resp->response_length >=
+ offsetof(struct ibv_query_device_resp_ex, rss_caps) +
+ sizeof(resp->rss_caps)) {
+ attr->rss_caps.supported_qpts = resp->rss_caps.supported_qpts;
+ attr->rss_caps.max_rwq_indirection_tables = resp->rss_caps.max_rwq_indirection_tables;
+ attr->rss_caps.max_rwq_indirection_table_size = resp->rss_caps.max_rwq_indirection_table_size;
+ }
+ }
+
+ if (attr_size >= offsetof(struct ibv_device_attr_ex, max_wq_type_rq) +
+ sizeof(attr->max_wq_type_rq)) {
+ if (resp->response_length >=
+ offsetof(struct ibv_query_device_resp_ex, max_wq_type_rq) +
+ sizeof(resp->max_wq_type_rq))
+ attr->max_wq_type_rq = resp->max_wq_type_rq;
+ }
+
return 0;
}