On Mon, Feb 03, 2025 at 11:20:03AM +0100, Stefano Brivio wrote:
On Mon, 3 Feb 2025 20:26:15 +1100 David Gibson
wrote: +/* Stages for version 1 */ +static const struct migrate_stage stages_v1[] = { + { + .name = "flow pre", + .source = flow_migrate_source_pre, + .target = NULL, + }, + DATA_STAGE(flow_first_free), + DATA_STAGE(flowtab), + DATA_STAGE(flow_hashtab), + DATA_STAGE(g_hash_secret),
...so this one for g_hash_secret (which is the abomination I wanted to drop) would eventually turn into a function?
Yes.
It looks neat, I'm just not sure if we'll really have "data stages" after I change the approach to only transfer the data we need as you suggested.
I agree, that may well be the case, but we can just drop the macro and helepr functions then.
Is that part of your pending queue by the way, or should I go ahead with it?
Is which part of my pending queue? g_hash_secret as a function? No, I've thought of it, but I haven't written it yet.
[...]
/** - * struct migrate_data - Data sections for given source version - * @v: Source version this applies to, host order - * @sections: Array of data sections, NULL-terminated + * migrate_cb_t - Callback function to implement one migration stage */ -struct migrate_data { - uint32_t v; - struct iovec *sections; -}; +typedef int (*migrate_cb_t)(struct ctx *c, struct migrate_meta *m, + const struct migrate_stage *stage, int fd);
typedef is really annoying, we already have a flow_sidx which kind of made sense, but this has really no advantage over something like:
Eh, I guess. I find the extra . or -> a little annoying, but we can do this if you'd prefer.
struct migrate_handler { int (*fn)(struct ctx *c, struct migrate_meta *m); };
-- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson