WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: Chris Wright <chrisw@xxxxxxxxxxxx>
Subject: [Xen-devel] Re: [RFC PATCH 15/35] subarch support for controlling interrupt delivery
From: "Martin J. Bligh" <mbligh@xxxxxxxxxx>
Date: Tue, 09 May 2006 07:49:42 -0700
Cc: virtualization@xxxxxxxxxxxxxx, xen-devel@xxxxxxxxxxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, Ian Pratt <ian.pratt@xxxxxxxxxxxxx>
Delivery-date: Wed, 10 May 2006 04:48:11 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
In-reply-to: <20060509085154.095325000@xxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20060509084945.373541000@xxxxxxxxxxxx> <20060509085154.095325000@xxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mozilla Thunderbird 1.0.7 (X11/20051013)
+/*
+ * 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

<Prev in Thread] Current Thread [Next in Thread>