Content (param[]) of received multiprocess messages are aligned with a 4 bytes constraint.
Before patch: struct mp_msg_internal { int type; /* 0 4 */ struct rte_mp_msg { char name[64]; /* 4 64 */ /* --- cacheline 1 boundary (64 bytes) was 4 bytes ago --- */ int len_param; /* 68 4 */ int num_fds; /* 72 4 */ /* typedef uint8_t -> __uint8_t */ unsigned char param[256]; /* 76 256 */ /* --- cacheline 5 boundary (320 bytes) was 12 bytes ago --- */ int fds[253]; /* 332 1012 */ } msg; /* 4 1340 */ /* size: 1344, cachelines: 21, members: 2 */ }; This results in many unaligned accesses for multiprocess malloc requests. Examples: ../lib/eal/common/malloc_mp.c:308:32: runtime error: member access within misaligned address 0x7f7b35df4684 for type 'const struct malloc_mp_req', which requires 8 byte alignment ../lib/eal/common/malloc_mp.c:158:9: runtime error: member access within misaligned address 0x7f36a535bb5c for type 'const struct malloc_mp_req', which requires 8 byte alignment ../lib/eal/common/malloc_mp.c:171:8: runtime error: member access within misaligned address 0x7f4ba65f296c for type 'struct malloc_mp_req', which requires 8 byte alignment Signed-off-by: David Marchand <david.march...@redhat.com> --- lib/eal/common/eal_common_proc.c | 2 +- lib/eal/common/malloc_mp.c | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/eal/common/eal_common_proc.c b/lib/eal/common/eal_common_proc.c index 0dea787e38..3846c7178d 100644 --- a/lib/eal/common/eal_common_proc.c +++ b/lib/eal/common/eal_common_proc.c @@ -62,7 +62,7 @@ enum mp_type { struct mp_msg_internal { int type; - struct rte_mp_msg msg; + alignas(8) struct rte_mp_msg msg; }; struct async_request_param { diff --git a/lib/eal/common/malloc_mp.c b/lib/eal/common/malloc_mp.c index 9765277f5d..000c7f6b47 100644 --- a/lib/eal/common/malloc_mp.c +++ b/lib/eal/common/malloc_mp.c @@ -148,7 +148,7 @@ get_unique_id(void) static int handle_sync(const struct rte_mp_msg *msg, const void *peer) { - struct rte_mp_msg reply; + alignas(8) struct rte_mp_msg reply; const struct malloc_mp_req *req = (const struct malloc_mp_req *)msg->param; struct malloc_mp_req *resp = @@ -330,7 +330,7 @@ handle_request(const struct rte_mp_msg *msg, const void *peer __rte_unused) } if (ret != 0) { - struct rte_mp_msg resp_msg; + alignas(8) struct rte_mp_msg resp_msg; struct malloc_mp_req *resp = (struct malloc_mp_req *)resp_msg.param; @@ -351,7 +351,7 @@ handle_request(const struct rte_mp_msg *msg, const void *peer __rte_unused) /* we did not modify the request */ free(entry); } else { - struct rte_mp_msg sr_msg; + alignas(8) struct rte_mp_msg sr_msg; struct malloc_mp_req *sr = (struct malloc_mp_req *)sr_msg.param; struct timespec ts; @@ -444,7 +444,7 @@ handle_sync_response(const struct rte_mp_msg *request, } if (entry->user_req.t == REQ_TYPE_FREE) { - struct rte_mp_msg msg; + alignas(8) struct rte_mp_msg msg; struct malloc_mp_req *resp = (struct malloc_mp_req *)msg.param; memset(&msg, 0, sizeof(msg)); @@ -465,7 +465,7 @@ handle_sync_response(const struct rte_mp_msg *request, } else if (entry->user_req.t == REQ_TYPE_ALLOC && result == REQ_RESULT_SUCCESS) { struct malloc_heap *heap = entry->alloc_state.heap; - struct rte_mp_msg msg; + alignas(8) struct rte_mp_msg msg; struct malloc_mp_req *resp = (struct malloc_mp_req *)msg.param; @@ -489,7 +489,7 @@ handle_sync_response(const struct rte_mp_msg *request, free(entry); } else if (entry->user_req.t == REQ_TYPE_ALLOC && result == REQ_RESULT_FAIL) { - struct rte_mp_msg rb_msg; + alignas(8) struct rte_mp_msg rb_msg; struct malloc_mp_req *rb = (struct malloc_mp_req *)rb_msg.param; struct timespec ts; @@ -551,7 +551,7 @@ static int handle_rollback_response(const struct rte_mp_msg *request, const struct rte_mp_reply *reply __rte_unused) { - struct rte_mp_msg msg; + alignas(8) struct rte_mp_msg msg; struct malloc_mp_req *resp = (struct malloc_mp_req *)msg.param; const struct malloc_mp_req *mpreq = (const struct malloc_mp_req *)request->param; @@ -628,7 +628,7 @@ handle_response(const struct rte_mp_msg *msg, const void *peer __rte_unused) int request_sync(void) { - struct rte_mp_msg msg; + alignas(8) struct rte_mp_msg msg; struct rte_mp_reply reply; struct malloc_mp_req *req = (struct malloc_mp_req *)msg.param; struct timespec ts; @@ -697,7 +697,7 @@ request_sync(void) int request_to_primary(struct malloc_mp_req *user_req) { - struct rte_mp_msg msg; + alignas(8) struct rte_mp_msg msg; struct malloc_mp_req *msg_req = (struct malloc_mp_req *)msg.param; struct mp_request *entry; struct timespec ts; -- 2.50.0