We will initially move them to global functions/variables, and later patches will integrate them into the offload provider framework.
Signed-off-by: Eelco Chaudron <echau...@redhat.com> --- lib/dpif-netdev-avx512.c | 3 ++- lib/dpif-netdev.c | 13 ++++++----- lib/dpif-netlink.c | 18 +++++++++------ lib/dpif-offload.c | 39 ++++++++++++++++++++++++++++++++ lib/dpif-offload.h | 2 ++ lib/dpif.c | 5 ++-- lib/netdev-dpdk.c | 5 ++-- lib/netdev-linux.c | 3 ++- lib/netdev-offload.c | 26 +++------------------ lib/netdev-offload.h | 2 -- ofproto/ofproto-dpif-upcall.c | 5 ++-- ofproto/ofproto-dpif.c | 6 +++++ tests/ofproto-dpif.at | 10 ++++++-- tests/system-dpdk.at | 3 +++ tests/system-offloads-traffic.at | 3 +++ 15 files changed, 95 insertions(+), 48 deletions(-) diff --git a/lib/dpif-netdev-avx512.c b/lib/dpif-netdev-avx512.c index 83e7a1394..0cc566eae 100644 --- a/lib/dpif-netdev-avx512.c +++ b/lib/dpif-netdev-avx512.c @@ -23,6 +23,7 @@ #include "dpif-netdev.h" #include "dpif-netdev-perf.h" #include "dpif-netdev-private.h" +#include "dpif-offload.h" #include <errno.h> #include <immintrin.h> @@ -110,7 +111,7 @@ dp_netdev_input_outer_avx512(struct dp_netdev_pmd_thread *pmd, in_port); /* Check if EMC or SMC are enabled. */ struct dfc_cache *cache = &pmd->flow_cache; - const uint32_t hwol_enabled = netdev_is_flow_api_enabled(); + const uint32_t hwol_enabled = dpif_offload_is_offload_enabled(); const uint32_t emc_enabled = pmd->ctx.emc_insert_min != 0; const uint32_t smc_enabled = pmd->ctx.smc_enable_db; diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 87d69c46d..82b1affef 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -18,6 +18,7 @@ #include "dpif-netdev.h" #include "dpif-netdev-private.h" #include "dpif-netdev-private-dfc.h" +#include "dpif-offload.h" #include <ctype.h> #include <errno.h> @@ -2993,7 +2994,7 @@ queue_netdev_flow_del(struct dp_netdev_pmd_thread *pmd, { struct dp_offload_thread_item *offload; - if (!netdev_is_flow_api_enabled()) { + if (!dpif_offload_is_offload_enabled()) { return; } @@ -3077,7 +3078,7 @@ queue_netdev_flow_put(struct dp_netdev_pmd_thread *pmd, struct dp_offload_thread_item *item; struct dp_offload_flow_item *flow_offload; - if (!netdev_is_flow_api_enabled()) { + if (!dpif_offload_is_offload_enabled()) { return; } @@ -3171,7 +3172,7 @@ dp_netdev_offload_flush(struct dp_netdev *dp, static struct ovs_barrier barrier OVS_GUARDED_BY(flush_mutex); struct netdev *netdev; - if (!netdev_is_flow_api_enabled()) { + if (!dpif_offload_is_offload_enabled()) { return; } @@ -3700,7 +3701,7 @@ dpif_netdev_get_flow_offload_status(const struct dp_netdev *dp, int ret = 0; - if (!netdev_is_flow_api_enabled()) { + if (!dpif_offload_is_offload_enabled()) { return false; } @@ -4769,7 +4770,7 @@ dpif_netdev_offload_stats_get(struct dpif *dpif, unsigned int tid; size_t i; - if (!netdev_is_flow_api_enabled()) { + if (!dpif_offload_is_offload_enabled()) { return EINVAL; } @@ -8514,7 +8515,7 @@ dfc_processing(struct dp_netdev_pmd_thread *pmd, size_t *n_flows, uint8_t *index_map, bool md_is_valid, odp_port_t port_no) { - const bool netdev_flow_api = netdev_is_flow_api_enabled(); + const bool netdev_flow_api = dpif_offload_is_offload_enabled(); const uint32_t recirc_depth = *recirc_depth_get(); const size_t cnt = dp_packet_batch_size(packets_); size_t n_missed = 0, n_emc_hit = 0, n_phwol_hit = 0; diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 7587c9c3e..50249f799 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -34,6 +34,7 @@ #include "bitmap.h" #include "dpif-netlink-rtnl.h" +#include "dpif-offload.h" #include "dpif-provider.h" #include "fat-rwlock.h" #include "flow.h" @@ -1313,7 +1314,7 @@ dpif_netlink_flow_flush(struct dpif *dpif_) flow.cmd = OVS_FLOW_CMD_DEL; flow.dp_ifindex = dpif->dp_ifindex; - if (netdev_is_flow_api_enabled()) { + if (dpif_offload_is_offload_enabled()) { netdev_ports_flow_flush(dpif_type_str); } @@ -2320,7 +2321,8 @@ parse_flow_put(struct dpif_netlink *dpif, struct dpif_flow_put *put) } else if (err != EEXIST) { struct netdev *oor_netdev = NULL; enum vlog_level level; - if (err == ENOSPC && netdev_is_offload_rebalance_policy_enabled()) { + if (err == ENOSPC + && dpif_offload_is_offload_rebalance_policy_enabled()) { /* * We need to set OOR on the input netdev (i.e, 'dev') for the * flow. But if the flow has a tunnel attribute (i.e, decap action, @@ -2439,12 +2441,14 @@ dpif_netlink_operate(struct dpif *dpif_, struct dpif_op **ops, size_t n_ops, int i = 0; int err = 0; - if (offload_type == DPIF_OFFLOAD_ALWAYS && !netdev_is_flow_api_enabled()) { + if (offload_type == DPIF_OFFLOAD_ALWAYS + && !dpif_offload_is_offload_enabled()) { VLOG_DBG("Invalid offload_type: %d", offload_type); return; } - if (offload_type != DPIF_OFFLOAD_NEVER && netdev_is_flow_api_enabled()) { + if (offload_type != DPIF_OFFLOAD_NEVER + && dpif_offload_is_offload_enabled()) { while (n_ops > 0) { count = 0; @@ -4233,7 +4237,7 @@ dpif_netlink_meter_set(struct dpif *dpif_, ofproto_meter_id meter_id, } err = dpif_netlink_meter_set__(dpif_, meter_id, config); - if (!err && netdev_is_flow_api_enabled()) { + if (!err && dpif_offload_is_offload_enabled()) { meter_offload_set(meter_id, config); } @@ -4332,7 +4336,7 @@ dpif_netlink_meter_get(const struct dpif *dpif, ofproto_meter_id meter_id, err = dpif_netlink_meter_get_stats(dpif, meter_id, stats, max_bands, OVS_METER_CMD_GET); - if (!err && netdev_is_flow_api_enabled()) { + if (!err && dpif_offload_is_offload_enabled()) { meter_offload_get(meter_id, stats); } @@ -4347,7 +4351,7 @@ dpif_netlink_meter_del(struct dpif *dpif, ofproto_meter_id meter_id, err = dpif_netlink_meter_get_stats(dpif, meter_id, stats, max_bands, OVS_METER_CMD_DEL); - if (!err && netdev_is_flow_api_enabled()) { + if (!err && dpif_offload_is_offload_enabled()) { meter_offload_del(meter_id, stats); } diff --git a/lib/dpif-offload.c b/lib/dpif-offload.c index ac2437343..aac87d955 100644 --- a/lib/dpif-offload.c +++ b/lib/dpif-offload.c @@ -50,6 +50,8 @@ static const struct dpif_offload_class *base_dpif_offload_classes[] = { }; static char *dpif_offload_provider_priority_list = "tc,rte_flow,dummy,dummy_x"; +static atomic_bool dpif_offload_global_enabled = false; +static atomic_bool dpif_offload_rebalance_policy = false; static int dpif_offload_register_provider__(const struct dpif_offload_class *class) @@ -370,6 +372,24 @@ dpif_offload_class_type(const struct dpif_offload *offload) return offload->class->type; } +bool +dpif_offload_is_offload_enabled(void) +{ + bool enabled; + + atomic_read_relaxed(&dpif_offload_global_enabled, &enabled); + return enabled; +} + +bool +dpif_offload_is_offload_rebalance_policy_enabled(void) +{ + bool enabled; + + atomic_read_relaxed(&dpif_offload_rebalance_policy, &enabled); + return enabled; +} + void dpif_offload_dump_start(struct dpif_offload_dump *dump, const struct dpif *dpif) @@ -476,4 +496,23 @@ dpif_offload_set_global_cfg(const struct smap *other_cfg) "restart required"); } } + + /* Handle other global configuration settings. + * + * According to the manual the 'hw-offload' parameter requires a restart + * when changed. In practice this is only needed on disable, as it will + * not actually disable hw-offload when requested. */ + if (smap_get_bool(other_cfg, "hw-offload", false)) { + static struct ovsthread_once once_enable = OVSTHREAD_ONCE_INITIALIZER; + + if (ovsthread_once_start(&once_enable)) { + atomic_store_relaxed(&dpif_offload_global_enabled, true); + + if (smap_get_bool(other_cfg, "offload-rebalance", false)) { + atomic_store_relaxed(&dpif_offload_rebalance_policy, true); + } + + ovsthread_once_done(&once_enable); + } + } } diff --git a/lib/dpif-offload.h b/lib/dpif-offload.h index 5d9b46d10..87adcd0fc 100644 --- a/lib/dpif-offload.h +++ b/lib/dpif-offload.h @@ -33,6 +33,8 @@ struct dpif_offload_dump { /* Global functions. */ void dpif_offload_set_global_cfg(const struct smap *other_cfg); +bool dpif_offload_is_offload_enabled(void); +bool dpif_offload_is_offload_rebalance_policy_enabled(void); /* Per dpif specific functions. */ diff --git a/lib/dpif.c b/lib/dpif.c index b77cfa0e5..eaf845b6a 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -1344,7 +1344,8 @@ void dpif_operate(struct dpif *dpif, struct dpif_op **ops, size_t n_ops, enum dpif_offload_type offload_type) { - if (offload_type == DPIF_OFFLOAD_ALWAYS && !netdev_is_flow_api_enabled()) { + if (offload_type == DPIF_OFFLOAD_ALWAYS + && !dpif_offload_is_offload_enabled()) { size_t i; for (i = 0; i < n_ops; i++) { struct dpif_op *op = ops[i]; @@ -1932,7 +1933,7 @@ bool dpif_may_support_explicit_drop_action(const struct dpif *dpif) { /* TC does not support offloading this action. */ - return dpif_is_netdev(dpif) || !netdev_is_flow_api_enabled(); + return dpif_is_netdev(dpif) || !dpif_offload_is_offload_enabled(); } bool diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 17b4d6677..0a393e276 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -47,6 +47,7 @@ #include "dirs.h" #include "dp-packet.h" #include "dpdk.h" +#include "dpif-offload.h" #include "dpif-netdev.h" #include "fatal-signal.h" #include "if-notifier.h" @@ -1315,7 +1316,7 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev) RTE_ETH_RX_OFFLOAD_TCP_CKSUM | RTE_ETH_RX_OFFLOAD_IPV4_CKSUM; - if (netdev_is_flow_api_enabled()) { + if (dpif_offload_is_offload_enabled()) { /* * Full tunnel offload requires that tunnel ID metadata be * delivered with "miss" packets from the hardware to the @@ -2288,7 +2289,7 @@ dpdk_set_rx_steer_config(struct netdev *netdev, struct netdev_dpdk *dev, flags = 0; } - if (flags && netdev_is_flow_api_enabled()) { + if (flags && dpif_offload_is_offload_enabled()) { VLOG_WARN_BUF(errp, "%s: options:rx-steering " "is incompatible with hw-offload", netdev_get_name(netdev)); diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index a63d03d48..c49a15e94 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -52,6 +52,7 @@ #include "dp-packet.h" #include "dpif-netlink.h" #include "dpif-netdev.h" +#include "dpif-offload.h" #include "openvswitch/dynamic-string.h" #include "fatal-signal.h" #include "hash.h" @@ -3017,7 +3018,7 @@ netdev_linux_set_policing(struct netdev *netdev_, uint32_t kbits_rate, COVERAGE_INC(netdev_set_policing); /* Use matchall for policing when offloadling ovs with tc-flower. */ - if (netdev_is_flow_api_enabled()) { + if (dpif_offload_is_offload_enabled()) { error = tc_del_matchall_policer(netdev_); if (kbits_rate || kpkts_rate) { error = tc_add_matchall_policer(netdev_, kbits_rate, kbits_burst, diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c index 8a9d36555..01fdadbc3 100644 --- a/lib/netdev-offload.c +++ b/lib/netdev-offload.c @@ -29,6 +29,7 @@ #include "cmap.h" #include "coverage.h" #include "dpif.h" +#include "dpif-offload.h" #include "dp-packet.h" #include "openvswitch/dynamic-string.h" #include "fatal-signal.h" @@ -59,7 +60,6 @@ VLOG_DEFINE_THIS_MODULE(netdev_offload); static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); -static bool netdev_flow_api_enabled = false; #define DEFAULT_OFFLOAD_THREAD_NB 1 #define MAX_OFFLOAD_THREAD_NB 10 @@ -389,7 +389,7 @@ netdev_flow_get_n_flows(struct netdev *netdev, uint64_t *n_flows) int netdev_init_flow_api(struct netdev *netdev) { - if (!netdev_is_flow_api_enabled()) { + if (!dpif_offload_is_offload_enabled()) { return EOPNOTSUPP; } @@ -527,12 +527,6 @@ netdev_any_oor(void) return oor; } -bool -netdev_is_flow_api_enabled(void) -{ - return netdev_flow_api_enabled; -} - unsigned int netdev_offload_thread_nb(void) { @@ -846,14 +840,6 @@ netdev_ifindex_to_odp_port(int ifindex) return ret; } -static bool netdev_offload_rebalance_policy = false; - -bool -netdev_is_offload_rebalance_policy_enabled(void) -{ - return netdev_offload_rebalance_policy; -} - static void netdev_ports_flow_init(void) { @@ -869,11 +855,10 @@ netdev_ports_flow_init(void) void netdev_set_flow_api_enabled(const struct smap *ovs_other_config) { - if (smap_get_bool(ovs_other_config, "hw-offload", false)) { + if (dpif_offload_is_offload_enabled()) { static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; if (ovsthread_once_start(&once)) { - netdev_flow_api_enabled = true; offload_thread_nb = smap_get_ullong(ovs_other_config, "n-offload-threads", @@ -897,11 +882,6 @@ netdev_set_flow_api_enabled(const struct smap *ovs_other_config) tc_set_policy(smap_get_def(ovs_other_config, "tc-policy", TC_POLICY_DEFAULT)); #endif - - if (smap_get_bool(ovs_other_config, "offload-rebalance", false)) { - netdev_offload_rebalance_policy = true; - } - netdev_ports_flow_init(); ovsthread_once_done(&once); diff --git a/lib/netdev-offload.h b/lib/netdev-offload.h index 7fc30a424..5a18727eb 100644 --- a/lib/netdev-offload.h +++ b/lib/netdev-offload.h @@ -123,9 +123,7 @@ uint32_t netdev_get_block_id(struct netdev *); int netdev_get_hw_info(struct netdev *, int); void netdev_set_hw_info(struct netdev *, int, int); bool netdev_any_oor(void); -bool netdev_is_flow_api_enabled(void); void netdev_set_flow_api_enabled(const struct smap *ovs_other_config); -bool netdev_is_offload_rebalance_policy_enabled(void); int netdev_flow_get_n_flows(struct netdev *netdev, uint64_t *n_flows); struct dpif_port; diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 9dfa52d82..4273b3ea6 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -24,6 +24,7 @@ #include "cmap.h" #include "lib/dpif-provider.h" #include "dpif.h" +#include "dpif-offload.h" #include "openvswitch/dynamic-string.h" #include "fail-open.h" #include "guarded-list.h" @@ -1070,7 +1071,7 @@ udpif_revalidator(void *arg) dpif_flow_dump_destroy(udpif->dump); seq_change(udpif->dump_seq); - if (netdev_is_offload_rebalance_policy_enabled()) { + if (dpif_offload_is_offload_rebalance_policy_enabled()) { udpif_run_flow_rebalance(udpif); } @@ -2963,7 +2964,7 @@ revalidate(struct revalidator *revalidator) } ukey->dump_seq = dump_seq; - if (netdev_is_offload_rebalance_policy_enabled() && + if (dpif_offload_is_offload_rebalance_policy_enabled() && result != UKEY_DELETE) { udpif_update_flow_pps(udpif, ukey, f); } diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index dba1dddde..29d6fa59d 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -6750,6 +6750,9 @@ ofproto_unixctl_dpif_offload_show(struct unixctl_conn *conn, struct json *backers = json_object_create(); const struct shash_node *backer; + json_object_put(backers, "enabled", + json_boolean_create(dpif_offload_is_offload_enabled())); + SHASH_FOR_EACH (backer, &all_dpif_backers) { dpif_offload_show_backer_json(backers, backer->data); } @@ -6758,6 +6761,9 @@ ofproto_unixctl_dpif_offload_show(struct unixctl_conn *conn, const struct shash_node **backers = shash_sort(&all_dpif_backers); struct ds ds = DS_EMPTY_INITIALIZER; + ds_put_format(&ds, "Globally enabled: %s\nDatapaths:\n", + dpif_offload_is_offload_enabled() ? "true" : "false"); + for (int i = 0; i < shash_count(&all_dpif_backers); i++) { dpif_offload_show_backer_text(backers[i]->data, &ds); } diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index c941b3cf7..8711295be 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at @@ -10076,6 +10076,8 @@ AT_KEYWORDS([dpif-offload]) OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy]) AT_CHECK([ovs-appctl dpif/offload/show], [0], [dnl +Globally enabled: false +Datapaths: dummy@ovs-dummy: dummy dummy_x @@ -10086,7 +10088,8 @@ AT_CHECK([ovs-appctl --format json --pretty dpif/offload/show], [0], [dnl "dummy@ovs-dummy": { "providers": [[ "dummy", - "dummy_x"]]}} + "dummy_x"]]}, + "enabled": false} ]) OVS_VSWITCHD_STOP @@ -10111,6 +10114,8 @@ OVS_VSWITCHD_START([add-br br1 -- set bridge br1 datapath-type=dummy], [], [], [], [-- set Open_vSwitch . other_config:hw-offload-priority=dummy_x,dummy]) AT_CHECK([ovs-appctl dpif/offload/show], [0], [dnl +Globally enabled: false +Datapaths: dummy@ovs-dummy: dummy_x dummy @@ -10121,7 +10126,8 @@ AT_CHECK([ovs-appctl --format json --pretty dpif/offload/show], [0], [dnl "dummy@ovs-dummy": { "providers": [[ "dummy_x", - "dummy"]]}} + "dummy"]]}, + "enabled": false} ]) OVS_TRAFFIC_VSWITCHD_STOP diff --git a/tests/system-dpdk.at b/tests/system-dpdk.at index b0e66567f..336cfe696 100644 --- a/tests/system-dpdk.at +++ b/tests/system-dpdk.at @@ -878,12 +878,15 @@ OVS_DPDK_START([--no-pci]) AT_CHECK([ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev]) AT_CHECK([ovs-appctl dpif/offload/show], [0], [dnl +Globally enabled: false +Datapaths: netdev@ovs-netdev: rte_flow ]) AT_CHECK([ovs-appctl --format json --pretty dpif/offload/show], [0], [dnl { + "enabled": false, "netdev@ovs-netdev": { "providers": [[ "rte_flow"]]}} diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at index 88ee6238d..471c8fdb8 100644 --- a/tests/system-offloads-traffic.at +++ b/tests/system-offloads-traffic.at @@ -1173,12 +1173,15 @@ OVS_TRAFFIC_VSWITCHD_START([], [], [-- set Open_vSwitch . other_config:hw-offload=true]) AT_CHECK([ovs-appctl dpif/offload/show], [0], [dnl +Globally enabled: true +Datapaths: system@ovs-system: tc ]) AT_CHECK([ovs-appctl --format json --pretty dpif/offload/show], [0], [dnl { + "enabled": true, "system@ovs-system": { "providers": [[ "tc"]]}} -- 2.50.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev