Prepare Open vSwitch 1.1.2 release.
[sliver-openvswitch.git] / datapath / table.h
index 9ae1ee3..22574be 100644 (file)
@@ -9,13 +9,36 @@
 #ifndef TABLE_H
 #define TABLE_H 1
 
-struct tbl;
 struct tbl_bucket;
 
 struct tbl_node {
        u32 hash;
 };
 
+/**
+ * struct tbl - hash table
+ * @n_buckets: number of buckets (a power of 2 between %TBL_L1_SIZE and
+ * %TBL_MAX_BUCKETS)
+ * @buckets: pointer to @n_buckets/%TBL_L1_SIZE pointers to %TBL_L1_SIZE pointers
+ * to buckets
+ * @rcu: RCU callback structure
+ * @obj_destructor: Called on each element when the table is destroyed.
+ *
+ * The @buckets array is logically an array of pointers to buckets.  It is
+ * broken into two levels to avoid the need to kmalloc() any object larger than
+ * a single page or to use vmalloc().  @buckets is always nonnull, as is each
+ * @buckets[i], but each @buckets[i][j] is nonnull only if the specified hash
+ * bucket is nonempty (for 0 <= i < @n_buckets/%TBL_L1_SIZE, 0 <= j <
+ * %TBL_L1_SIZE).
+ */
+struct tbl {
+       struct rcu_head rcu;
+       unsigned int n_buckets;
+       struct tbl_bucket __rcu ***buckets;
+       unsigned int count;
+       void (*obj_destructor)(struct tbl_node *);
+};
+
 #define TBL_L2_BITS (PAGE_SHIFT - ilog2(sizeof(struct tbl_bucket *)))
 #define TBL_L2_SIZE (1 << TBL_L2_BITS)
 #define TBL_L2_SHIFT 0
@@ -24,6 +47,9 @@ struct tbl_node {
 #define TBL_L1_SIZE (1 << TBL_L1_BITS)
 #define TBL_L1_SHIFT TBL_L2_BITS
 
+/* For 4 kB pages, this is 1,024 on 32-bit or 512 on 64-bit.  */
+#define TBL_MIN_BUCKETS TBL_L2_SIZE
+
 /* For 4 kB pages, this is 1,048,576 on 32-bit or 262,144 on 64-bit. */
 #define TBL_MAX_BUCKETS (TBL_L1_SIZE * TBL_L2_SIZE)
 
@@ -36,6 +62,7 @@ int tbl_remove(struct tbl *, struct tbl_node *);
 unsigned int tbl_count(struct tbl *);
 int tbl_foreach(struct tbl *,
                int (*callback)(struct tbl_node *, void *aux), void *aux);
+struct tbl_node *tbl_next(struct tbl *, u32 *bucketp, u32 *objp);
 
 int tbl_n_buckets(struct tbl *);
 struct tbl *tbl_expand(struct tbl *);