From patchwork Tue Aug 2 12:14:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?SsO8cmdlbiBHcm/Dnw==?= X-Patchwork-Id: 9256459 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C985A6089F for ; Tue, 2 Aug 2016 12:16:57 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BAAA528512 for ; Tue, 2 Aug 2016 12:16:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AF2DB28522; Tue, 2 Aug 2016 12:16:57 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 2854928521 for ; Tue, 2 Aug 2016 12:16:57 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bUYaL-0004uo-0u; Tue, 02 Aug 2016 12:14:13 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bUYaJ-0004uQ-JO for xen-devel@lists.xensource.com; Tue, 02 Aug 2016 12:14:11 +0000 Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id B4/FF-24990-29E80A75; Tue, 02 Aug 2016 12:14:10 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrILMWRWlGSWpSXmKPExsVyuP0Ov+6kvgX hBst+iFncm/Ke3YHRY3vfLvYAxijWzLyk/IoE1ow5/66xF5yQqOg9cI+5gXGlUBcjJ4eEgJHE 24n/mLoYuTiEBBYySnTf/8cOkmATUJXYcP0UK4gtImApMWt9G5jNLJAjcf5wB1iNsICfxPIvd 8HiLED1j68vYwaxeQXsJTp+TmaBWCAncX3mdKAFHBycAg4S5+54gISFgEomLehhn8DIvYCRYR WjRnFqUVlqka6RoV5SUWZ6RkluYmaOrqGBqV5uanFxYnpqTmJSsV5yfu4mRqB36xkYGHcw3p3 sd4hRkoNJSZTX5cv8cCG+pPyUyozE4oz4otKc1OJDjDIcHEoSvPa9C8KFBItS01Mr0jJzgGEG k5bg4FES4a0ASfMWFyTmFmemQ6ROMepyLNn1YC2TEEtefl6qlDgvD0iRAEhRRmke3AhYyF9il JUS5mVkYGAQ4ilILcrNLEGVf8UozsGoJMybATKFJzOvBG7TK6AjmICOOGEAdkRJIkJKqoExYv Py9xN3HSpt9lhzK4xL4lnT8Y9ljw8ZbWIyYoxp2xw97w3jyimh6Y7556eX/G6YV8fjpfH1vxv /ocg3Ukebu2Zv1M9yujl9ozf3bE3Xoq6bc3RNQzuy/PvPmHb1TXSTX23btfdYblI6l1W3fG7z 3mxdxqPKd7Q3FV9mkj6y4c9sDnmvqndKLMUZiYZazEXFiQBXHjwxdAIAAA== X-Env-Sender: jgross@suse.com X-Msg-Ref: server-15.tower-206.messagelabs.com!1470140049!40484439!1 X-Originating-IP: [195.135.220.15] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.77; banners=-,-,- X-VirusChecked: Checked Received: (qmail 43518 invoked from network); 2 Aug 2016 12:14:10 -0000 Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by server-15.tower-206.messagelabs.com with DHE-RSA-CAMELLIA256-SHA encrypted SMTP; 2 Aug 2016 12:14:10 -0000 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 7CEDBAC7A; Tue, 2 Aug 2016 12:14:09 +0000 (UTC) From: Juergen Gross To: qemu-devel@nongnu.org, xen-devel@lists.xensource.com Date: Tue, 2 Aug 2016 14:14:03 +0200 Message-Id: <1470140044-16492-2-git-send-email-jgross@suse.com> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1470140044-16492-1-git-send-email-jgross@suse.com> References: <1470140044-16492-1-git-send-email-jgross@suse.com> Cc: anthony.perard@citrix.com, Juergen Gross , sstabellini@kernel.org, kraxel@redhat.com Subject: [Xen-devel] [PATCH v2 1/2] xen: when removing a backend don't remove many of them X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP When a Xenstore watch fires indicating a backend has to be removed don't remove all backends for that domain with the specified device index, but just the one which has the correct type. The easiest way to achieve this is to use the already determined xendev as parameter for xen_be_del_xendev() instead of only the domid and device index. This at once removes the open coded QTAILQ_FOREACH_SAVE() in xen_be_del_xendev() as there is no need to search for the correct xendev any longer. Signed-off-by: Juergen Gross Reviewed-by: Stefano Stabellini --- hw/xen/xen_backend.c | 58 +++++++++++++++++----------------------------------- 1 file changed, 19 insertions(+), 39 deletions(-) diff --git a/hw/xen/xen_backend.c b/hw/xen/xen_backend.c index bab79b1..3ceb778 100644 --- a/hw/xen/xen_backend.c +++ b/hw/xen/xen_backend.c @@ -321,48 +321,28 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev, /* * release xen backend device. */ -static struct XenDevice *xen_be_del_xendev(int dom, int dev) +static void xen_be_del_xendev(struct XenDevice *xendev) { - struct XenDevice *xendev, *xnext; - - /* - * This is pretty much like QTAILQ_FOREACH(xendev, &xendevs, next) but - * we save the next pointer in xnext because we might free xendev. - */ - xnext = xendevs.tqh_first; - while (xnext) { - xendev = xnext; - xnext = xendev->next.tqe_next; - - if (xendev->dom != dom) { - continue; - } - if (xendev->dev != dev && dev != -1) { - continue; - } - - if (xendev->ops->free) { - xendev->ops->free(xendev); - } - - if (xendev->fe) { - char token[XEN_BUFSIZE]; - snprintf(token, sizeof(token), "fe:%p", xendev); - xs_unwatch(xenstore, xendev->fe, token); - g_free(xendev->fe); - } + if (xendev->ops->free) { + xendev->ops->free(xendev); + } - if (xendev->evtchndev != NULL) { - xenevtchn_close(xendev->evtchndev); - } - if (xendev->gnttabdev != NULL) { - xengnttab_close(xendev->gnttabdev); - } + if (xendev->fe) { + char token[XEN_BUFSIZE]; + snprintf(token, sizeof(token), "fe:%p", xendev); + xs_unwatch(xenstore, xendev->fe, token); + g_free(xendev->fe); + } - QTAILQ_REMOVE(&xendevs, xendev, next); - g_free(xendev); + if (xendev->evtchndev != NULL) { + xenevtchn_close(xendev->evtchndev); } - return NULL; + if (xendev->gnttabdev != NULL) { + xengnttab_close(xendev->gnttabdev); + } + + QTAILQ_REMOVE(&xendevs, xendev, next); + g_free(xendev); } /* @@ -682,7 +662,7 @@ static void xenstore_update_be(char *watch, char *type, int dom, if (xendev != NULL) { bepath = xs_read(xenstore, 0, xendev->be, &len); if (bepath == NULL) { - xen_be_del_xendev(dom, dev); + xen_be_del_xendev(xendev); } else { free(bepath); xen_be_backend_changed(xendev, path);