[Devel] [PATCH RH7] mm: Fix race between reparenting memcg and list_lru_del()
Kirill Tkhai
ktkhai at virtuozzo.com
Thu Dec 3 12:40:48 MSK 2020
Pull from here: https://ozlabs.org/~akpm/mmotm/broken-out/mm-list_lru-set-shrinker-map-bit-when-child-nr_items-is-not-zero.patch
On 03.12.2020 12:19, Vasily Averin wrote:
> I'm going to wait till final patch version will be committed upstream
>
> Kirill,
> I belive you will be notified, so please let me know when this happen.
>
> Thank you,
> Vasily Averin
>
> On 12/1/20 1:34 PM, Kirill Tkhai wrote:
>> From: Roman Gushchin <guro at fb.com>
>>
>> On reparenting struct list_lru_one::nr_items may become
>> negative, so all the shrinker bits logic works as not expected.
>>
>> This leads to cleared shrinker bit while LRU is not
>> actually empty.
>>
>> (We will pull description from ms git later, when it's available).
>>
>> https://lkml.org/lkml/2020/11/30/1093
>>
>> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
>> ---
>> mm/list_lru.c | 4 +---
>> 1 file changed, 1 insertion(+), 3 deletions(-)
>>
>> diff --git a/mm/list_lru.c b/mm/list_lru.c
>> index 21e12a8364ff..05d517197fbe 100644
>> --- a/mm/list_lru.c
>> +++ b/mm/list_lru.c
>> @@ -511,7 +511,6 @@ static void memcg_drain_list_lru_node(struct list_lru *lru, int nid,
>> struct list_lru_node *nlru = &lru->node[nid];
>> int dst_idx = memcg_cache_id(dst_memcg);
>> struct list_lru_one *src, *dst;
>> - bool set;
>>
>> /*
>> * Since list_lru_{add,del} may be called under an IRQ-safe lock,
>> @@ -523,9 +522,8 @@ static void memcg_drain_list_lru_node(struct list_lru *lru, int nid,
>> dst = list_lru_from_memcg_idx(nlru, dst_idx);
>>
>> list_splice_init(&src->list, &dst->list);
>> - set = (!dst->nr_items && src->nr_items);
>> dst->nr_items += src->nr_items;
>> - if (set)
>> + if (src->nr_items)
>> memcg_set_shrinker_bit(dst_memcg, nid, lru_shrinker_id(lru));
>> src->nr_items = 0;
>>
>>
>>
More information about the Devel
mailing list