Index: kernel/generic/src/smp/smp_call.c
===================================================================
--- kernel/generic/src/smp/smp_call.c	(revision 4f5e1c7c92f197446ceb7d6406c1f5233ad02527)
+++ kernel/generic/src/smp/smp_call.c	(revision 85eba4cfd62daabbcc27226f9c448ae8aaad1a70)
@@ -69,4 +69,12 @@
  * directly.
  * 
+ * All memory accesses of prior to smp_call() will be visible
+ * to @a func on cpu @a cpu_id. Similarly, any changes @a func
+ * makes on cpu @a cpu_id will be visible on this cpu once
+ * smp_call() returns.
+ * 
+ * Invoking @a func on the destination cpu acts as a memory barrier
+ * on that cpu.
+ * 
  * @param cpu_id Destination CPU's logical id (eg CPU->id)
  * @param func Function to call.
@@ -89,9 +97,18 @@
  * @a func to complete.
  * 
- * @a call_info must be valid until @a func returns.
+ * @a call_info must be valid until/after @a func returns. Use
+ * smp_call_wait() to wait until it is safe to free @a call_info.
  * 
  * If @a cpu_id is the local CPU, the function will be invoked
  * directly. If the destination cpu id @a cpu_id is invalid
  * or denotes an inactive cpu, the call is discarded immediately.
+ * 
+ * All memory accesses of the caller prior to smp_call_async()
+ * will be made visible to @a func on the other cpu. Similarly, 
+ * any changes @a func makes on cpu @a cpu_id will be visible
+ * to this cpu when smp_call_wait() returns.
+ * 
+ * Invoking @a func on the destination cpu acts as a memory barrier
+ * on that cpu.
  * 
  * Interrupts must be enabled. Otherwise you run the risk
@@ -196,4 +213,8 @@
 	list_initialize(&calls_list);
 	
+	/* 
+	 * Acts as a load memory barrier. Any changes made by the cpu that
+	 * added the smp_call to calls_list will be made visible to this cpu.
+	 */
 	spinlock_lock(&CPU->smp_calls_lock);
 	list_concat(&calls_list, &CPU->smp_pending_calls);
