Hi Antonio,

Thanks for investigating and sharing these results.

You're right, this patch changes slightly the assembly output in
miniflow_extract() and introduces a performance regression.


On 01/02/2016 03:13, "Fischetti, Antonio" <antonio.fische...@intel.com>
wrote:

>Hi, I was running some Regression Test to check performance in a
>Phy-2-Phy test, ie
>ovs-ofctl add-flow br0 in_port=1,action=output:2
>
>After applying patches #1 and then #2 the performance
>is still ok.
>Instead, after I apply this patch #3 the throughput goes from 12.1
>down to 11.6 Mpps.
>
>I found out 2 strange alternative ways to restore performance.
>Either:
>1. Comment the new parse_dl_type() function. I know it's odd
>because it isn't yet called from anywhere.

I guess that the compiler doesn't know that when it's compiling
flow.c.

>Or:
>2. Adding these weird changes to the 2 function prototypes which are
>called by parse_dl_type()
>
>- static inline ovs_be16
>+/*static inline*/ ovs_be16
>parse_vlan(const void **datap, size_t *sizep)
>
>and
>
>- static inline ovs_be16
>+ /*static*/ inline ovs_be16
>parse_ethertype(const void **datap, size_t *sizep)

It looks like my patch prevents the compiler from inlining part of
these functions, and this confirms it.

I propose the following incremental, that seems to resolve the
regression. What do you think?

---8<---

diff --git a/lib/flow.c b/lib/flow.c
index 08e199c..238a7f5 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -290,7 +290,7 @@ parse_mpls(const void **datap, size_t *sizep)
     return MIN(count, FLOW_MAX_MPLS_LABELS);
 }

-static inline ovs_be16
+static inline ALWAYS_INLINE ovs_be16
 parse_vlan(const void **datap, size_t *sizep)
 {
     const struct eth_header *eth = *datap;
@@ -312,7 +312,7 @@ parse_vlan(const void **datap, size_t *sizep)
     return 0;
 }

-static inline ovs_be16
+static inline ALWAYS_INLINE ovs_be16
 parse_ethertype(const void **datap, size_t *sizep)
 {
     const struct llc_snap_header *llc;


---8<---

I'm not a fan of this kind of optimizations, but I believe that
miniflow_extract() deserves some special treatment.

Thanks,

Daniele


>
>It looks like some compiler optimization is failing for some reason?
>I didn't investigate further on the output map of the executable.
>
>Antonio
>
>
>> -----Original Message-----
>> From: dev [mailto:dev-boun...@openvswitch.org] On Behalf Of Daniele Di
>> Proietto
>> Sent: Monday, November 16, 2015 6:21 AM
>> To: dev@openvswitch.org
>> Subject: [ovs-dev] [PATCH 03/12] flow: Introduce parse_dl_type().
>> 
>> The function simply returns the ethernet type of the packet (after
>> eventually discarding the VLAN tag).  It will be used by a following
>> commit.
>> 
>> Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com>
>> ---
>>  lib/flow.c | 10 ++++++++++
>>  lib/flow.h |  1 +
>>  2 files changed, 11 insertions(+)
>> 
>> diff --git a/lib/flow.c b/lib/flow.c
>> index 2bdce26..d8c1228 100644
>> --- a/lib/flow.c
>> +++ b/lib/flow.c
>> @@ -789,6 +789,16 @@ miniflow_extract(struct dp_packet *packet, struct
>> miniflow *dst)
>>      dst->map = mf.map;
>>  }
>> 
>> +ovs_be16
>> +parse_dl_type(const struct eth_header *data_, size_t size)
>> +{
>> +    const void *data = data_;
>> +
>> +    parse_vlan(&data, &size);
>> +
>> +    return parse_ethertype(&data, &size);
>> +}
>> +
>>  /* For every bit of a field that is wildcarded in 'wildcards', sets the
>>   * corresponding bit in 'flow' to zero. */
>>  void
>> diff --git a/lib/flow.h b/lib/flow.h
>> index de15a98..7465af8 100644
>> --- a/lib/flow.h
>> +++ b/lib/flow.h
>> @@ -237,6 +237,7 @@ void flow_compose(struct dp_packet *, const struct
>> flow *);
>> 
>>  bool parse_ipv6_ext_hdrs(const void **datap, size_t *sizep, uint8_t
>> *nw_proto,
>>                           uint8_t *nw_frag);
>> +ovs_be16 parse_dl_type(const struct eth_header *data_, size_t size);
>> 
>>  static inline uint64_t
>>  flow_get_xreg(const struct flow *flow, int idx)
>> --
>> 2.1.4
>> 
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to