1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
/*
* Copyright (c) 2022 Intel.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ODP_EXTRACT_PRIVATE
#define ODP_EXTRACT_PRIVATE 1
#include "dp-packet.h"
#include "odp-execute.h"
#include "odp-netlink.h"
#include "ovs-atomic.h"
/* Combine all required ISA and Linker checks into a single #define
* for readability and simplicity where the checks are needed. Note
* that it is always #defined, so code must use the #if preprocesor
* directive (not #ifdef). */
#define ACTION_IMPL_AVX512_CHECK (__x86_64__ && HAVE_AVX512F \
&& HAVE_LD_AVX512_GOOD && __SSE4_2__ && HAVE_AVX512BW && HAVE_AVX512VL \
&& HAVE_GCC_AVX512VL_GOOD)
/* Forward declaration for typedef. */
struct odp_execute_action_impl;
/* Typedef for an initialization function that can initialize each
* implementation, checking requirements such as CPU ISA. */
typedef int (*odp_execute_action_init_func)
(struct odp_execute_action_impl *self);
/* Structure represents an implementation of the odp actions. */
struct odp_execute_action_impl {
/* When set, the CPU ISA required for this implementation is available
* and the implementation can be used. */
bool available;
/* Name of the implementation. */
const char *name;
/* Function is used to detect if this CPU has the ISA required
* to run the optimized action implementation and if available, initializes
* the implementation for use. */
odp_execute_action_init_func init_func;
/* An array of callback functions, one for each action. */
ATOMIC(odp_execute_action_cb) funcs[__OVS_ACTION_ATTR_MAX];
};
/* Order of Actions implementations. */
enum odp_execute_action_impl_idx {
ACTION_IMPL_SCALAR,
ACTION_IMPL_AUTOVALIDATOR,
/* See ACTION_IMPL_BEGIN below, for "first to-be-validated" impl.
* Do not change the autovalidator position in this list without updating
* the define below. */
#if ACTION_IMPL_AVX512_CHECK
ACTION_IMPL_AVX512,
#endif
ACTION_IMPL_MAX,
};
/* Index to start verifying implementations from. */
BUILD_ASSERT_DECL(ACTION_IMPL_SCALAR == 0);
BUILD_ASSERT_DECL(ACTION_IMPL_AUTOVALIDATOR == 1);
#define ACTION_IMPL_BEGIN (ACTION_IMPL_AUTOVALIDATOR + 1)
bool action_avx512_isa_probe(void);
bool action_avx512vbmi_isa_probe(void);
/* Odp execute init handles setting up the state of the actions functions at
* initialization time. It cannot return errors, as it must always succeed in
* initializing the scalar/generic codepath. */
void odp_execute_action_init(void);
/* Init functions for the action implementations. Initializes the function
* pointers for optimized action types. */
int odp_action_scalar_init(struct odp_execute_action_impl *self);
struct odp_execute_action_impl * odp_execute_action_set(const char *name);
int action_autoval_init(struct odp_execute_action_impl *self);
int action_avx512_init(struct odp_execute_action_impl *self);
void odp_execute_action_get_info(struct ds *name);
void odp_execute_scalar_action(struct dp_packet_batch *batch,
const struct nlattr *action);
#endif /* ODP_EXTRACT_PRIVATE */
|