Quantcast

arm64: Remove early ASID allocation

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

arm64: Remove early ASID allocation

Dale Rahn
Do not preallocate the asid, wait until it is allcoated in pmap_setttb()
Simplifies the code by only having one location that does the asid
allocation.

There is no need to allocate the ASID direclty in pmap_activate as
the code in pmap setttb will do that allocation so this code is just
duplication that could potentially cause a race in the future.

diff --git a/sys/arch/arm64/arm64/pmap.c b/sys/arch/arm64/arm64/pmap.c
index 4d0c58c3663..d1fa358b85f 100644
--- a/sys/arch/arm64/arm64/pmap.c
+++ b/sys/arch/arm64/arm64/pmap.c
@@ -1403,14 +1403,6 @@ pmap_activate(struct proc *p)
  pcb = &p->p_addr->u_pcb;
 
  // printf("%s: called on proc %p %p\n", __func__, p,  pcb->pcb_pagedir);
- if (pm != pmap_kernel() && pm->pm_asid == -1) {
- // this userland process has no asid, allocate one.
- pmap_allocate_asid(pm);
- }
-
- if (pm != pmap_kernel())
- pcb->pcb_pagedir = ((uint64_t)pm->pm_asid << 48) | pm->pm_pt0pa;
-
  psw = disable_interrupts();
  if (p == curproc && pm != pmap_kernel() && pm != curcpu()->ci_curpm) {
  // clean up old process
Dale Rahn [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: arm64: Remove early ASID allocation

Mark Kettenis
> Date: Fri, 17 Mar 2017 16:00:53 -0400
> From: Dale Rahn <[hidden email]>
>
> Do not preallocate the asid, wait until it is allcoated in pmap_setttb()
> Simplifies the code by only having one location that does the asid
> allocation.
>
> There is no need to allocate the ASID direclty in pmap_activate as
> the code in pmap setttb will do that allocation so this code is just
> duplication that could potentially cause a race in the future.

I wondered if this was supposed to be an optimization, to prevent
running a potentially expensive operation with interrupts disabled.
But that doesn't really make a lot of sense.

ok kettenis@

P.S. I'm looking into using the full 16-bits to make ASID allocation
simpler.  First test shows that the full 16 bits work on the rpi3.

> diff --git a/sys/arch/arm64/arm64/pmap.c b/sys/arch/arm64/arm64/pmap.c
> index 4d0c58c3663..d1fa358b85f 100644
> --- a/sys/arch/arm64/arm64/pmap.c
> +++ b/sys/arch/arm64/arm64/pmap.c
> @@ -1403,14 +1403,6 @@ pmap_activate(struct proc *p)
>   pcb = &p->p_addr->u_pcb;
>  
>   // printf("%s: called on proc %p %p\n", __func__, p,  pcb->pcb_pagedir);
> - if (pm != pmap_kernel() && pm->pm_asid == -1) {
> - // this userland process has no asid, allocate one.
> - pmap_allocate_asid(pm);
> - }
> -
> - if (pm != pmap_kernel())
> - pcb->pcb_pagedir = ((uint64_t)pm->pm_asid << 48) | pm->pm_pt0pa;
> -
>   psw = disable_interrupts();
>   if (p == curproc && pm != pmap_kernel() && pm != curcpu()->ci_curpm) {
>   // clean up old process
> Dale Rahn [hidden email]
>
>

Loading...