Merge remote-tracking branch 'regulator/fix/arizona' into regulator-linus
[firefly-linux-kernel-4.4.55.git] / include / linux / percpu_ida.h
index 0b23edbee309bfcf9ba335b7ba1c0ba261ac8243..1900bd0fa639ae7a3c72d1c97a4f0758337c1560 100644 (file)
@@ -16,6 +16,8 @@ struct percpu_ida {
         * percpu_ida_init()
         */
        unsigned                        nr_tags;
+       unsigned                        percpu_max_size;
+       unsigned                        percpu_batch_size;
 
        struct percpu_ida_cpu __percpu  *tag_cpu;
 
@@ -51,10 +53,29 @@ struct percpu_ida {
        } ____cacheline_aligned_in_smp;
 };
 
+/*
+ * Number of tags we move between the percpu freelist and the global freelist at
+ * a time
+ */
+#define IDA_DEFAULT_PCPU_BATCH_MOVE    32U
+/* Max size of percpu freelist, */
+#define IDA_DEFAULT_PCPU_SIZE  ((IDA_DEFAULT_PCPU_BATCH_MOVE * 3) / 2)
+
 int percpu_ida_alloc(struct percpu_ida *pool, gfp_t gfp);
 void percpu_ida_free(struct percpu_ida *pool, unsigned tag);
 
 void percpu_ida_destroy(struct percpu_ida *pool);
-int percpu_ida_init(struct percpu_ida *pool, unsigned long nr_tags);
+int __percpu_ida_init(struct percpu_ida *pool, unsigned long nr_tags,
+       unsigned long max_size, unsigned long batch_size);
+static inline int percpu_ida_init(struct percpu_ida *pool, unsigned long nr_tags)
+{
+       return __percpu_ida_init(pool, nr_tags, IDA_DEFAULT_PCPU_SIZE,
+               IDA_DEFAULT_PCPU_BATCH_MOVE);
+}
+
+typedef int (*percpu_ida_cb)(unsigned, void *);
+int percpu_ida_for_each_free(struct percpu_ida *pool, percpu_ida_cb fn,
+       void *data);
 
+unsigned percpu_ida_free_tags(struct percpu_ida *pool, int cpu);
 #endif /* __PERCPU_IDA_H__ */