numam-dpdk/lib
Morten Brørup a2833ecc5e mempool: fix get objects from mempool with cache
A flush threshold for the mempool cache was introduced in DPDK version
1.3, but rte_mempool_do_generic_get() was not completely updated back
then, and some inefficiencies were introduced.

Fix the following in rte_mempool_do_generic_get():

1. The code that initially screens the cache request was not updated
with the change in DPDK version 1.3.
The initial screening compared the request length to the cache size,
which was correct before, but became irrelevant with the introduction of
the flush threshold. E.g. the cache can hold up to flushthresh objects,
which is more than its size, so some requests were not served from the
cache, even though they could be.
The initial screening has now been corrected to match the initial
screening in rte_mempool_do_generic_put(), which verifies that a cache
is present, and that the length of the request does not overflow the
memory allocated for the cache.

This bug caused a major performance degradation in scenarios where the
application burst length is the same as the cache size. In such cases,
the objects were not ever fetched from the mempool cache, regardless if
they could have been.
This scenario occurs e.g. if an application has configured a mempool
with a size matching the application's burst size.

2. The function is a helper for rte_mempool_generic_get(), so it must
behave according to the description of that function.
Specifically, objects must first be returned from the cache,
subsequently from the backend.
After the change in DPDK version 1.3, this was not the behavior when
the request was partially satisfied from the cache; instead, the objects
from the backend were returned ahead of the objects from the cache.
This bug degraded application performance on CPUs with a small L1 cache,
which benefit from having the hot objects first in the returned array.
(This is probably also the reason why the function returns the objects
in reverse order, which it still does.)
Now, all code paths first return objects from the cache, subsequently
from the backend.

The function was not behaving as described (by the function using it)
and expected by applications using it. This in itself is also a bug.

3. If the cache could not be backfilled, the function would attempt
to get all the requested objects from the backend (instead of only the
number of requested objects minus the objects available in the backend),
and the function would fail if that failed.
Now, the first part of the request is always satisfied from the cache,
and if the subsequent backfilling of the cache from the backend fails,
only the remaining requested objects are retrieved from the backend.

The function would fail despite there are enough objects in the cache
plus the common pool.

4. The code flow for satisfying the request from the cache was slightly
inefficient:
The likely code path where the objects are simply served from the cache
was treated as unlikely. Now it is treated as likely.

Signed-off-by: Morten Brørup <mb@smartsharesystems.com>
Signed-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Reviewed-by: Morten Brørup <mb@smartsharesystems.com>
2022-10-08 22:52:51 +02:00
..
acl version: 22.11-rc0 2022-07-21 12:13:48 +02:00
bbdev version: 22.11-rc0 2022-07-21 12:13:48 +02:00
bitratestats version: 22.11-rc0 2022-07-21 12:13:48 +02:00
bpf eal: remove unneeded includes from a public header 2022-09-21 15:31:03 +02:00
cfgfile version: 22.11-rc0 2022-07-21 12:13:48 +02:00
cmdline version: 22.11-rc0 2022-07-21 12:13:48 +02:00
compressdev dev: hide driver object 2022-09-23 16:14:34 +02:00
cryptodev security: hide session structure 2022-10-04 22:37:54 +02:00
distributor eal: remove unneeded includes from a public header 2022-09-21 15:31:03 +02:00
dmadev dmadev: support telemetry dump dmadev 2022-10-03 12:03:36 +02:00
eal eal: add thread comparison helper 2022-10-06 21:05:32 +02:00
efd eal: remove unneeded includes from a public header 2022-09-21 15:31:03 +02:00
ethdev ethdev: support multiple mbuf pools per Rx queue 2022-10-08 18:39:02 +02:00
eventdev eventdev: introduce event cryptodev vector type 2022-10-02 20:33:24 +02:00
fib version: 22.11-rc0 2022-07-21 12:13:48 +02:00
flow_classify lib: remove unneeded header includes 2022-02-22 13:10:39 +01:00
gpudev dev: hide driver object 2022-09-23 16:14:34 +02:00
graph eal: remove unneeded includes from a public header 2022-09-21 15:31:03 +02:00
gro gro: fix chain index for more than 2 packets 2022-10-05 14:16:37 +02:00
gso version: 22.11-rc0 2022-07-21 12:13:48 +02:00
hash version: 22.11-rc0 2022-07-21 12:13:48 +02:00
ip_frag ip_frag: add IPv4 fragment copy 2022-08-29 16:24:18 +02:00
ipsec security: hide session structure 2022-10-04 22:37:54 +02:00
jobstats version: 22.11-rc0 2022-07-21 12:13:48 +02:00
kni version: 22.11-rc0 2022-07-21 12:13:48 +02:00
kvargs version: 22.11-rc0 2022-07-21 12:13:48 +02:00
latencystats version: 22.11-rc0 2022-07-21 12:13:48 +02:00
lpm version: 22.11-rc0 2022-07-21 12:13:48 +02:00
mbuf mem: fix API doc about allocation on secondary processes 2022-10-04 13:36:13 +02:00
member version: 22.11-rc0 2022-07-21 12:13:48 +02:00
mempool mempool: fix get objects from mempool with cache 2022-10-08 22:52:51 +02:00
meter eal: remove unneeded includes from a public header 2022-09-21 15:31:03 +02:00
metrics metrics: return error code on initialization failures 2022-10-03 12:03:36 +02:00
net net: fix build with -Wpedantic 2022-09-29 09:20:12 +02:00
node eal: remove unneeded includes from a public header 2022-09-21 15:31:03 +02:00
pcapng dev: hide driver object 2022-09-23 16:14:34 +02:00
pci eal: remove unneeded includes from a public header 2022-09-21 15:31:03 +02:00
pdump eal: remove unneeded includes from a public header 2022-09-21 15:31:03 +02:00
pipeline cryptodev: rework session framework 2022-10-04 22:04:59 +02:00
port port: prevent unnecessary flush for ring output port 2022-09-22 16:56:58 +02:00
power eal: remove unneeded includes from a public header 2022-09-21 15:31:03 +02:00
rawdev rawdev: support telemetry dump rawdev 2022-10-03 12:03:36 +02:00
rcu rcu: fix build with datapath debug log 2022-10-06 12:37:11 +02:00
regexdev eal: deprecate RTE_FUNC_PTR_* macros 2022-09-23 16:14:34 +02:00
reorder version: 22.11-rc0 2022-07-21 12:13:48 +02:00
rib version: 22.11-rc0 2022-07-21 12:13:48 +02:00
ring mem: fix API doc about allocation on secondary processes 2022-10-04 13:36:13 +02:00
sched eal: remove unneeded includes from a public header 2022-09-21 15:31:03 +02:00
security security: hide session structure 2022-10-04 22:37:54 +02:00
stack version: 22.11-rc0 2022-07-21 12:13:48 +02:00
table table: add entry ID for learner tables 2022-09-24 11:35:23 +02:00
telemetry telemetry: make help command more helpful 2022-09-26 13:49:38 +02:00
timer timer: fix stopping all timers 2022-10-05 15:29:54 +02:00
vhost vhost: fix build with GCC 12 2022-10-06 12:18:09 +02:00
meson.build build: add definitions for use as Meson subproject 2022-06-07 20:49:20 +02:00