[ovs-dev] [batch v2 3/5] dpif-netdev: Take the classifier rdlock once per batch.

Jarno Rajahalme jrajahalme at nicira.com
Mon Jun 30 20:31:02 UTC 2014


Acked-by: Jarno Rajahalme <jrajahalme at nicira.com>

  Jarno

On Jun 30, 2014, at 1:11 PM, Ethan Jackson <ethan at nicira.com> wrote:

> Signed-off-by: Ethan Jackson <ethan at nicira.com>
> ---
> lib/dpif-netdev.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 8954e1b..4deb763 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -1073,15 +1073,13 @@ dp_netdev_flow_cast(const struct cls_rule *cr)
> 
> static struct dp_netdev_flow *
> dp_netdev_lookup_flow(const struct dp_netdev *dp, const struct miniflow *key)
> -    OVS_EXCLUDED(dp->cls.rwlock)
> +    OVS_REQ_RDLOCK(dp->cls.rwlock)
> {
>     struct dp_netdev_flow *netdev_flow;
>     struct cls_rule *rule;
> 
> -    fat_rwlock_rdlock(&dp->cls.rwlock);
>     rule = classifier_lookup_miniflow_first(&dp->cls, key);
>     netdev_flow = dp_netdev_flow_cast(rule);
> -    fat_rwlock_unlock(&dp->cls.rwlock);
> 
>     return netdev_flow;
> }
> @@ -1320,7 +1318,9 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
>     miniflow_init(&miniflow, &flow);
> 
>     ovs_mutex_lock(&dp->flow_mutex);
> +    fat_rwlock_rdlock(&dp->cls.rwlock);
>     netdev_flow = dp_netdev_lookup_flow(dp, &miniflow);
> +    fat_rwlock_unlock(&dp->cls.rwlock);
>     if (!netdev_flow) {
>         if (put->flags & DPIF_FP_CREATE) {
>             if (hmap_count(&dp->flow_table) < MAX_FLOWS) {
> @@ -2080,6 +2080,7 @@ dp_netdev_input(struct dp_netdev *dp, struct dpif_packet **packets, int cnt,
> 
>     miniflow_initialize(&key.flow, key.buf);
> 
> +    fat_rwlock_rdlock(&dp->cls.rwlock);
>     for (i = 0; i < cnt; i++) {
>         struct dp_netdev_flow *netdev_flow;
>         struct ofpbuf *buf = &packets[i]->ofpbuf;
> @@ -2120,6 +2121,7 @@ dp_netdev_input(struct dp_netdev *dp, struct dpif_packet **packets, int cnt,
>             }
>         }
>     }
> +    fat_rwlock_unlock(&dp->cls.rwlock);
> 
>     if (batch.flow) {
>         packet_batch_execute(&batch, dp);
> -- 
> 1.8.1.2
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev




More information about the dev mailing list