Commit 0972274d authored by Maria Matejka's avatar Maria Matejka
Browse files

ID Map: Introducing a maximum limit for the ID

parent 4e27fb34
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -196,7 +196,7 @@ ca_lookup(pool *p, const char *name, int f_type)

  static int inited = 0;
  if (!inited) {
    idm_init(&ca_idm, &root_pool, 8);
    idm_init(&ca_idm, &root_pool, 8, EA_CUSTOM_BIT);
    HASH_INIT(ca_hash, &root_pool, CA_ORDER);

    ca_storage_max = 256;
@@ -212,7 +212,7 @@ ca_lookup(pool *p, const char *name, int f_type)

    uint id = idm_alloc(&ca_idm);

    if (id >= EA_CUSTOM_BIT)
    if (!id)
      cf_error("Too many custom attributes.");

    if (id >= ca_storage_max) {
+15 −12
Original line number Diff line number Diff line
@@ -16,11 +16,12 @@


void
idm_init(struct idm *m, pool *p, uint size)
idm_init(struct idm *m, pool *p, u64 size, u64 max)
{
  m->pos = 0;
  m->used = 1;
  m->size = size;
  m->max = max;
  m->data = mb_allocz(p, m->size * sizeof(u32));

  /* ID 0 is reserved */
@@ -29,17 +30,17 @@ idm_init(struct idm *m, pool *p, uint size)

static inline int u32_cto(uint x) { return ffs(~x) - 1; }

u32
u64
idm_alloc(struct idm *m)
{
  uint i, j;
  u64 i, j;

  for (i = m->pos; i < m->size; i++)
    if (m->data[i] != 0xffffffff)
      goto found;

  /* If we are at least 7/8 full, expand */
  if (m->used > (m->size * 28))
  /* If we are at least 7/8 full, expand (if we are allowed to) */
  if ((m->used * 32 < m->max) && (m->used > m->size * 28))
  {
    m->size *= 2;
    m->data = mb_realloc(m->data, m->size * sizeof(u32));
@@ -51,24 +52,26 @@ idm_alloc(struct idm *m)
    if (m->data[i] != 0xffffffff)
      goto found;

  ASSERT(0);
  return 0;

found:
  ASSERT(i < 0x8000000);

  m->pos = i;
  j = u32_cto(m->data[i]);

  u64 id = 32 * i + j;

  ASSERT(id < m->max);

  m->data[i] |= (1 << j);
  m->used++;
  return 32 * i + j;
  return id;
}

void
idm_free(struct idm *m, u32 id)
idm_free(struct idm *m, u64 id)
{
  uint i = id / 32;
  uint j = id % 32;
  u64 i = id / 32;
  u64 j = id % 32;

  ASSERT((i < m->size) && (m->data[i] & (1 << j)));
  m->data[i] &= ~(1 << j);
+7 −6
Original line number Diff line number Diff line
@@ -13,13 +13,14 @@
struct idm
{
  u32 *data;
  u32 pos;
  u32 used;
  u32 size;
  u64 pos;
  u64 used;
  u64 size;
  u64 max;
};

void idm_init(struct idm *m, pool *p, uint size);
u32 idm_alloc(struct idm *m);
void idm_free(struct idm *m, u32 id);
void idm_init(struct idm *m, pool *p, u64 size, u64 max);
u64 idm_alloc(struct idm *m);
void idm_free(struct idm *m, u64 id);

#endif
+1 −1
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ tindex_new(pool *p)
  ti->unit_size = TI_MIN_UNIT_SIZE;
  ti->address_size = TI_MIN_ADDRESS_SIZE;
  ti->index_data = mb_allocz(p, ti->unit_size * (1 << ti->address_size));
  idm_init(&(ti->idm), p, (1 << ti->address_size));
  idm_init(&(ti->idm), p, (1 << (ti->address_size - 5)), (1 << ti->address_size));
  u32 rootnode = idm_alloc(&(ti->idm));
  ASSERT(rootnode == 1);
  return ti;
+2 −1
Original line number Diff line number Diff line
@@ -111,7 +111,7 @@ rte_src_init(void)
{
  rte_src_slab = sl_new(rta_pool, sizeof(struct rte_src));

  idm_init(&src_ids, rta_pool, SRC_ID_INIT_SIZE);
  idm_init(&src_ids, rta_pool, SRC_ID_INIT_SIZE, 1ULL << 32);

  HASH_INIT(src_hash, rta_pool, RSH_INIT_ORDER);
}
@@ -137,6 +137,7 @@ rt_get_source(struct proto *p, u32 id)
  src->proto = p;
  src->private_id = id;
  src->global_id = idm_alloc(&src_ids);
  ASSERT(src->global_id);
  src->uc = 0;

  HASH_INSERT2(src_hash, RSH, rta_pool, src);
Loading