All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: Anton Yakovlev <anton.yakovlev@opensynergy.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>,
	<virtualization@lists.linux-foundation.org>,
	<alsa-devel@alsa-project.org>, <virtio-dev@lists.oasis-open.org>,
	Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
	<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v5 6/9] ALSA: virtio: PCM substream operators
Date: Fri, 26 Feb 2021 15:23:37 +0100	[thread overview]
Message-ID: <s5ha6rqnc0m.wl-tiwai@suse.de> (raw)
In-Reply-To: <0a9f6dea-ed75-16eb-9fc2-84148fa820be@opensynergy.com>

On Thu, 25 Feb 2021 23:19:31 +0100,
Anton Yakovlev wrote:
> 
> On 25.02.2021 21:30, Takashi Iwai wrote:> On Thu, 25 Feb 2021 20:02:50
> +0100,
> > Michael S. Tsirkin wrote:
> >>
> >> On Thu, Feb 25, 2021 at 01:51:16PM +0100, Takashi Iwai wrote:
> >>> On Thu, 25 Feb 2021 13:14:37 +0100,
> >>> Anton Yakovlev wrote:
> 
> 
> [snip]
> 
> 
> >> Takashi given I was in my tree for a while and I planned to merge
> >> it this merge window.
> >
> > Hmm, that's too quick, I'm afraid.  I see still a few rough edges in
> > the code.  e.g. the reset work should be canceled at the driver
> > removal, but it's missing right now.  And that'll become tricky
> > because the reset work itself unbinds the device, hence it'll get
> > stuck if calling cancel_work_sync() at remove callback.
> 
> Yes, you made a good point here! In this case, we need some external
> mutex for synchronization. This is just a rough idea, but maybe
> something like this might work:
> 
> struct reset_work {
>     struct mutex mutex;
>     struct work_struct work;
>     struct virtio_snd *snd;
>     bool resetting;
> };
> 
> static struct reset_work reset_works[SNDRV_CARDS];
> 
> init()
>     // init mutexes and workers
> 
> 
> virtsnd_probe()
>     snd_card_new(snd->card)
>     reset_works[snd->card->number].snd = snd;
> 
> 
> virtsnd_remove()
>     mutex_lock(reset_works[snd->card->number].mutex)
>     reset_works[snd->card->number].snd = NULL;
>     resetting = reset_works[snd->card->number].resetting;
>     mutex_unlock(reset_works[snd->card->number].mutex)
> 
>     if (!resetting)
>         // cancel worker reset_works[snd->card->number].work
>     // remove device
> 
> 
> virtsnd_reset_fn(work)
>     mutex_lock(work->mutex)
>     if (!work->snd)
>         // do nothing and take an exit path
>     work->resetting = true;
>     mutex_unlock(work->mutex)
> 
>     device_reprobe()
> 
>     work->resetting = false;
> 
> 
> interrupt_handler()
>     schedule_work(reset_works[snd->card->number].work);
> 
> 
> What do you think?

I think it's still somehow racy.  Suppose that the reset_work is
already running right before entering virtsnd_remove(): it sets
reset_works[].resetting flag, virtsnd_remove() skips canceling, and
both reset work and virtsnd_remove() perform at the very same time.
(I don't know whether this may happen, but I assume it's possible.)

In that case, maybe a better check is to check current_work(), and
perform cancel_work_sync() unless it's &reset_works[].work itself.
Then the recursive cancel call can be avoided.

After that point, the reset must be completed, and we can (again)
process the rest release procedure.  (But also snd object itself might
have been changed again, so it needs to be re-evaluated.)

One remaining concern is that the card number of the sound instance
may change after reprobe.  That is, we may want to another persistent
object instead of accessing via an array index of sound card number.
So, we might need reset_works[] associated with virtio_snd object
instead.

In anyway, this is damn complex.  I sincerely hope that we can avoid
this kind of things.  Wouldn't it be better to shift the reset stuff
up to the virtio core layer?  Or drop the feature in the first
version.  Shooting itself (and revival) is a dangerous magic spell,
after all.


thanks,

Takashi

WARNING: multiple messages have this Message-ID (diff)
From: Takashi Iwai <tiwai@suse.de>
To: Anton Yakovlev <anton.yakovlev@opensynergy.com>
Cc: virtio-dev@lists.oasis-open.org, alsa-devel@alsa-project.org,
	"Michael S. Tsirkin" <mst@redhat.com>,
	linux-kernel@vger.kernel.org, Takashi Iwai <tiwai@suse.com>,
	virtualization@lists.linux-foundation.org
Subject: Re: [PATCH v5 6/9] ALSA: virtio: PCM substream operators
Date: Fri, 26 Feb 2021 15:23:37 +0100	[thread overview]
Message-ID: <s5ha6rqnc0m.wl-tiwai@suse.de> (raw)
In-Reply-To: <0a9f6dea-ed75-16eb-9fc2-84148fa820be@opensynergy.com>

On Thu, 25 Feb 2021 23:19:31 +0100,
Anton Yakovlev wrote:
> 
> On 25.02.2021 21:30, Takashi Iwai wrote:> On Thu, 25 Feb 2021 20:02:50
> +0100,
> > Michael S. Tsirkin wrote:
> >>
> >> On Thu, Feb 25, 2021 at 01:51:16PM +0100, Takashi Iwai wrote:
> >>> On Thu, 25 Feb 2021 13:14:37 +0100,
> >>> Anton Yakovlev wrote:
> 
> 
> [snip]
> 
> 
> >> Takashi given I was in my tree for a while and I planned to merge
> >> it this merge window.
> >
> > Hmm, that's too quick, I'm afraid.  I see still a few rough edges in
> > the code.  e.g. the reset work should be canceled at the driver
> > removal, but it's missing right now.  And that'll become tricky
> > because the reset work itself unbinds the device, hence it'll get
> > stuck if calling cancel_work_sync() at remove callback.
> 
> Yes, you made a good point here! In this case, we need some external
> mutex for synchronization. This is just a rough idea, but maybe
> something like this might work:
> 
> struct reset_work {
>     struct mutex mutex;
>     struct work_struct work;
>     struct virtio_snd *snd;
>     bool resetting;
> };
> 
> static struct reset_work reset_works[SNDRV_CARDS];
> 
> init()
>     // init mutexes and workers
> 
> 
> virtsnd_probe()
>     snd_card_new(snd->card)
>     reset_works[snd->card->number].snd = snd;
> 
> 
> virtsnd_remove()
>     mutex_lock(reset_works[snd->card->number].mutex)
>     reset_works[snd->card->number].snd = NULL;
>     resetting = reset_works[snd->card->number].resetting;
>     mutex_unlock(reset_works[snd->card->number].mutex)
> 
>     if (!resetting)
>         // cancel worker reset_works[snd->card->number].work
>     // remove device
> 
> 
> virtsnd_reset_fn(work)
>     mutex_lock(work->mutex)
>     if (!work->snd)
>         // do nothing and take an exit path
>     work->resetting = true;
>     mutex_unlock(work->mutex)
> 
>     device_reprobe()
> 
>     work->resetting = false;
> 
> 
> interrupt_handler()
>     schedule_work(reset_works[snd->card->number].work);
> 
> 
> What do you think?

I think it's still somehow racy.  Suppose that the reset_work is
already running right before entering virtsnd_remove(): it sets
reset_works[].resetting flag, virtsnd_remove() skips canceling, and
both reset work and virtsnd_remove() perform at the very same time.
(I don't know whether this may happen, but I assume it's possible.)

In that case, maybe a better check is to check current_work(), and
perform cancel_work_sync() unless it's &reset_works[].work itself.
Then the recursive cancel call can be avoided.

After that point, the reset must be completed, and we can (again)
process the rest release procedure.  (But also snd object itself might
have been changed again, so it needs to be re-evaluated.)

One remaining concern is that the card number of the sound instance
may change after reprobe.  That is, we may want to another persistent
object instead of accessing via an array index of sound card number.
So, we might need reset_works[] associated with virtio_snd object
instead.

In anyway, this is damn complex.  I sincerely hope that we can avoid
this kind of things.  Wouldn't it be better to shift the reset stuff
up to the virtio core layer?  Or drop the feature in the first
version.  Shooting itself (and revival) is a dangerous magic spell,
after all.


thanks,

Takashi

  reply	other threads:[~2021-02-26 14:25 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-22 15:34 [PATCH v5 0/9] ALSA: add virtio sound driver Anton Yakovlev
2021-02-22 15:34 ` [virtio-dev] " Anton Yakovlev
2021-02-22 15:34 ` Anton Yakovlev
2021-02-22 15:34 ` [PATCH v5 1/9] uapi: virtio_ids: add a sound device type ID from OASIS spec Anton Yakovlev
2021-02-22 15:34   ` [virtio-dev] " Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34 ` [PATCH v5 2/9] ALSA: virtio: add virtio sound driver Anton Yakovlev
2021-02-22 15:34   ` [virtio-dev] " Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-25 10:38   ` Takashi Iwai
2021-02-25 10:38     ` Takashi Iwai
2021-02-25 10:39     ` Takashi Iwai
2021-02-25 10:39       ` Takashi Iwai
2021-02-25 11:51     ` Anton Yakovlev
2021-02-25 11:51       ` [virtio-dev] " Anton Yakovlev
2021-02-25 11:51       ` Anton Yakovlev
2021-02-25 11:51       ` Anton Yakovlev
2021-02-25 12:08       ` Takashi Iwai
2021-02-25 12:08         ` Takashi Iwai
2021-02-22 15:34 ` [PATCH v5 3/9] ALSA: virtio: handling control messages Anton Yakovlev
2021-02-22 15:34   ` [virtio-dev] " Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34 ` [PATCH v5 4/9] ALSA: virtio: build PCM devices and substream hardware descriptors Anton Yakovlev
2021-02-22 15:34   ` [virtio-dev] " Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34 ` [PATCH v5 5/9] ALSA: virtio: handling control and I/O messages for the PCM device Anton Yakovlev
2021-02-22 15:34   ` [virtio-dev] " Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-25 10:45   ` Takashi Iwai
2021-02-25 10:45     ` Takashi Iwai
2021-02-22 15:34 ` [PATCH v5 6/9] ALSA: virtio: PCM substream operators Anton Yakovlev
2021-02-22 15:34   ` [virtio-dev] " Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-25 10:55   ` Takashi Iwai
2021-02-25 10:55     ` Takashi Iwai
2021-02-25 12:14     ` Anton Yakovlev
2021-02-25 12:14       ` [virtio-dev] " Anton Yakovlev
2021-02-25 12:14       ` Anton Yakovlev
2021-02-25 12:14       ` Anton Yakovlev
2021-02-25 12:51       ` Takashi Iwai
2021-02-25 12:51         ` Takashi Iwai
2021-02-25 19:02         ` Michael S. Tsirkin
2021-02-25 19:02           ` [virtio-dev] " Michael S. Tsirkin
2021-02-25 19:02           ` Michael S. Tsirkin
2021-02-25 19:02           ` Michael S. Tsirkin
2021-02-25 20:30           ` Takashi Iwai
2021-02-25 20:30             ` Takashi Iwai
2021-02-25 22:19             ` Anton Yakovlev
2021-02-25 22:19               ` [virtio-dev] " Anton Yakovlev
2021-02-25 22:19               ` Anton Yakovlev
2021-02-25 22:19               ` Anton Yakovlev
2021-02-26 14:23               ` Takashi Iwai [this message]
2021-02-26 14:23                 ` Takashi Iwai
2021-02-26 20:16                 ` Anton Yakovlev
2021-02-26 20:16                   ` [virtio-dev] " Anton Yakovlev
2021-02-26 20:16                   ` Anton Yakovlev
2021-02-26 20:16                   ` Anton Yakovlev
2021-02-26 20:19             ` Anton Yakovlev
2021-02-26 20:19               ` [virtio-dev] " Anton Yakovlev
2021-02-26 20:19               ` Anton Yakovlev
2021-02-26 20:19               ` Anton Yakovlev
2021-02-27  7:50               ` Takashi Iwai
2021-02-27  7:50                 ` Takashi Iwai
2021-02-22 15:34 ` [PATCH v5 7/9] ALSA: virtio: introduce jack support Anton Yakovlev
2021-02-22 15:34   ` [virtio-dev] " Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34 ` [PATCH v5 8/9] ALSA: virtio: introduce PCM channel map support Anton Yakovlev
2021-02-22 15:34   ` [virtio-dev] " Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34 ` [PATCH v5 9/9] ALSA: virtio: introduce device suspend/resume support Anton Yakovlev
2021-02-22 15:34   ` [virtio-dev] " Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-22 15:34   ` Anton Yakovlev
2021-02-23 12:09 ` [PATCH v5 0/9] ALSA: add virtio sound driver Michael S. Tsirkin
2021-02-23 12:09   ` [virtio-dev] " Michael S. Tsirkin
2021-02-23 12:09   ` Michael S. Tsirkin
2021-02-23 12:33   ` [virtio-dev] " Anton Yakovlev
2021-02-23 12:33     ` Anton Yakovlev
2021-02-23 12:33     ` Anton Yakovlev
2021-02-23 12:59     ` Michael S. Tsirkin
2021-02-23 12:59       ` Michael S. Tsirkin
2021-02-23 12:59       ` Michael S. Tsirkin

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=s5ha6rqnc0m.wl-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=anton.yakovlev@opensynergy.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=perex@perex.cz \
    --cc=tiwai@suse.com \
    --cc=virtio-dev@lists.oasis-open.org \
    --cc=virtualization@lists.linux-foundation.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.