From: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
To: Sascha Hauer <s.hauer@pengutronix.de>
Cc: Barebox List <barebox@lists.infradead.org>
Subject: Re: [PATCH 2/3] tftp: implement UDP reorder cache using lists
Date: Fri, 16 Sep 2022 16:12:07 +0200 [thread overview]
Message-ID: <lypmfv8l3c.fsf@ensc-pc.intern.sigma-chemnitz.de> (raw)
In-Reply-To: <20220916125232.3775559-3-s.hauer@pengutronix.de> (Sascha Hauer's message of "Fri, 16 Sep 2022 14:52:31 +0200")
Sascha Hauer <s.hauer@pengutronix.de> writes:
> The UDP reorder cache can be much easier implemented using lists.
> As a bonus the cache grows and shrinks on demand and no fixed size
> has to be configured at compile time.
There are three variants of the cache
- small, fixed sized array with linear search (very first
implementation) --> O(n)
- list --> O(n) on insert, O(1) on lookup
- bitmap --> O(1)
Performance wise, I think the list implementation is the slowest one
(although the fixed sized array is O(n) on every operation, this should
be still faster for small n than the list operations and the related
memory management).
>From code size, the list implementation is in the middle.
I am not sure whether dynamic shrinking/growing of the cache is so
important or whether a small, fixed sized cache suffices. In my
experience, only the first couple of packets really matter regarding
reordering.
Of course, the 'kfifo' could be replaced completely by a custom buffer
implementation where packets are inserted at the correct position. O(1)
for every operation + zero additional memory.
> -static inline bool is_block_before(uint16_t a, uint16_t b)
> -{
> - return (int16_t)(b - a) > 0;
> -}
> -
> ....
> static int tftp_window_cache_insert(struct tftp_cache *cache, uint16_t id,
> void const *data, size_t len)
> {
> ...
> + list_for_each_entry(block, &cache->blocks, list) {
fwiw, iterating in the reverse direction will find the position probably
faster
> + if (block->id == id)
> + return 0;
> + if (block->id < id)
This will break when wrapping at 65535; the removed 'is_block_before()'
function was written for this case.
> @@ -614,12 +431,26 @@ static void tftp_apply_window_cache(struct file_priv *priv)
> if (priv->state != STATE_RDATA)
> return;
>
> - block = tftp_window_cache_pop(cache);
> + if (list_empty(&cache->blocks))
> + return;
>
> - debug_assert(block);
> - debug_assert(block->id == (uint16_t)(priv->last_block + 1));
> + block = list_first_entry(&cache->blocks, struct tftp_block, list);
> +
> + if (block->id < priv->last_block + 1) {
ditto; wrapping at 65535
> + /* shouldn't happen, but be sure */
> + list_del(&block->list);
> + free(block);
> + continue;
> + }
> +
> + if (block->id != priv->last_block + 1)
ditto; wrapping at 65535. Resp. should be written as
| if (block->id != (uint16_t)(priv->last_block + 1))
Enrico
next prev parent reply other threads:[~2022-09-16 14:14 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-16 12:52 [PATCH 0/3] tftp updates Sascha Hauer
2022-09-16 12:52 ` [PATCH 1/3] tftp: remove selftest Sascha Hauer
2022-09-16 12:52 ` [PATCH 2/3] tftp: implement UDP reorder cache using lists Sascha Hauer
2022-09-16 14:12 ` Enrico Scholz [this message]
2022-09-19 7:33 ` Sascha Hauer
2022-09-16 12:52 ` [PATCH 3/3] net: designware_eqos: Allocate more receive buffers Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=lypmfv8l3c.fsf@ensc-pc.intern.sigma-chemnitz.de \
--to=enrico.scholz@sigma-chemnitz.de \
--cc=barebox@lists.infradead.org \
--cc=s.hauer@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox