Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1504018pxb; Fri, 26 Feb 2021 12:28:48 -0800 (PST) X-Google-Smtp-Source: ABdhPJw1wgsn3Ho6ztlnEq9ZCcEnVm36PygCwd6igD31nCpCXUCtOwo4CDAajmxLAIEbc8utF39S X-Received: by 2002:a50:bf42:: with SMTP id g2mr5338602edk.101.1614371328642; Fri, 26 Feb 2021 12:28:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614371328; cv=none; d=google.com; s=arc-20160816; b=b1Y4FlhqqH/xnxLsL7HxWf7yStGdPQDNddiaWyM3/fxgI54gYarFZj5ja+ltkEapwb NgUNfLO6DZlgdEYu+LAgu9s/YoN3K+9/CvuvxtFYdkFWGWp3TgwBz1QM4WKI2+y8F4I+ JRHBIAx4NqIMUjddcpxsF4Gh4T3aTveF3IU7zmhkDTbu3i0KkLWigpedX2lSNVqrn96l 4ITIKHi+qG0fEgScHYsV6oeu6YAcDF5V71AYvvCidI9xpGXcNthW6qLqBDMCi3CvFYt0 T+KbMu9b53TqqbNP8DrNv3wtToRf6fdX3dMciTiddfFGxtgXziqtAQ/rf/rHeQrE6DC/ R5VA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:date:message-id:from:references:cc:to :subject:dkim-signature; bh=QFjGStjIzh6J7frNT2LEqGS+oMJPYJeHt/N3AzMgBWQ=; b=PTV8TWhs0WwvS4/2Tda+hnoAhPpfZ8/4iYW/88qT4x+HYpYCkPLB1i0/T1YHRp1rLa UtwO2SCTiYFTaTH3CTy5bEZc8vhtZnumY545/1p+o58ix0c6KY497x3kO8eahkcstLX6 C2v+jUa28TlWdSTw6Nh1qv3AcL5L0IA/eUaXNECvP2Yofk2UYdIHiQzvHI1lQZD7EaS7 5fFWnHidlNdsnFjK+CO9IySOkCuVLOdwBcqXvsTGEaImRMSRSUzR48dbzymDxT3eKst4 DJ2AR6wwJxyEGhcG+CzqomF46KRKbjPo7vmPc76BXgmQrsx+ZefBaFRSGHfFVjWlD3HV lr9w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@opensynergy.com header.s=srmailgate02 header.b=l9OojtCd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=opensynergy.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id yr5si3780585ejb.728.2021.02.26.12.28.26; Fri, 26 Feb 2021 12:28:48 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@opensynergy.com header.s=srmailgate02 header.b=l9OojtCd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=opensynergy.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230273AbhBZU06 (ORCPT + 99 others); Fri, 26 Feb 2021 15:26:58 -0500 Received: from mx1.opensynergy.com ([217.66.60.4]:4051 "EHLO mx1.opensynergy.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230253AbhBZURi (ORCPT ); Fri, 26 Feb 2021 15:17:38 -0500 Received: from SR-MAILGATE-02.opensynergy.com (localhost.localdomain [127.0.0.1]) by mx1.opensynergy.com (Proxmox) with ESMTP id 6E31BA16ED; Fri, 26 Feb 2021 21:16:44 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=opensynergy.com; h=cc:cc:content-transfer-encoding:content-type:content-type :date:from:from:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=srmailgate02; bh=QFjGStjIzh6J 7frNT2LEqGS+oMJPYJeHt/N3AzMgBWQ=; b=l9OojtCdVaM6d0+MvAfQmteavjL4 X1lEvn6/iVjdMQz8DQ6zTmmYEOqRgBJrg4aLFv9eSeKtjNzf5zSbqA/WTrpQ1nX+ 2WbMpxMH7CIj8P2uoE5SDtuev90SsA1qNMDQ1x8wK8EXc+qj7eKsAy66iScVi8z4 EIZlf0TKkNS2eRjH1rUnTdA9AnXKidJw8RG1cCUTqJdvpKynVNKHGVlpBe+L7SLp QcceqhEmbk/SKyAkbxUieHG6SWOGHtUofAFqQxjlylEkxNzuXdvJ2AY4zUwH+Dr8 gW3Hij5eESFSxpLqaLGfYcDw/OFV+jkw5NMd5Ftzi6TDBwCX5EWrWNYj8Q== Subject: Re: [PATCH v5 6/9] ALSA: virtio: PCM substream operators To: Takashi Iwai CC: "Michael S. Tsirkin" , , , , Jaroslav Kysela , Takashi Iwai , References: <20210222153444.348390-1-anton.yakovlev@opensynergy.com> <20210222153444.348390-7-anton.yakovlev@opensynergy.com> <20210225135951-mutt-send-email-mst@kernel.org> <0a9f6dea-ed75-16eb-9fc2-84148fa820be@opensynergy.com> From: Anton Yakovlev Message-ID: <8243d984-0482-b9b5-e779-9f3f723d48ed@opensynergy.com> Date: Fri, 26 Feb 2021 21:16:41 +0100 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8"; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-ClientProxiedBy: SR-MAIL-02.open-synergy.com (10.26.10.22) To SR-MAIL-02.open-synergy.com (10.26.10.22) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 26.02.2021 15:23, Takashi Iwai wrote: > 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. Yes, I also got an impression, that without some assistance somewhere from the bus it will hardly be possible to find a suitable solution. Ok, then I will postpone this feature at the moment. > > thanks, > > Takashi > -- Anton Yakovlev Senior Software Engineer OpenSynergy GmbH Rotherstr. 20, 10245 Berlin