Subject: Re: Split pmap_activate() into pmap_activate() and pmap_newvmspace().
To: Jason R Thorpe <thorpej@wasabisystems.com>
From: Chuck Silvers <chuq@chuq.com>
List: tech-kern
Date: 09/07/2002 09:39:23
On Mon, Sep 02, 2002 at 02:34:39PM -0700, Jason R Thorpe wrote:
> On Fri, Aug 30, 2002 at 12:34:54AM -0700, Chuck Silvers wrote:
>
> > > (FWIW, I'm planning on changing the pmap_activate() semantics to
> > > address a problem on the nathanw_sa branch).
> >
> > ok, but is that related to this? what sort of change would you propose?
>
> It's not really related to this, but it overlaps in a way.
>
> The problem is that, as it stands, pmap_activate() has "fuzzy" semantics:
>
> 1. Sometimes, it's used to activate the address space for a process
> that is being switched to. Many platforms use this to make sure
> the PT base is set in the PCB, or something like that (or allocate
> an ASN, or mark the pmap active on CPU #n for MP TLB shootdown,
> etc.). In these cases, it is usually (always?) called when the
> target proc != curproc.
>
> 2. Sometimes it's called to say that the currently running process
> has a new virtual address space (e.g. uvmspace_share/unshare).
>
> This has problems in the LWP/SA universe. In that world, operation (1) is
> really per-LWP, and operation (2) is really per-proc. A little more detail:
how is operation 1 per-LWP? the address space is the same for each LWP
in a process, so wouldn't they use the same ASN, etc?
if the PCB is going to be per-LWP, shouldn't there be a corresponding
structure that is per-proc, and wouldn't any address space information
be in that structure instead of in the PCB?
(though I'd think that the per-LWP structure would be an LCB,
leaving "PCB" per-process. it does stand for "process control block"
after all.)
> 1. In the LWP/SA universe, this operation remains largely unchanged.
>
> 2. In the LWP/SA universe, this operation needs to traverse the list
> if LWPs, and update their PCBs, etc. This might involve sending
> IPIs to other CPUs, if LWPs for the current process are active on
> other CPUs.
when would a process get a new address space while it has multiple LWPs?
the address space changing out from under an LWP would cause a lot of problems,
I'd think. could you give an example of how this would work?
-Chuck
> What I'd like to do is split the two operations into two different calls:
>
> pmap_activate(struct proc *p) -- this will be essentially the same
> operation as it is now, except for the "and reload PT base register
> if curproc" part will go away. I.e. it will simply make a proc's
> pmap (or an LWP's proc's pmap) ready to be used by the current
> processor.
>
> pmap_newvmspace(struct proc *p, struct pmap *newpmap) -- this will
> be used to switch a process from one VM space to another. It also
> occurs to me that this could be used for your exec optimization
> (where you currently pmap_activate(&proc0), instead you would
> so pmap_newvmspace(p, pmap_kernel())).
>
> > well, I could just go ahead and fix all the pmap_activate() implementations
> > so that wouldn't need to be conditionalized. I don't think either of us
> > is going to go and implement pmap_predestroy() or pmap_remove_all()
> > for all pmaps anytime soon, so that would need to be conditionalized
> > either way. I don't see not much difference on that front.
>
> Actually, I *would* like to make the above change relatively soon, as it
> will make it possible to undo some hacks on the nathanw_sa branch, which
> will mean we can concentrate on other stuff there and hopefully merge it
> a little sooner :-)
>
> --
> -- Jason R. Thorpe <thorpej@wasabisystems.com>