DPDK 23.11.7
rte_lru.h
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2014 Intel Corporation
3 */
4
5#ifndef __INCLUDE_RTE_LRU_H__
6#define __INCLUDE_RTE_LRU_H__
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
12#include <rte_config.h>
13#ifdef RTE_ARCH_X86_64
14#include "rte_lru_x86.h"
15#elif defined(RTE_ARCH_ARM64)
16#include "rte_lru_arm64.h"
17#else
18#undef RTE_TABLE_HASH_LRU_STRATEGY
19#define RTE_TABLE_HASH_LRU_STRATEGY 1
20#endif
21
22#if RTE_TABLE_HASH_LRU_STRATEGY == 0
23
24#define lru_init(bucket) \
25do \
26 bucket = bucket; \
27while (0)
28
29#define lru_pos(bucket) (bucket->lru_list & 0xFFFFLLU)
30
31#define lru_update(bucket, mru_val) \
32do { \
33 bucket = bucket; \
34 mru_val = mru_val; \
35} while (0)
36
37#elif RTE_TABLE_HASH_LRU_STRATEGY == 1
38
39#define lru_init(bucket) \
40do \
41 bucket->lru_list = 0x0000000100020003LLU; \
42while (0)
43
44#define lru_pos(bucket) (bucket->lru_list & 0xFFFFLLU)
45
46#define lru_update(bucket, mru_val) \
47do { \
48 uint64_t _x, _pos, _x0, _x1, _x2, _mask; \
49 \
50 _x = bucket->lru_list; \
51 \
52 _pos = 4; \
53 if ((_x >> 48) == ((uint64_t) mru_val)) \
54 _pos = 3; \
55 \
56 if (((_x >> 32) & 0xFFFFLLU) == ((uint64_t) mru_val)) \
57 _pos = 2; \
58 \
59 if (((_x >> 16) & 0xFFFFLLU) == ((uint64_t) mru_val)) \
60 _pos = 1; \
61 \
62 if ((_x & 0xFFFFLLU) == ((uint64_t) mru_val)) \
63 _pos = 0; \
64 \
65 \
66 _pos <<= 4; \
67 _mask = (~0LLU) << _pos; \
68 _x0 = _x & (~_mask); \
69 _x1 = (_x >> 16) & _mask; \
70 _x2 = (_x << (48 - _pos)) & (0xFFFFLLU << 48); \
71 _x = _x0 | _x1 | _x2; \
72 \
73 if (_pos != 64) \
74 bucket->lru_list = _x; \
75} while (0)
76
77#elif (RTE_TABLE_HASH_LRU_STRATEGY == 2) || (RTE_TABLE_HASH_LRU_STRATEGY == 3)
78
83#else
84
85#error "Incorrect value for RTE_TABLE_HASH_LRU_STRATEGY"
86
87#endif
88
89#ifdef __cplusplus
90}
91#endif
92
93#endif