return d;
}
+struct domain *rcu_lock_domain_by_any_id(domid_t dom)
+{
+ if ( dom == DOMID_SELF )
+ return rcu_lock_current_domain();
+ return rcu_lock_domain_by_id(dom);
+}
+
int rcu_lock_target_domain_by_id(domid_t dom, struct domain **d)
{
if ( dom == DOMID_SELF )
return 0;
}
+int rcu_lock_remote_domain_by_id(domid_t dom, struct domain **d)
+{
+ if ( (*d = rcu_lock_domain_by_id(dom)) == NULL )
+ return -ESRCH;
+
+ if ( *d == current->domain )
+ {
+ rcu_unlock_domain(*d);
+ return -EPERM;
+ }
+
+ return 0;
+}
+
int domain_kill(struct domain *d)
{
int rc = 0;
*/
struct domain *rcu_lock_domain_by_id(domid_t dom);
+/*
+ * As above function, but resolves DOMID_SELF to current domain
+ */
+struct domain *rcu_lock_domain_by_any_id(domid_t dom);
+
/*
* As above function, but accounts for current domain context:
* - Translates target DOMID_SELF into caller's domain id; and
*/
int rcu_lock_remote_target_domain_by_id(domid_t dom, struct domain **d);
+/*
+ * As rcu_lock_domain_by_id(), but will fail EPERM or ESRCH rather than resolve
+ * to local domain.
+ */
+int rcu_lock_remote_domain_by_id(domid_t dom, struct domain **d);
+
/* Finish a RCU critical region started by rcu_lock_domain_by_id(). */
static inline void rcu_unlock_domain(struct domain *d)
{