+
+struct mtwatch_info {
+ /*
+ * The mtwatch_domain is put on both a hash table and a list.
+ * domain_list is used to optimize xenbus_watch un-registration.
+ *
+ * The mtwatch_domain is removed from domain_hash (with state set
+ * to MTWATCH_DOMAIN_DOWN) when its refcnt is zero. However, it is
+ * left on domain_list until all events belong to such
+ * mtwatch_domain are processed in mtwatch_thread().
+ *
+ * While there may exist two mtwatch_domain with the same domid on
+ * domain_list simultaneously,
+ * all mtwatch_domain on hash_hash
+ * should have unique domid.
+ */
+ spinlock_t domain_lock;
+ struct hlist_head domain_hash[MTWATCH_HASH_SIZE];
+ struct list_head domain_list;
+
+ /*
+ * When a per-domU kthread is going to be destroyed, it is put
+ * on the purge_list, and will be flushed by purge_work later.
+ */
+ struct work_struct purge_work;
+ spinlock_t purge_lock;
+ struct list_head purge_list;
+};