* Re: [PATCH 1/6] zsmalloc: switch from alloc_vm_area to get_vm_area
[not found] ` <20200918163724.2511-2-hch@lst.de>
@ 2020-09-21 17:42 ` Minchan Kim
[not found] ` <20200921181708.GA2067@lst.de>
0 siblings, 1 reply; 14+ messages in thread
From: Minchan Kim @ 2020-09-21 17:42 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Juergen Gross, Stefano Stabellini, Peter Zijlstra, intel-gfx, x86,
linux-kernel, linux-mm, dri-devel, Rodrigo Vivi, xen-devel,
Andrew Morton, Boris Ostrovsky, Nitin Gupta
On Fri, Sep 18, 2020 at 06:37:19PM +0200, Christoph Hellwig wrote:
> There is no obvious reason why zsmalloc needs to pre-fault the PTEs
> given that it later uses map_kernel_range to just like vmap().
IIRC, the problem was runtime pte popluating needs GFP_KERNEL but
zs_map_object API runs under non-preemtible section.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> mm/zsmalloc.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
> index c36fdff9a37131..3e4fe3259612fd 100644
> --- a/mm/zsmalloc.c
> +++ b/mm/zsmalloc.c
> @@ -1122,7 +1122,7 @@ static inline int __zs_cpu_up(struct mapping_area *area)
> */
> if (area->vm)
> return 0;
> - area->vm = alloc_vm_area(PAGE_SIZE * 2, NULL);
> + area->vm = get_vm_area(PAGE_SIZE * 2, 0);
> if (!area->vm)
> return -ENOMEM;
> return 0;
I think it shoud work.
diff --git a/mm/memory.c b/mm/memory.c
index 05789aa4af12..6a1e4d854593 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2232,7 +2232,7 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
arch_enter_lazy_mmu_mode();
do {
- if (create || !pte_none(*pte)) {
+ if ((create || !pte_none(*pte)) && fn) {
err = fn(pte++, addr, data);
if (err)
break;
diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
index 3e4fe3259612..9ef7daf3d279 100644
--- a/mm/zsmalloc.c
+++ b/mm/zsmalloc.c
@@ -1116,6 +1116,8 @@ static struct zspage *find_get_zspage(struct size_class *class)
#ifdef CONFIG_ZSMALLOC_PGTABLE_MAPPING
static inline int __zs_cpu_up(struct mapping_area *area)
{
+ int ret;
+
/*
* Make sure we don't leak memory if a cpu UP notification
* and zs_init() race and both call zs_cpu_up() on the same cpu
@@ -1125,7 +1127,13 @@ static inline int __zs_cpu_up(struct mapping_area *area)
area->vm = get_vm_area(PAGE_SIZE * 2, 0);
if (!area->vm)
return -ENOMEM;
- return 0;
+
+ /*
+ * Populate ptes in advance to avoid pte allocation with GFP_KERNEL
+ * in non-preemtible context of zs_map_object.
+ */
+ ret = apply_to_page_range(&init_mm, NULL, PAGE_SIZE * 2, NULL, NULL);
+ return ret;
}
static inline void __zs_cpu_down(struct mapping_area *area)
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/6] zsmalloc: switch from alloc_vm_area to get_vm_area
[not found] ` <20200921181708.GA2067@lst.de>
@ 2020-09-21 18:42 ` Minchan Kim
0 siblings, 0 replies; 14+ messages in thread
From: Minchan Kim @ 2020-09-21 18:42 UTC (permalink / raw)
To: Christoph Hellwig, Andrew Morton
Cc: Juergen Gross, Stefano Stabellini, Peter Zijlstra, intel-gfx, x86,
linux-kernel, linux-mm, dri-devel, Rodrigo Vivi, xen-devel,
Andrew Morton, Boris Ostrovsky, Nitin Gupta
On Mon, Sep 21, 2020 at 08:17:08PM +0200, Christoph Hellwig wrote:
> On Mon, Sep 21, 2020 at 10:42:56AM -0700, Minchan Kim wrote:
> > IIRC, the problem was runtime pte popluating needs GFP_KERNEL but
> > zs_map_object API runs under non-preemtible section.
>
> Make sense.
>
> > > - area->vm = alloc_vm_area(PAGE_SIZE * 2, NULL);
> > > + area->vm = get_vm_area(PAGE_SIZE * 2, 0);
> > > if (!area->vm)
> > > return -ENOMEM;
> > > return 0;
> >
> > I think it shoud work.
> >
> > diff --git a/mm/memory.c b/mm/memory.c
> > index 05789aa4af12..6a1e4d854593 100644
> > --- a/mm/memory.c
> > +++ b/mm/memory.c
> > @@ -2232,7 +2232,7 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
> > arch_enter_lazy_mmu_mode();
> >
> > do {
> > - if (create || !pte_none(*pte)) {
> > + if ((create || !pte_none(*pte)) && fn) {
> > err = fn(pte++, addr, data);
> > if (err)
> > break;
> > diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
> > index 3e4fe3259612..9ef7daf3d279 100644
> > --- a/mm/zsmalloc.c
> > +++ b/mm/zsmalloc.c
> > @@ -1116,6 +1116,8 @@ static struct zspage *find_get_zspage(struct size_class *class)
> > #ifdef CONFIG_ZSMALLOC_PGTABLE_MAPPING
> > static inline int __zs_cpu_up(struct mapping_area *area)
> > {
> > + int ret;
> > +
> > /*
> > * Make sure we don't leak memory if a cpu UP notification
> > * and zs_init() race and both call zs_cpu_up() on the same cpu
> > @@ -1125,7 +1127,13 @@ static inline int __zs_cpu_up(struct mapping_area *area)
> > area->vm = get_vm_area(PAGE_SIZE * 2, 0);
> > if (!area->vm)
> > return -ENOMEM;
> > - return 0;
> > +
> > + /*
> > + * Populate ptes in advance to avoid pte allocation with GFP_KERNEL
> > + * in non-preemtible context of zs_map_object.
> > + */
> > + ret = apply_to_page_range(&init_mm, NULL, PAGE_SIZE * 2, NULL, NULL);
> > + return ret;
>
> I think this needs the addr from the vm area somewhere..
Yeah, let's assign the addres we got get_vm_area.
>
> We probaby want to add a trivial helper to prefault an area instead of
> the open coded variant.
It seems zsmalloc is only customer the function so let's have the helper
when we see another customer.
If we don't have objection, I'd like to ask to Andrew fold this up.
---
mm/memory.c | 2 +-
mm/zsmalloc.c | 8 +++++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/mm/memory.c b/mm/memory.c
index 05789aa4af12..6a1e4d854593 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -2232,7 +2232,7 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
arch_enter_lazy_mmu_mode();
do {
- if (create || !pte_none(*pte)) {
+ if ((create || !pte_none(*pte)) && fn) {
err = fn(pte++, addr, data);
if (err)
break;
diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c
index 3e4fe3259612..918c7b019b3d 100644
--- a/mm/zsmalloc.c
+++ b/mm/zsmalloc.c
@@ -1125,7 +1125,13 @@ static inline int __zs_cpu_up(struct mapping_area *area)
area->vm = get_vm_area(PAGE_SIZE * 2, 0);
if (!area->vm)
return -ENOMEM;
- return 0;
+
+ /*
+ * Populate ptes in advance to avoid pte allocation with GFP_KERNEL
+ * in non-preemtible context of zs_map_object.
+ */
+ return apply_to_page_range(&init_mm, (unsigned long)area->vm->addr,
+ PAGE_SIZE * 2, NULL, NULL);
}
static inline void __zs_cpu_down(struct mapping_area *area)
--
2.28.0.681.g6f77f65b4e-goog
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 3/6] drm/i915: use vmap in shmem_pin_map
[not found] ` <20200918163724.2511-4-hch@lst.de>
@ 2020-09-21 19:11 ` Matthew Wilcox
[not found] ` <20200922062249.GA30831@lst.de>
0 siblings, 1 reply; 14+ messages in thread
From: Matthew Wilcox @ 2020-09-21 19:11 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Juergen Gross, Stefano Stabellini, linux-mm, Peter Zijlstra,
intel-gfx, x86, linux-kernel, Minchan Kim, dri-devel,
Rodrigo Vivi, xen-devel, Andrew Morton, Boris Ostrovsky,
Nitin Gupta
On Fri, Sep 18, 2020 at 06:37:21PM +0200, Christoph Hellwig wrote:
> void shmem_unpin_map(struct file *file, void *ptr)
> {
> + long i = shmem_npages(file);
> +
> mapping_clear_unevictable(file->f_mapping);
> - __shmem_unpin_map(file, ptr, shmem_npte(file));
> + vunmap(ptr);
> +
> + for (i = 0; i < shmem_npages(file); i++) {
> + struct page *page;
> +
> + page = shmem_read_mapping_page_gfp(file->f_mapping, i,
> + GFP_KERNEL);
> + if (!WARN_ON(IS_ERR(page))) {
> + put_page(page);
> + put_page(page);
> + }
> + }
> }
This is awkward. I'd like it if we had a vfree() variant which called
put_page() instead of __free_pages(). I'd like it even more if we
used release_pages() instead of our own loop that called put_page().
Perhaps something like this ...
+++ b/mm/vmalloc.c
@@ -2262,7 +2262,7 @@ static void __vunmap(const void *addr, int deallocate_page
s)
vm_remove_mappings(area, deallocate_pages);
- if (deallocate_pages) {
+ if (deallocate_pages == 1) {
int i;
for (i = 0; i < area->nr_pages; i++) {
@@ -2271,8 +2271,12 @@ static void __vunmap(const void *addr, int deallocate_pages)
BUG_ON(!page);
__free_pages(page, 0);
}
- atomic_long_sub(area->nr_pages, &nr_vmalloc_pages);
+ } else if (deallocate_pages == 2) {
+ release_pages(area->pages, area->nr_pages);
+ }
+ if (deallocate_pages) {
+ atomic_long_sub(area->nr_pages, &nr_vmalloc_pages);
kvfree(area->pages);
}
@@ -2369,6 +2373,14 @@ void vunmap(const void *addr)
}
EXPORT_SYMBOL(vunmap);
+void vunmap_put_pages(const void *addr)
+{
+ BUG_ON(in_interrupt());
+ might_sleep();
+ if (addr)
+ __vunmap(addr, 2);
+}
+
/**
* vmap - map an array of pages into virtually contiguous space
* @pages: array of page pointers
only with kernel-doc and so on. I bet somebody has a better idea for a name.
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 6/6] x86/xen: open code alloc_vm_area in arch_gnttab_valloc
[not found] ` <20200918163724.2511-7-hch@lst.de>
@ 2020-09-21 20:44 ` boris.ostrovsky
[not found] ` <20200922145819.GA28420@lst.de>
0 siblings, 1 reply; 14+ messages in thread
From: boris.ostrovsky @ 2020-09-21 20:44 UTC (permalink / raw)
To: Christoph Hellwig, Andrew Morton
Cc: Juergen Gross, Stefano Stabellini, linux-mm, Peter Zijlstra,
intel-gfx, x86, linux-kernel, Minchan Kim, dri-devel,
Rodrigo Vivi, xen-devel, Nitin Gupta
On 9/18/20 12:37 PM, Christoph Hellwig wrote:
>
> +static int gnttab_apply(pte_t *pte, unsigned long addr, void *data)
> +{
> + pte_t ***p = data;
> +
> + **p = pte;
> + (*p)++;
> + return 0;
> +}
> +
> static int arch_gnttab_valloc(struct gnttab_vm_area *area, unsigned nr_frames)
> {
> area->ptes = kmalloc_array(nr_frames, sizeof(*area->ptes), GFP_KERNEL);
> if (area->ptes == NULL)
> return -ENOMEM;
> -
> - area->area = alloc_vm_area(PAGE_SIZE * nr_frames, area->ptes);
> - if (area->area == NULL) {
> - kfree(area->ptes);
> - return -ENOMEM;
> - }
> -
> + area->area = get_vm_area(PAGE_SIZE * nr_frames, VM_IOREMAP);
> + if (!area->area)
> + goto out_free_ptes;
> + if (apply_to_page_range(&init_mm, (unsigned long)area->area->addr,
> + PAGE_SIZE * nr_frames, gnttab_apply, &area->ptes))
This will end up incrementing area->ptes pointer. So perhaps something like
pte_t **ptes = area->ptes;
if (apply_to_page_range(&init_mm, (unsigned long)area->area->addr,
PAGE_SIZE * nr_frames, gnttab_apply, &ptes)) {
...
}
-boris
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Intel-gfx] [PATCH 3/6] drm/i915: use vmap in shmem_pin_map
[not found] ` <20200922062249.GA30831@lst.de>
@ 2020-09-22 8:23 ` Tvrtko Ursulin
[not found] ` <20200922143141.GA26637@lst.de>
2020-09-22 11:21 ` Matthew Wilcox
1 sibling, 1 reply; 14+ messages in thread
From: Tvrtko Ursulin @ 2020-09-22 8:23 UTC (permalink / raw)
To: Christoph Hellwig, Matthew Wilcox
Cc: Juergen Gross, Stefano Stabellini, Minchan Kim, Peter Zijlstra,
intel-gfx, x86, linux-kernel, dri-devel, Chris Wilson, linux-mm,
Matthew Auld, xen-devel, Boris Ostrovsky, Andrew Morton,
Nitin Gupta
On 22/09/2020 07:22, Christoph Hellwig wrote:
> On Mon, Sep 21, 2020 at 08:11:57PM +0100, Matthew Wilcox wrote:
>> This is awkward. I'd like it if we had a vfree() variant which called
>> put_page() instead of __free_pages(). I'd like it even more if we
>> used release_pages() instead of our own loop that called put_page().
>
> Note that we don't need a new vfree variant, we can do this manually if
> we want, take a look at kernel/dma/remap.c. But I thought this code
> intentionally doesn't want to do that to avoid locking in the memory
> for the pages array. Maybe the i915 maintainers can clarify.
+ Chris & Matt who were involved with this part of i915.
If I understood this sub-thread correctly, iterating and freeing the
pages via the vmapped ptes, so no need for a
shmem_read_mapping_page_gfp loop in shmem_unpin_map looks plausible to me.
I did not get the reference to kernel/dma/remap.c though, and also not
sure how to do the error unwind path in shmem_pin_map at which point the
allocated vm area hasn't been fully populated yet. Hand-roll the loop
walking vm area struct in there?
Regards,
Tvrtko
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/6] drm/i915: use vmap in shmem_pin_map
[not found] ` <20200922062249.GA30831@lst.de>
2020-09-22 8:23 ` [Intel-gfx] " Tvrtko Ursulin
@ 2020-09-22 11:21 ` Matthew Wilcox
[not found] ` <20200922143906.GB26664@lst.de>
1 sibling, 1 reply; 14+ messages in thread
From: Matthew Wilcox @ 2020-09-22 11:21 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Juergen Gross, Stefano Stabellini, linux-mm, Peter Zijlstra,
intel-gfx, x86, linux-kernel, Minchan Kim, dri-devel,
Rodrigo Vivi, xen-devel, Andrew Morton, Boris Ostrovsky,
Nitin Gupta
On Tue, Sep 22, 2020 at 08:22:49AM +0200, Christoph Hellwig wrote:
> On Mon, Sep 21, 2020 at 08:11:57PM +0100, Matthew Wilcox wrote:
> > This is awkward. I'd like it if we had a vfree() variant which called
> > put_page() instead of __free_pages(). I'd like it even more if we
> > used release_pages() instead of our own loop that called put_page().
>
> Note that we don't need a new vfree variant, we can do this manually if
> we want, take a look at kernel/dma/remap.c. But I thought this code
> intentionally doesn't want to do that to avoid locking in the memory
> for the pages array. Maybe the i915 maintainers can clarify.
Actually, vfree() will work today; I cc'd you on a documentation update
to make it clear that this is permitted.
From my current experience with the i915 shmem code, I think that the
i915 maintainers are experts at graphics, and are unfamiliar with the MM.
There are a number of places where they do things the hard way.
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/6] drm/i915: use vmap in shmem_pin_map
[not found] ` <20200922143906.GB26664@lst.de>
@ 2020-09-22 14:53 ` Matthew Wilcox
0 siblings, 0 replies; 14+ messages in thread
From: Matthew Wilcox @ 2020-09-22 14:53 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Juergen Gross, Stefano Stabellini, linux-mm, Peter Zijlstra,
intel-gfx, x86, linux-kernel, Minchan Kim, dri-devel,
Rodrigo Vivi, xen-devel, Andrew Morton, Boris Ostrovsky,
Nitin Gupta
On Tue, Sep 22, 2020 at 04:39:06PM +0200, Christoph Hellwig wrote:
> On Tue, Sep 22, 2020 at 12:21:44PM +0100, Matthew Wilcox wrote:
> > Actually, vfree() will work today; I cc'd you on a documentation update
> > to make it clear that this is permitted.
>
> vfree calls __free_pages, the i915 and a lot of other code calls
> put_page. They are mostly the same, but not quite and everytime I
> look into that mess I'm more confused than before.
>
> Can someone in the know write sensible documentation on when to use
> __free_page(s) vs put_page?
I started on that, and then I found a bug that's been lurking for 12
years, so that delayed the documentation somewhat. The short answer is
that __free_pages() lets you free non-compound high-order pages while
put_page() can only free order-0 and compound pages.
I would really like to overhaul our memory allocation APIs:
current new
__get_free_page(s) alloc_page(s)
free_page(s) free_page(s)
alloc_page(s) get_free_page(s)
__free_pages put_page_order
Then put_page() and put_page_order() are more obviously friends.
But I cannot imagine a world in which Linus says yes to that upheaval.
He's previous expressed dislike of the get_free_page() family of APIs,
and thinks all those callers should just use kmalloc(). Maybe we can
make that transition happen, now that kmalloc() aligns larger allocations.
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 6/6] x86/xen: open code alloc_vm_area in arch_gnttab_valloc
[not found] ` <20200922145819.GA28420@lst.de>
@ 2020-09-22 15:24 ` boris.ostrovsky
[not found] ` <20200922152706.GA30633@lst.de>
0 siblings, 1 reply; 14+ messages in thread
From: boris.ostrovsky @ 2020-09-22 15:24 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Juergen Gross, Stefano Stabellini, linux-mm, Peter Zijlstra,
intel-gfx, x86, linux-kernel, Minchan Kim, dri-devel,
Rodrigo Vivi, xen-devel, Andrew Morton, Nitin Gupta
On 9/22/20 10:58 AM, Christoph Hellwig wrote:
> On Mon, Sep 21, 2020 at 04:44:10PM -0400, boris.ostrovsky@oracle.com wrote:
>> This will end up incrementing area->ptes pointer. So perhaps something like
>>
>>
>> pte_t **ptes = area->ptes;
>>
>> if (apply_to_page_range(&init_mm, (unsigned long)area->area->addr,
>> PAGE_SIZE * nr_frames, gnttab_apply, &ptes)) {
>>
>> ...
> Yeah. What do you think of this version?
Oh yes, this is way better. This now can actually be read without trying to mentally unwind triple pointers. (You probably want to initialize idx to zero before calling apply_to_page_range(), I am not sure it's guaranteed to be zero).
> I think it is a little
> cleaner and matches what xenbus does. At this point it probably should
> be split into a Xen and a alloc_vm_area removal patch, though.
Right.
-boris
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 6/6] x86/xen: open code alloc_vm_area in arch_gnttab_valloc
[not found] ` <20200922152706.GA30633@lst.de>
@ 2020-09-22 15:34 ` boris.ostrovsky
0 siblings, 0 replies; 14+ messages in thread
From: boris.ostrovsky @ 2020-09-22 15:34 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Juergen Gross, Stefano Stabellini, linux-mm, Peter Zijlstra,
intel-gfx, x86, linux-kernel, Minchan Kim, dri-devel,
Rodrigo Vivi, xen-devel, Andrew Morton, Nitin Gupta
On 9/22/20 11:27 AM, Christoph Hellwig wrote:
> On Tue, Sep 22, 2020 at 11:24:20AM -0400, boris.ostrovsky@oracle.com wrote:
>> On 9/22/20 10:58 AM, Christoph Hellwig wrote:
>>> On Mon, Sep 21, 2020 at 04:44:10PM -0400, boris.ostrovsky@oracle.com wrote:
>>>> This will end up incrementing area->ptes pointer. So perhaps something like
>>>>
>>>>
>>>> pte_t **ptes = area->ptes;
>>>>
>>>> if (apply_to_page_range(&init_mm, (unsigned long)area->area->addr,
>>>> PAGE_SIZE * nr_frames, gnttab_apply, &ptes)) {
>>>>
>>>> ...
>>> Yeah. What do you think of this version?
>>
>> Oh yes, this is way better. This now can actually be read without trying to mentally unwind triple pointers. (You probably want to initialize idx to zero before calling apply_to_page_range(), I am not sure it's guaranteed to be zero).
> Both instances are static variables, thus in .bss and initialized.
> So unless you insist I don't think we need a manual one.
Yes, you are right. (I thought perhaps this code could be called more than once but no, it can't).
-boris
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Intel-gfx] [PATCH 3/6] drm/i915: use vmap in shmem_pin_map
[not found] ` <20200922143141.GA26637@lst.de>
@ 2020-09-22 16:13 ` Tvrtko Ursulin
[not found] ` <20200922163346.GA1701@lst.de>
0 siblings, 1 reply; 14+ messages in thread
From: Tvrtko Ursulin @ 2020-09-22 16:13 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Juergen Gross, Stefano Stabellini, Minchan Kim, Peter Zijlstra,
intel-gfx, x86, linux-kernel, Matthew Wilcox, Chris Wilson,
linux-mm, dri-devel, xen-devel, Boris Ostrovsky, Andrew Morton,
Nitin Gupta, Matthew Auld
On 22/09/2020 15:31, Christoph Hellwig wrote:
> On Tue, Sep 22, 2020 at 09:23:59AM +0100, Tvrtko Ursulin wrote:
>> If I understood this sub-thread correctly, iterating and freeing the pages
>> via the vmapped ptes, so no need for a
>> shmem_read_mapping_page_gfp loop in shmem_unpin_map looks plausible to me.
>>
>> I did not get the reference to kernel/dma/remap.c though,
>
> What I mean is the code in dma_common_find_pages, which returns the
> page array for freeing.
Got it.
>> and also not sure
>> how to do the error unwind path in shmem_pin_map at which point the
>> allocated vm area hasn't been fully populated yet. Hand-roll the loop
>> walking vm area struct in there?
>
> Yes. What I originally did (re-created as I didn't save it) would be
> something like this:
>
> ---
>>From 5605e77cda246df6dd7ded99ec22cb3f341ef5d5 Mon Sep 17 00:00:00 2001
> From: Christoph Hellwig <hch@lst.de>
> Date: Wed, 16 Sep 2020 13:54:04 +0200
> Subject: drm/i915: use vmap in shmem_pin_map
>
> shmem_pin_map somewhat awkwardly reimplements vmap using
> alloc_vm_area and manual pte setup. The only practical difference
> is that alloc_vm_area prefeaults the vmalloc area PTEs, which doesn't
> seem to be required here (and could be added to vmap using a flag
> if actually required).
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> drivers/gpu/drm/i915/gt/shmem_utils.c | 81 +++++++++------------------
> 1 file changed, 27 insertions(+), 54 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/shmem_utils.c b/drivers/gpu/drm/i915/gt/shmem_utils.c
> index 43c7acbdc79dea..7ec6ba4c1065b2 100644
> --- a/drivers/gpu/drm/i915/gt/shmem_utils.c
> +++ b/drivers/gpu/drm/i915/gt/shmem_utils.c
> @@ -49,80 +49,53 @@ struct file *shmem_create_from_object(struct drm_i915_gem_object *obj)
> return file;
> }
>
> -static size_t shmem_npte(struct file *file)
> +static size_t shmem_npages(struct file *file)
> {
> return file->f_mapping->host->i_size >> PAGE_SHIFT;
> }
>
> -static void __shmem_unpin_map(struct file *file, void *ptr, size_t n_pte)
> -{
> - unsigned long pfn;
> -
> - vunmap(ptr);
> -
> - for (pfn = 0; pfn < n_pte; pfn++) {
> - struct page *page;
> -
> - page = shmem_read_mapping_page_gfp(file->f_mapping, pfn,
> - GFP_KERNEL);
> - if (!WARN_ON(IS_ERR(page))) {
> - put_page(page);
> - put_page(page);
> - }
> - }
> -}
> -
> void *shmem_pin_map(struct file *file)
> {
> - const size_t n_pte = shmem_npte(file);
> - pte_t *stack[32], **ptes, **mem;
Chris can comment how much he'd miss the 32 page stack shortcut.
> - struct vm_struct *area;
> - unsigned long pfn;
> -
> - mem = stack;
> - if (n_pte > ARRAY_SIZE(stack)) {
> - mem = kvmalloc_array(n_pte, sizeof(*mem), GFP_KERNEL);
> - if (!mem)
> - return NULL;
> - }
> + size_t n_pages = shmem_npages(file), i;
> + struct page **pages;
> + void *vaddr;
>
> - area = alloc_vm_area(n_pte << PAGE_SHIFT, mem);
> - if (!area) {
> - if (mem != stack)
> - kvfree(mem);
> + pages = kvmalloc_array(n_pages, sizeof(*pages), GFP_KERNEL);
> + if (!pages)
> return NULL;
> - }
> -
> - ptes = mem;
> - for (pfn = 0; pfn < n_pte; pfn++) {
> - struct page *page;
>
> - page = shmem_read_mapping_page_gfp(file->f_mapping, pfn,
> - GFP_KERNEL);
> - if (IS_ERR(page))
> + for (i = 0; i < n_pages; i++) {
> + pages[i] = shmem_read_mapping_page_gfp(file->f_mapping, i,
> + GFP_KERNEL);
> + if (IS_ERR(pages[i]))
> goto err_page;
> -
> - **ptes++ = mk_pte(page, PAGE_KERNEL);
> }
>
> - if (mem != stack)
> - kvfree(mem);
> -
> + vaddr = vmap(pages, n_pages, 0, PAGE_KERNEL);
> + if (!vaddr)
> + goto err_page;
> mapping_set_unevictable(file->f_mapping);
> - return area->addr;
> -
> + return vaddr;
Is there something in vmap() preventing us from freeing the pages array
here? I can't spot anything that is holding on to the pointer. Or it was
just a sketch before you realized we could walk the vm_area?
Also, I may be totally misunderstanding something, but I think you need
to assign area->pages manually so shmem_unpin_map can access it below.
> err_page:
> - if (mem != stack)
> - kvfree(mem);
> -
> - __shmem_unpin_map(file, area->addr, pfn);
> + while (--i >= 0)
> + put_page(pages[i]);
> + kvfree(pages);
> return NULL;
> }
>
> void shmem_unpin_map(struct file *file, void *ptr)
> {
> + struct vm_struct *area = find_vm_area(ptr);
> + size_t i = shmem_npages(file);
> +
> + if (WARN_ON_ONCE(!area || !area->pages))
> + return;
> +
> mapping_clear_unevictable(file->f_mapping);
> - __shmem_unpin_map(file, ptr, shmem_npte(file));
> + for (i = 0; i < shmem_npages(file); i++)
> + put_page(area->pages[i]);
> + kvfree(area->pages);
> + vunmap(ptr);
Is the verdict from mm experts that we can't use vfree due __free_pages
vs put_page differences?
Could we get from ptes to pages, so that we don't have to keep the
area->pages array allocated for the duration of the pin?
Regards,
Tvrtko
> }
>
> static int __shmem_rw(struct file *file, loff_t off,
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Intel-gfx] [PATCH 3/6] drm/i915: use vmap in shmem_pin_map
[not found] ` <20200922163346.GA1701@lst.de>
@ 2020-09-22 17:04 ` Tvrtko Ursulin
0 siblings, 0 replies; 14+ messages in thread
From: Tvrtko Ursulin @ 2020-09-22 17:04 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Juergen Gross, Stefano Stabellini, Minchan Kim, Peter Zijlstra,
intel-gfx, x86, linux-kernel, Matthew Wilcox, Chris Wilson,
linux-mm, dri-devel, xen-devel, Boris Ostrovsky, Andrew Morton,
Nitin Gupta, Matthew Auld
On 22/09/2020 17:33, Christoph Hellwig wrote:
> On Tue, Sep 22, 2020 at 05:13:45PM +0100, Tvrtko Ursulin wrote:
>>> void *shmem_pin_map(struct file *file)
>>> {
>>> - const size_t n_pte = shmem_npte(file);
>>> - pte_t *stack[32], **ptes, **mem;
>>
>> Chris can comment how much he'd miss the 32 page stack shortcut.
>
> I'd like to see a profile that claim that kmalloc matters in a
> path that does a vmap and reads pages through the page cache.
> Especially when the kmalloc saves doing another page cache lookup
> on the free side.
Only reason I can come up with now is if mapping side is on a latency
sensitive path, while un-mapping is lazy/delayed so can be more costly.
Then fast map and extra cost on unmap may make sense.
It more applies to the other i915 patch, which implements a much more
used API, but whether or not we can demonstrate any difference in the
perf profiles I couldn't tell you without trying to collect some.
>> Is there something in vmap() preventing us from freeing the pages array
>> here? I can't spot anything that is holding on to the pointer. Or it was
>> just a sketch before you realized we could walk the vm_area?
>>
>> Also, I may be totally misunderstanding something, but I think you need to
>> assign area->pages manually so shmem_unpin_map can access it below.
>
> We need area->pages to hold the pages for the free side. That being
> said the patch I posted is broken because it never assigned to that.
> As said it was a sketch. This is the patch I just rebooted into on
> my Laptop:
>
> http://git.infradead.org/users/hch/misc.git/commitdiff/048522dfa26b6667adfb0371ff530dc263abe829
>
> it needs extra prep patches from the series:
>
> http://git.infradead.org/users/hch/misc.git/shortlog/refs/heads/alloc_vm_area
>
>>> mapping_clear_unevictable(file->f_mapping);
>>> - __shmem_unpin_map(file, ptr, shmem_npte(file));
>>> + for (i = 0; i < shmem_npages(file); i++)
>>> + put_page(area->pages[i]);
>>> + kvfree(area->pages);
>>> + vunmap(ptr);
>>
>> Is the verdict from mm experts that we can't use vfree due __free_pages vs
>> put_page differences?
>
> Switched to vfree now.
>
>> Could we get from ptes to pages, so that we don't have to keep the
>> area->pages array allocated for the duration of the pin?
>
> We could do vmalloc_to_page, but that is fairly expensive (not as bad
> as reading from the page cache..). Are you really worried about the
> allocation?
Not so much given how we don't even use shmem_pin_map outside selftests.
If we start using it I expect it will be for tiny objects anyway. Only
if they end up being pinned for the lifetime of the driver, it may be a
pointless waste of memory compared to the downsides of vmalloc_to_page.
But we can revisit this particular edge case optimization if the need
arises.
I'll look at your other i915 patch tomorrow.
Regards,
Tvrtko
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Intel-gfx] [PATCH 4/6] drm/i915: use vmap in i915_gem_object_map
[not found] ` <20200918163724.2511-5-hch@lst.de>
@ 2020-09-23 9:52 ` Tvrtko Ursulin
[not found] ` <20200923134117.GB9893@lst.de>
0 siblings, 1 reply; 14+ messages in thread
From: Tvrtko Ursulin @ 2020-09-23 9:52 UTC (permalink / raw)
To: Christoph Hellwig, Andrew Morton
Cc: Juergen Gross, Stefano Stabellini, Minchan Kim, Peter Zijlstra,
intel-gfx, x86, linux-kernel, dri-devel, linux-mm, xen-devel,
Boris Ostrovsky, Nitin Gupta
On 18/09/2020 17:37, Christoph Hellwig wrote:
> i915_gem_object_map implements fairly low-level vmap functionality in
> a driver. Split it into two helpers, one for remapping kernel memory
> which can use vmap, and one for I/O memory that uses vmap_pfn.
>
> The only practical difference is that alloc_vm_area prefeaults the
> vmalloc area PTEs, which doesn't seem to be required here for the
> kernel memory case (and could be added to vmap using a flag if actually
> required).
Patch looks good to me.
Series did not get a CI run from our side because of a different base so
I don't know if you would like to have a run there? If so you would need
to rebase against git://anongit.freedesktop.org/drm-tip drm-tip and you
could even send a series to intel-gfx-trybot@lists.freedesktop.org,
suppressing cc, to check it out without sending a copy to the real
mailing list.
Regards,
Tvrtko
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> drivers/gpu/drm/i915/Kconfig | 1 +
> drivers/gpu/drm/i915/gem/i915_gem_pages.c | 101 ++++++++++------------
> 2 files changed, 47 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/Kconfig b/drivers/gpu/drm/i915/Kconfig
> index 9afa5c4a6bf006..1e1cb245fca778 100644
> --- a/drivers/gpu/drm/i915/Kconfig
> +++ b/drivers/gpu/drm/i915/Kconfig
> @@ -25,6 +25,7 @@ config DRM_I915
> select CRC32
> select SND_HDA_I915 if SND_HDA_CORE
> select CEC_CORE if CEC_NOTIFIER
> + select VMAP_PFN
> help
> Choose this option if you have a system that has "Intel Graphics
> Media Accelerator" or "HD Graphics" integrated graphics,
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> index e8a083743e0927..90029ea83aede9 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> @@ -234,50 +234,24 @@ int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
> return err;
> }
>
> -static inline pte_t iomap_pte(resource_size_t base,
> - dma_addr_t offset,
> - pgprot_t prot)
> -{
> - return pte_mkspecial(pfn_pte((base + offset) >> PAGE_SHIFT, prot));
> -}
> -
> /* The 'mapping' part of i915_gem_object_pin_map() below */
> -static void *i915_gem_object_map(struct drm_i915_gem_object *obj,
> +static void *i915_gem_object_map_page(struct drm_i915_gem_object *obj,
> enum i915_map_type type)
> {
> - unsigned long n_pte = obj->base.size >> PAGE_SHIFT;
> - struct sg_table *sgt = obj->mm.pages;
> - pte_t *stack[32], **mem;
> - struct vm_struct *area;
> + unsigned long n_pages = obj->base.size >> PAGE_SHIFT, i;
> + struct page *stack[32], **pages = stack, *page;
> + struct sgt_iter iter;
> pgprot_t pgprot;
> -
> - if (!i915_gem_object_has_struct_page(obj) && type != I915_MAP_WC)
> - return NULL;
> -
> - /* A single page can always be kmapped */
> - if (n_pte == 1 && type == I915_MAP_WB)
> - return kmap(sg_page(sgt->sgl));
> -
> - mem = stack;
> - if (n_pte > ARRAY_SIZE(stack)) {
> - /* Too big for stack -- allocate temporary array instead */
> - mem = kvmalloc_array(n_pte, sizeof(*mem), GFP_KERNEL);
> - if (!mem)
> - return NULL;
> - }
> -
> - area = alloc_vm_area(obj->base.size, mem);
> - if (!area) {
> - if (mem != stack)
> - kvfree(mem);
> - return NULL;
> - }
> + void *vaddr;
>
> switch (type) {
> default:
> MISSING_CASE(type);
> fallthrough; /* to use PAGE_KERNEL anyway */
> case I915_MAP_WB:
> + /* A single page can always be kmapped */
> + if (n_pages == 1)
> + return kmap(sg_page(obj->mm.pages->sgl));
> pgprot = PAGE_KERNEL;
> break;
> case I915_MAP_WC:
> @@ -285,30 +259,44 @@ static void *i915_gem_object_map(struct drm_i915_gem_object *obj,
> break;
> }
>
> - if (i915_gem_object_has_struct_page(obj)) {
> - struct sgt_iter iter;
> - struct page *page;
> - pte_t **ptes = mem;
> -
> - for_each_sgt_page(page, iter, sgt)
> - **ptes++ = mk_pte(page, pgprot);
> - } else {
> - resource_size_t iomap;
> - struct sgt_iter iter;
> - pte_t **ptes = mem;
> - dma_addr_t addr;
> + if (n_pages > ARRAY_SIZE(stack)) {
> + /* Too big for stack -- allocate temporary array instead */
> + pages = kvmalloc_array(n_pages, sizeof(*pages), GFP_KERNEL);
> + if (!pages)
> + return NULL;
> + }
>
> - iomap = obj->mm.region->iomap.base;
> - iomap -= obj->mm.region->region.start;
> + for_each_sgt_page(page, iter, obj->mm.pages)
> + pages[i++] = page;
> + vaddr = vmap(pages, n_pages, 0, pgprot);
> + if (pages != stack)
> + kvfree(pages);
> + return vaddr;
> +}
>
> - for_each_sgt_daddr(addr, iter, sgt)
> - **ptes++ = iomap_pte(iomap, addr, pgprot);
> +static void *i915_gem_object_map_pfn(struct drm_i915_gem_object *obj)
> +{
> + resource_size_t iomap = obj->mm.region->iomap.base -
> + obj->mm.region->region.start;
> + unsigned long n_pfn = obj->base.size >> PAGE_SHIFT;
> + unsigned long stack[32], *pfns = stack, i;
> + struct sgt_iter iter;
> + dma_addr_t addr;
> + void *vaddr;
> +
> + if (n_pfn > ARRAY_SIZE(stack)) {
> + /* Too big for stack -- allocate temporary array instead */
> + pfns = kvmalloc_array(n_pfn, sizeof(*pfns), GFP_KERNEL);
> + if (!pfns)
> + return NULL;
> }
>
> - if (mem != stack)
> - kvfree(mem);
> -
> - return area->addr;
> + for_each_sgt_daddr(addr, iter, obj->mm.pages)
> + pfns[i++] = (iomap + addr) >> PAGE_SHIFT;
> + vaddr = vmap_pfn(pfns, n_pfn, pgprot_writecombine(PAGE_KERNEL_IO));
> + if (pfns != stack)
> + kvfree(pfns);
> + return vaddr;
> }
>
> /* get, pin, and map the pages of the object into kernel space */
> @@ -360,7 +348,10 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
> }
>
> if (!ptr) {
> - ptr = i915_gem_object_map(obj, type);
> + if (i915_gem_object_has_struct_page(obj))
> + ptr = i915_gem_object_map_page(obj, type);
> + else if (type == I915_MAP_WC)
> + ptr = i915_gem_object_map_pfn(obj);
> if (!ptr) {
> err = -ENOMEM;
> goto err_unpin;
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Intel-gfx] [PATCH 4/6] drm/i915: use vmap in i915_gem_object_map
[not found] ` <20200923134117.GB9893@lst.de>
@ 2020-09-23 13:58 ` Tvrtko Ursulin
[not found] ` <20200923144455.GA15036@lst.de>
0 siblings, 1 reply; 14+ messages in thread
From: Tvrtko Ursulin @ 2020-09-23 13:58 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Juergen Gross, Stefano Stabellini, Minchan Kim, Peter Zijlstra,
intel-gfx, x86, linux-kernel, dri-devel, linux-mm, xen-devel,
Andrew Morton, Boris Ostrovsky, Nitin Gupta
On 23/09/2020 14:41, Christoph Hellwig wrote:
> On Wed, Sep 23, 2020 at 10:52:33AM +0100, Tvrtko Ursulin wrote:
>>
>> On 18/09/2020 17:37, Christoph Hellwig wrote:
>>> i915_gem_object_map implements fairly low-level vmap functionality in
>>> a driver. Split it into two helpers, one for remapping kernel memory
>>> which can use vmap, and one for I/O memory that uses vmap_pfn.
>>>
>>> The only practical difference is that alloc_vm_area prefeaults the
>>> vmalloc area PTEs, which doesn't seem to be required here for the
>>> kernel memory case (and could be added to vmap using a flag if actually
>>> required).
>>
>> Patch looks good to me.
>>
>> Series did not get a CI run from our side because of a different base so I
>> don't know if you would like to have a run there? If so you would need to
>> rebase against git://anongit.freedesktop.org/drm-tip drm-tip and you could
>> even send a series to intel-gfx-trybot@lists.freedesktop.org, suppressing
>> cc, to check it out without sending a copy to the real mailing list.
>
> It doesn't seem like I can post to any freedesktop list, as I always
> get rejection messages. But I'll happily prepare a branch if one
> of you an feed it into your CI.
That's fine, just ping me and I will forward it for testing, thanks!
Regards,
Tvrtko
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [Intel-gfx] [PATCH 4/6] drm/i915: use vmap in i915_gem_object_map
[not found] ` <20200923144455.GA15036@lst.de>
@ 2020-09-24 12:22 ` Tvrtko Ursulin
0 siblings, 0 replies; 14+ messages in thread
From: Tvrtko Ursulin @ 2020-09-24 12:22 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Juergen Gross, Stefano Stabellini, Minchan Kim, Peter Zijlstra,
intel-gfx, x86, linux-kernel, dri-devel, linux-mm, xen-devel,
Andrew Morton, Boris Ostrovsky, Nitin Gupta
On 23/09/2020 15:44, Christoph Hellwig wrote:
> On Wed, Sep 23, 2020 at 02:58:43PM +0100, Tvrtko Ursulin wrote:
>>>> Series did not get a CI run from our side because of a different base so I
>>>> don't know if you would like to have a run there? If so you would need to
>>>> rebase against git://anongit.freedesktop.org/drm-tip drm-tip and you could
>>>> even send a series to intel-gfx-trybot@lists.freedesktop.org, suppressing
>>>> cc, to check it out without sending a copy to the real mailing list.
>>>
>>> It doesn't seem like I can post to any freedesktop list, as I always
>>> get rejection messages. But I'll happily prepare a branch if one
>>> of you an feed it into your CI.
>>
>> That's fine, just ping me and I will forward it for testing, thanks!
>
> git://git.infradead.org/users/hch/misc.git i915-vmap-wip
>
> Gitweb:
>
> http://git.infradead.org/users/hch/misc.git/shortlog/refs/heads/i915-vmap-wip
>
> note that this includes a new commit to clean up one of the recent
> commits in the code.
CI says series looks good from the i915 perspective (*).
I don't know how will you handle it logistically, but when you have
final version I am happy to re-read and r-b the i915 patches.
Regards,
Tvrtko
*)
https://patchwork.freedesktop.org/series/82051/
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2020-09-24 12:22 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20200918163724.2511-1-hch@lst.de>
[not found] ` <20200918163724.2511-2-hch@lst.de>
2020-09-21 17:42 ` [PATCH 1/6] zsmalloc: switch from alloc_vm_area to get_vm_area Minchan Kim
[not found] ` <20200921181708.GA2067@lst.de>
2020-09-21 18:42 ` Minchan Kim
[not found] ` <20200918163724.2511-4-hch@lst.de>
2020-09-21 19:11 ` [PATCH 3/6] drm/i915: use vmap in shmem_pin_map Matthew Wilcox
[not found] ` <20200922062249.GA30831@lst.de>
2020-09-22 8:23 ` [Intel-gfx] " Tvrtko Ursulin
[not found] ` <20200922143141.GA26637@lst.de>
2020-09-22 16:13 ` Tvrtko Ursulin
[not found] ` <20200922163346.GA1701@lst.de>
2020-09-22 17:04 ` Tvrtko Ursulin
2020-09-22 11:21 ` Matthew Wilcox
[not found] ` <20200922143906.GB26664@lst.de>
2020-09-22 14:53 ` Matthew Wilcox
[not found] ` <20200918163724.2511-7-hch@lst.de>
2020-09-21 20:44 ` [PATCH 6/6] x86/xen: open code alloc_vm_area in arch_gnttab_valloc boris.ostrovsky
[not found] ` <20200922145819.GA28420@lst.de>
2020-09-22 15:24 ` boris.ostrovsky
[not found] ` <20200922152706.GA30633@lst.de>
2020-09-22 15:34 ` boris.ostrovsky
[not found] ` <20200918163724.2511-5-hch@lst.de>
2020-09-23 9:52 ` [Intel-gfx] [PATCH 4/6] drm/i915: use vmap in i915_gem_object_map Tvrtko Ursulin
[not found] ` <20200923134117.GB9893@lst.de>
2020-09-23 13:58 ` Tvrtko Ursulin
[not found] ` <20200923144455.GA15036@lst.de>
2020-09-24 12:22 ` Tvrtko Ursulin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox