From: Pranjal Shrivastava <praan@google.com>
To: Robin Murphy <robin.murphy@arm.com>
Cc: Nicolin Chen <nicolinc@nvidia.com>,
Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org>,
Mostafa Saleh <smostafa@google.com>,
iommu@lists.linux.dev
Subject: Re: [PATCH v3 2/2] iommu/arm-smmu-v3: Adopt arm_smmu_event in handlers
Date: Fri, 11 Oct 2024 20:31:07 +0000 [thread overview]
Message-ID: <ZwmLCzBuRbPy11cE@google.com> (raw)
In-Reply-To: <ec9e47cc-f3c2-4142-8395-3bbb8e055261@arm.com>
On Fri, Oct 11, 2024 at 01:59:36PM +0100, Robin Murphy wrote:
> On 2024-10-11 12:06 pm, Pranjal Shrivastava wrote:
> > On Fri, Oct 11, 2024 at 10:45:52AM +0000, Pranjal Shrivastava wrote:
> > > On Fri, Oct 11, 2024 at 11:21:48AM +0100, Robin Murphy wrote:
> > > > On 2024-10-11 8:55 am, Pranjal Shrivastava wrote:
> > > > > On Thu, Oct 03, 2024 at 03:53:15PM -0700, Nicolin Chen wrote:
> > > > > > On Thu, Oct 03, 2024 at 09:34:35PM +0000, Pranjal Shrivastava wrote:
> > > > > > > > The master and master_name are not that necessary to be in the
> > > > > > > > arm_smmu_event. I would keep both of them as local variables in
> > > > > > > > arm_smmu_handle_evt and pass master_name in to dump().
> > > > > > >
> > > > > > > Hmm, right or maybe ONLY have the master_name in arm_smmu_event?
> > > > > >
> > > > > > Just move both out of arm_smmu_event. Keep the master_name as a
> > > > > > local variable like the "master". You'd just need to pass it in
> > > > > > to the dump(). They both are in that same handle_evt().
> > > > > >
> > > > >
> > > > > Ack.
> > > > >
> > > > > > > > > Also, shall we rename it to `arm_smmu_read_evt_info` ?
> > > > > > > >
> > > > > > > > I'd probably use arm_smmu_event_get_from_raw()? Trying to high-
> > > > > > > > light struct arm_smmu_event v.s. u64 evt[EVTQ_ENT_DWORDS]. Yet,
> > > > > > > > no strong feeling about that.
> > > > > > > >
> > > > > > >
> > > > > > > Ack. How about `read_arm_smmu_event` :)
> > > > > > > Unless, we wanna follow the arm_smmu_<func> convention?
> > > > > >
> > > > > > I think it'd be nicer if we do.
> > > > > >
> > > > >
> > > > > Ack. `arm_smmu_get_evt_from_raw` it is!
> > > >
> > > > FWIW that sounds needlessly overcomplicated to me - the "raw" event array
> > > > should be a member of arm_smmu_event itself, since it seems silly to have
> > > > them separate with one pointing to the other when they have the exact same
> > > > scope and lifetime anyway. There still shouldn't need to be more than a
> > > > single logical step to process an evtq record into a finished
> > > > arm_smmu_event, just that that processing is now going to go a bit further
> > > > than simply le64_to_cpu().
> > >
> > > Hmm, are you suggesting something like queue_remove_raw(q, event->raw)?
> > > OR do you mean we should have our own queue_parse_evt(q, &event) that
> > > parses out the raw event into an `arm_smmu_event` record eliminating the
> > > need for the `arm_smmu_read_evt_info` altogether?
> > >
> > > Because we'd still need to store the raw event anyway since we're still
> > > logging the raw event.
> > >
> > > I think we can go with the former, i.e. queue_remove_raw(q, event->raw)
> > > and then use ``arm_smmu_read_evt_info` to populate other `event` fields
> >
> > Based on your comment, I was thinking like the attached sample code.
> > LMK if you were referring to something like that?
>
> Ah, apologies, it had slipped my mind that queue_read() is already buried
> two layers deep in an abstraction shared with the priq... so yeah, rather
> than start trying to turn that inside-out, I guess the neatest approach is
> to effectively flip this series instead - i.e. start with the minor shift
> to:
>
> struct arm_smmu_event evt;
>
> while (!queue_remove_raw(q, evt.raw)) {
> ret = arm_smmu_handle_evt(smmu, &evt);
> ...
> dev_info(smmu->dev, "event 0x%02x received:\n", evt.id);
> //etc.
>
> and leave arm_smmu_handle_evt() decoding the event as both it and
> arm_smmu_handle_ppr() already do, just now using the new structure instead
> of locals. Then we can come in to factor out and enhance the unhandled event
> report, and anything else specific to that reporting beyond the actual SMMU
> event record, like device names and ratelimiting, can remain private to
> arm_smmu_dump_event().
Ack. That makes sense. I'll re-organize the series accordingly.
>
> AFAICS the locking concern seems avoidable as well - we don't actually need
> the whole arm_smmu_master in either case, just the device, so then end of
> arm_smmu_handle_evt() could easily be a little simpler:
>
> ...
> mutex_lock(&smmu->streams_mutex);
> master = arm_smmu_find_master(smmu, sid);
> if (master)
> event->dev = get_device(master->dev);
> mutex_unlock(&smmu->streams_mutex);
>
> if (!event->dev)
> return -EINVAL;
Ahh, I see! My worry was a using `dev` after free but it looks like
`get_device(dev)` increments the reference count, preventing `dev` from
being freed prematurely.
Looking at the core code in drivers/base/core.c to confirm,
I see that the `device_release` invokes `dev->release` which frees the
`dev` struct and it seems that the `device_release` is called only
kobject's refcount reaches 0. Additionally, I see that `device_release`
is registered as the ->release callback in the device_ktype kobject.
So, looks like we should be good? LMK if I missed something above?
>
> return iommu_report_device_fault(event->dev, &fault_evt);
>
> then arm_smmu_dump_event() is safe to use a construct like:
>
> event->dev ? dev_name(event->dev) : "(unassigned)"
>
> and finally a cleanup in the evtq loop, which by that point probably
> condenses down to something like:
>
> while (!queue_remove_raw(q, evt.raw)) {
> if (arm_smmu_handle_evt(smmu, &evt))
> arm_smmu_dump_event(&evt);
> put_device(evt.dev);
Ack. Although, I'm curious to know the concern while calling
`arm_smmu_dump_event` within `arm_smmu_handle_evt`, is it because we
might hold the lock for a longer duration due to the super-long prints?
> cond_resched();
> }
>
> Thanks,
> Robin.
Thanks,
Pranjal
next prev parent reply other threads:[~2024-10-11 20:31 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-28 0:51 [PATCH v3 0/2] Parse out event records Pranjal Shrivastava
2024-09-28 0:51 ` [PATCH v3 1/2] iommu/arm-smmu-v3: Print better events records Pranjal Shrivastava
2024-09-30 19:15 ` Nicolin Chen
2024-10-01 20:52 ` Pranjal Shrivastava
2024-10-01 23:04 ` Nicolin Chen
2024-10-02 13:57 ` Jason Gunthorpe
2024-10-02 16:55 ` Nicolin Chen
2024-10-02 17:10 ` Jason Gunthorpe
2024-10-02 17:22 ` Nicolin Chen
2024-10-03 21:26 ` Pranjal Shrivastava
2024-10-03 22:50 ` Nicolin Chen
2024-10-11 7:53 ` Pranjal Shrivastava
2024-10-11 10:02 ` Pranjal Shrivastava
2024-09-28 0:51 ` [PATCH v3 2/2] iommu/arm-smmu-v3: Adopt arm_smmu_event in handlers Pranjal Shrivastava
2024-09-30 19:32 ` Nicolin Chen
2024-10-01 21:02 ` Pranjal Shrivastava
2024-10-01 22:59 ` Nicolin Chen
2024-10-03 21:34 ` Pranjal Shrivastava
2024-10-03 22:53 ` Nicolin Chen
2024-10-11 7:55 ` Pranjal Shrivastava
2024-10-11 10:21 ` Robin Murphy
2024-10-11 10:45 ` Pranjal Shrivastava
2024-10-11 11:06 ` Pranjal Shrivastava
2024-10-11 12:59 ` Robin Murphy
2024-10-11 20:31 ` Pranjal Shrivastava [this message]
2024-10-15 18:34 ` Pranjal Shrivastava
2024-10-15 20:03 ` Robin Murphy
2024-10-17 8:06 ` Pranjal Shrivastava
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=ZwmLCzBuRbPy11cE@google.com \
--to=praan@google.com \
--cc=iommu@lists.linux.dev \
--cc=joro@8bytes.org \
--cc=nicolinc@nvidia.com \
--cc=robin.murphy@arm.com \
--cc=smostafa@google.com \
--cc=will@kernel.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.