DPDK  24.11.6
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 #include <rte_config.h>
9 #ifdef RTE_ARCH_X86_64
10 #include "rte_lru_x86.h"
11 #elif defined(RTE_ARCH_ARM64)
12 #include "rte_lru_arm64.h"
13 #else
14 #undef RTE_TABLE_HASH_LRU_STRATEGY
15 #define RTE_TABLE_HASH_LRU_STRATEGY 1
16 #endif
17 
18 #if RTE_TABLE_HASH_LRU_STRATEGY == 0
19 
20 #define lru_init(bucket) \
21 do \
22  bucket = bucket; \
23 while (0)
24 
25 #define lru_pos(bucket) (bucket->lru_list & 0xFFFFLLU)
26 
27 #define lru_update(bucket, mru_val) \
28 do { \
29  bucket = bucket; \
30  mru_val = mru_val; \
31 } while (0)
32 
33 #elif RTE_TABLE_HASH_LRU_STRATEGY == 1
34 
35 #define lru_init(bucket) \
36 do \
37  bucket->lru_list = 0x0000000100020003LLU; \
38 while (0)
39 
40 #define lru_pos(bucket) (bucket->lru_list & 0xFFFFLLU)
41 
42 #define lru_update(bucket, mru_val) \
43 do { \
44  uint64_t _x, _pos, _x0, _x1, _x2, _mask; \
45  \
46  _x = bucket->lru_list; \
47  \
48  _pos = 4; \
49  if ((_x >> 48) == ((uint64_t) mru_val)) \
50  _pos = 3; \
51  \
52  if (((_x >> 32) & 0xFFFFLLU) == ((uint64_t) mru_val)) \
53  _pos = 2; \
54  \
55  if (((_x >> 16) & 0xFFFFLLU) == ((uint64_t) mru_val)) \
56  _pos = 1; \
57  \
58  if ((_x & 0xFFFFLLU) == ((uint64_t) mru_val)) \
59  _pos = 0; \
60  \
61  \
62  _pos <<= 4; \
63  _mask = (~0LLU) << _pos; \
64  _x0 = _x & (~_mask); \
65  _x1 = (_x >> 16) & _mask; \
66  _x2 = (_x << (48 - _pos)) & (0xFFFFLLU << 48); \
67  _x = _x0 | _x1 | _x2; \
68  \
69  if (_pos != 64) \
70  bucket->lru_list = _x; \
71 } while (0)
72 
73 #elif (RTE_TABLE_HASH_LRU_STRATEGY == 2) || (RTE_TABLE_HASH_LRU_STRATEGY == 3)
74 
79 #else
80 
81 #error "Incorrect value for RTE_TABLE_HASH_LRU_STRATEGY"
82 
83 #endif
84 
85 #endif