[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/3] gnttab: adjust pin count overflow checks
On 15.01.2021 14:09, Andrew Cooper wrote: > On 14/01/2021 15:23, Jan Beulich wrote: >> --- a/xen/common/grant_table.c >> +++ b/xen/common/grant_table.c >> @@ -323,22 +323,25 @@ shared_entry_header(struct grant_table * >> /* Active grant entry - used for shadowing GTF_permit_access grants. */ >> struct active_grant_entry { >> uint32_t pin; /* Reference count information: */ >> + /* Width of the individual counter fields. */ >> +#define GNTPIN_cntr_width 8 >> +#define GNTPIN_cntr_mask ((1U << GNTPIN_cntr_width) - 1) >> /* Count of writable host-CPU mappings. */ >> #define GNTPIN_hstw_shift 0 >> #define GNTPIN_hstw_inc (1U << GNTPIN_hstw_shift) >> -#define GNTPIN_hstw_mask (0xFFU << GNTPIN_hstw_shift) >> +#define GNTPIN_hstw_mask (GNTPIN_cntr_mask << GNTPIN_hstw_shift) >> /* Count of read-only host-CPU mappings. */ >> -#define GNTPIN_hstr_shift 8 >> +#define GNTPIN_hstr_shift (GNTPIN_hstw_shift + GNTPIN_cntr_width) > > While this patch is by-and-large an improvement, it unfortunately > further hides how the pin field works, which is already clear-as-mud. > > I'd recommend replacing the "Reference count information:" comment with: > > /* > * 4x byte-wide reference counts, for {host,device}{read,write} > * mappings, implemented as a single 32bit presumably to optimise > * checking for any reference. > */ > uint32_t pin; Sure, added. >> @@ -1052,19 +1063,19 @@ map_grant_ref( >> shah = shared_entry_header(rgt, ref); >> act = active_entry_acquire(rgt, ref); >> >> - /* Make sure we do not access memory speculatively */ >> - status = evaluate_nospec(rgt->gt_version == 1) ? &shah->flags >> - : &status_entry(rgt, ref); >> - >> /* If already pinned, check the active domid and avoid refcnt overflow. >> */ >> if ( act->pin && >> ((act->domid != ld->domain_id) || >> - (act->pin & 0x80808080U) != 0 || >> + (act->pin & (pin_incr << (GNTPIN_cntr_width - 1))) || > > This, I'm afraid, is not an improvement. What we want is: > > #define GNTPIN_overflow_mask 0x80808080U > > The reason for checking all at once is defence in depth (not strictly > necessary, but also not a problem), How is this not a problem? There is absolutely no reason to reject a request just because some unrelated field may be about to overflow. In fact I now think that I didn't even leverage the full potential - the "act->pin != old_pin" check could also be relaxed this way, I think. Just that it sits on a path we probably don't really care about very much. > and in this specific example, using > a constant results in better code because pin_incr doesn't need > unspilling from stack and manipulated. That's, I think, an acceptable price to pay for getting the checking correct. > If you're happy with both of these suggestions, then Reviewed-by: Andrew > Cooper <andrew.cooper3@xxxxxxxxxx> to avoid a repost. Thanks, but as per above - not yet. Plus if I made this 2nd suggested change, the patch would change significantly (the new local variable would then become pointless in at least acquire_grant_for_copy()), which I think would better involve re-posting then. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |