From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out-186.mta0.migadu.com (out-186.mta0.migadu.com [91.218.175.186]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A40B303A08 for ; Tue, 11 Nov 2025 15:37:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.186 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762875478; cv=none; b=JOPwp+NBYRcPGTfJTmiRORsfrRa1f9iPwlUno4rRBF5xL/xzS8gZV+fwTeKab95gVxUX512K/0Bs8lBFr8aUfrzO0wZogYzNnDH3mpr+1SifQnxv7FUQay5NMMiXwQPdmOloB1smMuOysciJqCbeN4+5fje3TazppcWw0zF+TO8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762875478; c=relaxed/simple; bh=tlRn2Zr6waGfESp+v75z26Egg0nYRqY7h018d106ygY=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=pxnPkHcMRJnOSptYmCB5TSC36ShnA4uXrsaXgFqHgNTzotKMXjN7ZskA0UMA4A9+qlX3dzzaiG7SAlrhNSpR3kkx6r8P3Lj6P/NWqExshC0lsx4lbB5Tfkt8AvH/EBkIdiwp99dUAXFbgittT6FjojhsCTqwKCqWaZ+fv/W6rg0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=AH/sxwr+; arc=none smtp.client-ip=91.218.175.186 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="AH/sxwr+" Message-ID: DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1762875464; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bmRvIZCuGTuDP1eUFzMKvlZSU2aU2eVTuu31lnKyx8g=; b=AH/sxwr+BhLhqvyddla32yy/t/eDL9n80VI/XrOzQwOfxg+iZE9RiJA18GR6bdPtf3Fmyu TF08d+p3K/7G80I7IYWOUMVKRcyM2M6jra17u9yL3CS25PzPVzVewRgVD7Qr+nyf0+czn6 Vi8yuw7WJ4hX+ldWR87emuQcXDpW4Cw= Date: Tue, 11 Nov 2025 07:37:32 -0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Subject: Re: [PATCH][next] RDMA/rxe: Avoid -Wflex-array-member-not-at-end warnings To: Leon Romanovsky , "Gustavo A. R. Silva" Cc: "Gustavo A. R. Silva" , Zhu Yanjun , Jason Gunthorpe , linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org References: <20251111115621.GO15456@unreal> <20251111141945.GQ15456@unreal> X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Zhu Yanjun In-Reply-To: <20251111141945.GQ15456@unreal> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT 在 2025/11/11 6:19, Leon Romanovsky 写道: > On Tue, Nov 11, 2025 at 09:14:05PM +0900, Gustavo A. R. Silva wrote: >> >> On 11/11/25 20:56, Leon Romanovsky wrote: >>> On Tue, Nov 11, 2025 at 12:35:02PM +0900, Gustavo A. R. Silva wrote: >>>> -Wflex-array-member-not-at-end was introduced in GCC-14, and we are >>>> getting ready to enable it, globally. >>>> >>>> Use the new TRAILING_OVERLAP() helper to fix the following warning: >>>> >>>> 21 drivers/infiniband/sw/rxe/rxe_verbs.h:271:33: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end] >>>> >>>> This helper creates a union between a flexible-array member (FAM) and a >>>> set of MEMBERS that would otherwise follow it. >>>> >>>> This overlays the trailing MEMBER struct ib_sge sge[RXE_MAX_SGE]; onto >>>> the FAM struct rxe_recv_wqe::dma.sge, while keeping the FAM and the >>>> start of MEMBER aligned. >>>> >>>> The static_assert() ensures this alignment remains, and it's >>>> intentionally placed inmediately after the related structure --no >>>> blank line in between. >>>> >>>> Lastly, move the conflicting declaration struct rxe_resp_info resp; >>>> to the end of the corresponding structure. >>>> >>>> Signed-off-by: Gustavo A. R. Silva >>>> --- >>>> drivers/infiniband/sw/rxe/rxe_verbs.h | 18 +++++++++++------- >>>> 1 file changed, 11 insertions(+), 7 deletions(-) >>>> >>>> diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h >>>> index fd48075810dd..6498d61e8956 100644 >>>> --- a/drivers/infiniband/sw/rxe/rxe_verbs.h >>>> +++ b/drivers/infiniband/sw/rxe/rxe_verbs.h >>>> @@ -219,12 +219,6 @@ struct rxe_resp_info { >>>> u32 rkey; >>>> u32 length; >>>> - /* SRQ only */ >>>> - struct { >>>> - struct rxe_recv_wqe wqe; >>>> - struct ib_sge sge[RXE_MAX_SGE]; >>>> - } srq_wqe; >>>> - >>>> /* Responder resources. It's a circular list where the oldest >>>> * resource is dropped first. >>>> */ >>>> @@ -232,7 +226,15 @@ struct rxe_resp_info { >>>> unsigned int res_head; >>>> unsigned int res_tail; >>>> struct resp_res *res; >>>> + >>>> + /* SRQ only */ >>>> + /* Must be last as it ends in a flexible-array member. */ >>>> + TRAILING_OVERLAP(struct rxe_recv_wqe, wqe, dma.sge, >>>> + struct ib_sge sge[RXE_MAX_SGE]; >>>> + ) srq_wqe; >>> Will this change be enough? >>> >>> diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h >>> index fd48075810dd..9ab11421a585 100644 >>> --- a/drivers/infiniband/sw/rxe/rxe_verbs.h >>> +++ b/drivers/infiniband/sw/rxe/rxe_verbs.h >>> @@ -219,12 +219,6 @@ struct rxe_resp_info { >>> u32 rkey; >>> u32 length; >>> - /* SRQ only */ >>> - struct { >>> - struct rxe_recv_wqe wqe; >>> - struct ib_sge sge[RXE_MAX_SGE]; >>> - } srq_wqe; >>> - >>> /* Responder resources. It's a circular list where the oldest >>> * resource is dropped first. >>> */ >>> @@ -232,6 +226,12 @@ struct rxe_resp_info { >>> unsigned int res_head; >>> unsigned int res_tail; >>> struct resp_res *res; >>> + >>> + /* SRQ only */ >>> + struct { >>> + struct ib_sge sge[RXE_MAX_SGE]; >>> + struct rxe_recv_wqe wqe; >>> + } srq_wqe; >>> }; >> The question is if this is really what you want? >> >> sge[RXE_MAX_SGE] is of the following type: >> >> struct ib_sge { >> u64 addr; >> u32 length; >> u32 lkey; >> }; >> >> and struct rxe_recv_wqe::dma.sge[] is of type: >> >> struct rxe_sge { >> __aligned_u64 addr; >> __u32 length; >> __u32 lkey; >> }; >> >> Both types are basically the same, and the original code looks >> pretty much like what people do when they want to pre-allocate >> a number of elements (of the same element type as the flex array) >> for a flexible-array member. >> >> Based on the above, the change you suggest seems a bit suspicious, >> and I'm not sure that's actually what you want? > You wrote about this error: "warning: structure containing a flexible array > member is not at the end of another structure". > > My suggestion was simply to move that flex array to be the last element > and save us from the need to have some complex, magic macro in RXE. Thanks, I agree with this approach. The macro is rather complicated, and this solution fixes the problem in a straightforward way. Yanjun.Zhu > > Thanks > >> Thanks >> -Gustavo >> >> >> >> >> -- Best Regards, Yanjun.Zhu