[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Re: [RFC PATCH 15/35] subarch support for controlling interrupt delivery



+/*
+ * The use of 'barrier' in the following reflects their use as local-lock
+ * operations. Reentrancy must be prevented (e.g., __cli()) /before/ following
+ * critical operations are executed. All critical operations must complete
+ * /before/ reentrancy is permitted (e.g., __sti()). Alpha architecture also
+ * includes these barriers, for example.
+ */

Seems like an odd comment to have in an i386 header file.

+#define __cli()                                                                
\
+do {                                                                   \
+       struct vcpu_info *_vcpu;                                        \
+       preempt_disable();                                              \
+       _vcpu = &HYPERVISOR_shared_info->vcpu_info[__vcpu_id];           \
+       _vcpu->evtchn_upcall_mask = 1;                                       \
+       preempt_enable_no_resched();                                    \
+       barrier();                                                      \
+} while (0)

Should be a real function

+#define __sti()                                                                
\
+do {                                                                   \
+       struct vcpu_info *_vcpu;                                        \
+       barrier();                                                      \
+       preempt_disable();                                              \
+       _vcpu = &HYPERVISOR_shared_info->vcpu_info[__vcpu_id];           \
+       _vcpu->evtchn_upcall_mask = 0;                                       \
+       barrier(); /* unmask then check (avoid races) */                \
+       if (unlikely(_vcpu->evtchn_upcall_pending))                  \
+               force_evtchn_callback();                                \
+       preempt_enable();                                               \
+} while (0)

Should be a real function

+#define __save_flags(x)                                                        
\
+do {                                                                   \
+       struct vcpu_info *_vcpu;                                        \
+       preempt_disable();                                              \
+       _vcpu = &HYPERVISOR_shared_info->vcpu_info[__vcpu_id];           \
+       (x) = _vcpu->evtchn_upcall_mask;                             \
+       preempt_enable();                                               \
+} while (0)

Should be a real function

+#define __restore_flags(x)                                             \
+do {                                                                   \
+       struct vcpu_info *_vcpu;                                        \
+       barrier();                                                      \
+       preempt_disable();                                              \
+       _vcpu = &HYPERVISOR_shared_info->vcpu_info[__vcpu_id];           \
+       if ((_vcpu->evtchn_upcall_mask = (x)) == 0) {                        \
+               barrier(); /* unmask then check (avoid races) */        \
+               if (unlikely(_vcpu->evtchn_upcall_pending))          \
+                       force_evtchn_callback();                        \
+               preempt_enable();                                       \
+       } else                                                          \
+               preempt_enable_no_resched();                            \
+} while (0)

Should be a real function

+#define safe_halt()            ((void)0)
+#define halt()                 ((void)0)
+
+#define __save_and_cli(x)                                              \
+do {                                                                   \
+       struct vcpu_info *_vcpu;                                        \
+       preempt_disable();                                              \
+       _vcpu = &HYPERVISOR_shared_info->vcpu_info[__vcpu_id];           \
+       (x) = _vcpu->evtchn_upcall_mask;                             \
+       _vcpu->evtchn_upcall_mask = 1;                                       \
+       preempt_enable_no_resched();                                    \
+       barrier();                                                      \
+} while (0)

Should be a real function

+#define local_irq_save(x)      __save_and_cli(x)
+#define local_irq_restore(x)   __restore_flags(x)
+#define local_save_flags(x)    __save_flags(x)
+#define local_irq_disable()    __cli()
+#define local_irq_enable()     __sti()
+
+/* Cannot use preempt_enable() here as we would recurse in preempt_sched(). */
+#define irqs_disabled()                                                        
\
+({     int ___x;                                                       \
+       struct vcpu_info *_vcpu;                                        \
+       preempt_disable();                                              \
+       _vcpu = &HYPERVISOR_shared_info->vcpu_info[__vcpu_id];           \
+       ___x = (_vcpu->evtchn_upcall_mask != 0);                     \
+       preempt_enable_no_resched();                                    \
+       ___x; })
+
+#endif /* __KERNEL__ */

Should be a real function

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.