From: "Fabio M. De Francesco" <fmdefrancesco@gmail.com>
To: Johan Hovold <johan@kernel.org>, Alex Elder <elder@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
greybus-dev@lists.linaro.org, linux-staging@lists.linux.dev,
linux-kernel@vger.kernel.org, Alex Elder <elder@linaro.org>
Subject: Re: [greybus-dev] [PATCH v3] staging: greybus: Convert uart.c from IDR to XArray
Date: Sat, 28 Aug 2021 20:01:48 +0200 [thread overview]
Message-ID: <3554184.2JXonMZcNW@localhost.localdomain> (raw)
In-Reply-To: <dc2d0dda-0a04-8b45-d83e-f7c54baa357b@linaro.org>
On Saturday, August 28, 2021 5:43:49 PM CEST Alex Elder wrote:
> On 8/16/21 2:50 PM, Fabio M. De Francesco wrote:
> > Convert greybus/uart.c from IDR to XArray. The abstract data type XArray
> > is more memory-efficient, parallelisable, and cache friendly. It takes
> > advantage of RCU to perform lookups without locking. Furthermore, IDR is
> > deprecated because XArray has a better (cleaner and more consistent) API.
> >
> > Signed-off-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
>
> I have one more comment, below. Generally, I don't think it is
> important to make this change, but I think it's fine to switch
> to the newer XArray interface. The result is a little simpler.
I agree that the result of using XArray is a little simpler and readable. As far as
performance is regarded (memory-efficiency, cache friendliness, parallelization
improvements) I have to take for true the words of Matthew W.. Some time ago
I did a similar conversion for staging/unisys/visorhba after discussing with him
on IRC; he confirmed that the driver would have got several benefits. This is why
I decided to do this work on staging/greybus too.
I cannot affirm the same for IDA to XArray conversions, since IDA are relatively
lighter and efficient than IDR. Unfortunately, I cannot profile such conversions
in order to prove/disprove they *really* gain on execution time and/or memory
footprint.
> >
> > []
> >
> > static int gb_uart_receive_data_handler(struct gb_operation *op)
> > {
> > @@ -341,8 +341,8 @@ static struct gb_tty *get_gb_by_minor(unsigned int minor)
> > {
> > struct gb_tty *gb_tty;
> >
> > - mutex_lock(&table_lock);
> > - gb_tty = idr_find(&tty_minors, minor);
> > + xa_lock(&tty_minors);
>
> I'm basically new to using the XArray interface, but I
> don't think you really need the xa_lock()/xa_unlock()
> calls here. You are not relying on reference counting
> to control when the allocated minor device numbers are
> freed, so I'm pretty sure you can simply call xa_load()
> to look up the gb_tty for the given minor device.
I haven't yet had time to understand how driver works. However,
I can attempt a response mostly due to logic than to a real knowledge
of how drivers work...
(1) I see that alloc_minor is called at "probe" (that I suppose it means
the the kernel "feels" that a new device has been added and so it should
initialize it somehow and make it ready to operate properly - I hope
I'm not too far from the truth :)).
(2) I see that xa_alloc() finds an *unused* identifier and, if it succeeds,
that identifier is used as the "minor". So, we have one minor per device
and that the same minor cannot be re-assigned to other devices. It also
should mean that there's no need for reference counting because that
"minor" is not shared.
(3) If the logic above is sound, we have a 1:1 correspondence between
minors and devices (max 16 gb_tty's) and therefore we don't need to lock
tty_minors because concurrent code passes different minors to xa_load()
which always returns different gb_tty's.
If the above argument is wrong I think I should read a book on device
drivers for the first time. I have Greg's but I haven't yet opened it for
reading :)
Thanks,
Fabio
> But please don't only take my word for it; investigate
> it for yourself, and if needed ask others about it so
> you're confident it's correct. There is no harm in
> taking the lock, but if it's not needed, it would be
> nice to avoid it.
>
> If you conclude the locks are necessary, just say so,
> and explain why, and I'll probably just accept it.
> Otherwise, please explain why you are sure they are
> not needed when you send version 4. Thank you.
>
> -Alex
>
>
> > + gb_tty = xa_load(&tty_minors, minor);
> > if (gb_tty) {
> > mutex_lock(&gb_tty->mutex);
> > if (gb_tty->disconnected) {
> > @@ -353,19 +353,19 @@ static struct gb_tty *get_gb_by_minor(unsigned int minor)
> > mutex_unlock(&gb_tty->mutex);
> > }
> > }
> > - mutex_unlock(&table_lock);
> > + xa_unlock(&tty_minors);
> > return gb_tty;
> > }
next prev parent reply other threads:[~2021-08-28 18:01 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-16 19:50 [PATCH v3] staging: greybus: Convert uart.c from IDR to XArray Fabio M. De Francesco
2021-08-28 15:43 ` [greybus-dev] " Alex Elder
2021-08-28 18:01 ` Fabio M. De Francesco [this message]
2021-09-02 9:15 ` Greg Kroah-Hartman
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=3554184.2JXonMZcNW@localhost.localdomain \
--to=fmdefrancesco@gmail.com \
--cc=elder@kernel.org \
--cc=elder@linaro.org \
--cc=gregkh@linuxfoundation.org \
--cc=greybus-dev@lists.linaro.org \
--cc=johan@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-staging@lists.linux.dev \
/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.