From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Laight Subject: RE: [PATCH] usbnet: smsc95xx: simplify tx_fixup code Date: Mon, 8 Oct 2018 08:41:49 +0000 Message-ID: <170d3d23a5c2463fab275d2e871775f3@AcuMS.aculab.com> References: <59988ed22559410881addfecf58335eb@AcuMS.aculab.com> <20181002165602.21033-1-ben.dooks@codethink.co.uk> <20181005.142412.601607260441380535.davem@davemloft.net> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Cc: "netdev@vger.kernel.org" , "oneukum@suse.com" , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "linux-kernel@lists.codethink.co.uk" To: 'David Miller' , "ben.dooks@codethink.co.uk" Return-path: Received: from eu-smtp-delivery-151.mimecast.com ([146.101.78.151]:20968 "EHLO eu-smtp-delivery-151.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726075AbeJHPw1 (ORCPT ); Mon, 8 Oct 2018 11:52:27 -0400 In-Reply-To: <20181005.142412.601607260441380535.davem@davemloft.net> Content-Language: en-US Sender: netdev-owner@vger.kernel.org List-ID: From: David Miller > Sent: 05 October 2018 22:24 > > From: Ben Dooks > Date: Tue, 2 Oct 2018 17:56:02 +0100 > > > - memcpy(skb->data, &tx_cmd_a, 4); > > + ptr = skb_push(skb, 8); > > + tx_cmd_a = cpu_to_le32(tx_cmd_a); > > + tx_cmd_b = cpu_to_le32(tx_cmd_b); > > + memcpy(ptr, &tx_cmd_a, 4); > > + memcpy(ptr+4, &tx_cmd_b, 4); > > Even a memcpy() through a void pointer does not guarantee that gcc will > not emit word sized loads and stores. True, but only if gcc can 'see' something that would require the pointer be aligned. In this case the void pointer comes from an external function so is fine. > You must use the get_unaligned()/put_unaligned() facilities to do this > properly. > > I also agree that making a proper type and structure instead of using > a void pointer would be better. The structure would need to be marked 'packed' - since its alignment isn't guaranteed. Then you don't need to use put_unaligned(). If it wasn't 'packed' then gcc would implement memcpy(&hdr->tx_cmd_a, &tx_cmd_a, 4) using an aligned write. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)