[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20150107110118.GO21820@casper.infradead.org>
Date: Wed, 7 Jan 2015 11:01:18 +0000
From: Thomas Graf <tgraf@...g.ch>
To: David Laight <David.Laight@...LAB.COM>
Cc: 'Alexei Starovoitov' <alexei.starovoitov@...il.com>,
"David S. Miller" <davem@...emloft.net>,
Jesse Gross <jesse@...ira.com>,
Stephen Hemminger <stephen@...workplumber.org>,
Pravin Shelar <pshelar@...ira.com>,
"netdev@...r.kernel.org" <netdev@...r.kernel.org>,
"dev@...nvswitch.org" <dev@...nvswitch.org>
Subject: Re: [PATCH 2/6] vxlan: Group Policy extension
On 01/07/15 at 10:03am, David Laight wrote:
> From: Alexei Starovoitov
> > On Tue, Jan 6, 2015 at 6:05 PM, Thomas Graf <tgraf@...g.ch> wrote:
> > > +struct vxlan_gbp {
> > > +#ifdef __LITTLE_ENDIAN_BITFIELD
> > > + __u8 reserved_flags1:3,
> > ...
> > > + __be16 policy_id;
> > > +} __packed;
> >
> > are you sure that compiler will be smart enough
> > to do single short load when you pack
> > u8 + struct vxlan_gbp inside struct vxlanhdr ?
> > I suspect compiler will use two byte loads
> > with shifts and ors every time to access policy_id.
> > Even it works ok, I think this struct layout is ugly.
> > imo would be much easier to read if you replace
> > the whole vxlanhdr with vxlanhdr_gbp
> > or split vxlanhdr into two 32-bit structs.
> > then __packed hacks won't be needed.
If I read objdump output correctly, gcc seems fine with it:
/* For backwards compatibility, only allow reserved fields to be
* used by VXLAN extensions if explicitly requested.
*/
if (vs->exts) {
if (!vxh->vni_present)
2640: 41 0f b6 55 08 movzbl 0x8(%r13),%edx
2645: f6 c2 08 test $0x8,%dl
2648: 74 c2 je 260c <vxlan_udp_encap_recv+0x9c>
[...]
md.gbp = ntohs(vxh->gbp.policy_id);
2652: 41 0f b7 55 0a movzwl 0xa(%r13),%edx
Let me know what I have to do/provide to validate this properly.
> Also, if you are writing the values then you need to write
> all the members of the bitfield in order to get a single write.
>
> Basically you are much better off using explicit masks.
I went back and forth on this and chose to use individual bit fields
and map them to a static bit definition which is exported via Netlink.
That way the user space Netlink interface remains stable should the
wire protocol ever change. Yes, this implies some branching which could
be avoided right now as long as user and wire protocol are identical. I
did not observe any performance differences in benchmarks though.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists