From: Ethan Zhao <haifeng.zhao@linux.intel.com>
To: Robin Murphy <robin.murphy@arm.com>, Ido Schimmel <idosch@idosch.org>
Cc: joro@8bytes.org, will@kernel.org, iommu@lists.linux.dev,
linux-kernel@vger.kernel.org, zhangzekun11@huawei.com,
john.g.garry@oracle.com, dheerajkumar.srivastava@amd.com,
jsnitsel@redhat.com
Subject: Re: [PATCH v3 0/2] iommu/iova: Make the rcache depot properly flexible
Date: Wed, 10 Jan 2024 08:52:06 +0800 [thread overview]
Message-ID: <252396e4-bf9a-4655-8993-75a44d58febd@linux.intel.com> (raw)
In-Reply-To: <7eaa0f41-a71b-43c1-8596-1df99584530a@arm.com>
On 1/9/2024 7:26 PM, Robin Murphy wrote:
> On 2024-01-09 6:23 am, Ethan Zhao wrote:
>>
>> On 1/9/2024 1:54 PM, Ethan Zhao wrote:
>>>
>>> On 1/9/2024 1:35 AM, Robin Murphy wrote:
>>>> On 2023-12-28 12:23 pm, Ido Schimmel wrote:
>>>>> On Tue, Sep 12, 2023 at 05:28:04PM +0100, Robin Murphy wrote:
>>>>>> v2:
>>>>>> https://lore.kernel.org/linux-iommu/cover.1692641204.git.robin.murphy@arm.com/
>>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I hope this is good to go now, just fixed the locking (and threw
>>>>>> lockdep at it to confirm, which of course I should have done to
>>>>>> begin
>>>>>> with...) and picked up tags.
>>>>>
>>>>> Hi,
>>>>>
>>>>> After pulling the v6.7 changes we started seeing the following memory
>>>>> leaks [1] of 'struct iova_magazine'. I'm not sure how to reproduce
>>>>> it,
>>>>> which is why I didn't perform bisection. However, looking at the
>>>>> mentioned code paths, they seem to have been changed in v6.7 as
>>>>> part of
>>>>> this patchset. I reverted both patches and didn't see any memory
>>>>> leaks
>>>>> when running a full regression (~10 hours), but I will repeat it
>>>>> to be
>>>>> sure.
>>>>>
>>>>> Any idea what could be the problem?
>>>>
>>>> Hmm, we've got what looks to be a set of magazines forming a
>>>> plausible depot list (or at least the tail end of one):
>>>>
>>>> ffff8881411f9000 -> ffff8881261c1000
>>>>
>>>> ffff8881261c1000 -> ffff88812be26400
>>>>
>>>> ffff88812be26400 -> ffff8188392ec000
>>>>
>>>> ffff8188392ec000 -> ffff8881a5301000
>>>>
>>>> ffff8881a5301000 -> NULL
>>>>
>>>> which I guess has somehow become detached from its rcache->depot
>>>> without being freed properly? However I'm struggling to see any
>>>> conceivable way that could happen which wouldn't already be more
>>>> severely broken in other ways as well (i.e. either general memory
>>>> corruption or someone somehow still trying to use the IOVA domain
>>>> while it's being torn down).
>>>>
>>>> Out of curiosity, does reverting just patch #2 alone make a
>>>> difference? And is your workload doing anything "interesting" in
>>>> relation to IOVA domain lifetimes, like creating and destroying
>>>> SR-IOV virtual functions, changing IOMMU domain types via sysfs, or
>>>> using that horrible vdpa thing, or are you seeing this purely from
>>>> regular driver DMA API usage?
>>>
>>> There no lock held when free_iova_rcaches(), is it possible
>>> free_iova_rcaches() race with the delayed cancel_delayed_work_sync() ?
>>>
>>> I don't know why not call cancel_delayed_work_sync(&rcache->work);
>>> first in free_iova_rcaches() to avoid possible race.
>>>
>> between following functions pair, race possible ? if called cocurrently.
>>
>> 1. free_iova_rcaches() with iova_depot_work_func()
>>
>> free_iova_rcaches() holds no lock, iova_depot_work_func() holds
>> rcache->lock.
>
> Unless I've completely misunderstood the workqueue API, that can't
> happen, since free_iova_rcaches() *does* synchronously cancel the work
> before it starts freeing the depot list.
iova_depot_work_func() pop and free mag from depot. free_iova_rcaches()
frees loaded and previous mag before syncronously cancelled.
different thing. okay here.
>
>> 2. iova_cpuhp_dead() with iova_depot_work_func()
>>
>> iova_cpuhp_dead() holds per cpu lock cpu_rcache->lock,
>> iova_depot_work_func() holds rcache->lock.
>
> That's not a race because those are touching completely different
> things - the closest they come to interacting is where they both free
> IOVAs back to the rbtree.
iova_cpuhp_dead() free pages with
iova_magazine_free_pfns(cpu_rcache->loaded, iovad);
iova_depot_work_func() free mag from depot. iova_magazine_free_pfns()
hold rbtree lock.
Okay, different thing.
>
>> 3. iova_cpuhp_dead() with free_iova_rcaches()
>>
>> iova_cpuhp_dead() holds per cpu lock cpu_rcache->lock,
>> free_iova_rcaches() holds no lock.
>
> See iova_domain_free_rcaches() - by the time we call
> free_iova_rcaches(), the hotplug handler has already been removed (and
> either way it couldn't account for *this* issue since it doesn't touch
> the depot at all).
Yes, iova_cpuhp_dead() was removed before free_iova_rcaches().
>
>> 4. iova_cpuhp_dead() with free_global_cached_iovas()
>>
>> iova_cpuhp_dead() holds per cpu lock cpu_rcache->lock and
>> free_global_cached_iovas() holds rcache->lock.
>
> Again, they hold different locks because they're touching unrelated
> things.
iova_cpuhp_dead() free loaded and previous pages.
free_global_cached_iovas() free mags from depot.
Okay too.
then free_global_cached_iovas() with iova_depot_work_func() ? they all
hold rcache->lock.
So there is no race at all, perfect. out of imagination, that memory
leak report.
kmemleak not always right.
Thanks,
Ethan
>
> Thanks,
> Robin.
next prev parent reply other threads:[~2024-01-10 0:52 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-12 16:28 [PATCH v3 0/2] iommu/iova: Make the rcache depot properly flexible Robin Murphy
2023-09-12 16:28 ` [PATCH v3 1/2] iommu/iova: Make the rcache depot scale better Robin Murphy
2023-09-12 16:28 ` [PATCH v3 2/2] iommu/iova: Manage the depot list size Robin Murphy
2023-09-25 10:08 ` [PATCH v3 0/2] iommu/iova: Make the rcache depot properly flexible Joerg Roedel
2023-12-28 12:23 ` Ido Schimmel
2024-01-02 7:24 ` Ido Schimmel
2024-01-03 8:38 ` Joerg Roedel
2024-01-06 4:21 ` Ethan Zhao
2024-01-06 7:07 ` zhangzekun (A)
2024-01-06 7:33 ` Ethan Zhao
2024-01-06 4:03 ` Ethan Zhao
2024-01-08 3:13 ` Ethan Zhao
2024-01-08 17:35 ` Robin Murphy
2024-01-09 5:54 ` Ethan Zhao
2024-01-09 6:23 ` Ethan Zhao
2024-01-09 11:26 ` Robin Murphy
2024-01-10 0:52 ` Ethan Zhao [this message]
2024-01-09 17:21 ` Ido Schimmel
2024-01-10 12:48 ` Robin Murphy
2024-01-10 14:00 ` Ido Schimmel
2024-01-10 17:58 ` Catalin Marinas
2024-01-11 8:20 ` Ido Schimmel
2024-01-11 10:13 ` Catalin Marinas
2024-01-12 15:31 ` Ido Schimmel
2024-01-15 7:17 ` Ido Schimmel
2024-10-28 8:04 ` Ido Schimmel
2024-10-28 17:45 ` Catalin Marinas
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=252396e4-bf9a-4655-8993-75a44d58febd@linux.intel.com \
--to=haifeng.zhao@linux.intel.com \
--cc=dheerajkumar.srivastava@amd.com \
--cc=idosch@idosch.org \
--cc=iommu@lists.linux.dev \
--cc=john.g.garry@oracle.com \
--cc=joro@8bytes.org \
--cc=jsnitsel@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=robin.murphy@arm.com \
--cc=will@kernel.org \
--cc=zhangzekun11@huawei.com \
/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.