summaryrefslogtreecommitdiff
path: root/ofproto/ofproto-dpif-rid.c
diff options
context:
space:
mode:
authorSimon Horman <simon.horman@netronome.com>2014-11-10 13:47:48 +0900
committerBen Pfaff <blp@nicira.com>2014-11-10 08:30:07 -0800
commitc3bd4bfc7120a16d3e3604985e9c607705ef594d (patch)
tree59ec2d346716934ea961afd88cebf55eff931499 /ofproto/ofproto-dpif-rid.c
parent7d16c8478e0bd17f63d4e6459e5d8f8dc6fcece2 (diff)
downloadopenvswitch-c3bd4bfc7120a16d3e3604985e9c607705ef594d.tar.gz
id-pool: Re-factor recirculation id allocator into standalone id pool.
Refactor the lock-free portion of the recirculation id allocator into stand-alone id pool. This is in preparation for re-using that portion to allocate bucket ids which are part of (draft) OpenFlow 1.5 groups. ONF-JIRA: EXT-350 Signed-off-by: Simon Horman <simon.horman@netronome.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'ofproto/ofproto-dpif-rid.c')
-rw-r--r--ofproto/ofproto-dpif-rid.c128
1 files changed, 6 insertions, 122 deletions
diff --git a/ofproto/ofproto-dpif-rid.c b/ofproto/ofproto-dpif-rid.c
index 236de4d7f..55d5c2bef 100644
--- a/ofproto/ofproto-dpif-rid.c
+++ b/ofproto/ofproto-dpif-rid.c
@@ -16,46 +16,25 @@
#include <config.h>
-#include "hmap.h"
-#include "hash.h"
+#include "id-pool.h"
#include "ovs-thread.h"
#include "ofproto-dpif-rid.h"
-struct rid_node {
- struct hmap_node node;
- uint32_t recirc_id;
-};
-
-struct rid_pool {
- struct hmap map;
- uint32_t base; /* IDs in the range of [base, base + n_ids). */
- uint32_t n_ids; /* Total number of ids in the pool. */
- uint32_t next_free_id; /* Possible next free id. */
-};
-
struct recirc_id_pool {
struct ovs_mutex lock;
- struct rid_pool rids;
+ struct id_pool *rids;
};
#define RECIRC_ID_BASE 300
#define RECIRC_ID_N_IDS 1024
-static void rid_pool_init(struct rid_pool *rids,
- uint32_t base, uint32_t n_ids);
-static void rid_pool_uninit(struct rid_pool *pool);
-static uint32_t rid_pool_alloc_id(struct rid_pool *pool);
-static void rid_pool_free_id(struct rid_pool *rids, uint32_t rid);
-static struct rid_node *rid_pool_find(struct rid_pool *rids, uint32_t id);
-static void rid_pool_add(struct rid_pool *rids, uint32_t id);
-
struct recirc_id_pool *
recirc_id_pool_create(void)
{
struct recirc_id_pool *pool;
pool = xmalloc(sizeof *pool);
- rid_pool_init(&pool->rids, RECIRC_ID_BASE, RECIRC_ID_N_IDS);
+ pool->rids = id_pool_create(RECIRC_ID_BASE, RECIRC_ID_N_IDS);
ovs_mutex_init(&pool->lock);
return pool;
@@ -64,7 +43,7 @@ recirc_id_pool_create(void)
void
recirc_id_pool_destroy(struct recirc_id_pool *pool)
{
- rid_pool_uninit(&pool->rids);
+ id_pool_destroy(pool->rids);
ovs_mutex_destroy(&pool->lock);
free(pool);
}
@@ -75,7 +54,7 @@ recirc_id_alloc(struct recirc_id_pool *pool)
uint32_t id;
ovs_mutex_lock(&pool->lock);
- id = rid_pool_alloc_id(&pool->rids);
+ id = id_pool_alloc_id(pool->rids);
ovs_mutex_unlock(&pool->lock);
return id;
@@ -85,101 +64,6 @@ void
recirc_id_free(struct recirc_id_pool *pool, uint32_t id)
{
ovs_mutex_lock(&pool->lock);
- rid_pool_free_id(&pool->rids, id);
+ id_pool_free_id(pool->rids, id);
ovs_mutex_unlock(&pool->lock);
}
-
-static void
-rid_pool_init(struct rid_pool *rids, uint32_t base, uint32_t n_ids)
-{
- rids->base = base;
- rids->n_ids = n_ids;
- rids->next_free_id = base;
- hmap_init(&rids->map);
-}
-
-static void
-rid_pool_uninit(struct rid_pool *rids)
-{
- struct rid_node *rid, *next;
-
- HMAP_FOR_EACH_SAFE(rid, next, node, &rids->map) {
- hmap_remove(&rids->map, &rid->node);
- free(rid);
- }
-
- hmap_destroy(&rids->map);
-}
-
-static struct rid_node *
-rid_pool_find(struct rid_pool *rids, uint32_t id)
-{
- size_t hash;
- struct rid_node *rid;
-
- hash = hash_int(id, 0);
- HMAP_FOR_EACH_WITH_HASH(rid, node, hash, &rids->map) {
- if (id == rid->recirc_id) {
- return rid;
- }
- }
- return NULL;
-}
-
-static void
-rid_pool_add(struct rid_pool *rids, uint32_t id)
-{
- struct rid_node *rid = xmalloc(sizeof *rid);
- size_t hash;
-
- rid->recirc_id = id;
- hash = hash_int(id, 0);
- hmap_insert(&rids->map, &rid->node, hash);
-}
-
-static uint32_t
-rid_pool_alloc_id(struct rid_pool *rids)
-{
- uint32_t id;
-
- if (rids->n_ids == 0) {
- return 0;
- }
-
- if (!(rid_pool_find(rids, rids->next_free_id))) {
- id = rids->next_free_id;
- goto found_free_id;
- }
-
- for(id = rids->base; id < rids->base + rids->n_ids; id++) {
- if (!rid_pool_find(rids, id)) {
- goto found_free_id;
- }
- }
-
- /* Not available. */
- return 0;
-
-found_free_id:
- rid_pool_add(rids, id);
-
- if (id < rids->base + rids->n_ids) {
- rids->next_free_id = id + 1;
- } else {
- rids->next_free_id = rids->base;
- }
-
- return id;
-}
-
-static void
-rid_pool_free_id(struct rid_pool *rids, uint32_t id)
-{
- struct rid_node *rid;
- if (id > rids->base && (id <= rids->base + rids->n_ids)) {
- rid = rid_pool_find(rids, id);
- if (rid) {
- hmap_remove(&rids->map, &rid->node);
- }
- }
-}