Skip to content

Commit 2ecdd4b

Browse files
Marcin Szycikanguy11
authored andcommitted
ice: Optimize switch recipe creation
Currently when creating switch recipes, switch ID is always added as the first word in every recipe. There are only 5 words in a recipe, so one word is always wasted. This is also true for the last recipe, which stores result indexes (in case of chain recipes). Therefore the maximum usable length of a chain recipe is 4 * 4 = 16 words. 4 words in a recipe, 4 recipes that can be chained (using a 5th one for result indexes). Current max size chained recipe: 0: smmmm 1: smmmm 2: smmmm 3: smmmm 4: srrrr Where: s - switch ID m - regular match (e.g. ipv4 src addr, udp dst port, etc.) r - result index Switch ID does not actually need to be present in every recipe, only in one of them (in case of chained recipe). This frees up to 8 extra words: 3 from recipes in the middle (because first recipe still needs to have switch ID), and 5 from one extra recipe (because now the last recipe also does not have switch ID, so it can chain 1 more recipe). Max size chained recipe after changes: 0: smmmm 1: Mmmmm 2: Mmmmm 3: Mmmmm 4: MMMMM 5: Rrrrr Extra usable words available after this change are highlighted with capital letters. Changing how switch ID is added is not straightforward, because it's not a regular lookup. Its FV index and mask can't be determined based on protocol + offset pair read from package and instead need to be added manually. Additionally, change how result indexes are added. Currently they are always inserted in a new recipe at the end. Example for 13 words, (with above optimization, switch ID being one of the words): 0: smmmm 1: mmmmm 2: mmmxx 3: rrrxx Where: x - unused word In this and some other cases, the result indexes can be moved just after last matches because there are unused words, saving one recipe. Example for 13 words after both optimizations: 0: smmmm 1: mmmmm 2: mmmrr Note how one less result index is needed in this case, because the last recipe does not need to "link" to itself. There are cases when adding an additional recipe for result indexes cannot be avoided. In that cases result indexes are all put in the last recipe. Example for 14 words after both optimizations: 0: smmmm 1: mmmmm 2: mmmmx 3: rrrxx With these two changes, recipes/rules are more space efficient, allowing more to be created in total. Co-developed-by: Michal Swiatkowski <[email protected]> Signed-off-by: Michal Swiatkowski <[email protected]> Reviewed-by: Przemek Kitszel <[email protected]> Signed-off-by: Marcin Szycik <[email protected]> Tested-by: Sujai Buvaneswaran <[email protected]> Signed-off-by: Tony Nguyen <[email protected]>
1 parent 589dd71 commit 2ecdd4b

File tree

3 files changed

+212
-337
lines changed

3 files changed

+212
-337
lines changed

drivers/net/ethernet/intel/ice/ice_protocol_type.h

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,24 @@
77

88
/* Each recipe can match up to 5 different fields. Fields to match can be meta-
99
* data, values extracted from packet headers, or results from other recipes.
10-
* One of the 5 fields is reserved for matching the switch ID. So, up to 4
11-
* recipes can provide intermediate results to another one through chaining,
12-
* e.g. recipes 0, 1, 2, and 3 can provide intermediate results to recipe 4.
10+
* Therefore, up to 5 recipes can provide intermediate results to another one
11+
* through chaining, e.g. recipes 0, 1, 2, 3 and 4 can provide intermediate
12+
* results to recipe 5. Note that one of the fields in one of the recipes must
13+
* always be reserved for matching the switch ID.
1314
*/
14-
#define ICE_NUM_WORDS_RECIPE 4
15+
#define ICE_NUM_WORDS_RECIPE 5
1516

16-
/* Max recipes that can be chained */
17+
/* Max recipes that can be chained, not including the last one, which combines
18+
* intermediate results.
19+
*/
1720
#define ICE_MAX_CHAIN_RECIPE 5
1821

19-
/* 1 word reserved for switch ID from allowed 5 words.
20-
* So a recipe can have max 4 words. And you can chain 5 such recipes
21-
* together. So maximum words that can be programmed for look up is 5 * 4.
22+
/* Total max recipes in chain recipe (including intermediate results) */
23+
#define ICE_MAX_CHAIN_RECIPE_RES (ICE_MAX_CHAIN_RECIPE + 1)
24+
25+
/* A recipe can have max 5 words, and 5 recipes can be chained together (using
26+
* the 6th one, which would contain only result indexes). So maximum words that
27+
* can be programmed for lookup is 5 * 5 (not including intermediate results).
2228
*/
2329
#define ICE_MAX_CHAIN_WORDS (ICE_NUM_WORDS_RECIPE * ICE_MAX_CHAIN_RECIPE)
2430

0 commit comments

Comments
 (0)