Daniel De Graaf
2012-Oct-15 14:02 UTC
[PATCH] xen: Add versions of rcu_lock_*_domain without IS_PRIV
While this patch is a part of my XSM IS_PRIV series, I am reposting it alone because the XSM build of xen-unstable is currently broken. I can also repost the remaining patches series if that would be helpful. --------------------------------->8---------------------------------- These functions will be used to avoid duplication of IS_PRIV calls that will be introduced in XSM hooks. This also fixes a build error with XSM enabled introduced by 25925:d1c3375c3f11 which depends on this patch. Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov> --- xen/common/domain.c | 21 +++++++++++++++++++++ xen/include/xen/sched.h | 11 +++++++++++ 2 files changed, 32 insertions(+) diff --git a/xen/common/domain.c b/xen/common/domain.c index a1aa05e..52489b3 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -420,6 +420,13 @@ struct domain *rcu_lock_domain_by_id(domid_t dom) 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 ) @@ -454,6 +461,20 @@ int rcu_lock_remote_target_domain_by_id(domid_t dom, struct domain **d) 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; diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 53804c8..b0def4a 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -447,6 +447,11 @@ struct domain *domain_create( 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 * - Checks that caller has permission to act on the target domain. @@ -460,6 +465,12 @@ int rcu_lock_target_domain_by_id(domid_t dom, struct domain **d); */ 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) { -- 1.7.11.7
Keir Fraser
2012-Oct-15 15:26 UTC
Re: [PATCH] xen: Add versions of rcu_lock_*_domain without IS_PRIV
Must we have two new calls for translating a domid to a domain? It''s getting to be a confusing mess isn''t it? Also, here, a more consistent name for rcu_lock_domain_by_any_id would be rcu_lock_any_domain_by_id, I think? -- Keir On 15/10/2012 15:02, "Daniel De Graaf" <dgdegra@tycho.nsa.gov> wrote:> While this patch is a part of my XSM IS_PRIV series, I am reposting it > alone because the XSM build of xen-unstable is currently broken. I can > also repost the remaining patches series if that would be helpful. > > --------------------------------->8---------------------------------- > > These functions will be used to avoid duplication of IS_PRIV calls > that will be introduced in XSM hooks. This also fixes a build error > with XSM enabled introduced by 25925:d1c3375c3f11 which depends on > this patch. > > Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov> > --- > xen/common/domain.c | 21 +++++++++++++++++++++ > xen/include/xen/sched.h | 11 +++++++++++ > 2 files changed, 32 insertions(+) > > diff --git a/xen/common/domain.c b/xen/common/domain.c > index a1aa05e..52489b3 100644 > --- a/xen/common/domain.c > +++ b/xen/common/domain.c > @@ -420,6 +420,13 @@ struct domain *rcu_lock_domain_by_id(domid_t dom) > 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 ) > @@ -454,6 +461,20 @@ int rcu_lock_remote_target_domain_by_id(domid_t dom, > struct domain **d) > 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; > diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h > index 53804c8..b0def4a 100644 > --- a/xen/include/xen/sched.h > +++ b/xen/include/xen/sched.h > @@ -447,6 +447,11 @@ struct domain *domain_create( > 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 > * - Checks that caller has permission to act on the target domain. > @@ -460,6 +465,12 @@ int rcu_lock_target_domain_by_id(domid_t dom, struct > domain **d); > */ > 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) > {
Daniel De Graaf
2012-Oct-15 15:31 UTC
Re: [PATCH] xen: Add versions of rcu_lock_*_domain without IS_PRIV
On 10/15/2012 11:26 AM, Keir Fraser wrote:> Must we have two new calls for translating a domid to a domain? It''s getting > to be a confusing mess isn''t it? Also, here, a more consistent name for > rcu_lock_domain_by_any_id would be rcu_lock_any_domain_by_id, I think? > > -- KeirThe original version of this patch queue removed the two _target_ calls; that removal is not in the current versions to avoid breaking code that is not yet converted (ARM and two other callers not converted). The name rcu_lock_any_domain_by_id is also fine, although it seems to imply that rcu_lock_domain_by_id cannot lock any domain, when the real difference is if they accept DOMID_SELF (hence why I chose to say any_id). Would you like me to send a patch changing the name?> > On 15/10/2012 15:02, "Daniel De Graaf" <dgdegra@tycho.nsa.gov> wrote: > >> While this patch is a part of my XSM IS_PRIV series, I am reposting it >> alone because the XSM build of xen-unstable is currently broken. I can >> also repost the remaining patches series if that would be helpful. >> >> --------------------------------->8---------------------------------- >> >> These functions will be used to avoid duplication of IS_PRIV calls >> that will be introduced in XSM hooks. This also fixes a build error >> with XSM enabled introduced by 25925:d1c3375c3f11 which depends on >> this patch. >> >> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov> >> --- >> xen/common/domain.c | 21 +++++++++++++++++++++ >> xen/include/xen/sched.h | 11 +++++++++++ >> 2 files changed, 32 insertions(+) >> >> diff --git a/xen/common/domain.c b/xen/common/domain.c >> index a1aa05e..52489b3 100644 >> --- a/xen/common/domain.c >> +++ b/xen/common/domain.c >> @@ -420,6 +420,13 @@ struct domain *rcu_lock_domain_by_id(domid_t dom) >> 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 ) >> @@ -454,6 +461,20 @@ int rcu_lock_remote_target_domain_by_id(domid_t dom, >> struct domain **d) >> 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; >> diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h >> index 53804c8..b0def4a 100644 >> --- a/xen/include/xen/sched.h >> +++ b/xen/include/xen/sched.h >> @@ -447,6 +447,11 @@ struct domain *domain_create( >> 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 >> * - Checks that caller has permission to act on the target domain. >> @@ -460,6 +465,12 @@ int rcu_lock_target_domain_by_id(domid_t dom, struct >> domain **d); >> */ >> 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) >> { >-- Daniel De Graaf National Security Agency
Keir Fraser
2012-Oct-15 15:47 UTC
Re: [PATCH] xen: Add versions of rcu_lock_*_domain without IS_PRIV
On 15/10/2012 16:31, "Daniel De Graaf" <dgdegra@tycho.nsa.gov> wrote:> On 10/15/2012 11:26 AM, Keir Fraser wrote: >> Must we have two new calls for translating a domid to a domain? It''s getting >> to be a confusing mess isn''t it? Also, here, a more consistent name for >> rcu_lock_domain_by_any_id would be rcu_lock_any_domain_by_id, I think? >> >> -- Keir > > The original version of this patch queue removed the two _target_ calls; > that removal is not in the current versions to avoid breaking code that is > not yet converted (ARM and two other callers not converted). > > The name rcu_lock_any_domain_by_id is also fine, although it seems to imply > that rcu_lock_domain_by_id cannot lock any domain, when the real difference > is if they accept DOMID_SELF (hence why I chose to say any_id). Would you > like me to send a patch changing the name?Oh I see. No I think that''s fine then. -- Keir>> >> On 15/10/2012 15:02, "Daniel De Graaf" <dgdegra@tycho.nsa.gov> wrote: >> >>> While this patch is a part of my XSM IS_PRIV series, I am reposting it >>> alone because the XSM build of xen-unstable is currently broken. I can >>> also repost the remaining patches series if that would be helpful. >>> >>> --------------------------------->8---------------------------------- >>> >>> These functions will be used to avoid duplication of IS_PRIV calls >>> that will be introduced in XSM hooks. This also fixes a build error >>> with XSM enabled introduced by 25925:d1c3375c3f11 which depends on >>> this patch. >>> >>> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov> >>> --- >>> xen/common/domain.c | 21 +++++++++++++++++++++ >>> xen/include/xen/sched.h | 11 +++++++++++ >>> 2 files changed, 32 insertions(+) >>> >>> diff --git a/xen/common/domain.c b/xen/common/domain.c >>> index a1aa05e..52489b3 100644 >>> --- a/xen/common/domain.c >>> +++ b/xen/common/domain.c >>> @@ -420,6 +420,13 @@ struct domain *rcu_lock_domain_by_id(domid_t dom) >>> 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 ) >>> @@ -454,6 +461,20 @@ int rcu_lock_remote_target_domain_by_id(domid_t dom, >>> struct domain **d) >>> 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; >>> diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h >>> index 53804c8..b0def4a 100644 >>> --- a/xen/include/xen/sched.h >>> +++ b/xen/include/xen/sched.h >>> @@ -447,6 +447,11 @@ struct domain *domain_create( >>> 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 >>> * - Checks that caller has permission to act on the target domain. >>> @@ -460,6 +465,12 @@ int rcu_lock_target_domain_by_id(domid_t dom, struct >>> domain **d); >>> */ >>> 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) >>> { >> >