aboutsummaryrefslogtreecommitdiffstats
path: root/xen/include/xen/preempt.h
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2010-11-18 11:45:33 +0000
committerKeir Fraser <keir@xen.org>2010-11-18 11:45:33 +0000
commit652ec2d1ec8c2c79dce01dc9136c0dfefeabc13e (patch)
tree5c31a11a97e5c3143712dd2c4dfc2e3da5a38505 /xen/include/xen/preempt.h
parentc03ec255cdfe2ee762e27be80132ee240be50314 (diff)
downloadxen-652ec2d1ec8c2c79dce01dc9136c0dfefeabc13e.tar.gz
xen-652ec2d1ec8c2c79dce01dc9136c0dfefeabc13e.tar.bz2
xen-652ec2d1ec8c2c79dce01dc9136c0dfefeabc13e.zip
Define Linux-style <preempt.h> interface.
Use it to disable sleeping in spinlock and rcu-read regions. Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/include/xen/preempt.h')
-rw-r--r--xen/include/xen/preempt.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/xen/include/xen/preempt.h b/xen/include/xen/preempt.h
new file mode 100644
index 0000000000..749bc589cb
--- /dev/null
+++ b/xen/include/xen/preempt.h
@@ -0,0 +1,33 @@
+/******************************************************************************
+ * preempt.h
+ *
+ * Track atomic regions in the hypervisor which disallow sleeping.
+ *
+ * Copyright (c) 2010, Keir Fraser <keir@xen.org>
+ */
+
+#ifndef __XEN_PREEMPT_H__
+#define __XEN_PREEMPT_H__
+
+#include <xen/config.h>
+#include <xen/percpu.h>
+#include <xen/irq.h> /* in_irq() */
+#include <asm/system.h> /* local_irq_is_enabled() */
+
+DECLARE_PER_CPU(unsigned int, __preempt_count);
+
+#define preempt_count() (this_cpu(__preempt_count))
+
+#define preempt_disable() do { \
+ preempt_count()++; \
+ barrier(); \
+} while (0)
+
+#define preempt_enable() do { \
+ barrier(); \
+ preempt_count()--; \
+} while (0)
+
+#define in_atomic() (preempt_count() || in_irq() || !local_irq_is_enabled())
+
+#endif /* __XEN_PREEMPT_H__ */