On Wed, Aug 01, 2018 at 06:02:55AM -0400, Rik van Riel wrote:
> Conditionally skip lazy TLB mm refcounting. When an architecture has
> CONFIG_ARCH_NO_ACTIVE_MM_REFCOUNTING enabled, an mm that is used in
> lazy TLB mode anywhere will get shot down from exit_mmap, and there
> in no need to incur the cache line bouncing overhead of refcounting
> a lazy TLB mm.
> 
> Implement this by moving the refcounting of a lazy TLB mm to helper
> functions, which skip the refcounting when it is not necessary.
> 
> Deal with use_mm and unuse_mm by fully splitting out the refcounting
> of the lazy TLB mm a kernel thread may have when entering use_mm from
> the refcounting of the mm that use_mm is about to start using.


> @@ -2803,16 +2803,29 @@ context_switch(struct rq *rq, struct task_struct 
> *prev,
>        * membarrier after storing to rq->curr, before returning to
>        * user-space.
>        */
> +     /*
> +      * kernel -> kernel     lazy + transfer active
> +      *   user -> kernel     lazy + grab_lazy_mm active
> +      *
> +      * kernel ->   user     switch + drop_lazy_mm active
> +      *   user ->   user     switch
> +      */
> +     if (!mm) {                              // to kernel
>               next->active_mm = oldmm;
>               enter_lazy_tlb(oldmm, next);
> +
> +             if (prev->mm)                   // from user
> +                     grab_lazy_mm(oldmm);
> +             else
> +                     prev->active_mm = NULL;
> +     } else {                                // to user
>               switch_mm_irqs_off(oldmm, mm, next);
>  
> +             if (!prev->mm) {                // from kernel
> +                     /* will drop_lazy_mm() in finish_task_switch(). */
> +                     rq->prev_mm = oldmm;
> +                     prev->active_mm = NULL;
> +             }
>       }

So this still confuses the heck out of me; and the Changelog doesn't
seem to even mention it. You still track and swizzle ->active_mm but no
longer refcount it.

Why can't we skip the ->active_mm swizzle and keep ->active_mm == ->mm.

Doing the swizzle but not the refcount just makes me itch.

Reply via email to