X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Ftable.c;h=36613bd901aa84fb1894a14ff2c6e5a8fbf71318;hb=8402c74b186e28c53ad51fc8813aebe64a12cd7c;hp=47fa01690dbc574581f844e494a4976eae1ba228;hpb=ed099e921e30d3720c5ad7d1b4f911bb23911bf3;p=openvswitch diff --git a/datapath/table.c b/datapath/table.c index 47fa0169..36613bd9 100644 --- a/datapath/table.c +++ b/datapath/table.c @@ -178,14 +178,14 @@ static struct tbl_bucket __rcu **find_bucket(struct tbl *table, u32 hash) return &table->buckets[l1][l2]; } -static int search_bucket(const struct tbl_bucket *bucket, void *target, u32 hash, - int (*cmp)(const struct tbl_node *, void *)) +static int search_bucket(const struct tbl_bucket *bucket, void *target, int len, u32 hash, + int (*cmp)(const struct tbl_node *, void *, int len)) { int i; for (i = 0; i < bucket->n_objs; i++) { struct tbl_node *obj = bucket->objs[i]; - if (obj->hash == hash && likely(cmp(obj, target))) + if (obj->hash == hash && likely(cmp(obj, target, len))) return i; } @@ -197,6 +197,8 @@ static int search_bucket(const struct tbl_bucket *bucket, void *target, u32 hash * @table: hash table to search * @target: identifier for the object that is being searched for, will be * provided as an argument to @cmp when making comparisions + * @len: length of @target in bytes, will be provided as an argument to @cmp + * when making comparisons * @hash: hash of @target * @cmp: comparision function to match objects with the given hash, returns * nonzero if the objects match, zero otherwise @@ -204,8 +206,8 @@ static int search_bucket(const struct tbl_bucket *bucket, void *target, u32 hash * Searches @table for an object identified by @target. Returns the tbl_node * contained in the object if successful, otherwise %NULL. */ -struct tbl_node *tbl_lookup(struct tbl *table, void *target, u32 hash, - int (*cmp)(const struct tbl_node *, void *)) +struct tbl_node *tbl_lookup(struct tbl *table, void *target, int len, u32 hash, + int (*cmp)(const struct tbl_node *, void *, int)) { struct tbl_bucket __rcu **bucketp = find_bucket(table, hash); struct tbl_bucket *bucket = get_bucket(*bucketp); @@ -214,7 +216,7 @@ struct tbl_node *tbl_lookup(struct tbl *table, void *target, u32 hash, if (!bucket) return NULL; - index = search_bucket(bucket, target, hash, cmp); + index = search_bucket(bucket, target, len, hash, cmp); if (index < 0) return NULL; @@ -331,13 +333,13 @@ struct tbl *tbl_expand(struct tbl *table) int n_buckets = table->n_buckets * 2; struct tbl *new_table; - if (n_buckets >= TBL_MAX_BUCKETS) { + if (n_buckets > TBL_MAX_BUCKETS) { err = -ENOSPC; goto error; } err = -ENOMEM; - new_table = tbl_create(TBL_MIN_BUCKETS); + new_table = tbl_create(n_buckets); if (!new_table) goto error;