Received: by 10.223.176.5 with SMTP id f5csp1476523wra; Wed, 31 Jan 2018 07:02:49 -0800 (PST) X-Google-Smtp-Source: AH8x22662ShvWQ5uLW16wdmp1BSjaifcViSO45/QSLj+CKDaKy/Y8Tr+H55HcnA6oTSjHfwPLItF X-Received: by 10.101.82.1 with SMTP id o1mr26295222pgp.259.1517410937089; Wed, 31 Jan 2018 07:02:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517410936; cv=none; d=google.com; s=arc-20160816; b=s2qBQu9vw3Hn/S9LE+r4jP3PI398eHH2D7RliD7lNyPljIXajuCuh/R7EmsQBpS8bi PmJ3yK3Ren9PrxycwqUVx+LYiyLwYcNnmOpPrgd7R0rjbdKEACBZ5sW+MRzgfuv2VrWE CYLo8ojwQhz7YSNPqijUbHqx3m6171QSJe5bFCFoag/kAvST08ZhNMijZUvJvloJ+pBK Xt/K/Qlx5uxVZA3YfENZBbegqZRtqrWe/redg94Atclyu7sdh5yNiA8gWcObjUQ6iVbG 6f5Tsp3jgSHrANeQBJlMeUx6HfjcPqMr/njzpkr2PUFMsKv/G6JoaOvfpeCMoMq/P5bx FA/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-language :content-transfer-encoding:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature :arc-authentication-results; bh=oc76H4+MxIh6TvF1Pdio9GA2X9yccBl+tC8gP4AsrYE=; b=O/NQg7mTapbWrB/6pEjcNHtd2gyXPAnewlTlSq5R+SHee/zbwDquUHW9HvTgveolvn OkTTx0gZ9XFnhUeOKIQOW5pAGMBfBww5eVyN1vRUZRyQkpLEV15o0KLMKE331I2q83OQ 1GGp6KjAuACjF6fNd523u9V31CmEAe6YirQujaZ9zaQOfB8r6YFNJl1c6B3Z/3CTjHAN o0kyFDG1AruM4zh65mFKIuCbAGoMMTD43NfsD5s1UISDWhHvTVd4p9GYIu8+JbEtbUYJ Sio1g8sROXZO4YoEpvNXzQdV5rYhdmPyhWVxxhTLXYJhwLo5JNVQ7uJsnJ0JE2AQa02C ft9w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Yx+offMI; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q14si2259659pfh.17.2018.01.31.07.02.01; Wed, 31 Jan 2018 07:02:16 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Yx+offMI; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752716AbeAaPA3 (ORCPT + 99 others); Wed, 31 Jan 2018 10:00:29 -0500 Received: from mail-lf0-f66.google.com ([209.85.215.66]:46599 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751001AbeAaPA1 (ORCPT ); Wed, 31 Jan 2018 10:00:27 -0500 Received: by mail-lf0-f66.google.com with SMTP id q194so21133218lfe.13; Wed, 31 Jan 2018 07:00:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding:content-language; bh=oc76H4+MxIh6TvF1Pdio9GA2X9yccBl+tC8gP4AsrYE=; b=Yx+offMIOQhBcwB1jnKUNjgiKY73K6yUoKZXIrU7TpuEPgsrsbnutrOHtBGhnwFWac 9WNrVeaIpHT95T6A4nvE0GZNcB2yApDuoDNU2fh4p1Gq08jSEYQx1QTjF4kjti40ccEg 2MZ9xiyRFKUVYcMsZeNFinnPu0xK7NVN1ERkHAmLUJqdEgLmbv0YxcgTFeacgscLhRAD NxwR4EPqMET1+s8x8rPnNOFqoFzKrviTdYDA1y+mxze9NcQBq7r0PhoTDnTcCr4lKJ8I Mdg3S0V3K/gz9yKARmmoiAXd1zJT5kSAwaRCPPMJL9k5LF7IYfQ6Yje4/eiZWB11DQHo u/8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=oc76H4+MxIh6TvF1Pdio9GA2X9yccBl+tC8gP4AsrYE=; b=Pg3JJizEt7Z210xEnKofPKZ3taO+uj9aGKtVoA7ZvSe0/1DgAsUy3Berdv6r0Vxxhh wjAeQkP34RN6g+8/69Lzo6D3q7HeCeriso9Agcz6uYzsXWMJO+V7JCaxmqkpTZaHUTVu I5tdGQu1XdNnrV6MTpAyok9jXUQ9XTHMCIuGdzZmidm8u5ci8QsY5wcGbW7QtR/1RJW9 iAD7KAF4a7XAxLn7TMh+VPvoOug+FyrHhG5smW6HBBlJEzGg+4svHjvn0vL88ybpoKWo UhIvAaPgd0pHCO52DZvokx/6jEfHvgBQbI1s/o7unHST7EUWJjEIalX/UEqRWuYd5t+w 6N4g== X-Gm-Message-State: AKwxytesfy8QDOUk3DFF0+f2uTMuptK26moFG2+/8i3jag420mbfbjzY RhM0rlXrDdts8EZyLUofggc= X-Received: by 10.25.202.9 with SMTP id a9mr19426126lfg.144.1517410825423; Wed, 31 Jan 2018 07:00:25 -0800 (PST) Received: from [10.17.182.9] (ll-74.141.223.85.sovam.net.ua. [85.223.141.74]) by smtp.gmail.com with ESMTPSA id u87sm3975923lfk.8.2018.01.31.07.00.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 31 Jan 2018 07:00:24 -0800 (PST) Subject: Re: [Xen-devel] [PATCHv2] xen-netfront: remove warning when unloading module To: Eduardo Otubo , xen-devel@lists.xenproject.org Cc: jgross@suse.com, wei.liu2@citrix.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, paul.durrant@citrix.com, cheshi@redhat.com, vkuznets@redhat.com, mgamal@redhat.com, cavery@redhat.com, boris.ostrovsky@oracle.com References: <20171123141835.5820-1-otubo@redhat.com> From: Oleksandr Andrushchenko Message-ID: Date: Wed, 31 Jan 2018 17:00:23 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <20171123141835.5820-1-otubo@redhat.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, Eduardo! I am working on a frontend driver (PV DRM) and also seeing some strange things on driver unloading: xt# rmmod -f drm_xen_front.ko [ 3236.462497] [drm] Unregistering XEN PV vdispl [ 3236.485745] [drm:xen_drv_remove [drm_xen_front]] *ERROR* Backend state is InitWait while removing driver [ 3236.486950] vdispl vdispl-0: 22 freeing event channel 11 [ 3236.496123] vdispl vdispl-0: failed to write error node for device/vdispl/0 (22 freeing event channel 11) [ 3236.496271] vdispl vdispl-0: 22 freeing event channel 12 [ 3236.501633] vdispl vdispl-0: failed to write error node for device/vdispl/0 (22 freeing event channel 12) These are somewhat different from your use-case with grant references, but I have a question: do you really see that XenbusStateClosed and XenbusStateClosing are called? In my driver I can't see those and once I tried to dig deeper into the problem I saw that on driver removal it is disconnected from XenBus, so no backend state change events come in via .otherend_changed callback. The only difference I see here is that the backend is a user-space application Thank you, Oleksandr On 11/23/2017 04:18 PM, Eduardo Otubo wrote: > v2: > * Replace busy wait with wait_event()/wake_up_all() > * Cannot garantee that at the time xennet_remove is called, the > xen_netback state will not be XenbusStateClosed, so added a > condition for that > * There's a small chance for the xen_netback state is > XenbusStateUnknown by the time the xen_netfront switches to Closed, > so added a condition for that. > > When unloading module xen_netfront from guest, dmesg would output > warning messages like below: > > [ 105.236836] xen:grant_table: WARNING: g.e. 0x903 still in use! > [ 105.236839] deferring g.e. 0x903 (pfn 0x35805) > > This problem relies on netfront and netback being out of sync. By the time > netfront revokes the g.e.'s netback didn't have enough time to free all of > them, hence displaying the warnings on dmesg. > > The trick here is to make netfront to wait until netback frees all the g.e.'s > and only then continue to cleanup for the module removal, and this is done by > manipulating both device states. > > Signed-off-by: Eduardo Otubo > --- > drivers/net/xen-netfront.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c > index 8b8689c6d887..391432e2725d 100644 > --- a/drivers/net/xen-netfront.c > +++ b/drivers/net/xen-netfront.c > @@ -87,6 +87,8 @@ struct netfront_cb { > /* IRQ name is queue name with "-tx" or "-rx" appended */ > #define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3) > > +static DECLARE_WAIT_QUEUE_HEAD(module_unload_q); > + > struct netfront_stats { > u64 packets; > u64 bytes; > @@ -2021,10 +2023,12 @@ static void netback_changed(struct xenbus_device *dev, > break; > > case XenbusStateClosed: > + wake_up_all(&module_unload_q); > if (dev->state == XenbusStateClosed) > break; > /* Missed the backend's CLOSING state -- fallthrough */ > case XenbusStateClosing: > + wake_up_all(&module_unload_q); > xenbus_frontend_closed(dev); > break; > } > @@ -2130,6 +2134,20 @@ static int xennet_remove(struct xenbus_device *dev) > > dev_dbg(&dev->dev, "%s\n", dev->nodename); > > + if (xenbus_read_driver_state(dev->otherend) != XenbusStateClosed) { > + xenbus_switch_state(dev, XenbusStateClosing); > + wait_event(module_unload_q, > + xenbus_read_driver_state(dev->otherend) == > + XenbusStateClosing); > + > + xenbus_switch_state(dev, XenbusStateClosed); > + wait_event(module_unload_q, > + xenbus_read_driver_state(dev->otherend) == > + XenbusStateClosed || > + xenbus_read_driver_state(dev->otherend) == > + XenbusStateUnknown); > + } > + > xennet_disconnect_backend(info); > > unregister_netdev(info->netdev);