Re: [RFC v2 12/14] arm64/lib: asid: Allow user to update the context under the lock

From: Julien Grall
Date: Mon Jul 15 2019 - 10:39:04 EST




On 03/07/2019 18:35, James Morse wrote:
Hi Julien,

Hi James,

On 20/06/2019 14:06, Julien Grall wrote:
Some users of the ASID allocator (e.g VMID) will require to update the
context when a new ASID is generated. This has to be protected by a lock
to prevent concurrent modification.

Rather than introducing yet another lock, it is possible to re-use the
allocator lock for that purpose. This patch introduces a new callback
that will be call when updating the context.

You're using this later in the series to mask out the generation from the atomic64 to
leave just the vmid.

You are right.


Where does this concurrent modification happen? The value is only written if we have a
rollover, and while its active the only bits that could change are the generation.
(subsequent vCPUs that take the slow path for the same VM will see the updated generation
and skip the new_context call)

If we did the generation filtering in update_vmid() after the call to
asid_check_context(), what would go wrong?
It happens more often than is necessary and would need a WRITE_ONCE(), but the vmid can't
change until we become preemptible and another vCPU gets a chance to make its vmid active.

I think I was over cautious. Pre-filtering after asid_check_context() is equally fine as long as update_vttbr() is called from preemptible context.

Cheers,

--
Julien Grall