On 08/16/2017 02:53 PM, Kirill Tkhai wrote:
> This patch completes splitting of ni->lock into ni->lock and pni->lock.
> Now, global ni->lock is used for inserting in tcache_nodeinfo::reclaim_tree,
> which happen just on every 1024 inserting or erasing of pages.
> For other LRU operations is used pni->lock, which is per-filesystem
> (i.e., per-container), and does not affect other containers.
> 
> Also, lock order is changed:
> 
>       spin_lock(&pni->lock);
>       spin_lock(&ni->lock);
> 
> Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>
> ---
>  mm/tcache.c |   27 ++++++++++++++-------------
>  1 file changed, 14 insertions(+), 13 deletions(-)
> 

>  static int tcache_create_pool(void)
> @@ -1064,7 +1064,6 @@ tcache_lru_isolate(int nid, struct page **pages, int 
> nr_to_isolate)
>       }
>       rcu_read_unlock();
>  
> -     spin_lock_irq(&ni->lock);
>       spin_lock(&pni->lock);

spin_lock_irq(&pni->lock) 

>       nr_isolated = __tcache_lru_isolate(pni, pages, nr_to_isolate);
>  
> @@ -1073,17 +1072,19 @@ tcache_lru_isolate(int nid, struct page **pages, int 
> nr_to_isolate)
>  
>       atomic_long_sub(nr_isolated, &ni->nr_pages);
>  
> -     if (!RB_EMPTY_NODE(rbn)) {
> -             rb_erase(rbn, &ni->reclaim_tree);
> -             RB_CLEAR_NODE(rbn);
> +     if (!RB_EMPTY_NODE(rbn) || !list_empty(&pni->lru)) {
> +             spin_lock(&ni->lock);




> +             if (!RB_EMPTY_NODE(rbn))
> +                     rb_erase(rbn, &ni->reclaim_tree);
> +             if (!list_empty(&pni->lru))
> +                     __tcache_insert_reclaim_node(ni, pni);
> +             else
> +                     RB_CLEAR_NODE(rbn);

Didn't get this part. Shouldn't we have something like this?

                if (!RB_EMPTY_NODE(rbn)) {
                        rb_erase(rbn, &ni->reclaim_tree);
                        RB_CLEAR_NODE(rbn);
                }
                if (!list_empty(&pni->lru))
                        __tcache_insert_reclaim_node(ni, pni);



> +             update_ni_rb_first(ni);
> +             spin_unlock(&ni->lock);
>       }
> -     if (!list_empty(&pni->lru))
> -             __tcache_insert_reclaim_node(ni, pni);
> -     update_ni_rb_first(ni);
> -
>  unlock:
>       spin_unlock(&pni->lock);

spin_unlock_irq(&pni->lock) 

> -     spin_unlock_irq(&ni->lock);
>       tcache_put_pool(pni->pool);
>  out:
>       return nr_isolated;
> 
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to