[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] x86/pv: free the shared_info page switch_compat() replaces



On Tue, Nov 10, 2026 at 1:21 PM Jan Beulich <jbeulich@xxxxxxxx> wrote:
> What I asked for here is that we free the page if its refcount is zero
> (the common case), exactly as you do (via RCU). Yet we would skip the
> freeing (and leak the page) in the unexpected case of the refcount not
> being zero after the put_page_alloc_ref().

OK, I think I see.  Yes, I'd considered that.  I mean, to be honest,
the whole xenheap allocation thing is janky; somehow we've taken a
useful, well-understood primitive that should work simply and
consistently (dropping the last ref causes a free) and added extra
bits so that it's fragile once again.  (If shared_info were a domheap
page, do_settime() would just grab a ref, map & access the page, then
drop the ref, knowing the page wouldn't be freed while it held the
ref, and *would* once it was dropped.)

Given that dropping a ref doesn't automatically / atomically free the
page, it seems like the rule should be that you *never* grab a ref to
a xenheap page, unless you've gone through the rest of the code and
verified that the freeing path works correctly.

And given *that*, since nobody else is currently grabbing the ref, not
checking the refcount should be safe.

I suppose you'll say, sure, but this is a non-hot path, and if we ever
*do* free with an outstanding refcount it's a security issue, so why
not be safe?  You have to draw the line on internal consistency checks
*somewhere*; I'd leave the check off, but I can add it if you really
want.

> > Now that we have the RCU version implemented and tested, I think we
> > should keep it.  It's safe now, and we can keep it safe in the future.
> > If you want we could add a comment to the field warning that no
> > references should be taken to it because it may change; but honestly
> > that seems like overkill to me.
>
> For the field I'm not concerned - it's purpose is clear, and anyone
> trying to add obtaining of a ref using it as input will hopefully be
> caught the latest during review. It's a ref existing ahead of the
> put_page_alloc_ref() which worries me (some).

For clarity, I meant a comment on d->shared_info, saying not to retain
pointers into it outside of a domain rcu_lock; and I guess now also
adding not to grab an additional reference to it without coordinating
free-on-last-reference properly.  But as I said, both should be a
general rule, not something we need to add to each data structure
affected.

 -George



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.