[Intel-wired-lan] [net-next PATCH 03/25] ice: remove circular header dependencies on ice.h

G, GurucharanX gurucharanx.g at intel.com
Wed Mar 2 08:20:36 UTC 2022



> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces at osuosl.org> On Behalf Of
> Jacob Keller
> Sent: Wednesday, February 23, 2022 5:57 AM
> To: Intel Wired LAN <intel-wired-lan at lists.osuosl.org>
> Subject: [Intel-wired-lan] [net-next PATCH 03/25] ice: remove circular header
> dependencies on ice.h
> 
> Several headers in the ice driver include ice.h even though they are
> themselves included by that header. The most notable of these is
> ice_common.h, but several other headers also do this.
> 
> Such a recursive inclusion is problematic as it forces headers to be included in
> a strict order, otherwise compilation errors can result. The circular inclusions
> do not trigger an endless loop due to standard header inclusion guards,
> however other errors can occur.
> 
> For example, ice_flow.h defines ice_rss_hash_cfg, which is used by
> ice_sriov.h as part of the definition of ice_vf_hash_ip_ctx.
> 
> ice_flow.h includes ice_acl.h, which includes ice_common.h, and which
> finally includes ice.h. Since ice.h itself includes ice_sriov.h, this creates a
> circular dependency.
> 
> The definition in ice_sriov.h requires things from ice_flow.h, but ice_flow.h
> itself will lead to trying to load ice_sriov.h as part of its process for expanding
> ice.h. The current code avoids this issue by having an implicit dependency
> without the include of ice_flow.h.
> 
> If we were to fix that so that ice_sriov.h explicitly depends on ice_flow.h the
> following pattern would occur:
> 
>   ice_flow.h -> ice_acl.h -> ice_common.h -> ice.h -> ice_sriov.h
> 
> At this point, during the expansion of, the header guard for ice_flow.h is
> already set, so when ice_sriov.h attempts to load the ice_flow.h header it is
> skipped. Then, we go on to begin including the rest of ice_sriov.h, including
> structure definitions which depend on ice_rss_hash_cfg. This produces a
> compiler warning because ice_rss_hash_cfg hasn't yet been included.
> Remember, we're just at the start of ice_flow.h!
> 
> If the order of headers is incorrect (ice_flow.h is not implicitly loaded first in
> all files which include ice_sriov.h) then we get the same failure.
> 
> Removing this recursive inclusion requires fixing a few cases where some
> headers depended on the header inclusions from ice.h. In addition, a few
> other changes are also required.
> 
> Most notably, ice_hw_to_dev is implemented as a macro in ice_osdep.h,
> which is the likely reason that ice_common.h includes ice.h at all. This macro
> implementation requires the full definition of ice_pf in order to properly
> compile.
> 
> Fix this by moving it to a function declared in ice_main.c, so that we do not
> require all files to depend on the layout of the ice_pf structure.
> 
> Note that this change only fixes circular dependencies, but it does not fully
> resolve all implicit dependencies where one header may depend on the
> inclusion of another. I tried to fix as many of the implicit dependencies as I
> noticed, but fixing them all requires a somewhat tedious analysis of each
> header and attempting to compile it separately.
> 
> Signed-off-by: Jacob Keller <jacob.e.keller at intel.com>
> ---
>  drivers/net/ethernet/intel/ice/ice.h           |  3 ---
>  drivers/net/ethernet/intel/ice/ice_arfs.h      |  3 +++
>  drivers/net/ethernet/intel/ice/ice_common.h    |  4 ++--
>  drivers/net/ethernet/intel/ice/ice_dcb.h       |  1 +
>  drivers/net/ethernet/intel/ice/ice_flex_pipe.c |  1 +
>  drivers/net/ethernet/intel/ice/ice_flow.c      |  1 +
>  drivers/net/ethernet/intel/ice/ice_flow.h      |  2 ++
>  drivers/net/ethernet/intel/ice/ice_idc_int.h   |  1 -
>  drivers/net/ethernet/intel/ice/ice_main.c      | 15 +++++++++++++++
>  drivers/net/ethernet/intel/ice/ice_osdep.h     | 11 +++++++++--
>  drivers/net/ethernet/intel/ice/ice_repr.h      |  1 -
>  drivers/net/ethernet/intel/ice/ice_sriov.h     |  1 -
>  drivers/net/ethernet/intel/ice/ice_type.h      |  1 +
>  drivers/net/ethernet/intel/ice/ice_xsk.h       |  1 -
>  14 files changed, 35 insertions(+), 11 deletions(-)
> 

Tested-by: Gurucharan <gurucharanx.g at intel.com> (A Contingent worker at Intel)


More information about the Intel-wired-lan mailing list