On Tue, Oct 29, 2013 at 10:24 AM, Andy Zhou <az...@nicira.com> wrote:
> This is not a review, but it would be nice to add some code comments in
> proper data structure layout, so that the same logic can be followed in the
> future.
>
ok, I will add general guideline in datapath.h as follows:

/*
 * data structure members should be arranged according to frequency of access
 * in ovs fast-path. So that most frequently accessed members are in
first cache-line
 * for a datapath object.
 */

>
> On Tue, Oct 29, 2013 at 10:12 AM, Pravin B Shelar <pshe...@nicira.com>
> wrote:
>>
>> Following patch rearranges various ovs structures which
>> are accessed in datapath for optimal cacheline access.
>>
>> Signed-off-by: Pravin B Shelar <pshe...@nicira.com>
>> ---
>>  datapath/datapath.h   |   19 +++++++++----------
>>  datapath/flow.h       |   13 ++++++-------
>>  datapath/flow_table.c |    2 +-
>>  datapath/vport.h      |   26 ++++++++++++--------------
>>  4 files changed, 28 insertions(+), 32 deletions(-)
>>
>> diff --git a/datapath/datapath.h b/datapath/datapath.h
>> index 879a830..5a89e0e 100644
>> --- a/datapath/datapath.h
>> +++ b/datapath/datapath.h
>> @@ -53,29 +53,29 @@
>>   *   up per packet.
>>   */
>>  struct dp_stats_percpu {
>> +       struct u64_stats_sync sync;
>> +       u64 n_mask_hit;
>>         u64 n_hit;
>>         u64 n_missed;
>>         u64 n_lost;
>> -       u64 n_mask_hit;
>> -       struct u64_stats_sync sync;
>>  };
>>
>>  /**
>>   * struct datapath - datapath for flow-based packet switching
>> - * @rcu: RCU callback head for deferred destruction.
>> - * @list_node: Element in global 'dps' list.
>> + * @stats_percpu: Per-CPU datapath statistics.
>>   * @table: flow table.
>>   * @ports: Hash table for ports.  %OVSP_LOCAL port always exists.
>> Protected by
>>   * ovs_mutex and RCU.
>> - * @stats_percpu: Per-CPU datapath statistics.
>>   * @net: Reference to net namespace.
>> + * @list_node: Element in global 'dps' list.
>> + * @rcu: RCU callback head for deferred destruction.
>>   *
>>   * Context: See the comment on locking at the top of datapath.c for
>> additional
>>   * locking information.
>>   */
>>  struct datapath {
>> -       struct rcu_head rcu;
>> -       struct list_head list_node;
>> +       /* Stats. */
>> +       struct dp_stats_percpu __percpu *stats_percpu;
>>
>>         /* Flow table. */
>>         struct flow_table table;
>> @@ -83,13 +83,12 @@ struct datapath {
>>         /* Switch ports. */
>>         struct hlist_head *ports;
>>
>> -       /* Stats. */
>> -       struct dp_stats_percpu __percpu *stats_percpu;
>> -
>>  #ifdef CONFIG_NET_NS
>>         /* Network namespace ref. */
>>         struct net *net;
>>  #endif
>> +       struct list_head list_node;
>> +       struct rcu_head rcu;
>>  };
>>
>>  /**
>> diff --git a/datapath/flow.h b/datapath/flow.h
>> index d1ac85a..bab87c3 100644
>> --- a/datapath/flow.h
>> +++ b/datapath/flow.h
>> @@ -128,11 +128,11 @@ struct sw_flow_key_range {
>>  };
>>
>>  struct sw_flow_mask {
>> -       int ref_count;
>> -       struct rcu_head rcu;
>>         struct list_head list;
>>         struct sw_flow_key_range range;
>>         struct sw_flow_key key;
>> +       int ref_count;
>> +       struct rcu_head rcu;
>>  };
>>
>>  struct sw_flow_match {
>> @@ -156,14 +156,13 @@ struct sw_flow_stats {
>>  } ____cacheline_aligned_in_smp;
>>
>>  struct sw_flow {
>> -       struct rcu_head rcu;
>>         struct hlist_node hash_node[2];
>> -       u32 hash;
>> -
>> -       struct sw_flow_key key;
>> -       struct sw_flow_key unmasked_key;
>>         struct sw_flow_mask *mask;
>> +       struct sw_flow_key key;
>>         struct sw_flow_actions __rcu *sf_acts;
>> +       struct sw_flow_key unmasked_key;
>> +       u32 hash;
>> +       struct rcu_head rcu;
>>         struct sw_flow_stats stats[];
>>  };
>>
>> diff --git a/datapath/flow_table.c b/datapath/flow_table.c
>> index c2a7aa5..9c828d8 100644
>> --- a/datapath/flow_table.c
>> +++ b/datapath/flow_table.c
>> @@ -50,7 +50,7 @@
>>  #define TBL_MIN_BUCKETS                1024
>>  #define REHASH_INTERVAL                (10 * 60 * HZ)
>>
>> -static struct kmem_cache *flow_cache;
>> +static struct kmem_cache *flow_cache __read_mostly;
>>
>>  static u16 range_n_bytes(const struct sw_flow_key_range *range)
>>  {
>> diff --git a/datapath/vport.h b/datapath/vport.h
>> index 995889c..761e638 100644
>> --- a/datapath/vport.h
>> +++ b/datapath/vport.h
>> @@ -63,35 +63,34 @@ struct vport_err_stats {
>>
>>  /**
>>   * struct vport - one port within a datapath
>> - * @rcu: RCU callback head for deferred destruction.
>> + * @percpu_stats: Points to per-CPU statistics used and maintained by
>> vport
>>   * @dp: Datapath to which this port belongs.
>> + * @ops: Class structure.
>> + * @dp_hash_node: Element in @datapath->ports hash table in datapath.c.
>>   * @upcall_portid: The Netlink port to use for packets received on this
>> port that
>>   * miss the flow table.
>>   * @port_no: Index into @dp's @ports array.
>>   * @hash_node: Element in @dev_table hash table in vport.c.
>> - * @dp_hash_node: Element in @datapath->ports hash table in datapath.c.
>> - * @ops: Class structure.
>> - * @percpu_stats: Points to per-CPU statistics used and maintained by
>> vport
>>   * @stats_lock: Protects @err_stats and @offset_stats.
>>   * @err_stats: Points to error statistics used and maintained by vport
>>   * @offset_stats: Added to actual statistics as a sop to compatibility
>> with
>>   * XAPI for Citrix XenServer.  Deprecated.
>> + * @rcu: RCU callback head for deferred destruction.
>>   */
>>  struct vport {
>> -       struct rcu_head rcu;
>> +       struct pcpu_tstats __percpu *percpu_stats;
>>         struct datapath *dp;
>> +       const struct vport_ops *ops;
>> +       struct hlist_node dp_hash_node;
>> +
>>         u32 upcall_portid;
>>         u16 port_no;
>>
>>         struct hlist_node hash_node;
>> -       struct hlist_node dp_hash_node;
>> -       const struct vport_ops *ops;
>> -
>> -       struct pcpu_tstats __percpu *percpu_stats;
>> -
>>         spinlock_t stats_lock;
>>         struct vport_err_stats err_stats;
>>         struct ovs_vport_stats offset_stats;
>> +       struct rcu_head rcu;
>>  };
>>
>>  /**
>> @@ -118,6 +117,8 @@ struct vport_parms {
>>  /**
>>   * struct vport_ops - definition of a type of virtual port
>>   *
>> + * @send: Send a packet on the device.  Returns the length of the packet
>> sent,
>> + * zero for dropped packets or negative for error.
>>   * @type: %OVS_VPORT_TYPE_* value for this type of virtual port.
>>   * @create: Create a new vport configured as specified.  On success
>> returns
>>   * a new vport allocated with ovs_vport_alloc(), otherwise an ERR_PTR()
>> value.
>> @@ -129,10 +130,9 @@ struct vport_parms {
>>   * existing vport to a &struct sk_buff.  May be %NULL for a vport that
>> does not
>>   * have any configuration.
>>   * @get_name: Get the device's name.
>> - * @send: Send a packet on the device.  Returns the length of the packet
>> sent,
>> - * zero for dropped packets or negative for error.
>>   */
>>  struct vport_ops {
>> +       int (*send)(struct vport *, struct sk_buff *);
>>         enum ovs_vport_type type;
>>
>>         /* Called with ovs_mutex. */
>> @@ -144,8 +144,6 @@ struct vport_ops {
>>
>>         /* Called with rcu_read_lock or ovs_mutex. */
>>         const char *(*get_name)(const struct vport *);
>> -
>> -       int (*send)(struct vport *, struct sk_buff *);
>>  };
>>
>>  enum vport_err_type {
>> --
>> 1.7.1
>>
>> _______________________________________________
>> 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