Matthew Wilcox <willy@debian.org> writes: > This is a fun one ... I don't know what to blame for this. > > struct rfd { > u16 status; > u16 command; > u32 link; > u32 rbd; > u16 actual_size; > u16 size; > }; > > static void e100_rx_rfa_add_tail(struct nic *nic, struct rx_list *curr) > { > struct rfd *rfd = (struct rfd *)curr->skb->data; > > memcpy(rfd, &nic->blank_rfd, sizeof(struct rfd)); > } > > I'm using gcc (GCC) 3.3.2 (Debian) for this. > > The kernel doesn't use -fno-builtin or -fno-builtin-memcpy so it attempts > to optimise this by doing 4-byte loads and stores. Problem is, the > destination is misaligned (deliberately), so the kernel emits unaligned > messages. Adding -fno-builtin to the command line turns this back into > a call to memcpy. > > So how should this be fixed? > > - Improve gcc's builtin memcpy to work on non-aligned structs (unlikely)? The builtin memcpy is correct, casting unaligned data is invoking undefined behaviour here. > - Somehow tag the pointer or the struct that it's unaligned? > - Compile with -fno-builtin-memcpy (and probably a few others too)? > > Other suggestions? - Don't use the casted address, but rather the original pointer in the memcpy call. Andreas. -- Andreas Schwab, SuSE Labs, schwab@suse.de SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." - To unsubscribe from this list: send the line "unsubscribe linux-ia64" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.htmlReceived on Mon Dec 8 11:26:15 2003
This archive was generated by hypermail 2.1.8 : 2005-08-02 09:20:20 EST