From patchwork Fri Mar 31 20:42:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Zhou X-Patchwork-Id: 745803 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3vvtkV6f6Wz9ryb for ; Sat, 1 Apr 2017 07:43:30 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 0A661B63; Fri, 31 Mar 2017 20:42:33 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 0802E949 for ; Fri, 31 Mar 2017 20:42:31 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pg0-f66.google.com (mail-pg0-f66.google.com [74.125.83.66]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id A26E6154 for ; Fri, 31 Mar 2017 20:42:30 +0000 (UTC) Received: by mail-pg0-f66.google.com with SMTP id 79so19807904pgf.0 for ; Fri, 31 Mar 2017 13:42:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:content-transfer-encoding; bh=U4qdhUM8ztB6he/3XQAddXNBn6B1NyBTFYeJWCGJW8Q=; b=OL4SHESg2fzelHfMwfq7ANSutST0DqkSBW5KsTEZ3B5Oje39/1xU3QLFNP/8JAfnCA 32BwEEMZ8FrQJtBnIGFT1+9J0QS7yYSyKmUruZvzlwxNgyEP6iBNWSSaFwpXlSRZ1qpT f4yjMavqImHY2+XUjIXkQZ3LJdux2Ag66Jpzv7oheZaxQwHBt3SgMKS2y18PiY1RyPJ1 H8BSD6WVvyfL2xPZnNDk/Q8398na8pRhUr0ymmyNhCqp24lQGMsnD0LQua07Zh0Yf0Ep 6oHG4pAxgIu2sxzwcYovMpEUkhqWkJXXw7ujiZO+bvP1U4FH3JgFRMoV07QC6h1Fc7o+ bPrA== X-Gm-Message-State: AFeK/H0K1FxYxLOdRrLPMnwrGhrHDkcK0VmyoeZG92ABwykue4YI8C07N9N8RA+knoG0nw== X-Received: by 10.98.14.140 with SMTP id 12mr4474107pfo.77.1490992950181; Fri, 31 Mar 2017 13:42:30 -0700 (PDT) Received: from centos.eng.vmware.com ([208.91.1.34]) by smtp.gmail.com with ESMTPSA id z62sm12183867pff.88.2017.03.31.13.42.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 31 Mar 2017 13:42:29 -0700 (PDT) From: Andy Zhou To: dev@openvswitch.org Date: Fri, 31 Mar 2017 13:42:03 -0700 Message-Id: <1490992923-28158-3-git-send-email-azhou@ovn.org> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1490992923-28158-1-git-send-email-azhou@ovn.org> References: <1490992923-28158-1-git-send-email-azhou@ovn.org> X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH 3/3] ofproto-dpif: Add 'meter_ids' to backer X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Add 'meter_ids', an id-pool object to manage datapath meter id, i.e. provider_meter_id. Currently, only userspace datapath supports meter, and it implements the provider_meter_id management. Moving this function to 'backer' allows other datapath implementation to share the same logic. Signed-off-by: Andy Zhou --- lib/dpif-netdev.c | 24 ------------------------ ofproto/ofproto-dpif.c | 22 ++++++++++++++++++++++ ofproto/ofproto-dpif.h | 4 ++++ 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index a14a2ebb5b2a..d5417162b7af 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -260,7 +260,6 @@ struct dp_netdev { /* Meters. */ struct ovs_mutex meter_locks[N_METER_LOCKS]; struct dp_meter *meters[MAX_METERS]; /* Meter bands. */ - uint32_t meter_free; /* Next free meter. */ /* Protects access to ofproto-dpif-upcall interface during revalidator * thread synchronization. */ @@ -3896,9 +3895,6 @@ dpif_netdev_meter_set(struct dpif *dpif, ofproto_meter_id *meter_id, struct dp_meter *meter; int i; - if (mid == UINT32_MAX) { - mid = dp->meter_free; - } if (mid >= MAX_METERS) { return EFBIG; /* Meter_id out of range. */ } @@ -3958,21 +3954,6 @@ dpif_netdev_meter_set(struct dpif *dpif, ofproto_meter_id *meter_id, dp->meters[mid] = meter; meter_unlock(dp, mid); - meter_id->uint32 = mid; /* Store on success. */ - - /* Find next free meter */ - if (dp->meter_free == mid) { /* Now taken. */ - do { - if (++mid >= MAX_METERS) { /* Wrap around */ - mid = 0; - } - if (mid == dp->meter_free) { /* Full circle */ - mid = MAX_METERS; - break; - } - } while (dp->meters[mid]); - dp->meter_free = mid; /* Next free meter or MAX_METERS */ - } return 0; } return ENOMEM; @@ -4027,11 +4008,6 @@ dpif_netdev_meter_del(struct dpif *dpif, meter_lock(dp, meter_id); dp_delete_meter(dp, meter_id); meter_unlock(dp, meter_id); - - /* Keep free meter index as low as possible */ - if (meter_id < dp->meter_free) { - dp->meter_free = meter_id; - } } return error; } diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 523adad6fa52..0d37efbea9ac 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -662,6 +662,7 @@ close_dpif_backer(struct dpif_backer *backer) free(backer->type); free(backer->dp_version_string); dpif_close(backer->dpif); + id_pool_destroy(backer->meter_ids); free(backer); } @@ -787,6 +788,15 @@ open_dpif_backer(const char *type, struct dpif_backer **backerp) = check_variable_length_userdata(backer); backer->dp_version_string = dpif_get_dp_version(backer->dpif); + /* Manage Datpath meter IDs if supported. */ + struct ofputil_meter_features features; + dpif_meter_get_features(backer->dpif, &features); + if (features.max_meters) { + backer->meter_ids = id_pool_create(0, features.max_meters); + } else { + backer->meter_ids = NULL; + } + return error; } @@ -5391,6 +5401,17 @@ meter_set(struct ofproto *ofproto_, ofproto_meter_id *meter_id, { struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_); + /* Provider ID unknown. Use backer to allocate a new DP meter */ + if (meter_id->uint32 == UINT32_MAX) { + if (!ofproto->backer->meter_ids) { + return EFBIG; /* Datapath does not support meter. */ + } + + if(!id_pool_alloc_id(ofproto->backer->meter_ids, &meter_id->uint32)) { + return ENOMEM; /* Can't allocate a DP meter. */ + } + } + switch (dpif_meter_set(ofproto->backer->dpif, meter_id, config)) { case 0: return 0; @@ -5426,6 +5447,7 @@ meter_del(struct ofproto *ofproto_, ofproto_meter_id meter_id) struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_); dpif_meter_del(ofproto->backer->dpif, meter_id, NULL, 0); + id_pool_free_id(ofproto->backer->meter_ids, meter_id.uint32); } const struct ofproto_class ofproto_dpif_class = { diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h index cc514d245a90..4aabb35bc30b 100644 --- a/ofproto/ofproto-dpif.h +++ b/ofproto/ofproto-dpif.h @@ -51,6 +51,7 @@ #include "hmapx.h" #include "odp-util.h" #include "openvswitch/ofp-util.h" +#include "id-pool.h" #include "ovs-thread.h" #include "ofproto-provider.h" #include "util.h" @@ -208,6 +209,9 @@ struct dpif_backer { bool recv_set_enable; /* Enables or disables receiving packets. */ + /* Meter. */ + struct id_pool *meter_ids; /* Datapath meter allocation. */ + /* Version string of the datapath stored in OVSDB. */ char *dp_version_string;