]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - include/linux/percpu_ida.h
sched: Implement task_nice() as static inline function
[mirror_ubuntu-zesty-kernel.git] / include / linux / percpu_ida.h
index 0b23edbee309bfcf9ba335b7ba1c0ba261ac8243..f5cfdd6a5539101a0bc57d7815044f9bca3c11c9 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/types.h>
 #include <linux/bitops.h>
 #include <linux/init.h>
+#include <linux/sched.h>
 #include <linux/spinlock_types.h>
 #include <linux/wait.h>
 #include <linux/cpumask.h>
@@ -16,6 +17,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 +54,29 @@ struct percpu_ida {
        } ____cacheline_aligned_in_smp;
 };
 
-int percpu_ida_alloc(struct percpu_ida *pool, gfp_t gfp);
+/*
+ * 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, int state);
 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__ */