lkml.org 
[lkml]   [2024]   [Mar]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH 2/2][next] ALSA: firewire-lib: Avoid -Wflex-array-member-not-at-end warning
-Wflex-array-member-not-at-end is coming in GCC-14, and we are getting
ready to enable it globally.

There is currently a local structure `template` that is using a flexible
`struct fw_iso_packet` as a header for an on-stack array
`__be32 header[CIP_HEADER_QUADLETS];`.

struct {
struct fw_iso_packet params;
__be32 header[CIP_HEADER_QUADLETS];
} template = { {0}, {0} };

However, we are deprecating flexible arrays in the middle of another
struct. So, in order to avoid this, we use the `struct_group_tagged()`
helper to separate the flexible array from the rest of the members in
the flexible structure:

struct fw_iso_packet {
struct_group_tagged(fw_iso_packet_hdr, hdr,
... the rest of the members
);
u32 header[]; /* tx: Top of 1394 isoch. data_block */
};

With the change described above, we can now declare an object of the
type of the tagged struct, without embedding the flexible array in the
middle of another struct:

struct {
struct fw_iso_packet_hdr params;
__be32 header[CIP_HEADER_QUADLETS];
} template = { {0}, {0} };

We also use `container_of()` whenever we need to retrieve a pointer to
the flexible structure.

So, with these changes, fix the following warning:

sound/firewire/amdtp-stream.c: In function ‘process_rx_packets’:
sound/firewire/amdtp-stream.c:1184:46: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end]
1184 | struct fw_iso_packet params;
|

Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
---
sound/firewire/amdtp-stream.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/sound/firewire/amdtp-stream.c b/sound/firewire/amdtp-stream.c
index c9f153f85ae6..7ba1cd64d7f1 100644
--- a/sound/firewire/amdtp-stream.c
+++ b/sound/firewire/amdtp-stream.c
@@ -1181,12 +1181,14 @@ static void process_rx_packets(struct fw_iso_context *context, u32 tstamp, size_

for (i = 0; i < packets; ++i) {
struct {
- struct fw_iso_packet params;
+ struct fw_iso_packet_hdr params;
__be32 header[CIP_HEADER_QUADLETS];
} template = { {0}, {0} };
+ struct fw_iso_packet *params =
+ container_of(&template.params, struct fw_iso_packet, hdr);
bool sched_irq = false;

- build_it_pkt_header(s, desc->cycle, &template.params, pkt_header_length,
+ build_it_pkt_header(s, desc->cycle, params, pkt_header_length,
desc->data_blocks, desc->data_block_counter,
desc->syt, i, curr_cycle_time);

@@ -1198,7 +1200,7 @@ static void process_rx_packets(struct fw_iso_context *context, u32 tstamp, size_
}
}

- if (queue_out_packet(s, &template.params, sched_irq) < 0) {
+ if (queue_out_packet(s, params, sched_irq) < 0) {
cancel_stream(s);
return;
}
--
2.34.1

\
 
 \ /
  Last update: 2024-05-27 15:37    [W:0.039 / U:0.268 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site