mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-27 04:54:41 +08:00
649c87c6ff
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@intel.com> Tested-by: Gurucharan G <gurucharanx.g@intel.com> (A Contingent worker at Intel) Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
86 lines
2.3 KiB
C
86 lines
2.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Copyright (C) 2018-2020, Intel Corporation. */
|
|
|
|
#ifndef _ICE_ARFS_H_
|
|
#define _ICE_ARFS_H_
|
|
|
|
#include "ice_fdir.h"
|
|
|
|
enum ice_arfs_fltr_state {
|
|
ICE_ARFS_INACTIVE,
|
|
ICE_ARFS_ACTIVE,
|
|
ICE_ARFS_TODEL,
|
|
};
|
|
|
|
struct ice_arfs_entry {
|
|
struct ice_fdir_fltr fltr_info;
|
|
struct hlist_node list_entry;
|
|
u64 time_activated; /* only valid for UDP flows */
|
|
u32 flow_id;
|
|
/* fltr_state = 0 - ICE_ARFS_INACTIVE:
|
|
* filter needs to be updated or programmed in HW.
|
|
* fltr_state = 1 - ICE_ARFS_ACTIVE:
|
|
* filter is active and programmed in HW.
|
|
* fltr_state = 2 - ICE_ARFS_TODEL:
|
|
* filter has been deleted from HW and needs to be removed from
|
|
* the aRFS hash table.
|
|
*/
|
|
u8 fltr_state;
|
|
};
|
|
|
|
struct ice_arfs_entry_ptr {
|
|
struct ice_arfs_entry *arfs_entry;
|
|
struct hlist_node list_entry;
|
|
};
|
|
|
|
struct ice_arfs_active_fltr_cntrs {
|
|
atomic_t active_tcpv4_cnt;
|
|
atomic_t active_tcpv6_cnt;
|
|
atomic_t active_udpv4_cnt;
|
|
atomic_t active_udpv6_cnt;
|
|
};
|
|
|
|
#ifdef CONFIG_RFS_ACCEL
|
|
int
|
|
ice_rx_flow_steer(struct net_device *netdev, const struct sk_buff *skb,
|
|
u16 rxq_idx, u32 flow_id);
|
|
void ice_clear_arfs(struct ice_vsi *vsi);
|
|
void ice_free_cpu_rx_rmap(struct ice_vsi *vsi);
|
|
void ice_init_arfs(struct ice_vsi *vsi);
|
|
void ice_sync_arfs_fltrs(struct ice_pf *pf);
|
|
int ice_set_cpu_rx_rmap(struct ice_vsi *vsi);
|
|
void ice_remove_arfs(struct ice_pf *pf);
|
|
void ice_rebuild_arfs(struct ice_pf *pf);
|
|
bool
|
|
ice_is_arfs_using_perfect_flow(struct ice_hw *hw,
|
|
enum ice_fltr_ptype flow_type);
|
|
#else
|
|
static inline void ice_clear_arfs(struct ice_vsi *vsi) { }
|
|
static inline void ice_free_cpu_rx_rmap(struct ice_vsi *vsi) { }
|
|
static inline void ice_init_arfs(struct ice_vsi *vsi) { }
|
|
static inline void ice_sync_arfs_fltrs(struct ice_pf *pf) { }
|
|
static inline void ice_remove_arfs(struct ice_pf *pf) { }
|
|
static inline void ice_rebuild_arfs(struct ice_pf *pf) { }
|
|
|
|
static inline int ice_set_cpu_rx_rmap(struct ice_vsi __always_unused *vsi)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int
|
|
ice_rx_flow_steer(struct net_device __always_unused *netdev,
|
|
const struct sk_buff __always_unused *skb,
|
|
u16 __always_unused rxq_idx, u32 __always_unused flow_id)
|
|
{
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
static inline bool
|
|
ice_is_arfs_using_perfect_flow(struct ice_hw __always_unused *hw,
|
|
enum ice_fltr_ptype __always_unused flow_type)
|
|
{
|
|
return false;
|
|
}
|
|
#endif /* CONFIG_RFS_ACCEL */
|
|
#endif /* _ICE_ARFS_H_ */
|