Re: [greybus-dev] [PATCH v4] staging: greybus: Convert uart.c from IDR to XArray

From: Matthew Wilcox
Date: Wed Sep 01 2021 - 10:30:57 EST


On Wed, Sep 01, 2021 at 03:56:20PM +0200, Fabio M. De Francesco wrote:
> Anyway I tried to reason about it. I perfectly know what is required to
> protect critical sections of code, but I don't know how drivers work; I mean
> I don't know whether or not different threads that run concurrently could
> really interfere in that specific section. This is because I simply reason in
> terms of general rules of protection of critical section but I really don't
> know how Greybus works or (more in general) how drivers work.

>From a quick look, it is indeed possible to get rid of the mutex.
If this were a high-performance path which needed to have many threads
simultaneously looking up the gb_tty, or it were core kernel code, I
would say that you should use kfree_rcu() to free gb_tty and then
you could replace the mutex_lock() on lookup with a rcu_read_lock().

Since this is low-performance and driver code, I think you're better off
simply doing this:

xa_lock((&tty_minors);
gb_tty = xa_load(&tty_minors, minor);
... establish a refcount ...
xa_unlock(&tty_minors);

EXCEPT ...

establishing a refcount currently involves taking a mutex. So you can't
do that. First, you have to convert the gb_tty mutex to a spinlock
(which looks fine to me), and then you can do this. But this is where
you need to work with the driver authors to make sure it's OK.