From nobody Mon Feb 9 16:19:00 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1628778216; cv=none; d=zohomail.com; s=zohoarc; b=gQbNp8V1+gyMwFEfJuPbCFW+ICdSUD7zmFr9oZ8zVaIY8hR1w7fpTN29oz68QqAY0OV7TFuPoGjrCBOYuSpA1ICoBzf2yavlJEkWvBw6Jg9cajtvA2+wJgY5qT+Bvi480CZ81+QdqmEoQ+xHPbdyt6fVPmEBSuajopS2u25jruE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1628778216; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=fF0wInCslqTLQh+Fbjb4/Af105vv4ysHAegwrEvgNV8=; b=aDzB19lT869vw4ABEBfCgIs2QZcF1nv8ozsLJXHb7hfvCMFHc7XEjVVS5Am05r5TXJQkaexoFdTbGS/3wwQy1Gj1QyVxmEOfiX9f9xiqGkcRUQHCh65B0o16DVtiJJg0+kt4jKcq6+Z1SzUfDgggWcgpzTFJJ9qxB85WMS6TaDg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1628778216244237.7083330805632; Thu, 12 Aug 2021 07:23:36 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.166483.303888 (Exim 4.92) (envelope-from ) id 1mEBcA-0006qT-SW; Thu, 12 Aug 2021 14:23:22 +0000 Received: by outflank-mailman (output) from mailman id 166483.303888; Thu, 12 Aug 2021 14:23:22 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mEBcA-0006qF-O2; Thu, 12 Aug 2021 14:23:22 +0000 Received: by outflank-mailman (input) for mailman id 166483; Thu, 12 Aug 2021 14:23:21 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mEBc8-0002Q2-Vs for xen-devel@lists.xenproject.org; Thu, 12 Aug 2021 14:23:21 +0000 Received: from mail-lf1-x136.google.com (unknown [2a00:1450:4864:20::136]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id db15243a-4c8e-4db6-8c86-b145e29ded7f; Thu, 12 Aug 2021 14:22:43 +0000 (UTC) Received: by mail-lf1-x136.google.com with SMTP id z20so13830951lfd.2 for ; Thu, 12 Aug 2021 07:22:43 -0700 (PDT) Received: from localhost.localdomain (host-176-36-213-80.b024.la.net.ua. [176.36.213.80]) by smtp.gmail.com with ESMTPSA id s16sm329678ljj.48.2021.08.12.07.22.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Aug 2021 07:22:41 -0700 (PDT) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: db15243a-4c8e-4db6-8c86-b145e29ded7f DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fF0wInCslqTLQh+Fbjb4/Af105vv4ysHAegwrEvgNV8=; b=Ve7AJGKRku9ZVNMC2JNKBULinWP6TztmfyDhHotFGk8aNVwpO/+p1cMs8cnJ4hSlNk 3EaUfi7v8yBA/Gc7Emcp7oV7MC6HDE/QnMYwkfMZClIqEOxUPuxPvsJtZzc/jcYbEV3n a/ISC8EIQBVKHk1YZlUil0Xl+wcZ/MdqwcbVQfEfjlLSjKAQWXU+l/hKFLQ297HhdSu3 nAlpSwzNwMDZ5Ri8uOjByEMV8K4lVZplrKC0DI9BN/iuuj0ullGaMgQfgyEJevzz+9rT rDCVCPVvaL6Iv0TTC8jqDbKOHshkaO8DmxY6CHLK/baX79YOBClGJvvrqqsTGyp7uewC R45w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fF0wInCslqTLQh+Fbjb4/Af105vv4ysHAegwrEvgNV8=; b=DpbLHqg3MyaYvTaNProZ4hlamKWurjtKpU5kqB4ssC5BuSPsjD6ojdlw0VRq23v+wv eeAelN/d5VUlqQxu9qRgwT8F9095vH4JYb7MdOBdHnjyH9T6vedpDBUIK6Fnuy36R9GC kNTAyk3zSjA0Pov6B0D44OwkT97bljy5d2M4b9cNzfQ0WdtTm4wK0q2nYtQaICcQJWJn BYF1zSGl7ILuX9zoxHrAMcDwU00RUwHGFzgi8zNIqS11nX7pppNHKR7HNSLzW3qCnO67 j/S2XqCgUDMKu55bBQwM6as+uLXh0ZUxiG3QaY+gRx6Jwvcyr/5TaVeBQ1WAbJhei+/i dWnA== X-Gm-Message-State: AOAM532stQiKF9T7wqNXvQkdl73l+dE33JTf2gc/Fpx9cCELwZqhsfUv /48oYgsI2JiN5O8AfbGvTdB0HGSSCgHgOg== X-Google-Smtp-Source: ABdhPJwrGBoi301pR4qIn8rI0NK6QKJqJOB5rjIuuUqbLBpA6iIl2wUOg6077nFXDEMgesdUwig7pA== X-Received: by 2002:a05:6512:118a:: with SMTP id g10mr2708865lfr.491.1628778162524; Thu, 12 Aug 2021 07:22:42 -0700 (PDT) From: Anastasiia Lukianenko To: xen-devel@lists.xenproject.org Cc: oleksandr_tyshchenko@epam.com, artem_mygaiev@epam.com, rahul.singh@arm.com, bertrand.marquis@arm.com, oleksandr_andrushchenko@epam.com, roger.pau@citrix.com, julien@xen.org, sstabellini@kernel.org, andr2000@gmail.com, vicooodin@gmail.com, Anastasiia Lukianenko Subject: [PATCH 9/9] tools/libs/light: Add "reset" and "remove" PCI dev commands to xl pcid daemon and libxl PCI Date: Thu, 12 Aug 2021 17:22:30 +0300 Message-Id: <20210812142230.19353-10-vicooodin@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210812142230.19353-1-vicooodin@gmail.com> References: <20210812142230.19353-1-vicooodin@gmail.com> X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1628778217072100005 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Anastasiia Lukianenko Add "reset" command processing to xl pcid daemon. Make possible sending "reset"/"remove" PCI device requests from libxl PCI to xl pcid daemon instead of using sysfs on libxl side. Signed-off-by: Anastasiia Lukianenko --- tools/include/pcid.h | 1 + tools/libs/light/libxl_pci.c | 94 +++++++++++++++++++---------------- tools/libs/light/libxl_pcid.c | 63 +++++++++++++++++++++++ 3 files changed, 115 insertions(+), 43 deletions(-) diff --git a/tools/include/pcid.h b/tools/include/pcid.h index 3153bafb19..38ea06c602 100644 --- a/tools/include/pcid.h +++ b/tools/include/pcid.h @@ -30,6 +30,7 @@ =20 #define PCID_CMD_LIST "ls" #define PCID_CMD_UNBIND "unbind" +#define PCID_CMD_RESET "reset" #define PCID_CMD_DIR_ID "dir_id" =20 #define PCID_CMD_WRITE "write" diff --git a/tools/libs/light/libxl_pci.c b/tools/libs/light/libxl_pci.c index 3d9bf4830b..0498baa47e 100644 --- a/tools/libs/light/libxl_pci.c +++ b/tools/libs/light/libxl_pci.c @@ -1635,37 +1635,26 @@ static int libxl__device_pci_reset(libxl__gc *gc, u= nsigned int domain, unsigned unsigned int dev, unsigned int func) { char *reset; - int fd, rc; - - reset =3D GCSPRINTF("%s/do_flr", SYSFS_PCIBACK_DRIVER); - fd =3D open(reset, O_WRONLY); - if (fd >=3D 0) { - char *buf =3D GCSPRINTF(PCI_BDF, domain, bus, dev, func); - rc =3D write(fd, buf, strlen(buf)); - if (rc < 0) - LOGD(ERROR, domain, "write to %s returned %d", reset, rc); - close(fd); - return rc < 0 ? rc : 0; - } - if (errno !=3D ENOENT) - LOGED(ERROR, domain, "Failed to access pciback path %s", reset); - reset =3D GCSPRINTF("%s/"PCI_BDF"/reset", SYSFS_PCI_DEV, domain, bus, = dev, func); - fd =3D open(reset, O_WRONLY); - if (fd >=3D 0) { - rc =3D write(fd, "1", 1); - if (rc < 0) - LOGED(ERROR, domain, "write to %s returned %d", reset, rc); - close(fd); - return rc < 0 ? rc : 0; - } - if (errno =3D=3D ENOENT) { - LOGD(ERROR, domain, - "The kernel doesn't support reset from sysfs for PCI device "= PCI_BDF, - domain, bus, dev, func); - } else { - LOGED(ERROR, domain, "Failed to access reset path %s", reset); + char *buf; + struct vchan_info *vchan; + libxl__json_object *args =3D NULL, *result =3D NULL; + + vchan =3D pci_prepare_vchan(gc); + if (!vchan) + return -1; + + reset =3D GCSPRINTF("%s", "/do_flr"); + buf =3D GCSPRINTF(PCI_BDF, domain, bus, dev, func); + + libxl__vchan_param_add_string(gc, &args, PCID_CMD_PCI_PATH, reset); + libxl__vchan_param_add_string(gc, &args, PCID_CMD_PCI_INFO, buf); + result =3D vchan_send_command(gc, vchan, PCID_CMD_RESET, args); + if (!result) { + LOGD(ERROR, domain, "write to %s returned error", reset); + return -1; } - return -1; + + return 0; } =20 int libxl__device_pci_setdefault(libxl__gc *gc, uint32_t domid, @@ -2085,20 +2074,35 @@ static void do_pci_remove(libxl__egc *egc, pci_remo= ve_state *prs) goto out_fail; } } else { - char *sysfs_path =3D GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/resource",= pci->domain, + char *sysfs_path =3D GCSPRINTF("/"PCI_BDF"/resource", pci->domain, pci->bus, pci->dev, pci->func); - FILE *f =3D fopen(sysfs_path, "r"); unsigned int start =3D 0, end =3D 0, flags =3D 0, size =3D 0; int irq =3D 0; int i; + struct vchan_info *vchan; + libxl__json_object *args =3D NULL, *result =3D NULL; + const libxl__json_object *addr; + int j =3D 0; =20 - if (f =3D=3D NULL) { - LOGED(ERROR, domainid, "Couldn't open %s", sysfs_path); + vchan =3D pci_prepare_vchan(gc); + if (!vchan) + goto out_fail; + libxl__vchan_param_add_string(gc, &args, PCID_CMD_PCI_INFO, sysfs_= path); + result =3D vchan_send_command(gc, vchan, PCID_CMD_READ_RESOURCES, = args); + if (!result) { + LOGED(ERROR, domainid, "Couldn't get resources from %s", sysfs= _path); + rc =3D ERROR_FAIL; goto skip1; } + for (i =3D 0; i < PROC_PCI_NUM_RESOURCES; i++) { - if (fscanf(f, "0x%x 0x%x 0x%x\n", &start, &end, &flags) !=3D 3) - continue; + addr =3D libxl__json_array_get(result, j++); + start =3D libxl__json_object_get_integer(addr); + addr =3D libxl__json_array_get(result, j++); + end =3D libxl__json_object_get_integer(addr); + addr =3D libxl__json_array_get(result, j++); + flags =3D libxl__json_object_get_integer(addr); + size =3D end - start + 1; if (start) { if (flags & PCI_BAR_IO) { @@ -2119,16 +2123,21 @@ static void do_pci_remove(libxl__egc *egc, pci_remo= ve_state *prs) } } } - fclose(f); + skip1: - sysfs_path =3D GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/irq", pci->domai= n, + sysfs_path =3D GCSPRINTF("/"PCI_BDF"/irq", pci->domain, pci->bus, pci->dev, pci->func); - f =3D fopen(sysfs_path, "r"); - if (f =3D=3D NULL) { - LOGED(ERROR, domainid, "Couldn't open %s", sysfs_path); + libxl__vchan_param_add_string(gc, &args, PCID_CMD_PCI_INFO, sysfs_= path); + libxl__vchan_param_add_string(gc, &args, PCID_CMD_DIR_ID, PCID_PCI= _DEV); + result =3D vchan_send_command(gc, vchan, PCID_CMD_READ_HEX, args); + if (!result) { + LOGED(ERROR, domainid, "Couldn't get irq from %s", sysfs_path); + rc =3D ERROR_FAIL; goto skip_irq; } - if ((fscanf(f, "%u", &irq) =3D=3D 1) && irq) { + + irq =3D libxl__json_object_get_integer(result); + if (irq) { rc =3D xc_physdev_unmap_pirq(ctx->xch, domid, irq); if (rc < 0) { LOGED(ERROR, domainid, "xc_physdev_unmap_pirq irq=3D%d", i= rq); @@ -2138,7 +2147,6 @@ skip1: LOGED(ERROR, domainid, "xc_domain_irq_permission irq=3D%d"= , irq); } } - fclose(f); } skip_irq: rc =3D 0; diff --git a/tools/libs/light/libxl_pcid.c b/tools/libs/light/libxl_pcid.c index 7dd8f53f78..a4669b9533 100644 --- a/tools/libs/light/libxl_pcid.c +++ b/tools/libs/light/libxl_pcid.c @@ -348,6 +348,67 @@ out: return result; } =20 +static libxl__json_object *process_reset_cmd(libxl__gc *gc, + const struct libxl__json_obje= ct *resp) +{ + libxl__json_object *result =3D NULL; + const libxl__json_object *args, *pci_path, *pci_info; + char *reset; + int rc, fd; + + args =3D libxl__json_map_get(PCID_MSG_FIELD_ARGS, resp, JSON_MAP); + if (!args) + goto out; + pci_info =3D libxl__json_map_get(PCID_CMD_PCI_INFO, args, JSON_ANY); + if (!pci_info) + goto out; + pci_path =3D libxl__json_map_get(PCID_CMD_PCI_PATH, args, JSON_ANY); + + reset =3D libxl__sprintf(gc, SYSFS_PCIBACK_DRIVER"%s", pci_path->u.str= ing); + fd =3D open(reset, O_WRONLY); + if (fd >=3D 0) { + rc =3D write(fd, pci_info->u.string, strlen(pci_info->u.string)); + if (rc < 0) { + LOGE(ERROR, "write to %s returned %d\n", reset, rc); + goto out; + } + close(fd); + goto success; + } + if (errno !=3D ENOENT) + LOGE(ERROR, "Failed to access pciback path %s\n", reset); + + reset =3D libxl__sprintf(gc, "%s/%s/reset", SYSFS_PCI_DEV, pci_info->u= .string); + fd =3D open(reset, O_WRONLY); + if (fd >=3D 0) { + rc =3D write(fd, "1", 1); + if (rc < 0) { + LOGE(ERROR, "write to %s returned %d\n", reset, rc); + goto out; + } + close(fd); + goto success; + } + if (errno =3D=3D ENOENT) + LOGE(ERROR, + "The kernel doesn't support reset from sysfs for PCI devic= e %s\n", + pci_info->u.string); + else + LOGE(ERROR, "Failed to access reset path %s\n", reset); + goto out; + +success: + result =3D libxl__json_object_alloc(gc, JSON_STRING); + if (!result) { + LOGE(ERROR, "Memory allocation failed\n"); + goto out; + } + result->u.string =3D pci_path->u.string; + +out: + return result; +} + static int pcid_handle_message(libxl__gc *gc, const libxl__json_object *re= quest, libxl__json_object **result) { @@ -373,6 +434,8 @@ static int pcid_handle_message(libxl__gc *gc, const lib= xl__json_object *request, *result =3D process_read_rsc_cmd(gc, request); else if (strcmp(command_name, PCID_CMD_UNBIND) =3D=3D 0) *result =3D process_unbind_cmd(gc, request); + else if (strcmp(command_name, PCID_CMD_RESET) =3D=3D 0) + *result =3D process_reset_cmd(gc, request); else return ERROR_NOTFOUND; =20 --=20 2.17.1