From: Uladzislau Rezki <urezki@gmail.com>
To: Baoquan He <bhe@redhat.com>
Cc: Uladzislau Rezki <urezki@gmail.com>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
stephen.s.brennan@oracle.com, willy@infradead.org,
akpm@linux-foundation.org, hch@infradead.org
Subject: Re: [PATCH v2 2/7] mm/vmalloc.c: add flags to mark vm_map_ram area
Date: Mon, 16 Jan 2023 18:54:34 +0100 [thread overview]
Message-ID: <Y8WPWngsci0QPY0Y@pc636> (raw)
In-Reply-To: <Y8DWG+OHV6E4cR8p@fedora>
On Fri, Jan 13, 2023 at 11:55:07AM +0800, Baoquan He wrote:
> Hi Uladzislau Rezki,
>
> On 12/23/22 at 12:14pm, Baoquan He wrote:
> > On 12/20/22 at 05:55pm, Uladzislau Rezki wrote:
> ......
> > > spin_lock(&vmap_area_lock);
> > > > insert_vmap_area(va, &vmap_area_root, &vmap_area_list);
> > > > @@ -1887,6 +1889,10 @@ struct vmap_area *find_vmap_area(unsigned long addr)
> > > >
> > > > #define VMAP_BLOCK_SIZE (VMAP_BBMAP_BITS * PAGE_SIZE)
> > > >
> > > > +#define VMAP_RAM 0x1
> > > > +#define VMAP_BLOCK 0x2
> > > > +#define VMAP_FLAGS_MASK 0x3
> > > >
> > > Maybe to rename a VMAP_BLOCK to something like VMAP_BLOCK_RESERVED or
> > > VMAP_PER_CPU_BLOCK?
> >
> > Both VMAP_BLOCK or VMAP_PER_CPU_BLOCK look good to me, please see my
> > explanation at below.
> >
> > >
> > > > struct vmap_block_queue {
> > > > spinlock_t lock;
> > > > struct list_head free;
> > > > @@ -1962,7 +1968,8 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask)
> > > >
> > > > va = alloc_vmap_area(VMAP_BLOCK_SIZE, VMAP_BLOCK_SIZE,
> > > > VMALLOC_START, VMALLOC_END,
> > > > - node, gfp_mask);
> > > > + node, gfp_mask,
> > > > + VMAP_RAM|VMAP_BLOCK);
> > > >
> > > A new_vmap_block() is for a per-cpu path. As far as i see the VMAP_BLOCK
> > > flag is used to mark a VA that corresponds to a reserved per-cpu free area.
> > >
> > > Whereas a VMAP_RAM is for VA that was obtained over per-cpu path but
> > > over alloc_vmap_area() thus a VA should be read out over "busy" tree
> > > directly.
>
> Rethinking about the vmap->flags and the bit0->VMAP_RAM,
> bit1->VMAP_BLOCK correspondence, it looks better to use bit0->VMAP_RAM
> to indicate the vm_map_ram area, no matter how it's handled inside
> vm_map_ram() interface; and use bit1->VMAP_BLOCK to mark out the special
> vm_map_ram area which is further subdivided and managed by struct
> vmap_block. With these, you can see that we can identify vm_map_ram area
> and treat it as one type of vmalloc area, e.g in vread(), s_show().
>
> Means when we are talking about vm_map_ram areas, we use
> (vmap->flags & VMAP_RAM) to recognize them; when we need to
> differentiate and handle vm_map_ram areas respectively, we use
> (vmap->flags & VMAP_BLOCK) to pick out the area which is further managed
> by vmap_block. Please help check if this is OK to you.
>
> > >
> > > Why do you need to set here both VMAP_RAM and VMAP_BLOCK?
> >
> > My understanding is that the vm_map_ram area has two types, one is
> > the vb percpu area via vb_alloc(), the other is allocated via
> > alloc_vmap_area(). While both of them is got from vm_map_ram()
> > interface, this is the main point that distinguishes the vm_map_ram area
> > than the normal vmalloc area, and this makes vm_map_ram area not owning
> > va->vm pointer. So here, I use flag VMAP_RAM to mark the vm_map_ram
> > area, including the two types; meanwhile, I add VMAP_BLOCK to mark out
> > the vb percpu area.
> >
> > I understand people could have different view about them, e.g as you
> > said, use VMAP_RAM to mark the type of vm_map_ram area allocated through
> > alloc_vmap_area(), while use VMAP_PER_CPU_BLOCK to mark vb percpu area
> > from vb_alloc. In this way, we may need to rename VMAP_RAM to reflect
> > the area allocated from alloc_vmap_area() only. Both is fine to me.
> >
> > >
> > > > if (IS_ERR(va)) {
> > > > kfree(vb);
> > > > return ERR_CAST(va);
> > > > @@ -2229,8 +2236,12 @@ void vm_unmap_ram(const void *mem, unsigned int count)
> > > > return;
> > > > }
> > > >
> > > > - va = find_vmap_area(addr);
> > > > + spin_lock(&vmap_area_lock);
> > > > + va = __find_vmap_area((unsigned long)addr, &vmap_area_root);
> > > > BUG_ON(!va);
> > > > + if (va)
> > > > + va->flags &= ~VMAP_RAM;
> > > > + spin_unlock(&vmap_area_lock);
> > > > debug_check_no_locks_freed((void *)va->va_start,
> > > >
> > > Agree with Lorenzo. BUG_ON() should be out of spinlock(). Furthermore
> > > i think it makes sense to go with WARN_ON_ONCE() and do not kill a system.
> > > Instead emit a warning and bailout.
> > >
> > > What do you think? Maybe separate patch for it?
> >
> > Agree, your patch looks great to me. Thanks.
> >
> > >
> > > > (va->va_end - va->va_start));
> > > > free_unmap_vmap_area(va);
> > > > @@ -2265,7 +2276,8 @@ void *vm_map_ram(struct page **pages, unsigned int count, int node)
> > > > } else {
> > > > struct vmap_area *va;
> > > > va = alloc_vmap_area(size, PAGE_SIZE,
> > > > - VMALLOC_START, VMALLOC_END, node, GFP_KERNEL);
> > > > + VMALLOC_START, VMALLOC_END,
> > > > + node, GFP_KERNEL, VMAP_RAM);
> > > > if (IS_ERR(va))
> > > > return NULL;
> > > >
> > > > @@ -2505,7 +2517,7 @@ static struct vm_struct *__get_vm_area_node(unsigned long size,
> > > > if (!(flags & VM_NO_GUARD))
> > > > size += PAGE_SIZE;
> > > >
> > > > - va = alloc_vmap_area(size, align, start, end, node, gfp_mask);
> > > > + va = alloc_vmap_area(size, align, start, end, node, gfp_mask, 0);
> > > > if (IS_ERR(va)) {
> > > > kfree(area);
> > > > return NULL;
> > > >
> > > I know we have already discussed the new parameter. But what if we just
> > > use atomic_set operation to mark VA as either vmap-ram or vmap-block?
>
> As I replied at above, I take the vm_map_ram as one kind of vmalloc
> area, and mark out the percpu vmap block handling of vm_map_ram area.
> Seems the passing in the flags through function parameter is better. Not
> sure if I got your suggestion correctly, and my code change is
> appropriate. I have sent v3 according to your and Lorenzo's comments and
> suggestion, and my rethinking after reading your words. I make some
> adjustment to try to remove misundersanding or confusion when reading
> patch and code. Please help check if it's OK.
>
OK, if we decided to go with a parameter it is OK, it is not a big deal
and complexity. If needed it can be adjusted later on if there is a
need.
Thanks!
--
Uladzislau Rezki
next prev parent reply other threads:[~2023-01-16 17:54 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-17 1:54 [PATCH v2 0/7] mm/vmalloc.c: allow vread() to read out vm_map_ram areas Baoquan He
2022-12-17 1:54 ` [PATCH v2 1/7] mm/vmalloc.c: add used_map into vmap_block to track space of vmap_block Baoquan He
2022-12-17 1:54 ` [PATCH v2 2/7] mm/vmalloc.c: add flags to mark vm_map_ram area Baoquan He
2022-12-17 11:44 ` Lorenzo Stoakes
2022-12-19 8:01 ` Baoquan He
2022-12-19 9:09 ` Lorenzo Stoakes
2022-12-19 12:24 ` Baoquan He
2022-12-19 13:01 ` Lorenzo Stoakes
2022-12-20 12:14 ` Baoquan He
2022-12-20 12:42 ` Lorenzo Stoakes
2022-12-20 16:55 ` Uladzislau Rezki
2022-12-23 4:14 ` Baoquan He
2023-01-13 3:55 ` Baoquan He
2023-01-16 17:54 ` Uladzislau Rezki [this message]
2023-01-18 3:09 ` Baoquan He
2023-01-18 12:20 ` Uladzislau Rezki
2022-12-17 1:54 ` [PATCH v2 3/7] mm/vmalloc.c: allow vread() to read out vm_map_ram areas Baoquan He
2022-12-17 4:10 ` kernel test robot
2022-12-17 6:41 ` kernel test robot
2022-12-17 9:46 ` Baoquan He
2022-12-17 12:06 ` Lorenzo Stoakes
2023-01-04 8:01 ` Baoquan He
2023-01-04 20:20 ` Lorenzo Stoakes
2023-01-09 4:35 ` Baoquan He
2023-01-09 7:12 ` Lorenzo Stoakes
2023-01-09 12:49 ` Baoquan He
2022-12-17 1:54 ` [PATCH v2 4/7] mm/vmalloc: explicitly identify vm_map_ram area when shown in /proc/vmcoreinfo Baoquan He
2022-12-17 1:54 ` [PATCH v2 5/7] mm/vmalloc: skip the uninitilized vmalloc areas Baoquan He
2022-12-17 12:07 ` Lorenzo Stoakes
2022-12-19 7:16 ` Baoquan He
2022-12-17 1:54 ` [PATCH v2 6/7] powerpc: mm: add VM_IOREMAP flag to the vmalloc area Baoquan He
2022-12-17 1:54 ` Baoquan He
2022-12-17 1:54 ` [PATCH v2 7/7] sh: mm: set " Baoquan He
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y8WPWngsci0QPY0Y@pc636 \
--to=urezki@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=bhe@redhat.com \
--cc=hch@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=stephen.s.brennan@oracle.com \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.