summaryrefslogtreecommitdiff
path: root/lib/odp-execute-private.h
blob: 643f41c2a6109055a0cf82645b8b931970296846 (plain)
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 */