On Tue, 3 Nov 2026 at 18:07, Thomas Monjalon <[email protected]> wrote:
>
> Derive the hotplug devargs buffer size from the IPC parameter capacity.
> This increases the maximum devargs length in multi-process mode
> from 127 to 247 bytes, excluding the terminating null byte.
>
> Signed-off-by: Thomas Monjalon <[email protected]>
> ---
> lib/eal/common/eal_common_dev.c | 2 +-
> lib/eal/common/hotplug_mp.h | 8 +++++++-
> 2 files changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/lib/eal/common/eal_common_dev.c b/lib/eal/common/eal_common_dev.c
> index f42a8d2349..febb584313 100644
> --- a/lib/eal/common/eal_common_dev.c
> +++ b/lib/eal/common/eal_common_dev.c
> @@ -276,7 +276,7 @@ rte_dev_probe(const char *devargs)
> goto skip_mp_req;
>
> if (strlen(devargs) >= EAL_DEV_MP_DEV_ARGS_MAX_LEN) {
> - EAL_LOG(ERR, "devargs truncated (len %zu, max %d)",
> + EAL_LOG(ERR, "devargs truncated (len %zu, max %zu)",
> strlen(devargs), EAL_DEV_MP_DEV_ARGS_MAX_LEN);
> return -E2BIG;
> }
> diff --git a/lib/eal/common/hotplug_mp.h b/lib/eal/common/hotplug_mp.h
> index 7221284286..bd2f0f296a 100644
> --- a/lib/eal/common/hotplug_mp.h
> +++ b/lib/eal/common/hotplug_mp.h
> @@ -5,6 +5,7 @@
> #ifndef _HOTPLUG_MP_H_
> #define _HOTPLUG_MP_H_
>
> +#include "rte_eal.h"
> #include "rte_dev.h"
>
> #define EAL_DEV_MP_ACTION_REQUEST "eal_dev_mp_request"
> @@ -12,7 +13,9 @@
>
> #define EAL_DEV_MP_DEV_NAME_MAX_LEN RTE_DEV_NAME_MAX_LEN
> #define EAL_DEV_MP_BUS_NAME_MAX_LEN 32
> -#define EAL_DEV_MP_DEV_ARGS_MAX_LEN 128
> +#define EAL_DEV_MP_DEV_ARGS_MAX_LEN (RTE_MP_MAX_PARAM_LEN \
> + - sizeof(enum eal_dev_req_type) - sizeof(int))
> + /* minus t and result from struct eal_dev_mp_req */
>
> enum eal_dev_req_type {
> EAL_DEV_REQ_TYPE_ATTACH,
> @@ -27,6 +30,9 @@ struct eal_dev_mp_req {
> int result;
> };
>
> +static_assert(sizeof(struct eal_dev_mp_req) <= RTE_MP_MAX_PARAM_LEN,
> + "Hotplug message struct exceeds IPC parameter capacity");
> +
A bit ugly to list those fields, even with the assert.
No strong opinion, just listing an alternative.
The idea is to switch to a flexible array for devargs.
struct eal_dev_mp_req {
enum eal_dev_req_type t;
- char devargs[EAL_DEV_MP_DEV_ARGS_MAX_LEN];
int result;
+ char devargs[];
};
+#define EAL_DEV_MP_DEV_ARGS_MAX_LEN \
+ (RTE_MP_MAX_PARAM_LEN - sizeof(struct eal_dev_mp_req))
This requires an update of
eal_dev_hotplug_request_to_primary/eal_dev_hotplug_request_to_secondary
so they manipulate a rte_mp_msg object.
A bonus side effect is that it avoids copies on stack for the message,
as the caller already provides the message buffer.
--
David Marchand