Message ID | 20240812222013.1503584-2-pkaligineedi@google.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 58c98d0cd4f8899f517ba1f0255d2aac7666a002 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | gve: Add RSS config support | expand |
On 2024-08-13 at 03:50:12, Praveen Kaligineedi (pkaligineedi@google.com) wrote: > From: Ziwei Xiao <ziweixiao@google.com> > > Add a device option to inform the driver about the hash key size and > hash table size used by the device. This information will be stored and > made available for RSS ethtool operations. > > Signed-off-by: Ziwei Xiao <ziweixiao@google.com> > Signed-off-by: Praveen Kaligineedi <pkaligineedi@google.com> > Reviewed-by: Praveen Kaligineedi <pkaligineedi@google.com> > Reviewed-by: Harshitha Ramamurthy <hramamurthy@google.com> > Reviewed-by: Willem de Bruijn <willemb@google.com> > --- > Changes in v2: > - Unify the RSS argument order in related functions(Jakub Kicinski) > > drivers/net/ethernet/google/gve/gve.h | 3 ++ > drivers/net/ethernet/google/gve/gve_adminq.c | 36 ++++++++++++++++++-- > drivers/net/ethernet/google/gve/gve_adminq.h | 15 +++++++- > 3 files changed, 51 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/google/gve/gve.h > index 84ac004d3953..6c21f3c53619 100644 > --- a/drivers/net/ethernet/google/gve/gve.h > +++ b/drivers/net/ethernet/google/gve/gve.h > @@ -831,6 +831,9 @@ struct gve_priv { > u32 num_flow_rules; > > struct gve_flow_rules_cache flow_rules_cache; > + > + u16 rss_key_size; > + u16 rss_lut_size; > }; > > enum gve_service_task_flags_bit { > diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/ethernet/google/gve/gve_adminq.c > index c5bbc1b7524e..b5c801d2f8b5 100644 > --- a/drivers/net/ethernet/google/gve/gve_adminq.c > +++ b/drivers/net/ethernet/google/gve/gve_adminq.c > @@ -45,6 +45,7 @@ void gve_parse_device_option(struct gve_priv *priv, > struct gve_device_option_dqo_qpl **dev_op_dqo_qpl, > struct gve_device_option_buffer_sizes **dev_op_buffer_sizes, > struct gve_device_option_flow_steering **dev_op_flow_steering, > + struct gve_device_option_rss_config **dev_op_rss_config, > struct gve_device_option_modify_ring **dev_op_modify_ring) > { > u32 req_feat_mask = be32_to_cpu(option->required_features_mask); > @@ -207,6 +208,23 @@ void gve_parse_device_option(struct gve_priv *priv, > "Flow Steering"); > *dev_op_flow_steering = (void *)(option + 1); > break; > + case GVE_DEV_OPT_ID_RSS_CONFIG: > + if (option_length < sizeof(**dev_op_rss_config) || > + req_feat_mask != GVE_DEV_OPT_REQ_FEAT_MASK_RSS_CONFIG) { > + dev_warn(&priv->pdev->dev, GVE_DEVICE_OPTION_ERROR_FMT, > + "RSS config", > + (int)sizeof(**dev_op_rss_config), > + GVE_DEV_OPT_REQ_FEAT_MASK_RSS_CONFIG, > + option_length, req_feat_mask); > + break; > + } > + > + if (option_length > sizeof(**dev_op_rss_config)) > + dev_warn(&priv->pdev->dev, > + GVE_DEVICE_OPTION_TOO_BIG_FMT, > + "RSS config"); > + *dev_op_rss_config = (void *)(option + 1); > + break; > default: > /* If we don't recognize the option just continue > * without doing anything. > @@ -227,6 +245,7 @@ gve_process_device_options(struct gve_priv *priv, > struct gve_device_option_dqo_qpl **dev_op_dqo_qpl, > struct gve_device_option_buffer_sizes **dev_op_buffer_sizes, > struct gve_device_option_flow_steering **dev_op_flow_steering, > + struct gve_device_option_rss_config **dev_op_rss_config, > struct gve_device_option_modify_ring **dev_op_modify_ring) > { > const int num_options = be16_to_cpu(descriptor->num_device_options); > @@ -249,7 +268,8 @@ gve_process_device_options(struct gve_priv *priv, > dev_op_gqi_rda, dev_op_gqi_qpl, > dev_op_dqo_rda, dev_op_jumbo_frames, > dev_op_dqo_qpl, dev_op_buffer_sizes, > - dev_op_flow_steering, dev_op_modify_ring); > + dev_op_flow_steering, dev_op_rss_config, > + dev_op_modify_ring); > dev_opt = next_opt; > } > > @@ -867,6 +887,8 @@ static void gve_enable_supported_features(struct gve_priv *priv, > *dev_op_buffer_sizes, > const struct gve_device_option_flow_steering > *dev_op_flow_steering, > + const struct gve_device_option_rss_config > + *dev_op_rss_config, > const struct gve_device_option_modify_ring > *dev_op_modify_ring) > { > @@ -931,6 +953,14 @@ static void gve_enable_supported_features(struct gve_priv *priv, > priv->max_flow_rules); > } > } > + > + if (dev_op_rss_config && > + (supported_features_mask & GVE_SUP_RSS_CONFIG_MASK)) { > + priv->rss_key_size = > + be16_to_cpu(dev_op_rss_config->hash_key_size); > + priv->rss_lut_size = > + be16_to_cpu(dev_op_rss_config->hash_lut_size); > + } > } > > int gve_adminq_describe_device(struct gve_priv *priv) > @@ -939,6 +969,7 @@ int gve_adminq_describe_device(struct gve_priv *priv) > struct gve_device_option_buffer_sizes *dev_op_buffer_sizes = NULL; > struct gve_device_option_jumbo_frames *dev_op_jumbo_frames = NULL; > struct gve_device_option_modify_ring *dev_op_modify_ring = NULL; > + struct gve_device_option_rss_config *dev_op_rss_config = NULL; > struct gve_device_option_gqi_rda *dev_op_gqi_rda = NULL; > struct gve_device_option_gqi_qpl *dev_op_gqi_qpl = NULL; > struct gve_device_option_dqo_rda *dev_op_dqo_rda = NULL; > @@ -973,6 +1004,7 @@ int gve_adminq_describe_device(struct gve_priv *priv) > &dev_op_jumbo_frames, &dev_op_dqo_qpl, > &dev_op_buffer_sizes, > &dev_op_flow_steering, > + &dev_op_rss_config, > &dev_op_modify_ring); > if (err) > goto free_device_descriptor; > @@ -1035,7 +1067,7 @@ int gve_adminq_describe_device(struct gve_priv *priv) > gve_enable_supported_features(priv, supported_features_mask, > dev_op_jumbo_frames, dev_op_dqo_qpl, > dev_op_buffer_sizes, dev_op_flow_steering, > - dev_op_modify_ring); > + dev_op_rss_config, dev_op_modify_ring); > > free_device_descriptor: > dma_pool_free(priv->adminq_pool, descriptor, descriptor_bus); > diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/ethernet/google/gve/gve_adminq.h > index ed1370c9b197..7d9ef9a12fef 100644 > --- a/drivers/net/ethernet/google/gve/gve_adminq.h > +++ b/drivers/net/ethernet/google/gve/gve_adminq.h > @@ -164,6 +164,14 @@ struct gve_device_option_flow_steering { > > static_assert(sizeof(struct gve_device_option_flow_steering) == 12); > > +struct gve_device_option_rss_config { > + __be32 supported_features_mask; > + __be16 hash_key_size; > + __be16 hash_lut_size; > +}; > + > +static_assert(sizeof(struct gve_device_option_rss_config) == 8); > + > /* Terminology: > * > * RDA - Raw DMA Addressing - Buffers associated with SKBs are directly DMA > @@ -182,6 +190,7 @@ enum gve_dev_opt_id { > GVE_DEV_OPT_ID_JUMBO_FRAMES = 0x8, > GVE_DEV_OPT_ID_BUFFER_SIZES = 0xa, > GVE_DEV_OPT_ID_FLOW_STEERING = 0xb, > + GVE_DEV_OPT_ID_RSS_CONFIG = 0xe, > }; > > enum gve_dev_opt_req_feat_mask { > @@ -194,6 +203,7 @@ enum gve_dev_opt_req_feat_mask { > GVE_DEV_OPT_REQ_FEAT_MASK_BUFFER_SIZES = 0x0, > GVE_DEV_OPT_REQ_FEAT_MASK_MODIFY_RING = 0x0, > GVE_DEV_OPT_REQ_FEAT_MASK_FLOW_STEERING = 0x0, > + GVE_DEV_OPT_REQ_FEAT_MASK_RSS_CONFIG = 0x0, > }; > > enum gve_sup_feature_mask { > @@ -201,6 +211,7 @@ enum gve_sup_feature_mask { > GVE_SUP_JUMBO_FRAMES_MASK = 1 << 2, > GVE_SUP_BUFFER_SIZES_MASK = 1 << 4, > GVE_SUP_FLOW_STEERING_MASK = 1 << 5, > + GVE_SUP_RSS_CONFIG_MASK = 1 << 7, Use BIT() Thanks, Hariprasad k > };
diff --git a/drivers/net/ethernet/google/gve/gve.h b/drivers/net/ethernet/google/gve/gve.h index 84ac004d3953..6c21f3c53619 100644 --- a/drivers/net/ethernet/google/gve/gve.h +++ b/drivers/net/ethernet/google/gve/gve.h @@ -831,6 +831,9 @@ struct gve_priv { u32 num_flow_rules; struct gve_flow_rules_cache flow_rules_cache; + + u16 rss_key_size; + u16 rss_lut_size; }; enum gve_service_task_flags_bit { diff --git a/drivers/net/ethernet/google/gve/gve_adminq.c b/drivers/net/ethernet/google/gve/gve_adminq.c index c5bbc1b7524e..b5c801d2f8b5 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.c +++ b/drivers/net/ethernet/google/gve/gve_adminq.c @@ -45,6 +45,7 @@ void gve_parse_device_option(struct gve_priv *priv, struct gve_device_option_dqo_qpl **dev_op_dqo_qpl, struct gve_device_option_buffer_sizes **dev_op_buffer_sizes, struct gve_device_option_flow_steering **dev_op_flow_steering, + struct gve_device_option_rss_config **dev_op_rss_config, struct gve_device_option_modify_ring **dev_op_modify_ring) { u32 req_feat_mask = be32_to_cpu(option->required_features_mask); @@ -207,6 +208,23 @@ void gve_parse_device_option(struct gve_priv *priv, "Flow Steering"); *dev_op_flow_steering = (void *)(option + 1); break; + case GVE_DEV_OPT_ID_RSS_CONFIG: + if (option_length < sizeof(**dev_op_rss_config) || + req_feat_mask != GVE_DEV_OPT_REQ_FEAT_MASK_RSS_CONFIG) { + dev_warn(&priv->pdev->dev, GVE_DEVICE_OPTION_ERROR_FMT, + "RSS config", + (int)sizeof(**dev_op_rss_config), + GVE_DEV_OPT_REQ_FEAT_MASK_RSS_CONFIG, + option_length, req_feat_mask); + break; + } + + if (option_length > sizeof(**dev_op_rss_config)) + dev_warn(&priv->pdev->dev, + GVE_DEVICE_OPTION_TOO_BIG_FMT, + "RSS config"); + *dev_op_rss_config = (void *)(option + 1); + break; default: /* If we don't recognize the option just continue * without doing anything. @@ -227,6 +245,7 @@ gve_process_device_options(struct gve_priv *priv, struct gve_device_option_dqo_qpl **dev_op_dqo_qpl, struct gve_device_option_buffer_sizes **dev_op_buffer_sizes, struct gve_device_option_flow_steering **dev_op_flow_steering, + struct gve_device_option_rss_config **dev_op_rss_config, struct gve_device_option_modify_ring **dev_op_modify_ring) { const int num_options = be16_to_cpu(descriptor->num_device_options); @@ -249,7 +268,8 @@ gve_process_device_options(struct gve_priv *priv, dev_op_gqi_rda, dev_op_gqi_qpl, dev_op_dqo_rda, dev_op_jumbo_frames, dev_op_dqo_qpl, dev_op_buffer_sizes, - dev_op_flow_steering, dev_op_modify_ring); + dev_op_flow_steering, dev_op_rss_config, + dev_op_modify_ring); dev_opt = next_opt; } @@ -867,6 +887,8 @@ static void gve_enable_supported_features(struct gve_priv *priv, *dev_op_buffer_sizes, const struct gve_device_option_flow_steering *dev_op_flow_steering, + const struct gve_device_option_rss_config + *dev_op_rss_config, const struct gve_device_option_modify_ring *dev_op_modify_ring) { @@ -931,6 +953,14 @@ static void gve_enable_supported_features(struct gve_priv *priv, priv->max_flow_rules); } } + + if (dev_op_rss_config && + (supported_features_mask & GVE_SUP_RSS_CONFIG_MASK)) { + priv->rss_key_size = + be16_to_cpu(dev_op_rss_config->hash_key_size); + priv->rss_lut_size = + be16_to_cpu(dev_op_rss_config->hash_lut_size); + } } int gve_adminq_describe_device(struct gve_priv *priv) @@ -939,6 +969,7 @@ int gve_adminq_describe_device(struct gve_priv *priv) struct gve_device_option_buffer_sizes *dev_op_buffer_sizes = NULL; struct gve_device_option_jumbo_frames *dev_op_jumbo_frames = NULL; struct gve_device_option_modify_ring *dev_op_modify_ring = NULL; + struct gve_device_option_rss_config *dev_op_rss_config = NULL; struct gve_device_option_gqi_rda *dev_op_gqi_rda = NULL; struct gve_device_option_gqi_qpl *dev_op_gqi_qpl = NULL; struct gve_device_option_dqo_rda *dev_op_dqo_rda = NULL; @@ -973,6 +1004,7 @@ int gve_adminq_describe_device(struct gve_priv *priv) &dev_op_jumbo_frames, &dev_op_dqo_qpl, &dev_op_buffer_sizes, &dev_op_flow_steering, + &dev_op_rss_config, &dev_op_modify_ring); if (err) goto free_device_descriptor; @@ -1035,7 +1067,7 @@ int gve_adminq_describe_device(struct gve_priv *priv) gve_enable_supported_features(priv, supported_features_mask, dev_op_jumbo_frames, dev_op_dqo_qpl, dev_op_buffer_sizes, dev_op_flow_steering, - dev_op_modify_ring); + dev_op_rss_config, dev_op_modify_ring); free_device_descriptor: dma_pool_free(priv->adminq_pool, descriptor, descriptor_bus); diff --git a/drivers/net/ethernet/google/gve/gve_adminq.h b/drivers/net/ethernet/google/gve/gve_adminq.h index ed1370c9b197..7d9ef9a12fef 100644 --- a/drivers/net/ethernet/google/gve/gve_adminq.h +++ b/drivers/net/ethernet/google/gve/gve_adminq.h @@ -164,6 +164,14 @@ struct gve_device_option_flow_steering { static_assert(sizeof(struct gve_device_option_flow_steering) == 12); +struct gve_device_option_rss_config { + __be32 supported_features_mask; + __be16 hash_key_size; + __be16 hash_lut_size; +}; + +static_assert(sizeof(struct gve_device_option_rss_config) == 8); + /* Terminology: * * RDA - Raw DMA Addressing - Buffers associated with SKBs are directly DMA @@ -182,6 +190,7 @@ enum gve_dev_opt_id { GVE_DEV_OPT_ID_JUMBO_FRAMES = 0x8, GVE_DEV_OPT_ID_BUFFER_SIZES = 0xa, GVE_DEV_OPT_ID_FLOW_STEERING = 0xb, + GVE_DEV_OPT_ID_RSS_CONFIG = 0xe, }; enum gve_dev_opt_req_feat_mask { @@ -194,6 +203,7 @@ enum gve_dev_opt_req_feat_mask { GVE_DEV_OPT_REQ_FEAT_MASK_BUFFER_SIZES = 0x0, GVE_DEV_OPT_REQ_FEAT_MASK_MODIFY_RING = 0x0, GVE_DEV_OPT_REQ_FEAT_MASK_FLOW_STEERING = 0x0, + GVE_DEV_OPT_REQ_FEAT_MASK_RSS_CONFIG = 0x0, }; enum gve_sup_feature_mask { @@ -201,6 +211,7 @@ enum gve_sup_feature_mask { GVE_SUP_JUMBO_FRAMES_MASK = 1 << 2, GVE_SUP_BUFFER_SIZES_MASK = 1 << 4, GVE_SUP_FLOW_STEERING_MASK = 1 << 5, + GVE_SUP_RSS_CONFIG_MASK = 1 << 7, }; #define GVE_DEV_OPT_LEN_GQI_RAW_ADDRESSING 0x0 @@ -214,6 +225,7 @@ enum gve_driver_capbility { gve_driver_capability_dqo_rda = 3, gve_driver_capability_alt_miss_compl = 4, gve_driver_capability_flexible_buffer_size = 5, + gve_driver_capability_flexible_rss_size = 6, }; #define GVE_CAP1(a) BIT((int)a) @@ -226,7 +238,8 @@ enum gve_driver_capbility { GVE_CAP1(gve_driver_capability_gqi_rda) | \ GVE_CAP1(gve_driver_capability_dqo_rda) | \ GVE_CAP1(gve_driver_capability_alt_miss_compl) | \ - GVE_CAP1(gve_driver_capability_flexible_buffer_size)) + GVE_CAP1(gve_driver_capability_flexible_buffer_size) | \ + GVE_CAP1(gve_driver_capability_flexible_rss_size)) #define GVE_DRIVER_CAPABILITY_FLAGS2 0x0 #define GVE_DRIVER_CAPABILITY_FLAGS3 0x0