On 2023/10/12 17:56, 陈冠有 wrote:
> Subject: [PATCH] Fix: "rd" command to read zram buf on Linux 5.17 and later
> 
> 
> Kernel commit a41ec880aa7b ("zsmalloc: move huge compressed obj from page to 
> zspage"),
> which is contained in Linux 5.17 and later kernels.
> Kernel commit ffedd09fa9b06 ("zsmalloc: Stop using slab fields in struct 
> page")
> Kernel commit f635725c3905e ("zram: do not waste zram_table_entry flags 
> bits"),
> which is contained in Linux 6.1 and later kernels.

Thanks for sending the updated patch.

The commit log can be updated later... some comments below.

> 
> Before:
> crash> mod -s zram zram.ko
>       MODULE       NAME                                          BASE         
>   SIZE  OBJECT FILE
> ffffffde224db800  zram                                    ffffffde224d2000    
> 57344  zram.ko
> crash> mod -s zsmalloc zsmalloc.ko
>       MODULE       NAME                                          BASE         
>   SIZE  OBJECT FILE
> ffffffde224c5180  zsmalloc                                ffffffde224bf000    
> 40960  zsmalloc.ko
> crash> rd 0x13d89fb0
> rd: zspage magic incorrect: b0
> 
> After:
> crash> rd 0x13d89fb0
>          13d89fb0:  c2b54f7170883b20                     ;.pqO..
> 
> Link: https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org
> Link: 
> https://lkml.kernel.org/r/20220912152744.527438-1-senozhat...@chromium.org
> 
> Signed-off-by: chenguanyou <chenguan...@xiaomi.com>
> ---
>   defs.h     | 13 +++++++++++
>   diskdump.c | 67 ++++++++++++++++++++++++++++++++++++++++++++----------
>   2 files changed, 68 insertions(+), 12 deletions(-)
> 
> diff --git a/defs.h b/defs.h
> index 96a7a2a..95ccbb4 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -2225,6 +2225,7 @@ struct offset_table {                    /* stash of 
> commonly-used offsets */
>      long module_memory_base;
>      long module_memory_size;
>      long irq_data_irq;
> +   long zspage_huge;
>   };
> 
>   struct size_table {         /* stash of commonly-used sizes */
> @@ -7221,6 +7222,18 @@ struct zspage {
>       unsigned int freeobj;
>   };
> 
> +struct zspage_5_17 {
> +    struct {
> +        unsigned int huge : 1;
> +        unsigned int fullness : 2;
> +        unsigned int class : 9;
> +        unsigned int isolated : 3;
> +        unsigned int magic : 8;
> +    };
> +    unsigned int inuse;
> +    unsigned int freeobj;
> +};
> +
>   /*
>    * makedumpfile.c
>    */
> diff --git a/diskdump.c b/diskdump.c
> index 2c284ff..625b3a0 100644
> --- a/diskdump.c
> +++ b/diskdump.c
> @@ -2754,6 +2754,9 @@ zram_init(void)
>      if (INVALID_MEMBER(zram_table_flag))
>          MEMBER_OFFSET_INIT(zram_table_flag, "zram_table_entry", "value");
>      STRUCT_SIZE_INIT(zram_table_entry, "zram_table_entry");
> +   MEMBER_OFFSET_INIT(zspoll_size_class, "zs_pool", "size_class");
> +   MEMBER_OFFSET_INIT(size_class_size, "size_class", "size");
> +   MEMBER_OFFSET_INIT(zspage_huge, "zspage", "huge");
>   }
> 
>   static unsigned char *
> @@ -2761,9 +2764,11 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
> char *zram_buf)
>   {
>      ulong obj, off, class, page, zspage;
>      struct zspage zspage_s;
> +   struct zspage_5_17 zspage_5_17_s;
>      physaddr_t paddr;
>      unsigned int obj_idx, class_idx, size;
>      ulong pages[2], sizes[2];
> +   ulong zs_magic;
> 
>      readmem(handle, KVADDR, &obj, sizeof(void *), "zram entry", 
> FAULT_ON_ERROR);
>      obj >>= OBJ_TAG_BITS;
> @@ -2772,11 +2777,19 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
> char *zram_buf)
> 
>      readmem(page + OFFSET(page_private), KVADDR, &zspage,
>              sizeof(void *), "page_private", FAULT_ON_ERROR);
> -   readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
> FAULT_ON_ERROR);
> 
> -   class_idx = zspage_s.class;
> -   if (zspage_s.magic != ZSPAGE_MAGIC)
> -       error(FATAL, "zspage magic incorrect: %x\n", zspage_s.magic);
> +   if (VALID_MEMBER(zspage_huge)) {
> +       readmem(zspage, KVADDR, &zspage_5_17_s, sizeof(struct zspage_5_17), 
> "zspage_5_17", FAULT_ON_ERROR);
> +       class_idx = zspage_5_17_s.class;
> +       zs_magic = zspage_5_17_s.magic;
> +   } else {
> +       readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
> FAULT_ON_ERROR);
> +       class_idx = zspage_s.class;
> +       zs_magic = zspage_s.magic;
> +   }
> +
> +   if (zs_magic != ZSPAGE_MAGIC)
> +       error(FATAL, "zspage magic incorrect: %x\n", zs_magic);
> 
>      class = pool + OFFSET(zspoll_size_class);
>      class += (class_idx * sizeof(void *));
> @@ -2794,8 +2807,13 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
> char *zram_buf)
>      }
> 
>      pages[0] = page;
> -   readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
> -           sizeof(void *), "page_freelist", FAULT_ON_ERROR);
> +   if (VALID_MEMBER(page_freelist)) {
> +       readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
> +               sizeof(void *), "page_freelist", FAULT_ON_ERROR);
> +   } else {
> +       readmem(page + OFFSET(page_index), KVADDR, &pages[1],
> +               sizeof(void *), "page_index", FAULT_ON_ERROR);
> +   }
>      sizes[0] = PAGESIZE() - off;
>      sizes[1] = size - sizes[0];
>      if (!is_page_ptr(pages[0], &paddr)) {
> @@ -2812,9 +2830,15 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
> char *zram_buf)
>      readmem(paddr, PHYSADDR, zram_buf + sizes[0], sizes[1], "zram 
> buffer[1]", FAULT_ON_ERROR);
> 
>   out:
> -   readmem(page, KVADDR, &obj, sizeof(void *), "page flags", FAULT_ON_ERROR);
> -   if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
> -       return (zram_buf + ZS_HANDLE_SIZE);
> +   if (!VALID_MEMBER(zspage_huge)) {
> +       readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
> FAULT_ON_ERROR);
> +       if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
> +           return (zram_buf + ZS_HANDLE_SIZE);
> +       }
> +   } else {
> +       if (!zspage_5_17_s.huge) {
> +           return (zram_buf + ZS_HANDLE_SIZE);
> +       }
>      }
> 
>      return zram_buf;
> @@ -2929,6 +2953,11 @@ try_zram_decompress(ulonglong pte_val, unsigned char 
> *buf, ulong len, ulonglong
>      unsigned char *outbuf = NULL;
>      ulong zram, zram_table_entry, sector, index, entry, flags, size,
>          outsize, off;
> +   unsigned long *same_buf = NULL;
> +   bool is_same = false;
> +   ulong ZRAM_SAME_PAGEFLAG;
> +   ulong ZRAM_WB_PAGEFLAG;
> +   long ZRAM_LOCK_VALUE = 24;

is_same and ZRAM_WB_PAGEFLAG are not used.

cc -c -g -DX86_64 -DLZO -DSNAPPY -DZSTD -DGDB_10_2  diskdump.c -Wall -O2 
-Wstrict-prototypes -Wmissing-prototypes -fstack-protector 
-Wformat-security
diskdump.c: In function 'try_zram_decompress':
diskdump.c:2959:8: warning: variable 'ZRAM_WB_PAGEFLAG' set but not used 
[-Wunused-but-set-variable]
   ulong ZRAM_WB_PAGEFLAG;
         ^~~~~~~~~~~~~~~~
diskdump.c:2957:7: warning: unused variable 'is_same' [-Wunused-variable]
   bool is_same = false;
        ^~~~~~~

> 
>      if (INVALID_MEMBER(zram_compressor)) {
>          zram_init();
> @@ -2992,11 +3021,25 @@ try_zram_decompress(ulonglong pte_val, unsigned char 
> *buf, ulong len, ulonglong
>          sizeof(void *), "entry of table", FAULT_ON_ERROR);
>      readmem(zram_table_entry + OFFSET(zram_table_flag), KVADDR, &flags,
>          sizeof(void *), "zram_table_flag", FAULT_ON_ERROR);
> -   if (!entry || (flags & ZRAM_FLAG_SAME_BIT)) {
> -       memset(buf, entry, len);
> +
> +   if (!enumerator_value("ZRAM_LOCK", &ZRAM_LOCK_VALUE)

This is one of slow functions, so this makes the rd command very slow, 
e.g. "rd 7f88aa3ff000 32" takes more than 1 second on a machine:

crash> rd 7f88aa3ff000 32 | elaps.py
     7f88aa3ff000:  0000000000000000 0101010101010101   ................
     7f88aa3ff010:  0101010101010101 0101010101010101   ................
     7f88aa3ff020:  0101010101010101 0101010101010101   ................
...
(elaps: 0:00:01.135)
crash>

The value does not change in a vmcore/kcore, how about having these

   static long ZRAM_LOCK;
   static long ZRAM_SAME;

in diskdump.c and get it in zram_init()?


> +           && THIS_KERNEL_VERSION >= LINUX(6,1,0))
> +       ZRAM_LOCK_VALUE = PAGESHIFT() + 1;
> +
> +   ZRAM_SAME_PAGEFLAG = ZRAM_LOCK_VALUE + 1;
> +   ZRAM_WB_PAGEFLAG = ZRAM_LOCK_VALUE + 2;
> +
> +   if (!entry || flags & (1 << ZRAM_SAME_PAGEFLAG)) {
> +       same_buf = (unsigned long *)GETBUF(PAGESIZE());
> +       for (int count = 0; count < PAGESIZE() / sizeof(unsigned long); 
> count++) {
> +           same_buf[count] = entry;
> +       }

Does this mean that the current "memset(buf, entry, len)" is a bug, 
because entry is ulong, right?  If so, I agree.

> +       memcpy(buf, same_buf + off, PAGESIZE());

This PAGESIZE() should be len?

Thanks,
Kazu

> +       FREEBUF(same_buf);
>          goto out;
>      }
> -   size = flags & (ZRAM_FLAG_SHIFT -1);
> +
> +   size = flags & ((1 << ZRAM_LOCK_VALUE) - 1);
>      if (size == 0) {
>          len = 0;
>          goto out;
> --
> 2.39.0
> 
> Thanks.
> --
> Crash-utility mailing list
> Crash-utility@redhat.com
> https://listman.redhat.com/mailman/listinfo/crash-utility
> Contribution Guidelines: https://github.com/crash-utility/crash/wiki
> 
> 
> ________________________________
> 发件人: HAGIO KAZUHITO(萩尾 一仁) <k-hagio...@nec.com>
> 发送时间: 2023年10月12日 16:17:43
> 收件人: 陈冠有; crash-utility@redhat.com
> 抄送: liji...@redhat.com
> 主题: Re: 答复: [External Mail]Re: [PATCH v4] Fix: move huge compressed obj from 
> page to zspage
> 
> [外部邮件] 此邮件来源于小米公司外部,请谨慎处理。若对邮件安全性存疑,请将邮件转发给mi...@xiaomi.com进行反馈
> 
> On 2023/10/09 15:09, 陈冠有 wrote:
>> Hi Kazu
>>
> 
> Thank you for the information.
> 
> I'm reviewing this, but could you please resend a patch as an attached
> plain text file?  Your email cannot be applied with "git am" due to
> base64 encoding and broken indents.
> 
>>
>> a41ec880aa7b ("zsmalloc: move huge compressed obj from page to zspage")
>>
>> zspage6 meam linux 6 and later, because I don't have a better way at the 
>> moment.
> 
> ok, the commit a41ec880aa7b exists since Linux 5.17, so "zspage_5_17"
> would be better.
> 
> Thanks,
> Kazu
> 
>>
>>
>> ffedd09fa9b06 ("zsmalloc: Stop using slab fields in struct page")
>>
>> using page->index to store 'page' (page->index and page->freelist are at the 
>> same offset in struct page).
>>
>>
>> f635725c3905e ("zram: do not waste zram_table_entry flags bits")
>>
>> -#define ZRAM_FLAG_SHIFT 24
>> +#define ZRAM_FLAG_SHIFT (PAGE_SHIFT + 1)
>>
>>
>> enum zram_pageflags {
>>       /* zram slot is locked */
>>       ZRAM_LOCK = ZRAM_FLAG_SHIFT,
>>       ZRAM_SAME,  /* Page consists the same element */
>>       ZRAM_WB,    /* page is stored on backing_device */
>>       ZRAM_UNDER_WB,  /* page is under writeback */
>>       ZRAM_HUGE,  /* Incompressible page */
>>       ZRAM_IDLE,  /* not accessed page since last idle marking */
>>       ZRAM_INCOMPRESSIBLE, /* none of the algorithms could compress it */
>>
>>       ZRAM_COMP_PRIORITY_BIT1, /* First bit of comp priority index */
>>       ZRAM_COMP_PRIORITY_BIT2, /* Second bit of comp priority index */
>>
>>       __NR_ZRAM_PAGEFLAGS,
>> };
>>
>> Thanks
>>
>>
>> ________________________________
>> 发件人: HAGIO KAZUHITO(萩尾 一仁) <k-hagio...@nec.com>
>> 发送时间: 2023年10月4日 9:33:57
>> 收件人: 陈冠有; crash-utility@redhat.com
>> 抄送: liji...@redhat.com
>> 主题: [External Mail]Re: [PATCH v4] Fix: move huge compressed obj from page to 
>> zspage
>>
>> [外部邮件] 此邮件来源于小米公司外部,请谨慎处理。若对邮件安全性存疑,请将邮件转发给mi...@xiaomi.com进行反馈
>>
>> On 2023/09/20 12:28, 陈冠有 wrote:
>>> when zspage define 'huge', crash-utility zram decompress fail.
>>> we need to be compatible with the previous kernel,
>>> so we can't define 'huge' directly in zspage.
>>
>> Thank you for the patch, is this v4 patch the latest one?
>>
>>>
>>> Before:
>>> crash> mod -s zram zram.ko
>>>         MODULE       NAME                                          BASE     
>>>       SIZE  OBJECT FILE
>>> ffffffde224db800  zram                                    ffffffde224d2000  
>>>   57344  zram.ko
>>> crash> mod -s zsmalloc zsmalloc.ko
>>>         MODULE       NAME                                          BASE     
>>>       SIZE  OBJECT FILE
>>> ffffffde224c5180  zsmalloc                                ffffffde224bf000  
>>>   40960  zsmalloc.ko
>>> crash> rd 0x13d89fb0
>>> rd: zspage magic incorrect: b0
>>>
>>> After:
>>> crash> rd 0x13d89fb0
>>>            13d89fb0:  c2b54f7170883b20                     ;.pqO..
>>>
>>> Link: https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org
>>
>> Please use the commit information if it's already in the kernel.
>> a41ec880aa7b ("zsmalloc: move huge compressed obj from page to zspage")
>>
>>>
>>> Signed-off-by: chenguanyou <chenguan...@xiaomi.com>
>>> ---
>>>     defs.h     | 13 +++++++++++
>>>     diskdump.c | 67 ++++++++++++++++++++++++++++++++++++++++++++----------
>>>     2 files changed, 68 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/defs.h b/defs.h
>>> index 96a7a2a..0af69cc 100644
>>> --- a/defs.h
>>> +++ b/defs.h
>>> @@ -2225,6 +2225,7 @@ struct offset_table {                    /* stash of 
>>> commonly-used offsets */
>>>        long module_memory_base;
>>>        long module_memory_size;
>>>        long irq_data_irq;
>>> +   long zspage_huge;
>>>     };
>>>
>>>     struct size_table {         /* stash of commonly-used sizes */
>>> @@ -7221,6 +7222,18 @@ struct zspage {
>>>         unsigned int freeobj;
>>>     };
>>>
>>> +struct zspage6 {
>>
>> Why is this name "zspage6"?
>>
>>> +    struct {
>>> +        unsigned int huge : 1;
>>> +        unsigned int fullness : 2;
>>> +        unsigned int class : 9;
>>> +        unsigned int isolated : 3;
>>> +        unsigned int magic : 8;
>>> +    };
>>> +    unsigned int inuse;
>>> +    unsigned int freeobj;
>>> +};
>>> +
>>>     /*
>>>      * makedumpfile.c
>>>      */
>>> diff --git a/diskdump.c b/diskdump.c
>>> index 2c284ff..02aaf1b 100644
>>> --- a/diskdump.c
>>> +++ b/diskdump.c
>>> @@ -2754,6 +2754,9 @@ zram_init(void)
>>>        if (INVALID_MEMBER(zram_table_flag))
>>>            MEMBER_OFFSET_INIT(zram_table_flag, "zram_table_entry", "value");
>>>        STRUCT_SIZE_INIT(zram_table_entry, "zram_table_entry");
>>> +    MEMBER_OFFSET_INIT(zspoll_size_class, "zs_pool", "size_class");
>>> +    MEMBER_OFFSET_INIT(size_class_size, "size_class", "size");
>>> +    MEMBER_OFFSET_INIT(zspage_huge, "zspage", "huge");
>>>     }
>>>
>>>     static unsigned char *
>>> @@ -2761,9 +2764,11 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>     {
>>>        ulong obj, off, class, page, zspage;
>>>        struct zspage zspage_s;
>>> +   struct zspage6 zspage6_s;
>>>        physaddr_t paddr;
>>>        unsigned int obj_idx, class_idx, size;
>>>        ulong pages[2], sizes[2];
>>> +   ulong zs_magic;
>>>
>>>        readmem(handle, KVADDR, &obj, sizeof(void *), "zram entry", 
>>> FAULT_ON_ERROR);
>>>        obj >>= OBJ_TAG_BITS;
>>> @@ -2772,11 +2777,19 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>
>>>        readmem(page + OFFSET(page_private), KVADDR, &zspage,
>>>                sizeof(void *), "page_private", FAULT_ON_ERROR);
>>> -   readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
>>> FAULT_ON_ERROR);
>>>
>>> -   class_idx = zspage_s.class;
>>> -   if (zspage_s.magic != ZSPAGE_MAGIC)
>>> -       error(FATAL, "zspage magic incorrect: %x\n", zspage_s.magic);
>>> +   if (VALID_MEMBER(zspage_huge)) {
>>> +       readmem(zspage, KVADDR, &zspage6_s, sizeof(struct zspage6), 
>>> "zspage6", FAULT_ON_ERROR);
>>> +       class_idx = zspage6_s.class;
>>> +       zs_magic = zspage6_s.magic;
>>> +   } else {
>>> +       readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
>>> FAULT_ON_ERROR);
>>> +       class_idx = zspage_s.class;
>>> +       zs_magic = zspage_s.magic;
>>> +   }
>>> +
>>> +   if (zs_magic != ZSPAGE_MAGIC)
>>> +       error(FATAL, "zspage magic incorrect: %x\n", zs_magic);
>>>
>>>        class = pool + OFFSET(zspoll_size_class);
>>>        class += (class_idx * sizeof(void *));
>>> @@ -2794,8 +2807,13 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>        }
>>>
>>>        pages[0] = page;
>>> -   readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
>>> -           sizeof(void *), "page_freelist", FAULT_ON_ERROR);
>>> +   if (VALID_MEMBER(page_freelist)) {
>>> +       readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
>>> +               sizeof(void *), "page_freelist", FAULT_ON_ERROR);
>>> +   } else {
>>> +       readmem(page + OFFSET(page_index), KVADDR, &pages[1],
>>> +               sizeof(void *), "page_index", FAULT_ON_ERROR);
>>> +   }
>>
>> What is the kernel commit related to this hunk?
>>
>>>        sizes[0] = PAGESIZE() - off;
>>>        sizes[1] = size - sizes[0];
>>>        if (!is_page_ptr(pages[0], &paddr)) {
>>> @@ -2812,9 +2830,15 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>        readmem(paddr, PHYSADDR, zram_buf + sizes[0], sizes[1], "zram 
>>> buffer[1]", FAULT_ON_ERROR);
>>>
>>>     out:
>>> -   readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
>>> FAULT_ON_ERROR);
>>> -   if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
>>> -       return (zram_buf + ZS_HANDLE_SIZE);
>>> +   if (!VALID_MEMBER(zspage_huge)) {
>>> +       readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
>>> FAULT_ON_ERROR);
>>> +       if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
>>> +           return (zram_buf + ZS_HANDLE_SIZE);
>>> +       }
>>> +   } else {
>>> +       if (!zspage6_s.huge) {
>>> +           return (zram_buf + ZS_HANDLE_SIZE);
>>> +       }
>>>        }
>>>
>>>        return zram_buf;
>>> @@ -2929,6 +2953,11 @@ try_zram_decompress(ulonglong pte_val, unsigned char 
>>> *buf, ulong len, ulonglong
>>>        unsigned char *outbuf = NULL;
>>>        ulong zram, zram_table_entry, sector, index, entry, flags, size,
>>>            outsize, off;
>>> +   unsigned long *same_buf = NULL;
>>> +   bool is_same = false;
>>> +   ulong ZRAM_SAME_PAGEFLAG;
>>> +   ulong ZRAM_WB_PAGEFLAG;
>>> +   long ZRAM_LOCK_VALUE = 24;
>>>
>>>        if (INVALID_MEMBER(zram_compressor)) {
>>>            zram_init();
>>> @@ -2992,11 +3021,25 @@ try_zram_decompress(ulonglong pte_val, unsigned 
>>> char *buf, ulong len, ulonglong
>>>            sizeof(void *), "entry of table", FAULT_ON_ERROR);
>>>        readmem(zram_table_entry + OFFSET(zram_table_flag), KVADDR, &flags,
>>>            sizeof(void *), "zram_table_flag", FAULT_ON_ERROR);
>>> -   if (!entry || (flags & ZRAM_FLAG_SAME_BIT)) {
>>> -       memset(buf, entry, len);
>>> +
>>> +   if (!enumerator_value("ZRAM_LOCK", &ZRAM_LOCK_VALUE)
>>> +           && THIS_KERNEL_VERSION >= LINUX(6,1,0))
>>> +       ZRAM_LOCK_VALUE = PAGESHIFT() + 1;
>>> +
>>> +   ZRAM_SAME_PAGEFLAG = ZRAM_LOCK_VALUE + 1;
>>> +   ZRAM_WB_PAGEFLAG = ZRAM_LOCK_VALUE + 2;
>>> +
>>> +   if (!entry || flags & (1 << ZRAM_SAME_PAGEFLAG)) {
>>> +       same_buf = (unsigned long *)GETBUF(PAGESIZE());
>>> +       for (int count = 0; count < PAGESIZE() / sizeof(unsigned long); 
>>> count++) {
>>> +           same_buf[count] = entry;
>>> +       }
>>> +       memcpy(buf, same_buf + off, PAGESIZE());
>>> +       FREEBUF(same_buf);
>>
>> What is the kernel commit related to this hunk?
>>
>> And I could not apply this, could you resend it as a plain text email or
>> an attached plain text file?
>>
>> Thanks,
>> Kazu
>>
>>>            goto out;
>>>        }
>>> -   size = flags & (ZRAM_FLAG_SHIFT -1);
>>> +
>>> +   size = flags & ((1 << ZRAM_LOCK_VALUE) - 1);
>>>        if (size == 0) {
>>>            len = 0;
>>>            goto out;
>>> --
>>> 2.39.0
>>>
>>>
>>> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
>>>  This e-mail and its attachments contain confidential information from 
>>> XIAOMI, which is intended only for the person or entity whose address is 
>>> listed above. Any use of the information contained herein in any way 
>>> (including, but not limited to, total or partial disclosure, reproduction, 
>>> or dissemination) by persons other than the intended recipient(s) is 
>>> prohibited. If you receive this e-mail in error, please notify the sender 
>>> by phone or email immediately and delete it!******/#
>> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
>>  This e-mail and its attachments contain confidential information from 
>> XIAOMI, which is intended only for the person or entity whose address is 
>> listed above. Any use of the information contained herein in any way 
>> (including, but not limited to, total or partial disclosure, reproduction, 
>> or dissemination) by persons other than the intended recipient(s) is 
>> prohibited. If you receive this e-mail in error, please notify the sender by 
>> phone or email immediately and delete it!******/#
>>
>>
>> Hi Kazu
>>
>>
>> a41ec880aa7b ("zsmalloc: move huge compressed obj from page to zspage")
>>
>> zspage6 meam linux 6 and later, because I don't have a better way at the
>> moment.
>>
>>
>> ffedd09fa9b06 ("zsmalloc: Stop using slab fields in struct page")
>>
>> using page->index to store 'page' (page->index and page->freelist are at
>> the same offset in struct page).
>>
>>
>> f635725c3905e ("zram: do not waste zram_table_entry flags bits")
>>
>> -#define ZRAM_FLAG_SHIFT 24
>> +#define ZRAM_FLAG_SHIFT (PAGE_SHIFT + 1)
>>
>> enum zram_pageflags {
>>       /* zram slot is locked */
>>       ZRAM_LOCK = ZRAM_FLAG_SHIFT,
>>       ZRAM_SAME,  /* Page consists the same element */
>>       ZRAM_WB,    /* page is stored on backing_device */
>>       ZRAM_UNDER_WB,  /* page is under writeback */
>>       ZRAM_HUGE,  /* Incompressible page */
>>       ZRAM_IDLE,  /* not accessed page since last idle marking */
>>       ZRAM_INCOMPRESSIBLE, /* none of the algorithms could compress it */
>>
>>       ZRAM_COMP_PRIORITY_BIT1, /* First bit of comp priority index */
>>       ZRAM_COMP_PRIORITY_BIT2, /* Second bit of comp priority index */
>>
>>       __NR_ZRAM_PAGEFLAGS,
>> };
>>
>> Thanks
>>
>> ------------------------------------------------------------------------
>> *发件人:* HAGIO KAZUHITO(萩尾 一仁) <k-hagio...@nec.com>
>> *发送时间:* 2023年10月4日 9:33:57
>> *收件人:* 陈冠有; crash-utility@redhat.com
>> *抄送:* liji...@redhat.com
>> *主题:* [External Mail]Re: [PATCH v4] Fix: move huge compressed obj from
>> page to zspage
>> [外部邮件] 此邮件来源于小米公司外部,请谨慎处理。若对邮件安全性存疑,请
>> 将邮件转发给mi...@xiaomi.com进行反馈
>>
>> On 2023/09/20 12:28, 陈冠有 wrote:
>>> when zspage define 'huge', crash-utility zram decompress fail.
>>> we need to be compatible with the previous kernel,
>>> so we can't define 'huge' directly in zspage.
>>
>> Thank you for the patch, is this v4 patch the latest one?
>>
>>>
>>> Before:
>>> crash> mod -s zram zram.ko
>>>        MODULE       NAME                                          BASE      
>>>      SIZE  OBJECT FILE
>>> ffffffde224db800  zram                                    ffffffde224d2000  
>>>   57344  zram.ko
>>> crash> mod -s zsmalloc zsmalloc.ko
>>>        MODULE       NAME                                          BASE      
>>>      SIZE  OBJECT FILE
>>> ffffffde224c5180  zsmalloc                                ffffffde224bf000  
>>>   40960  zsmalloc.ko
>>> crash> rd 0x13d89fb0
>>> rd: zspage magic incorrect: b0
>>>
>>> After:
>>> crash> rd 0x13d89fb0
>>>           13d89fb0:  c2b54f7170883b20                     ;.pqO..
>>>
>>> Link: https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org
>> <https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org>
>>
>> Please use the commit information if it's already in the kernel.
>> a41ec880aa7b ("zsmalloc: move huge compressed obj from page to zspage")
>>
>>>
>>> Signed-off-by: chenguanyou <chenguan...@xiaomi.com>
>>> ---
>>>    defs.h     | 13 +++++++++++
>>>    diskdump.c | 67 ++++++++++++++++++++++++++++++++++++++++++++----------
>>>    2 files changed, 68 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/defs.h b/defs.h
>>> index 96a7a2a..0af69cc 100644
>>> --- a/defs.h
>>> +++ b/defs.h
>>> @@ -2225,6 +2225,7 @@ struct offset_table {                    /* stash of 
>>> commonly-used offsets */
>>>       long module_memory_base;
>>>       long module_memory_size;
>>>       long irq_data_irq;
>>> +   long zspage_huge;
>>>    };
>>>
>>>    struct size_table {         /* stash of commonly-used sizes */
>>> @@ -7221,6 +7222,18 @@ struct zspage {
>>>        unsigned int freeobj;
>>>    };
>>>
>>> +struct zspage6 {
>>
>> Why is this name "zspage6"?
>>
>>> +    struct {
>>> +        unsigned int huge : 1;
>>> +        unsigned int fullness : 2;
>>> +        unsigned int class : 9;
>>> +        unsigned int isolated : 3;
>>> +        unsigned int magic : 8;
>>> +    };
>>> +    unsigned int inuse;
>>> +    unsigned int freeobj;
>>> +};
>>> +
>>>    /*
>>>     * makedumpfile.c
>>>     */
>>> diff --git a/diskdump.c b/diskdump.c
>>> index 2c284ff..02aaf1b 100644
>>> --- a/diskdump.c
>>> +++ b/diskdump.c
>>> @@ -2754,6 +2754,9 @@ zram_init(void)
>>>       if (INVALID_MEMBER(zram_table_flag))
>>>           MEMBER_OFFSET_INIT(zram_table_flag, "zram_table_entry", "value");
>>>       STRUCT_SIZE_INIT(zram_table_entry, "zram_table_entry");
>>> +    MEMBER_OFFSET_INIT(zspoll_size_class, "zs_pool", "size_class");
>>> +    MEMBER_OFFSET_INIT(size_class_size, "size_class", "size");
>>> +    MEMBER_OFFSET_INIT(zspage_huge, "zspage", "huge");
>>>    }
>>>
>>>    static unsigned char *
>>> @@ -2761,9 +2764,11 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>    {
>>>       ulong obj, off, class, page, zspage;
>>>       struct zspage zspage_s;
>>> +   struct zspage6 zspage6_s;
>>>       physaddr_t paddr;
>>>       unsigned int obj_idx, class_idx, size;
>>>       ulong pages[2], sizes[2];
>>> +   ulong zs_magic;
>>>
>>>       readmem(handle, KVADDR, &obj, sizeof(void *), "zram entry", 
>>> FAULT_ON_ERROR);
>>>       obj >>= OBJ_TAG_BITS;
>>> @@ -2772,11 +2777,19 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>
>>>       readmem(page + OFFSET(page_private), KVADDR, &zspage,
>>>               sizeof(void *), "page_private", FAULT_ON_ERROR);
>>> -   readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
>>> FAULT_ON_ERROR);
>>>
>>> -   class_idx = zspage_s.class;
>>> -   if (zspage_s.magic != ZSPAGE_MAGIC)
>>> -       error(FATAL, "zspage magic incorrect: %x\n", zspage_s.magic);
>>> +   if (VALID_MEMBER(zspage_huge)) {
>>> +       readmem(zspage, KVADDR, &zspage6_s, sizeof(struct zspage6), 
>>> "zspage6", FAULT_ON_ERROR);
>>> +       class_idx = zspage6_s.class;
>>> +       zs_magic = zspage6_s.magic;
>>> +   } else {
>>> +       readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
>>> FAULT_ON_ERROR);
>>> +       class_idx = zspage_s.class;
>>> +       zs_magic = zspage_s.magic;
>>> +   }
>>> +
>>> +   if (zs_magic != ZSPAGE_MAGIC)
>>> +       error(FATAL, "zspage magic incorrect: %x\n", zs_magic);
>>>
>>>       class = pool + OFFSET(zspoll_size_class);
>>>       class += (class_idx * sizeof(void *));
>>> @@ -2794,8 +2807,13 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>       }
>>>
>>>       pages[0] = page;
>>> -   readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
>>> -           sizeof(void *), "page_freelist", FAULT_ON_ERROR);
>>> +   if (VALID_MEMBER(page_freelist)) {
>>> +       readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
>>> +               sizeof(void *), "page_freelist", FAULT_ON_ERROR);
>>> +   } else {
>>> +       readmem(page + OFFSET(page_index), KVADDR, &pages[1],
>>> +               sizeof(void *), "page_index", FAULT_ON_ERROR);
>>> +   }
>>
>> What is the kernel commit related to this hunk?
>>
>>>       sizes[0] = PAGESIZE() - off;
>>>       sizes[1] = size - sizes[0];
>>>       if (!is_page_ptr(pages[0], &paddr)) {
>>> @@ -2812,9 +2830,15 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>       readmem(paddr, PHYSADDR, zram_buf + sizes[0], sizes[1], "zram 
>>> buffer[1]", FAULT_ON_ERROR);
>>>
>>>    out:
>>> -   readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
>>> FAULT_ON_ERROR);
>>> -   if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
>>> -       return (zram_buf + ZS_HANDLE_SIZE);
>>> +   if (!VALID_MEMBER(zspage_huge)) {
>>> +       readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
>>> FAULT_ON_ERROR);
>>> +       if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
>>> +           return (zram_buf + ZS_HANDLE_SIZE);
>>> +       }
>>> +   } else {
>>> +       if (!zspage6_s.huge) {
>>> +           return (zram_buf + ZS_HANDLE_SIZE);
>>> +       }
>>>       }
>>>
>>>       return zram_buf;
>>> @@ -2929,6 +2953,11 @@ try_zram_decompress(ulonglong pte_val, unsigned char 
>>> *buf, ulong len, ulonglong
>>>       unsigned char *outbuf = NULL;
>>>       ulong zram, zram_table_entry, sector, index, entry, flags, size,
>>>           outsize, off;
>>> +   unsigned long *same_buf = NULL;
>>> +   bool is_same = false;
>>> +   ulong ZRAM_SAME_PAGEFLAG;
>>> +   ulong ZRAM_WB_PAGEFLAG;
>>> +   long ZRAM_LOCK_VALUE = 24;
>>>
>>>       if (INVALID_MEMBER(zram_compressor)) {
>>>           zram_init();
>>> @@ -2992,11 +3021,25 @@ try_zram_decompress(ulonglong pte_val, unsigned 
>>> char *buf, ulong len, ulonglong
>>>           sizeof(void *), "entry of table", FAULT_ON_ERROR);
>>>       readmem(zram_table_entry + OFFSET(zram_table_flag), KVADDR, &flags,
>>>           sizeof(void *), "zram_table_flag", FAULT_ON_ERROR);
>>> -   if (!entry || (flags & ZRAM_FLAG_SAME_BIT)) {
>>> -       memset(buf, entry, len);
>>> +
>>> +   if (!enumerator_value("ZRAM_LOCK", &ZRAM_LOCK_VALUE)
>>> +           && THIS_KERNEL_VERSION >= LINUX(6,1,0))
>>> +       ZRAM_LOCK_VALUE = PAGESHIFT() + 1;
>>> +
>>> +   ZRAM_SAME_PAGEFLAG = ZRAM_LOCK_VALUE + 1;
>>> +   ZRAM_WB_PAGEFLAG = ZRAM_LOCK_VALUE + 2;
>>> +
>>> +   if (!entry || flags & (1 << ZRAM_SAME_PAGEFLAG)) {
>>> +       same_buf = (unsigned long *)GETBUF(PAGESIZE());
>>> +       for (int count = 0; count < PAGESIZE() / sizeof(unsigned long); 
>>> count++) {
>>> +           same_buf[count] = entry;
>>> +       }
>>> +       memcpy(buf, same_buf + off, PAGESIZE());
>>> +       FREEBUF(same_buf);
>>
>> What is the kernel commit related to this hunk?
>>
>> And I could not apply this, could you resend it as a plain text email or
>> an attached plain text file?
>>
>> Thanks,
>> Kazu
>>
>>>           goto out;
>>>       }
>>> -   size = flags & (ZRAM_FLAG_SHIFT -1);
>>> +
>>> +   size = flags & ((1 << ZRAM_LOCK_VALUE) - 1);
>>>       if (size == 0) {
>>>           len = 0;
>>>           goto out;
>>> --
>>> 2.39.0
>>>
>>>
>>> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
>>>  This e-mail and its attachments contain confidential information from 
>>> XIAOMI, which is intended only for the person or entity whose  address is 
>>> listed above. Any use of the information contained herein
>> in any way (including, but not limited to, total or partial disclosure,
>> reproduction, or dissemination) by persons other than the intended
>> recipient(s) is prohibited. If you receive this e-mail in error, please
>> notify the sender by phone or email immediately and delete it!******/#
>> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出
>> 的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄
>> 露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件
>> 通知发件人并删除本邮件! This e-mail and its attachments contain
>> confidential information from XIAOMI, which is intended only for the
>> person or entity whose address is listed above. Any use of the
>> information contained herein in any way (including, but not limited to,
>> total or partial disclosure, reproduction, or dissemination) by persons
>> other than the intended recipient(s) is prohibited. If you receive this
>> e-mail in error, please notify the sender by phone or email immediately
>> and delete it!******/#
> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
>  This e-mail and its attachments contain confidential information from 
> XIAOMI, which is intended only for the person or entity whose address is 
> listed above. Any use of the information contained herein in any way 
> (including, but not limited to, total or partial disclosure, reproduction, or 
> dissemination) by persons other than the intended recipient(s) is prohibited. 
> If you receive this e-mail in error, please notify the sender by phone or 
> email immediately and delete it!******/#
> 
> 
> Subject: [PATCH] Fix: "rd" command to read zram buf on Linux 5.17 and later
> 
> 
> Kernel commit a41ec880aa7b ("zsmalloc: move huge compressed obj from 
> page to zspage"),
> which is contained in Linux 5.17 and later kernels.
> Kernel commit ffedd09fa9b06 ("zsmalloc: Stop using slab fields in struct 
> page")
> Kernel commit f635725c3905e ("zram: do not waste zram_table_entry flags 
> bits"),
> which is contained in Linux 6.1 and later kernels.
> 
> Before:
> crash> mod -s zram zram.ko
>       MODULE       NAME                                          BASE    
>         SIZE  OBJECT FILE
> ffffffde224db800  zram                                    
> ffffffde224d2000    57344  zram.ko
> crash> mod -s zsmalloc zsmalloc.ko
>       MODULE       NAME                                          BASE    
>         SIZE  OBJECT FILE
> ffffffde224c5180  zsmalloc                                
> ffffffde224bf000    40960  zsmalloc.ko
> crash> rd 0x13d89fb0
> rd: zspage magic incorrect: b0
> 
> After:
> crash> rd 0x13d89fb0
>          13d89fb0:  c2b54f7170883b20                     ;.pqO..
> 
> Link: https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org
> Link: 
> https://lkml.kernel.org/r/20220912152744.527438-1-senozhat...@chromium.org
> 
> Signed-off-by: chenguanyou <chenguan...@xiaomi.com>
> ---
>   defs.h     | 13 +++++++++++
>   diskdump.c | 67 ++++++++++++++++++++++++++++++++++++++++++++----------
>   2 files changed, 68 insertions(+), 12 deletions(-)
> 
> diff --git a/defs.h b/defs.h
> index 96a7a2a..95ccbb4 100644
> --- a/defs.h
> +++ b/defs.h
> @@ -2225,6 +2225,7 @@ struct offset_table {                    /* stash 
> of commonly-used offsets */
>      long module_memory_base;
>      long module_memory_size;
>      long irq_data_irq;
> +   long zspage_huge;
>   };
> 
>   struct size_table {         /* stash of commonly-used sizes */
> @@ -7221,6 +7222,18 @@ struct zspage {
>       unsigned int freeobj;
>   };
> 
> +struct zspage_5_17 {
> +    struct {
> +        unsigned int huge : 1;
> +        unsigned int fullness : 2;
> +        unsigned int class : 9;
> +        unsigned int isolated : 3;
> +        unsigned int magic : 8;
> +    };
> +    unsigned int inuse;
> +    unsigned int freeobj;
> +};
> +
>   /*
>    * makedumpfile.c
>    */
> diff --git a/diskdump.c b/diskdump.c
> index 2c284ff..625b3a0 100644
> --- a/diskdump.c
> +++ b/diskdump.c
> @@ -2754,6 +2754,9 @@ zram_init(void)
>      if (INVALID_MEMBER(zram_table_flag))
>          MEMBER_OFFSET_INIT(zram_table_flag, "zram_table_entry", "value");
>      STRUCT_SIZE_INIT(zram_table_entry, "zram_table_entry");
> +   MEMBER_OFFSET_INIT(zspoll_size_class, "zs_pool", "size_class");
> +   MEMBER_OFFSET_INIT(size_class_size, "size_class", "size");
> +   MEMBER_OFFSET_INIT(zspage_huge, "zspage", "huge");
>   }
> 
>   static unsigned char *
> @@ -2761,9 +2764,11 @@ zram_object_addr(ulong pool, ulong handle, 
> unsigned char *zram_buf)
>   {
>      ulong obj, off, class, page, zspage;
>      struct zspage zspage_s;
> +   struct zspage_5_17 zspage_5_17_s;
>      physaddr_t paddr;
>      unsigned int obj_idx, class_idx, size;
>      ulong pages[2], sizes[2];
> +   ulong zs_magic;
> 
>      readmem(handle, KVADDR, &obj, sizeof(void *), "zram entry", 
> FAULT_ON_ERROR);
>      obj >>= OBJ_TAG_BITS;
> @@ -2772,11 +2777,19 @@ zram_object_addr(ulong pool, ulong handle, 
> unsigned char *zram_buf)
> 
>      readmem(page + OFFSET(page_private), KVADDR, &zspage,
>              sizeof(void *), "page_private", FAULT_ON_ERROR);
> -   readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
> FAULT_ON_ERROR);
> 
> -   class_idx = zspage_s.class;
> -   if (zspage_s.magic != ZSPAGE_MAGIC)
> -       error(FATAL, "zspage magic incorrect: %x\n", zspage_s.magic);
> +   if (VALID_MEMBER(zspage_huge)) {
> +       readmem(zspage, KVADDR, &zspage_5_17_s, sizeof(struct 
> zspage_5_17), "zspage_5_17", FAULT_ON_ERROR);
> +       class_idx = zspage_5_17_s.class;
> +       zs_magic = zspage_5_17_s.magic;
> +   } else {
> +       readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), 
> "zspage", FAULT_ON_ERROR);
> +       class_idx = zspage_s.class;
> +       zs_magic = zspage_s.magic;
> +   }
> +
> +   if (zs_magic != ZSPAGE_MAGIC)
> +       error(FATAL, "zspage magic incorrect: %x\n", zs_magic);
> 
>      class = pool + OFFSET(zspoll_size_class);
>      class += (class_idx * sizeof(void *));
> @@ -2794,8 +2807,13 @@ zram_object_addr(ulong pool, ulong handle, 
> unsigned char *zram_buf)
>      }
> 
>      pages[0] = page;
> -   readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
> -           sizeof(void *), "page_freelist", FAULT_ON_ERROR);
> +   if (VALID_MEMBER(page_freelist)) {
> +       readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
> +               sizeof(void *), "page_freelist", FAULT_ON_ERROR);
> +   } else {
> +       readmem(page + OFFSET(page_index), KVADDR, &pages[1],
> +               sizeof(void *), "page_index", FAULT_ON_ERROR);
> +   }
>      sizes[0] = PAGESIZE() - off;
>      sizes[1] = size - sizes[0];
>      if (!is_page_ptr(pages[0], &paddr)) {
> @@ -2812,9 +2830,15 @@ zram_object_addr(ulong pool, ulong handle, 
> unsigned char *zram_buf)
>      readmem(paddr, PHYSADDR, zram_buf + sizes[0], sizes[1], "zram 
> buffer[1]", FAULT_ON_ERROR);
> 
>   out:
> -   readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
> FAULT_ON_ERROR);
> -   if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
> -       return (zram_buf + ZS_HANDLE_SIZE);
> +   if (!VALID_MEMBER(zspage_huge)) {
> +       readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
> FAULT_ON_ERROR);
> +       if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
> +           return (zram_buf + ZS_HANDLE_SIZE);
> +       }
> +   } else {
> +       if (!zspage_5_17_s.huge) {
> +           return (zram_buf + ZS_HANDLE_SIZE);
> +       }
>      }
> 
>      return zram_buf;
> @@ -2929,6 +2953,11 @@ try_zram_decompress(ulonglong pte_val, unsigned 
> char *buf, ulong len, ulonglong
>      unsigned char *outbuf = NULL;
>      ulong zram, zram_table_entry, sector, index, entry, flags, size,
>          outsize, off;
> +   unsigned long *same_buf = NULL;
> +   bool is_same = false;
> +   ulong ZRAM_SAME_PAGEFLAG;
> +   ulong ZRAM_WB_PAGEFLAG;
> +   long ZRAM_LOCK_VALUE = 24;
> 
>      if (INVALID_MEMBER(zram_compressor)) {
>          zram_init();
> @@ -2992,11 +3021,25 @@ try_zram_decompress(ulonglong pte_val, unsigned 
> char *buf, ulong len, ulonglong
>          sizeof(void *), "entry of table", FAULT_ON_ERROR);
>      readmem(zram_table_entry + OFFSET(zram_table_flag), KVADDR, &flags,
>          sizeof(void *), "zram_table_flag", FAULT_ON_ERROR);
> -   if (!entry || (flags & ZRAM_FLAG_SAME_BIT)) {
> -       memset(buf, entry, len);
> +
> +   if (!enumerator_value("ZRAM_LOCK", &ZRAM_LOCK_VALUE)
> +           && THIS_KERNEL_VERSION >= LINUX(6,1,0))
> +       ZRAM_LOCK_VALUE = PAGESHIFT() + 1;
> +
> +   ZRAM_SAME_PAGEFLAG = ZRAM_LOCK_VALUE + 1;
> +   ZRAM_WB_PAGEFLAG = ZRAM_LOCK_VALUE + 2;
> +
> +   if (!entry || flags & (1 << ZRAM_SAME_PAGEFLAG)) {
> +       same_buf = (unsigned long *)GETBUF(PAGESIZE());
> +       for (int count = 0; count < PAGESIZE() / sizeof(unsigned long); 
> count++) {
> +           same_buf[count] = entry;
> +       }
> +       memcpy(buf, same_buf + off, PAGESIZE());
> +       FREEBUF(same_buf);
>          goto out;
>      }
> -   size = flags & (ZRAM_FLAG_SHIFT -1);
> +
> +   size = flags & ((1 << ZRAM_LOCK_VALUE) - 1);
>      if (size == 0) {
>          len = 0;
>          goto out;
> -- 
> 2.39.0
> 
> Thanks.
> --
> Crash-utility mailing list
> Crash-utility@redhat.com
> https://listman.redhat.com/mailman/listinfo/crash-utility 
> <https://listman.redhat.com/mailman/listinfo/crash-utility>
> Contribution Guidelines: https://github.com/crash-utility/crash/wiki 
> <https://github.com/crash-utility/crash/wiki>
> 
> ------------------------------------------------------------------------
> *发件人:* HAGIO KAZUHITO(萩尾 一仁) <k-hagio...@nec.com>
> *发送时间:* 2023年10月12日 16:17:43
> *收件人:* 陈冠有; crash-utility@redhat.com
> *抄送:* liji...@redhat.com
> *主题:* Re: 答复: [External Mail]Re: [PATCH v4] Fix: move huge 
> compressed obj from page to zspage
> [外部邮件] 此邮件来源于小米公司外部,请谨慎处理。若对邮件安全性存疑,请 
> 将邮件转发给mi...@xiaomi.com进行反馈
> 
> On 2023/10/09 15:09, 陈冠有 wrote:
>> Hi Kazu
>>
> 
> Thank you for the information.
> 
> I'm reviewing this, but could you please resend a patch as an attached
> plain text file?  Your email cannot be applied with "git am" due to
> base64 encoding and broken indents.
> 
>>
>> a41ec880aa7b ("zsmalloc: move huge compressed obj from page to zspage")
>>
>> zspage6 meam linux 6 and later, because I don't have a better way at the 
>> moment.
> 
> ok, the commit a41ec880aa7b exists since Linux 5.17, so "zspage_5_17"
> would be better.
> 
> Thanks,
> Kazu
> 
>>
>>
>> ffedd09fa9b06 ("zsmalloc: Stop using slab fields in struct page")
>>
>> using page->index to store 'page' (page->index and page->freelist are at the 
>> same offset in struct page).
>>
>>
>> f635725c3905e ("zram: do not waste zram_table_entry flags bits")
>>
>> -#define ZRAM_FLAG_SHIFT 24
>> +#define ZRAM_FLAG_SHIFT (PAGE_SHIFT + 1)
>>
>>
>> enum zram_pageflags {
>>      /* zram slot is locked */
>>      ZRAM_LOCK = ZRAM_FLAG_SHIFT,
>>      ZRAM_SAME,  /* Page consists the same element */
>>      ZRAM_WB,    /* page is stored on backing_device */
>>      ZRAM_UNDER_WB,  /* page is under writeback */
>>      ZRAM_HUGE,  /* Incompressible page */
>>      ZRAM_IDLE,  /* not accessed page since last idle marking */
>>      ZRAM_INCOMPRESSIBLE, /* none of the algorithms could compress it */
>>
>>      ZRAM_COMP_PRIORITY_BIT1, /* First bit of comp priority index */
>>      ZRAM_COMP_PRIORITY_BIT2, /* Second bit of comp priority index */
>>
>>      __NR_ZRAM_PAGEFLAGS,
>> };
>>
>> Thanks
>>
>>
>> ________________________________
>> 发件人: HAGIO KAZUHITO(萩尾 一仁) <k-hagio...@nec.com>
>> 发送时间: 2023年10月4日 9:33:57
>> 收件人: 陈冠有; crash-utility@redhat.com
>> 抄送: liji...@redhat.com
>> 主题: [External Mail]Re: [PATCH v4] Fix: move huge compressed obj from page to 
>> zspage
>>
>> [外部邮件] 此邮件来源于小米公司外部,请谨慎处理。若对邮件安全性存疑,请将邮件转发给mi...@xiaomi.com进行反馈
>>
>> On 2023/09/20 12:28, 陈冠有 wrote:
>>> when zspage define 'huge', crash-utility zram decompress fail.
>>> we need to be compatible with the previous kernel,
>>> so we can't define 'huge' directly in zspage.
>>
>> Thank you for the patch, is this v4 patch the latest one?
>>
>>>
>>> Before:
>>> crash> mod -s zram zram.ko
>>>        MODULE       NAME                                          BASE      
>>>     SIZE  OBJECT FILE
>>> ffffffde224db800  zram                                    ffffffde224d2000  
>>>   57344  zram.ko
>>> crash> mod -s zsmalloc zsmalloc.ko
>>>        MODULE       NAME                                          BASE      
>>>     SIZE  OBJECT FILE
>>> ffffffde224c5180  zsmalloc                                ffffffde224bf000  
>>>   40960  zsmalloc.ko
>>> crash> rd 0x13d89fb0
>>> rd: zspage magic incorrect: b0
>>>
>>> After:
>>> crash> rd 0x13d89fb0
>>>           13d89fb0:  c2b54f7170883b20                     ;.pqO..
>>>
>>> Link: https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org 
> <https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org>
>>
>> Please use the commit information if it's already in the kernel.
>> a41ec880aa7b ("zsmalloc: move huge compressed obj from page to zspage")
>>
>>>
>>> Signed-off-by: chenguanyou <chenguan...@xiaomi.com>
>>> ---
>>>    defs.h     | 13 +++++++++++
>>>    diskdump.c | 67 ++++++++++++++++++++++++++++++++++++++++++++----------
>>>    2 files changed, 68 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/defs.h b/defs.h
>>> index 96a7a2a..0af69cc 100644
>>> --- a/defs.h
>>> +++ b/defs.h
>>> @@ -2225,6 +2225,7 @@ struct offset_table {                    /* stash of 
>>> commonly-used offsets */
>>>       long module_memory_base;
>>>       long module_memory_size;
>>>       long irq_data_irq;
>>> +   long zspage_huge;
>>>    };
>>>
>>>    struct size_table {         /* stash of commonly-used sizes */
>>> @@ -7221,6 +7222,18 @@ struct zspage {
>>>        unsigned int freeobj;
>>>    };
>>>
>>> +struct zspage6 {
>>
>> Why is this name "zspage6"?
>>
>>> +    struct {
>>> +        unsigned int huge : 1;
>>> +        unsigned int fullness : 2;
>>> +        unsigned int class : 9;
>>> +        unsigned int isolated : 3;
>>> +        unsigned int magic : 8;
>>> +    };
>>> +    unsigned int inuse;
>>> +    unsigned int freeobj;
>>> +};
>>> +
>>>    /*
>>>     * makedumpfile.c
>>>     */
>>> diff --git a/diskdump.c b/diskdump.c
>>> index 2c284ff..02aaf1b 100644
>>> --- a/diskdump.c
>>> +++ b/diskdump.c
>>> @@ -2754,6 +2754,9 @@ zram_init(void)
>>>       if (INVALID_MEMBER(zram_table_flag))
>>>           MEMBER_OFFSET_INIT(zram_table_flag, "zram_table_entry", "value");
>>>       STRUCT_SIZE_INIT(zram_table_entry, "zram_table_entry");
>>> +    MEMBER_OFFSET_INIT(zspoll_size_class, "zs_pool", "size_class");
>>> +    MEMBER_OFFSET_INIT(size_class_size, "size_class", "size");
>>> +    MEMBER_OFFSET_INIT(zspage_huge, "zspage", "huge");
>>>    }
>>>
>>>    static unsigned char *
>>> @@ -2761,9 +2764,11 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>    {
>>>       ulong obj, off, class, page, zspage;
>>>       struct zspage zspage_s;
>>> +   struct zspage6 zspage6_s;
>>>       physaddr_t paddr;
>>>       unsigned int obj_idx, class_idx, size;
>>>       ulong pages[2], sizes[2];
>>> +   ulong zs_magic;
>>>
>>>       readmem(handle, KVADDR, &obj, sizeof(void *), "zram entry", 
>>>FAULT_ON_ERROR);
>>>       obj >>= OBJ_TAG_BITS;
>>> @@ -2772,11 +2777,19 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>
>>>       readmem(page + OFFSET(page_private), KVADDR, &zspage,
>>>               sizeof(void *), "page_private", FAULT_ON_ERROR);
>>> -   readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
>>> FAULT_ON_ERROR);
>>>
>>> -   class_idx = zspage_s.class;
>>> -   if (zspage_s.magic != ZSPAGE_MAGIC)
>>> -       error(FATAL, "zspage magic incorrect: %x\n", zspage_s.magic);
>>> +   if (VALID_MEMBER(zspage_huge)) {
>>> +       readmem(zspage, KVADDR, &zspage6_s, sizeof(struct zspage6), 
>>> "zspage6", FAULT_ON_ERROR);
>>> +       class_idx = zspage6_s.class;
>>> +       zs_magic = zspage6_s.magic;
>>> +   } else {
>>> +       readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
>>> FAULT_ON_ERROR);
>>> +       class_idx = zspage_s.class;
>>> +       zs_magic = zspage_s.magic;
>>> +   }
>>> +
>>> +   if (zs_magic != ZSPAGE_MAGIC)
>>> +       error(FATAL, "zspage magic incorrect: %x\n", zs_magic);
>>>
>>>       class = pool + OFFSET(zspoll_size_class);
>>>       class += (class_idx * sizeof(void *));
>>> @@ -2794,8 +2807,13 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>       }
>>>
>>>       pages[0] = page;
>>> -   readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
>>> -           sizeof(void *), "page_freelist", FAULT_ON_ERROR);
>>> +   if (VALID_MEMBER(page_freelist)) {
>>> +       readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
>>> +               sizeof(void *), "page_freelist", FAULT_ON_ERROR);
>>> +   } else {
>>> +       readmem(page + OFFSET(page_index), KVADDR, &pages[1],
>>> +               sizeof(void *), "page_index", FAULT_ON_ERROR);
>>> +   }
>>
>> What is the kernel commit related to this hunk?
>>
>>>       sizes[0] = PAGESIZE() - off;
>>>       sizes[1] = size - sizes[0];
>>>       if (!is_page_ptr(pages[0], &paddr)) {
>>> @@ -2812,9 +2830,15 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>       readmem(paddr, PHYSADDR, zram_buf + sizes[0], sizes[1], "zram 
>>>buffer[1]", FAULT_ON_ERROR);
>>>
>>>    out:
>>> -   readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
>>> FAULT_ON_ERROR);
>>> -   if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
>>> -       return (zram_buf + ZS_HANDLE_SIZE);
>>> +   if (!VALID_MEMBER(zspage_huge)) {
>>> +       readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
>>> FAULT_ON_ERROR);
>>> +       if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
>>> +           return (zram_buf + ZS_HANDLE_SIZE);
>>> +       }
>>> +   } else {
>>> +       if (!zspage6_s.huge) {
>>> +           return (zram_buf + ZS_HANDLE_SIZE);
>>> +       }
>>>       }
>>>
>>>       return zram_buf;
>>> @@ -2929,6 +2953,11 @@ try_zram_decompress(ulonglong pte_val, unsigned char 
>>> *buf, ulong len, ulonglong
>>>       unsigned char *outbuf = NULL;
>>>       ulong zram, zram_table_entry, sector, index, entry, flags, size,
>>>           outsize, off;
>>> +   unsigned long *same_buf = NULL;
>>> +   bool is_same = false;
>>> +   ulong ZRAM_SAME_PAGEFLAG;
>>> +   ulong ZRAM_WB_PAGEFLAG;
>>> +   long ZRAM_LOCK_VALUE = 24;
>>>
>>>       if (INVALID_MEMBER(zram_compressor)) {
>>>           zram_init();
>>> @@ -2992,11 +3021,25 @@ try_zram_decompress(ulonglong pte_val, unsigned 
>>> char *buf, ulong len, ulonglong
>>>           sizeof(void *), "entry of table", FAULT_ON_ERROR);
>>>       readmem(zram_table_entry + OFFSET(zram_table_flag), KVADDR, &flags,
>>>           sizeof(void *), "zram_table_flag", FAULT_ON_ERROR);
>>> -   if (!entry || (flags & ZRAM_FLAG_SAME_BIT)) {
>>> -       memset(buf, entry, len);
>>> +
>>> +   if (!enumerator_value("ZRAM_LOCK", &ZRAM_LOCK_VALUE)
>>> +           && THIS_KERNEL_VERSION >= LINUX(6,1,0))
>>> +       ZRAM_LOCK_VALUE = PAGESHIFT() + 1;
>>> +
>>> +   ZRAM_SAME_PAGEFLAG = ZRAM_LOCK_VALUE + 1;
>>> +   ZRAM_WB_PAGEFLAG = ZRAM_LOCK_VALUE + 2;
>>> +
>>> +   if (!entry || flags & (1 << ZRAM_SAME_PAGEFLAG)) {
>>> +       same_buf = (unsigned long *)GETBUF(PAGESIZE());
>>> +       for (int count = 0; count < PAGESIZE() / sizeof(unsigned long); 
>>> count++) {
>>> +           same_buf[count] = entry;
>>> +       }
>>> +       memcpy(buf, same_buf + off, PAGESIZE());
>>> +       FREEBUF(same_buf);
>>
>> What is the kernel commit related to this hunk?
>>
>> And I could not apply this, could you resend it as a plain text email or
>> an attached plain text file?
>>
>> Thanks,
>> Kazu
>>
>>>           goto out;
>>>       }
>>> -   size = flags & (ZRAM_FLAG_SHIFT -1);
>>> +
>>> +   size = flags & ((1 << ZRAM_LOCK_VALUE) - 1);
>>>       if (size == 0) {
>>>           len = 0;
>>>           goto out;
>>> --
>>> 2.39.0
>>>
>>>
>>> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
>>>  This e-mail and its attachments contain confidential information from 
>>> XIAOMI, which is intended only for the person or entity whose  address is 
>>> listed above. Any use of the information contained herein 
> in any way (including, but not limited to, total or partial disclosure, 
> reproduction, or dissemination) by persons other than the intended 
> recipient(s) is prohibited. If you receive this e-mail in error, please 
> notify the sender by phone or email immediately and delete it!******/#
>> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
>>  This e-mail and its attachments contain confidential information from 
>> XIAOMI, which is intended only for the person or entity whose  address is 
>> listed above. Any use of the information contained herein 
> in any way (including, but not limited to, total or partial disclosure, 
> reproduction, or dissemination) by persons other than the intended 
> recipient(s) is prohibited. If you receive this e-mail in error, please 
> notify the sender by phone or email immediately and delete it!******/#
>>
>>
>> Hi Kazu
>>
>>
>> a41ec880aa7b ("zsmalloc: move huge compressed obj from page to zspage")
>>
>> zspage6 meam linux 6 and later, because I don't have a better way at the
>> moment.
>>
>>
>> ffedd09fa9b06 ("zsmalloc: Stop using slab fields in struct page")
>>
>> using page->index to store 'page' (page->index and page->freelist are at
>> the same offset in struct page).
>>
>>
>> f635725c3905e ("zram: do not waste zram_table_entry flags bits")
>>
>> -#define ZRAM_FLAG_SHIFT 24
>> +#define ZRAM_FLAG_SHIFT (PAGE_SHIFT + 1)
>>
>> enum zram_pageflags {
>>      /* zram slot is locked */
>>      ZRAM_LOCK = ZRAM_FLAG_SHIFT,
>>      ZRAM_SAME,  /* Page consists the same element */
>>      ZRAM_WB,    /* page is stored on backing_device */
>>      ZRAM_UNDER_WB,  /* page is under writeback */
>>      ZRAM_HUGE,  /* Incompressible page */
>>      ZRAM_IDLE,  /* not accessed page since last idle marking */
>>      ZRAM_INCOMPRESSIBLE, /* none of the algorithms could compress it */
>>
>>      ZRAM_COMP_PRIORITY_BIT1, /* First bit of comp priority index */
>>      ZRAM_COMP_PRIORITY_BIT2, /* Second bit of comp priority index */
>>
>>      __NR_ZRAM_PAGEFLAGS,
>> };
>>
>> Thanks
>>
>> ------------------------------------------------------------------------
>> *发件人:* HAGIO KAZUHITO(萩尾 一仁) <k-hagio...@nec.com>
>> *发送时间:* 2023年10月4日 9:33:57
>> *收件人:* 陈冠有; crash-utility@redhat.com
>> *抄送:* liji...@redhat.com
>> *主题:* [External Mail]Re: [PATCH v4] Fix: move huge compressed obj from
>> page to zspage
>> [外部邮件] 此邮件来源于小米公司外部,请谨慎处理。若对邮件安全性存疑,请
>> 将邮件转发给mi...@xiaomi.com进行反馈
>>
>> On 2023/09/20 12:28, 陈冠有 wrote:
>>> when zspage define 'huge', crash-utility zram decompress fail.
>>> we need to be compatible with the previous kernel,
>>> so we can't define 'huge' directly in zspage.
>>
>> Thank you for the patch, is this v4 patch the latest one?
>>
>>>
>>> Before:
>>> crash> mod -s zram zram.ko
>>>       MODULE       NAME                                          BASE       
>>>    SIZE  OBJECT FILE
>>> ffffffde224db800  zram                                    ffffffde224d2000  
>>>   57344  zram.ko
>>> crash> mod -s zsmalloc zsmalloc.ko
>>>       MODULE       NAME                                          BASE       
>>>    SIZE  OBJECT FILE
>>> ffffffde224c5180  zsmalloc                                ffffffde224bf000  
>>>   40960  zsmalloc.ko
>>> crash> rd 0x13d89fb0
>>> rd: zspage magic incorrect: b0
>>>
>>> After:
>>> crash> rd 0x13d89fb0
>>>          13d89fb0:  c2b54f7170883b20                     ;.pqO..
>>>
>>> Link: https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org 
> <https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org>
>> <https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org 
> <https://lkml.kernel.org/r/20211115185909.3949505-6-minc...@kernel.org>>
>>
>> Please use the commit information if it's already in the kernel.
>> a41ec880aa7b ("zsmalloc: move huge compressed obj from page to zspage")
>>
>>>
>>> Signed-off-by: chenguanyou <chenguan...@xiaomi.com>
>>> ---
>>>   defs.h     | 13 +++++++++++
>>>   diskdump.c | 67 ++++++++++++++++++++++++++++++++++++++++++++----------
>>>   2 files changed, 68 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/defs.h b/defs.h
>>> index 96a7a2a..0af69cc 100644
>>> --- a/defs.h
>>> +++ b/defs.h
>>> @@ -2225,6 +2225,7 @@ struct offset_table {                    /* stash of 
>>> commonly-used offsets */
>>>      long module_memory_base;
>>>      long module_memory_size;
>>>      long irq_data_irq;
>>> +   long zspage_huge;
>>>   };
>>>
>>>   struct size_table {         /* stash of commonly-used sizes */
>>> @@ -7221,6 +7222,18 @@ struct zspage {
>>>       unsigned int freeobj;
>>>   };
>>>
>>> +struct zspage6 {
>>
>> Why is this name "zspage6"?
>>
>>> +    struct {
>>> +        unsigned int huge : 1;
>>> +        unsigned int fullness : 2;
>>> +        unsigned int class : 9;
>>> +        unsigned int isolated : 3;
>>> +        unsigned int magic : 8;
>>> +    };
>>> +    unsigned int inuse;
>>> +    unsigned int freeobj;
>>> +};
>>> +
>>>   /*
>>>    * makedumpfile.c
>>>    */
>>> diff --git a/diskdump.c b/diskdump.c
>>> index 2c284ff..02aaf1b 100644
>>> --- a/diskdump.c
>>> +++ b/diskdump.c
>>> @@ -2754,6 +2754,9 @@ zram_init(void)
>>>      if (INVALID_MEMBER(zram_table_flag))
>>>          MEMBER_OFFSET_INIT(zram_table_flag, "zram_table_entry", "value");
>>>      STRUCT_SIZE_INIT(zram_table_entry, "zram_table_entry");
>>> +    MEMBER_OFFSET_INIT(zspoll_size_class, "zs_pool", "size_class");
>>> +    MEMBER_OFFSET_INIT(size_class_size, "size_class", "size");
>>> +    MEMBER_OFFSET_INIT(zspage_huge, "zspage", "huge");
>>>   }
>>>
>>>   static unsigned char *
>>> @@ -2761,9 +2764,11 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>   {
>>>      ulong obj, off, class, page, zspage;
>>>      struct zspage zspage_s;
>>> +   struct zspage6 zspage6_s;
>>>      physaddr_t paddr;
>>>      unsigned int obj_idx, class_idx, size;
>>>      ulong pages[2], sizes[2];
>>> +   ulong zs_magic;
>>>
>>>      readmem(handle, KVADDR, &obj, sizeof(void *), "zram entry", 
>>>FAULT_ON_ERROR);
>>>      obj >>= OBJ_TAG_BITS;
>>> @@ -2772,11 +2777,19 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>
>>>      readmem(page + OFFSET(page_private), KVADDR, &zspage,
>>>              sizeof(void *), "page_private", FAULT_ON_ERROR);
>>> -   readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
>>> FAULT_ON_ERROR);
>>>
>>> -   class_idx = zspage_s.class;
>>> -   if (zspage_s.magic != ZSPAGE_MAGIC)
>>> -       error(FATAL, "zspage magic incorrect: %x\n", zspage_s.magic);
>>> +   if (VALID_MEMBER(zspage_huge)) {
>>> +       readmem(zspage, KVADDR, &zspage6_s, sizeof(struct zspage6), 
>>> "zspage6", FAULT_ON_ERROR);
>>> +       class_idx = zspage6_s.class;
>>> +       zs_magic = zspage6_s.magic;
>>> +   } else {
>>> +       readmem(zspage, KVADDR, &zspage_s, sizeof(struct zspage), "zspage", 
>>> FAULT_ON_ERROR);
>>> +       class_idx = zspage_s.class;
>>> +       zs_magic = zspage_s.magic;
>>> +   }
>>> +
>>> +   if (zs_magic != ZSPAGE_MAGIC)
>>> +       error(FATAL, "zspage magic incorrect: %x\n", zs_magic);
>>>
>>>      class = pool + OFFSET(zspoll_size_class);
>>>      class += (class_idx * sizeof(void *));
>>> @@ -2794,8 +2807,13 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>      }
>>>
>>>      pages[0] = page;
>>> -   readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
>>> -           sizeof(void *), "page_freelist", FAULT_ON_ERROR);
>>> +   if (VALID_MEMBER(page_freelist)) {
>>> +       readmem(page + OFFSET(page_freelist), KVADDR, &pages[1],
>>> +               sizeof(void *), "page_freelist", FAULT_ON_ERROR);
>>> +   } else {
>>> +       readmem(page + OFFSET(page_index), KVADDR, &pages[1],
>>> +               sizeof(void *), "page_index", FAULT_ON_ERROR);
>>> +   }
>>
>> What is the kernel commit related to this hunk?
>>
>>>      sizes[0] = PAGESIZE() - off;
>>>      sizes[1] = size - sizes[0];
>>>      if (!is_page_ptr(pages[0], &paddr)) {
>>> @@ -2812,9 +2830,15 @@ zram_object_addr(ulong pool, ulong handle, unsigned 
>>> char *zram_buf)
>>>      readmem(paddr, PHYSADDR, zram_buf + sizes[0], sizes[1], "zram 
>>>buffer[1]", FAULT_ON_ERROR);
>>>
>>>   out:
>>> -   readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
>>> FAULT_ON_ERROR);
>>> -   if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
>>> -       return (zram_buf + ZS_HANDLE_SIZE);
>>> +   if (!VALID_MEMBER(zspage_huge)) {
>>> +       readmem(page, KVADDR, &obj, sizeof(void *), "page flags", 
>>> FAULT_ON_ERROR);
>>> +       if (!(obj & (1<<10))) { //PG_OwnerPriv1 flag
>>> +           return (zram_buf + ZS_HANDLE_SIZE);
>>> +       }
>>> +   } else {
>>> +       if (!zspage6_s.huge) {
>>> +           return (zram_buf + ZS_HANDLE_SIZE);
>>> +       }
>>>      }
>>>
>>>      return zram_buf;
>>> @@ -2929,6 +2953,11 @@ try_zram_decompress(ulonglong pte_val, unsigned char 
>>> *buf, ulong len, ulonglong
>>>      unsigned char *outbuf = NULL;
>>>      ulong zram, zram_table_entry, sector, index, entry, flags, size,
>>>          outsize, off;
>>> +   unsigned long *same_buf = NULL;
>>> +   bool is_same = false;
>>> +   ulong ZRAM_SAME_PAGEFLAG;
>>> +   ulong ZRAM_WB_PAGEFLAG;
>>> +   long ZRAM_LOCK_VALUE = 24;
>>>
>>>      if (INVALID_MEMBER(zram_compressor)) {
>>>          zram_init();
>>> @@ -2992,11 +3021,25 @@ try_zram_decompress(ulonglong pte_val, unsigned 
>>> char *buf, ulong len, ulonglong
>>>          sizeof(void *), "entry of table", FAULT_ON_ERROR);
>>>      readmem(zram_table_entry + OFFSET(zram_table_flag), KVADDR, &flags,
>>>          sizeof(void *), "zram_table_flag", FAULT_ON_ERROR);
>>> -   if (!entry || (flags & ZRAM_FLAG_SAME_BIT)) {
>>> -       memset(buf, entry, len);
>>> +
>>> +   if (!enumerator_value("ZRAM_LOCK", &ZRAM_LOCK_VALUE)
>>> +           && THIS_KERNEL_VERSION >= LINUX(6,1,0))
>>> +       ZRAM_LOCK_VALUE = PAGESHIFT() + 1;
>>> +
>>> +   ZRAM_SAME_PAGEFLAG = ZRAM_LOCK_VALUE + 1;
>>> +   ZRAM_WB_PAGEFLAG = ZRAM_LOCK_VALUE + 2;
>>> +
>>> +   if (!entry || flags & (1 << ZRAM_SAME_PAGEFLAG)) {
>>> +       same_buf = (unsigned long *)GETBUF(PAGESIZE());
>>> +       for (int count = 0; count < PAGESIZE() / sizeof(unsigned long); 
>>> count++) {
>>> +           same_buf[count] = entry;
>>> +       }
>>> +       memcpy(buf, same_buf + off, PAGESIZE());
>>> +       FREEBUF(same_buf);
>>
>> What is the kernel commit related to this hunk?
>>
>> And I could not apply this, could you resend it as a plain text email or
>> an attached plain text file?
>>
>> Thanks,
>> Kazu
>>
>>>          goto out;
>>>      }
>>> -   size = flags & (ZRAM_FLAG_SHIFT -1);
>>> +
>>> +   size = flags & ((1 << ZRAM_LOCK_VALUE) - 1);
>>>      if (size == 0) {
>>>          len = 0;
>>>          goto out;
>>> --
>>> 2.39.0
>>>
>>>
>>> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件!
>>>  This e-mail and its attachments contain confidential information from 
>>> XIAOMI, which is intended only for the person or entity whose address is 
>>> listed above. Any use of the information contained herein
>> in any way (including, but not limited to, total or partial disclosure,
>> reproduction, or dissemination) by persons other than the intended
>> recipient(s) is prohibited. If you receive this e-mail in error, please
>> notify the sender by phone or email immediately and delete it!******/#
>> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出
>> 的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄
>> 露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件
>> 通知发件人并删除本邮件! This e-mail and its attachments contain
>> confidential information from XIAOMI, which is intended only for the
>> person or entity whose address is listed above. Any use of the
>> information contained herein in any way (including, but not limited to,
>> total or partial disclosure, reproduction, or dissemination) by persons
>> other than the intended recipient(s) is prohibited. If you receive this
>> e-mail in error, please notify the sender by phone or email immediately
>> and delete it!******/#
> #/******本邮件及其附件含有小米公司的保密信息,仅限于发送给上面地址中列出 
> 的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄 
> 露、复制、或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件 
> 通知发件人并删除本邮件! This e-mail and its attachments contain 
> confidential information from XIAOMI, which is intended only for the 
> person or entity whose address is listed above. Any use of the 
> information contained herein in any way (including, but not limited to, 
> total or partial disclosure, reproduction, or dissemination) by persons 
> other than the intended recipient(s) is prohibited. If you receive this 
> e-mail in error, please notify the sender by phone or email immediately 
> and delete it!******/#
--
Crash-utility mailing list
Crash-utility@redhat.com
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki

Reply via email to