Skip to content

Commit e0ffbd3

Browse files
committed
Merge branch 'ena-dynamic-queue-sizes'
Sameeh Jubran says: ==================== Support for dynamic queue size changes This patchset introduces the following: * add new admin command for supporting different queue size for Tx/Rx * add support for Tx/Rx queues size modification through ethtool * allow queues allocation backoff when low on memory * update driver version Difference from v2: * Dropped superfluous range checks which are already done in ethtool. [patch 5/7] * Dropped inline keyword from function. [patch 4/7] * Added a new patch which drops inline keyword all *.c files. [patch 6/7] Difference from v1: * Changed ena_update_queue_sizes() signature to use u32 instead of int type for the size arguments. [patch 5/7] ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents f2dec9a + dbbc6e6 commit e0ffbd3

File tree

7 files changed

+403
-143
lines changed

7 files changed

+403
-143
lines changed

drivers/net/ethernet/amazon/ena/ena_admin_defs.h

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ enum ena_admin_aq_feature_id {
6464
ENA_ADMIN_LLQ = 4,
6565
ENA_ADMIN_EXTRA_PROPERTIES_STRINGS = 5,
6666
ENA_ADMIN_EXTRA_PROPERTIES_FLAGS = 6,
67+
ENA_ADMIN_MAX_QUEUES_EXT = 7,
6768
ENA_ADMIN_RSS_HASH_FUNCTION = 10,
6869
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG = 11,
6970
ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG = 12,
@@ -425,7 +426,13 @@ struct ena_admin_get_set_feature_common_desc {
425426
/* as appears in ena_admin_aq_feature_id */
426427
u8 feature_id;
427428

428-
u16 reserved16;
429+
/* The driver specifies the max feature version it supports and the
430+
* device responds with the currently supported feature version. The
431+
* field is zero based
432+
*/
433+
u8 feature_version;
434+
435+
u8 reserved8;
429436
};
430437

431438
struct ena_admin_device_attr_feature_desc {
@@ -535,6 +542,34 @@ struct ena_admin_feature_llq_desc {
535542
u32 max_tx_burst_size;
536543
};
537544

545+
struct ena_admin_queue_ext_feature_fields {
546+
u32 max_tx_sq_num;
547+
548+
u32 max_tx_cq_num;
549+
550+
u32 max_rx_sq_num;
551+
552+
u32 max_rx_cq_num;
553+
554+
u32 max_tx_sq_depth;
555+
556+
u32 max_tx_cq_depth;
557+
558+
u32 max_rx_sq_depth;
559+
560+
u32 max_rx_cq_depth;
561+
562+
u32 max_tx_header_size;
563+
564+
/* Maximum Descriptors number, including meta descriptor, allowed for
565+
* a single Tx packet
566+
*/
567+
u16 max_per_packet_tx_descs;
568+
569+
/* Maximum Descriptors number allowed for a single Rx packet */
570+
u16 max_per_packet_rx_descs;
571+
};
572+
538573
struct ena_admin_queue_feature_desc {
539574
u32 max_sq_num;
540575

@@ -849,6 +884,19 @@ struct ena_admin_get_feat_cmd {
849884
u32 raw[11];
850885
};
851886

887+
struct ena_admin_queue_ext_feature_desc {
888+
/* version */
889+
u8 version;
890+
891+
u8 reserved1[3];
892+
893+
union {
894+
struct ena_admin_queue_ext_feature_fields max_queue_ext;
895+
896+
u32 raw[10];
897+
};
898+
};
899+
852900
struct ena_admin_get_feat_resp {
853901
struct ena_admin_acq_common_desc acq_common_desc;
854902

@@ -861,6 +909,8 @@ struct ena_admin_get_feat_resp {
861909

862910
struct ena_admin_queue_feature_desc max_queue;
863911

912+
struct ena_admin_queue_ext_feature_desc max_queue_ext;
913+
864914
struct ena_admin_feature_aenq_desc aenq;
865915

866916
struct ena_admin_get_feature_link_desc link;
@@ -929,7 +979,9 @@ struct ena_admin_aenq_common_desc {
929979

930980
u16 syndrom;
931981

932-
/* 0 : phase */
982+
/* 0 : phase
983+
* 7:1 : reserved - MBZ
984+
*/
933985
u8 flags;
934986

935987
u8 reserved1[3];

drivers/net/ethernet/amazon/ena/ena_com.c

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ struct ena_com_stats_ctx {
9191
struct ena_admin_acq_get_stats_resp get_resp;
9292
};
9393

94-
static inline int ena_com_mem_addr_set(struct ena_com_dev *ena_dev,
94+
static int ena_com_mem_addr_set(struct ena_com_dev *ena_dev,
9595
struct ena_common_mem_addr *ena_addr,
9696
dma_addr_t addr)
9797
{
@@ -190,7 +190,7 @@ static int ena_com_admin_init_aenq(struct ena_com_dev *dev,
190190
return 0;
191191
}
192192

193-
static inline void comp_ctxt_release(struct ena_com_admin_queue *queue,
193+
static void comp_ctxt_release(struct ena_com_admin_queue *queue,
194194
struct ena_comp_ctx *comp_ctx)
195195
{
196196
comp_ctx->occupied = false;
@@ -277,7 +277,7 @@ static struct ena_comp_ctx *__ena_com_submit_admin_cmd(struct ena_com_admin_queu
277277
return comp_ctx;
278278
}
279279

280-
static inline int ena_com_init_comp_ctxt(struct ena_com_admin_queue *queue)
280+
static int ena_com_init_comp_ctxt(struct ena_com_admin_queue *queue)
281281
{
282282
size_t size = queue->q_depth * sizeof(struct ena_comp_ctx);
283283
struct ena_comp_ctx *comp_ctx;
@@ -978,7 +978,8 @@ static int ena_com_get_feature_ex(struct ena_com_dev *ena_dev,
978978
struct ena_admin_get_feat_resp *get_resp,
979979
enum ena_admin_aq_feature_id feature_id,
980980
dma_addr_t control_buf_dma_addr,
981-
u32 control_buff_size)
981+
u32 control_buff_size,
982+
u8 feature_ver)
982983
{
983984
struct ena_com_admin_queue *admin_queue;
984985
struct ena_admin_get_feat_cmd get_cmd;
@@ -1009,7 +1010,7 @@ static int ena_com_get_feature_ex(struct ena_com_dev *ena_dev,
10091010
}
10101011

10111012
get_cmd.control_buffer.length = control_buff_size;
1012-
1013+
get_cmd.feat_common.feature_version = feature_ver;
10131014
get_cmd.feat_common.feature_id = feature_id;
10141015

10151016
ret = ena_com_execute_admin_command(admin_queue,
@@ -1029,13 +1030,15 @@ static int ena_com_get_feature_ex(struct ena_com_dev *ena_dev,
10291030

10301031
static int ena_com_get_feature(struct ena_com_dev *ena_dev,
10311032
struct ena_admin_get_feat_resp *get_resp,
1032-
enum ena_admin_aq_feature_id feature_id)
1033+
enum ena_admin_aq_feature_id feature_id,
1034+
u8 feature_ver)
10331035
{
10341036
return ena_com_get_feature_ex(ena_dev,
10351037
get_resp,
10361038
feature_id,
10371039
0,
1038-
0);
1040+
0,
1041+
feature_ver);
10391042
}
10401043

10411044
static int ena_com_hash_key_allocate(struct ena_com_dev *ena_dev)
@@ -1095,7 +1098,7 @@ static int ena_com_indirect_table_allocate(struct ena_com_dev *ena_dev,
10951098
int ret;
10961099

10971100
ret = ena_com_get_feature(ena_dev, &get_resp,
1098-
ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG);
1101+
ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG, 0);
10991102
if (unlikely(ret))
11001103
return ret;
11011104

@@ -1515,7 +1518,7 @@ int ena_com_set_aenq_config(struct ena_com_dev *ena_dev, u32 groups_flag)
15151518
struct ena_admin_get_feat_resp get_resp;
15161519
int ret;
15171520

1518-
ret = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_AENQ_CONFIG);
1521+
ret = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_AENQ_CONFIG, 0);
15191522
if (ret) {
15201523
pr_info("Can't get aenq configuration\n");
15211524
return ret;
@@ -1890,7 +1893,7 @@ void ena_com_destroy_io_queue(struct ena_com_dev *ena_dev, u16 qid)
18901893
int ena_com_get_link_params(struct ena_com_dev *ena_dev,
18911894
struct ena_admin_get_feat_resp *resp)
18921895
{
1893-
return ena_com_get_feature(ena_dev, resp, ENA_ADMIN_LINK_CONFIG);
1896+
return ena_com_get_feature(ena_dev, resp, ENA_ADMIN_LINK_CONFIG, 0);
18941897
}
18951898

18961899
int ena_com_extra_properties_strings_init(struct ena_com_dev *ena_dev)
@@ -1916,7 +1919,7 @@ int ena_com_extra_properties_strings_init(struct ena_com_dev *ena_dev)
19161919
rc = ena_com_get_feature_ex(ena_dev, &resp,
19171920
ENA_ADMIN_EXTRA_PROPERTIES_STRINGS,
19181921
extra_properties_strings->dma_addr,
1919-
extra_properties_strings->size);
1922+
extra_properties_strings->size, 0);
19201923
if (rc) {
19211924
pr_debug("Failed to get extra properties strings\n");
19221925
goto err;
@@ -1946,7 +1949,7 @@ int ena_com_get_extra_properties_flags(struct ena_com_dev *ena_dev,
19461949
struct ena_admin_get_feat_resp *resp)
19471950
{
19481951
return ena_com_get_feature(ena_dev, resp,
1949-
ENA_ADMIN_EXTRA_PROPERTIES_FLAGS);
1952+
ENA_ADMIN_EXTRA_PROPERTIES_FLAGS, 0);
19501953
}
19511954

19521955
int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
@@ -1956,33 +1959,50 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
19561959
int rc;
19571960

19581961
rc = ena_com_get_feature(ena_dev, &get_resp,
1959-
ENA_ADMIN_DEVICE_ATTRIBUTES);
1962+
ENA_ADMIN_DEVICE_ATTRIBUTES, 0);
19601963
if (rc)
19611964
return rc;
19621965

19631966
memcpy(&get_feat_ctx->dev_attr, &get_resp.u.dev_attr,
19641967
sizeof(get_resp.u.dev_attr));
19651968
ena_dev->supported_features = get_resp.u.dev_attr.supported_features;
19661969

1967-
rc = ena_com_get_feature(ena_dev, &get_resp,
1968-
ENA_ADMIN_MAX_QUEUES_NUM);
1969-
if (rc)
1970-
return rc;
1970+
if (ena_dev->supported_features & BIT(ENA_ADMIN_MAX_QUEUES_EXT)) {
1971+
rc = ena_com_get_feature(ena_dev, &get_resp,
1972+
ENA_ADMIN_MAX_QUEUES_EXT,
1973+
ENA_FEATURE_MAX_QUEUE_EXT_VER);
1974+
if (rc)
1975+
return rc;
19711976

1972-
memcpy(&get_feat_ctx->max_queues, &get_resp.u.max_queue,
1973-
sizeof(get_resp.u.max_queue));
1974-
ena_dev->tx_max_header_size = get_resp.u.max_queue.max_header_size;
1977+
if (get_resp.u.max_queue_ext.version != ENA_FEATURE_MAX_QUEUE_EXT_VER)
1978+
return -EINVAL;
1979+
1980+
memcpy(&get_feat_ctx->max_queue_ext, &get_resp.u.max_queue_ext,
1981+
sizeof(get_resp.u.max_queue_ext));
1982+
ena_dev->tx_max_header_size =
1983+
get_resp.u.max_queue_ext.max_queue_ext.max_tx_header_size;
1984+
} else {
1985+
rc = ena_com_get_feature(ena_dev, &get_resp,
1986+
ENA_ADMIN_MAX_QUEUES_NUM, 0);
1987+
memcpy(&get_feat_ctx->max_queues, &get_resp.u.max_queue,
1988+
sizeof(get_resp.u.max_queue));
1989+
ena_dev->tx_max_header_size =
1990+
get_resp.u.max_queue.max_header_size;
1991+
1992+
if (rc)
1993+
return rc;
1994+
}
19751995

19761996
rc = ena_com_get_feature(ena_dev, &get_resp,
1977-
ENA_ADMIN_AENQ_CONFIG);
1997+
ENA_ADMIN_AENQ_CONFIG, 0);
19781998
if (rc)
19791999
return rc;
19802000

19812001
memcpy(&get_feat_ctx->aenq, &get_resp.u.aenq,
19822002
sizeof(get_resp.u.aenq));
19832003

19842004
rc = ena_com_get_feature(ena_dev, &get_resp,
1985-
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG);
2005+
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG, 0);
19862006
if (rc)
19872007
return rc;
19882008

@@ -1992,7 +2012,7 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
19922012
/* Driver hints isn't mandatory admin command. So in case the
19932013
* command isn't supported set driver hints to 0
19942014
*/
1995-
rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_HW_HINTS);
2015+
rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_HW_HINTS, 0);
19962016

19972017
if (!rc)
19982018
memcpy(&get_feat_ctx->hw_hints, &get_resp.u.hw_hints,
@@ -2003,7 +2023,7 @@ int ena_com_get_dev_attr_feat(struct ena_com_dev *ena_dev,
20032023
else
20042024
return rc;
20052025

2006-
rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_LLQ);
2026+
rc = ena_com_get_feature(ena_dev, &get_resp, ENA_ADMIN_LLQ, 0);
20072027
if (!rc)
20082028
memcpy(&get_feat_ctx->llq, &get_resp.u.llq,
20092029
sizeof(get_resp.u.llq));
@@ -2240,7 +2260,7 @@ int ena_com_get_offload_settings(struct ena_com_dev *ena_dev,
22402260
struct ena_admin_get_feat_resp resp;
22412261

22422262
ret = ena_com_get_feature(ena_dev, &resp,
2243-
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG);
2263+
ENA_ADMIN_STATELESS_OFFLOAD_CONFIG, 0);
22442264
if (unlikely(ret)) {
22452265
pr_err("Failed to get offload capabilities %d\n", ret);
22462266
return ret;
@@ -2269,7 +2289,7 @@ int ena_com_set_hash_function(struct ena_com_dev *ena_dev)
22692289

22702290
/* Validate hash function is supported */
22712291
ret = ena_com_get_feature(ena_dev, &get_resp,
2272-
ENA_ADMIN_RSS_HASH_FUNCTION);
2292+
ENA_ADMIN_RSS_HASH_FUNCTION, 0);
22732293
if (unlikely(ret))
22742294
return ret;
22752295

@@ -2329,7 +2349,7 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,
23292349
rc = ena_com_get_feature_ex(ena_dev, &get_resp,
23302350
ENA_ADMIN_RSS_HASH_FUNCTION,
23312351
rss->hash_key_dma_addr,
2332-
sizeof(*rss->hash_key));
2352+
sizeof(*rss->hash_key), 0);
23332353
if (unlikely(rc))
23342354
return rc;
23352355

@@ -2381,7 +2401,7 @@ int ena_com_get_hash_function(struct ena_com_dev *ena_dev,
23812401
rc = ena_com_get_feature_ex(ena_dev, &get_resp,
23822402
ENA_ADMIN_RSS_HASH_FUNCTION,
23832403
rss->hash_key_dma_addr,
2384-
sizeof(*rss->hash_key));
2404+
sizeof(*rss->hash_key), 0);
23852405
if (unlikely(rc))
23862406
return rc;
23872407

@@ -2406,7 +2426,7 @@ int ena_com_get_hash_ctrl(struct ena_com_dev *ena_dev,
24062426
rc = ena_com_get_feature_ex(ena_dev, &get_resp,
24072427
ENA_ADMIN_RSS_HASH_INPUT,
24082428
rss->hash_ctrl_dma_addr,
2409-
sizeof(*rss->hash_ctrl));
2429+
sizeof(*rss->hash_ctrl), 0);
24102430
if (unlikely(rc))
24112431
return rc;
24122432

@@ -2642,7 +2662,7 @@ int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl)
26422662
rc = ena_com_get_feature_ex(ena_dev, &get_resp,
26432663
ENA_ADMIN_RSS_REDIRECTION_TABLE_CONFIG,
26442664
rss->rss_ind_tbl_dma_addr,
2645-
tbl_size);
2665+
tbl_size, 0);
26462666
if (unlikely(rc))
26472667
return rc;
26482668

@@ -2857,7 +2877,7 @@ int ena_com_init_interrupt_moderation(struct ena_com_dev *ena_dev)
28572877
int rc;
28582878

28592879
rc = ena_com_get_feature(ena_dev, &get_resp,
2860-
ENA_ADMIN_INTERRUPT_MODERATION);
2880+
ENA_ADMIN_INTERRUPT_MODERATION, 0);
28612881

28622882
if (rc) {
28632883
if (rc == -EOPNOTSUPP) {

drivers/net/ethernet/amazon/ena/ena_com.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@
101101

102102
#define ENA_HW_HINTS_NO_TIMEOUT 0xFFFF
103103

104+
#define ENA_FEATURE_MAX_QUEUE_EXT_VER 1
105+
104106
enum ena_intr_moder_level {
105107
ENA_INTR_MODER_LOWEST = 0,
106108
ENA_INTR_MODER_LOW,
@@ -389,6 +391,7 @@ struct ena_com_dev {
389391

390392
struct ena_com_dev_get_features_ctx {
391393
struct ena_admin_queue_feature_desc max_queues;
394+
struct ena_admin_queue_ext_feature_desc max_queue_ext;
392395
struct ena_admin_device_attr_feature_desc dev_attr;
393396
struct ena_admin_feature_aenq_desc aenq;
394397
struct ena_admin_feature_offload_desc offload;

0 commit comments

Comments
 (0)