[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/5] xen/gnttab: Reduce code volume when using union grant_combo
There is no need for 'struct { ... } shorts' to be named. Convert it to being an anonymous struct, and rename 'word' to the more common 'raw'. For _set_status_v1() and gnttab_prepare_for_transfer() which use a bounded cmpxchg loop, rename {prev,new}_scombo to {prev,new} and reduce their scope to within the loop. For _set_status_v2(), the flags and id variables are completely unnecessary. Drop them. No functional change. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Wei Liu <wl@xxxxxxx> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx> CC: Julien Grall <julien.grall@xxxxxxx> CC: George Dunlap <george.dunlap@xxxxxxxxxxxxx> --- xen/common/grant_table.c | 91 ++++++++++++++++++++++-------------------------- 1 file changed, 41 insertions(+), 50 deletions(-) diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index e5d585f..6d8f17d 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -144,11 +144,11 @@ custom_param("gnttab", parse_gnttab); * The following union allows that to happen in an endian-neutral fashion. */ union grant_combo { - uint32_t word; + uint32_t raw; struct { uint16_t flags; domid_t domid; - } shorts; + }; }; /* Used to share code between unmap_grant_ref and unmap_and_replace. */ @@ -680,7 +680,7 @@ static int _set_status_v1(const grant_entry_header_t *shah, { int rc = GNTST_okay; uint32_t *raw_shah = (uint32_t *)shah; - union grant_combo scombo, prev_scombo, new_scombo; + union grant_combo scombo; uint16_t mask = GTF_type_mask; /* @@ -698,7 +698,7 @@ static int _set_status_v1(const grant_entry_header_t *shah, if ( mapflag ) mask |= GTF_sub_page; - scombo.word = ACCESS_ONCE(*raw_shah); + scombo.raw = ACCESS_ONCE(*raw_shah); /* * This loop attempts to set the access (reading/writing) flags @@ -708,37 +708,35 @@ static int _set_status_v1(const grant_entry_header_t *shah, */ for ( ; ; ) { + union grant_combo prev, new; + /* If not already pinned, check the grant domid and type. */ - if ( !act->pin && - (((scombo.shorts.flags & mask) != - GTF_permit_access) || - (scombo.shorts.domid != ldomid)) ) + if ( !act->pin && (((scombo.flags & mask) != GTF_permit_access) || + (scombo.domid != ldomid)) ) PIN_FAIL(done, GNTST_general_error, "Bad flags (%x) or dom (%d); expected d%d\n", - scombo.shorts.flags, scombo.shorts.domid, - ldomid); + scombo.flags, scombo.domid, ldomid); - new_scombo = scombo; - new_scombo.shorts.flags |= GTF_reading; + new = scombo; + new.flags |= GTF_reading; if ( !readonly ) { - new_scombo.shorts.flags |= GTF_writing; - if ( unlikely(scombo.shorts.flags & GTF_readonly) ) + new.flags |= GTF_writing; + if ( unlikely(scombo.flags & GTF_readonly) ) PIN_FAIL(done, GNTST_general_error, "Attempt to write-pin a r/o grant entry\n"); } - prev_scombo.word = guest_cmpxchg(rd, raw_shah, - scombo.word, new_scombo.word); - if ( likely(prev_scombo.word == scombo.word) ) + prev.raw = guest_cmpxchg(rd, raw_shah, scombo.raw, new.raw); + if ( likely(prev.raw == scombo.raw) ) break; if ( retries++ == 4 ) PIN_FAIL(done, GNTST_general_error, "Shared grant entry is unstable\n"); - scombo = prev_scombo; + scombo = prev; } done: @@ -756,13 +754,9 @@ static int _set_status_v2(const grant_entry_header_t *shah, int rc = GNTST_okay; uint32_t *raw_shah = (uint32_t *)shah; union grant_combo scombo; - uint16_t flags = shah->flags; - domid_t id = shah->domid; uint16_t mask = GTF_type_mask; - scombo.word = ACCESS_ONCE(*raw_shah); - flags = scombo.shorts.flags; - id = scombo.shorts.domid; + scombo.raw = ACCESS_ONCE(*raw_shah); /* if this is a grant mapping operation we should ensure GTF_sub_page is not set */ @@ -770,13 +764,12 @@ static int _set_status_v2(const grant_entry_header_t *shah, mask |= GTF_sub_page; /* If not already pinned, check the grant domid and type. */ - if ( !act->pin && - ( (((flags & mask) != GTF_permit_access) && - ((flags & mask) != GTF_transitive)) || - (id != ldomid)) ) + if ( !act->pin && ((((scombo.flags & mask) != GTF_permit_access) && + ((scombo.flags & mask) != GTF_transitive)) || + (scombo.domid != ldomid)) ) PIN_FAIL(done, GNTST_general_error, "Bad flags (%x) or dom (%d); expected d%d, flags %x\n", - flags, id, ldomid, mask); + scombo.flags, scombo.domid, ldomid, mask); if ( readonly ) { @@ -784,7 +777,7 @@ static int _set_status_v2(const grant_entry_header_t *shah, } else { - if ( unlikely(flags & GTF_readonly) ) + if ( unlikely(scombo.flags & GTF_readonly) ) PIN_FAIL(done, GNTST_general_error, "Attempt to write-pin a r/o grant entry\n"); *status |= GTF_reading | GTF_writing; @@ -794,27 +787,25 @@ static int _set_status_v2(const grant_entry_header_t *shah, still valid */ smp_mb(); - scombo.word = ACCESS_ONCE(*raw_shah); - flags = scombo.shorts.flags; - id = scombo.shorts.domid; + scombo.raw = ACCESS_ONCE(*raw_shah); if ( !act->pin ) { - if ( (((flags & mask) != GTF_permit_access) && - ((flags & mask) != GTF_transitive)) || - (id != ldomid) || - (!readonly && (flags & GTF_readonly)) ) + if ( (((scombo.flags & mask) != GTF_permit_access) && + ((scombo.flags & mask) != GTF_transitive)) || + (scombo.domid != ldomid) || + (!readonly && (scombo.flags & GTF_readonly)) ) { gnttab_clear_flag(rd, _GTF_writing, status); gnttab_clear_flag(rd, _GTF_reading, status); PIN_FAIL(done, GNTST_general_error, "Unstable flags (%x) or dom (%d); expected d%d (r/w: %d)\n", - flags, id, ldomid, !readonly); + scombo.flags, scombo.domid, ldomid, !readonly); } } else { - if ( unlikely(flags & GTF_readonly) ) + if ( unlikely(scombo.flags & GTF_readonly) ) { gnttab_clear_flag(rd, _GTF_writing, status); PIN_FAIL(done, GNTST_general_error, @@ -2038,7 +2029,7 @@ gnttab_prepare_for_transfer( { struct grant_table *rgt = rd->grant_table; uint32_t *raw_shah; - union grant_combo scombo, prev_scombo, new_scombo; + union grant_combo scombo; int retries = 0; grant_read_lock(rgt); @@ -2052,26 +2043,26 @@ gnttab_prepare_for_transfer( } raw_shah = (uint32_t *)shared_entry_header(rgt, ref); - scombo.word = ACCESS_ONCE(*raw_shah); + scombo.raw = ACCESS_ONCE(*raw_shah); for ( ; ; ) { - if ( unlikely(scombo.shorts.flags != GTF_accept_transfer) || - unlikely(scombo.shorts.domid != ld->domain_id) ) + union grant_combo prev, new; + + if ( unlikely(scombo.flags != GTF_accept_transfer) || + unlikely(scombo.domid != ld->domain_id) ) { gdprintk(XENLOG_INFO, "Bad flags (%x) or dom (%d); expected d%d\n", - scombo.shorts.flags, scombo.shorts.domid, - ld->domain_id); + scombo.flags, scombo.domid, ld->domain_id); goto fail; } - new_scombo = scombo; - new_scombo.shorts.flags |= GTF_transfer_committed; + new = scombo; + new.flags |= GTF_transfer_committed; - prev_scombo.word = guest_cmpxchg(rd, raw_shah, - scombo.word, new_scombo.word); - if ( likely(prev_scombo.word == scombo.word) ) + prev.raw = guest_cmpxchg(rd, raw_shah, scombo.raw, new.raw); + if ( likely(prev.raw == scombo.raw) ) break; if ( retries++ == 4 ) @@ -2080,7 +2071,7 @@ gnttab_prepare_for_transfer( goto fail; } - scombo = prev_scombo; + scombo = prev; } grant_read_unlock(rgt); -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |