On Mon, Apr 30, 2012 at 7:29 AM, Konstantin Khlebnikov
<[email protected]> wrote:
> Currently, nonlinear mappings can not be distinguished from ordinary mappings.
> This patch adds into /proc/pid/smaps line "Nonlinear: <size> kB", where size is
> amount of nonlinear ptes in vma, this line appears only if VM_NONLINEAR is set.
> This information may be useful not only for checkpoint/restore project.
>
> Signed-off-by: Konstantin Khlebnikov <[email protected]>
> Requested-by: Pavel Emelyanov <[email protected]>
> ---
> ?fs/proc/task_mmu.c | ? 12 ++++++++++++
> ?1 file changed, 12 insertions(+)
>
> diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
> index acee5fd..b1d9729 100644
> --- a/fs/proc/task_mmu.c
> +++ b/fs/proc/task_mmu.c
> @@ -393,6 +393,7 @@ struct mem_size_stats {
> ? ? ? ?unsigned long anonymous;
> ? ? ? ?unsigned long anonymous_thp;
> ? ? ? ?unsigned long swap;
> + ? ? ? unsigned long nonlinear;
> ? ? ? ?u64 pss;
> ?};
>
> @@ -402,6 +403,7 @@ static void smaps_pte_entry(pte_t ptent, unsigned long addr,
> ?{
> ? ? ? ?struct mem_size_stats *mss = walk->private;
> ? ? ? ?struct vm_area_struct *vma = mss->vma;
> + ? ? ? pgoff_t pgoff = linear_page_index(vma, addr);
> ? ? ? ?struct page *page = NULL;
> ? ? ? ?int mapcount;
>
> @@ -414,6 +416,9 @@ static void smaps_pte_entry(pte_t ptent, unsigned long addr,
> ? ? ? ? ? ? ? ? ? ? ? ?mss->swap += ptent_size;
> ? ? ? ? ? ? ? ?else if (is_migration_entry(swpent))
> ? ? ? ? ? ? ? ? ? ? ? ?page = migration_entry_to_page(swpent);
> + ? ? ? } else if (pte_file(ptent)) {
> + ? ? ? ? ? ? ? if (pte_to_pgoff(ptent) != pgoff)
> + ? ? ? ? ? ? ? ? ? ? ? mss->nonlinear += ptent_size;
I think this is not equal to our non linear mapping definition. Even if
pgoff is equal to linear mapping case, it is non linear. I.e. nonlinear is
vma attribute. Why do you want to introduce different definition?
KOSAKI Motohiro wrote:
> On Mon, Apr 30, 2012 at 7:29 AM, Konstantin Khlebnikov
> <[email protected]> wrote:
>> Currently, nonlinear mappings can not be distinguished from ordinary mappings.
>> This patch adds into /proc/pid/smaps line "Nonlinear:<size> kB", where size is
>> amount of nonlinear ptes in vma, this line appears only if VM_NONLINEAR is set.
>> This information may be useful not only for checkpoint/restore project.
>>
>> Signed-off-by: Konstantin Khlebnikov<[email protected]>
>> Requested-by: Pavel Emelyanov<[email protected]>
>> ---
>> fs/proc/task_mmu.c | 12 ++++++++++++
>> 1 file changed, 12 insertions(+)
>>
>> diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
>> index acee5fd..b1d9729 100644
>> --- a/fs/proc/task_mmu.c
>> +++ b/fs/proc/task_mmu.c
>> @@ -393,6 +393,7 @@ struct mem_size_stats {
>> unsigned long anonymous;
>> unsigned long anonymous_thp;
>> unsigned long swap;
>> + unsigned long nonlinear;
>> u64 pss;
>> };
>>
>> @@ -402,6 +403,7 @@ static void smaps_pte_entry(pte_t ptent, unsigned long addr,
>> {
>> struct mem_size_stats *mss = walk->private;
>> struct vm_area_struct *vma = mss->vma;
>> + pgoff_t pgoff = linear_page_index(vma, addr);
>> struct page *page = NULL;
>> int mapcount;
>>
>> @@ -414,6 +416,9 @@ static void smaps_pte_entry(pte_t ptent, unsigned long addr,
>> mss->swap += ptent_size;
>> else if (is_migration_entry(swpent))
>> page = migration_entry_to_page(swpent);
>> + } else if (pte_file(ptent)) {
>> + if (pte_to_pgoff(ptent) != pgoff)
>> + mss->nonlinear += ptent_size;
>
> I think this is not equal to our non linear mapping definition. Even if
> pgoff is equal to linear mapping case, it is non linear. I.e. nonlinear is
> vma attribute. Why do you want to introduce different definition?
VMA attribute can be determined via presence of this field,
without VM_NONLINEAR it does not appears.
On Tue, May 1, 2012 at 1:56 PM, Konstantin Khlebnikov
<[email protected]> wrote:
> KOSAKI Motohiro wrote:
>>
>> On Mon, Apr 30, 2012 at 7:29 AM, Konstantin Khlebnikov
>> <[email protected]> ?wrote:
>>>
>>> Currently, nonlinear mappings can not be distinguished from ordinary
>>> mappings.
>>> This patch adds into /proc/pid/smaps line "Nonlinear:<size> ?kB", where
>>> size is
>>> amount of nonlinear ptes in vma, this line appears only if VM_NONLINEAR
>>> is set.
>>> This information may be useful not only for checkpoint/restore project.
>>>
>>> Signed-off-by: Konstantin Khlebnikov<[email protected]>
>>> Requested-by: Pavel Emelyanov<[email protected]>
>>> ---
>>> ?fs/proc/task_mmu.c | ? 12 ++++++++++++
>>> ?1 file changed, 12 insertions(+)
>>>
>>> diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
>>> index acee5fd..b1d9729 100644
>>> --- a/fs/proc/task_mmu.c
>>> +++ b/fs/proc/task_mmu.c
>>> @@ -393,6 +393,7 @@ struct mem_size_stats {
>>> ? ? ? ?unsigned long anonymous;
>>> ? ? ? ?unsigned long anonymous_thp;
>>> ? ? ? ?unsigned long swap;
>>> + ? ? ? unsigned long nonlinear;
>>> ? ? ? ?u64 pss;
>>> ?};
>>>
>>> @@ -402,6 +403,7 @@ static void smaps_pte_entry(pte_t ptent, unsigned
>>> long addr,
>>> ?{
>>> ? ? ? ?struct mem_size_stats *mss = walk->private;
>>> ? ? ? ?struct vm_area_struct *vma = mss->vma;
>>> + ? ? ? pgoff_t pgoff = linear_page_index(vma, addr);
>>> ? ? ? ?struct page *page = NULL;
>>> ? ? ? ?int mapcount;
>>>
>>> @@ -414,6 +416,9 @@ static void smaps_pte_entry(pte_t ptent, unsigned
>>> long addr,
>>> ? ? ? ? ? ? ? ? ? ? ? ?mss->swap += ptent_size;
>>> ? ? ? ? ? ? ? ?else if (is_migration_entry(swpent))
>>> ? ? ? ? ? ? ? ? ? ? ? ?page = migration_entry_to_page(swpent);
>>> + ? ? ? } else if (pte_file(ptent)) {
>>> + ? ? ? ? ? ? ? if (pte_to_pgoff(ptent) != pgoff)
>>> + ? ? ? ? ? ? ? ? ? ? ? mss->nonlinear += ptent_size;
>>
>>
>> I think this is not equal to our non linear mapping definition. Even if
>> pgoff is equal to linear mapping case, it is non linear. I.e. nonlinear is
>> vma attribute. Why do you want to introduce different definition?
>
> VMA attribute can be determined via presence of this field,
> without VM_NONLINEAR it does not appears.
I meant, is there any worth?