Re: mlock: mlocked pages are unevictable

KOSAKI Motohiro
2008-10-21T17:18:36Z

2008/10/22 KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>:
> Hi
>
>> I think the following part of your patch:
>>
>>> diff --git a/mm/swap.c b/mm/swap.c
>>> index fee6b97..bc58c13 100644
>>> --- a/mm/swap.c
>>> +++ b/mm/swap.c
>>> @@ -278,7 +278,7 @@ void lru_add_drain(void)
>>> put_cpu();
>>> }
>>>
>>> -#ifdef CONFIG_NUMA
>>> +#if defined(CONFIG_NUMA) || defined(CONFIG_UNEVICTABLE_LRU)
>>> static void lru_add_drain_per_cpu(struct work_struct *dummy)
>>> {
>>> lru_add_drain();
>>
>> causes this (allyesconfig on s390):
>
> hm,
>
> I don't think so.
>
> Actually, this patch has
> mmap_sem -> lru_add_drain_all() dependency.
>
> but its dependency already exist in another place.
> example,
>
> sys_move_pages()
> do_move_pages() <- down_read(mmap_sem)
> migrate_prep()
> lru_add_drain_all()
>
> Thought?

ok. maybe I understand this issue.

This bug is caused by folloing dependencys.

some VM place has
mmap_sem -> kevent_wq

net/core/dev.c::dev_ioctl() has
rtnl_lock -> mmap_sem (*) almost ioctl has
copy_from_user() and it cause page fault.

linkwatch_event has
kevent_wq -> rtnl_lock

So, I think VM subsystem shouldn't use kevent_wq because many driver
use ioctl and work queue combination.
then drivers fixing isn't easy.

I'll make the patch soon.