From nobody Fri Dec 19 17:23:34 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=crudebyte.com ARC-Seal: i=1; a=rsa-sha256; t=1733221005; cv=none; d=zohomail.com; s=zohoarc; b=IJEi0O2iEc7BG3qdjdNdUjc7VIMYK0I+YJfPaybLNBVdr5o1wBUFRSVifPOK7o24NR6XKs5Y/FHjPI3Z5KQ97G3A5FhdEwR0NewEN5kzWsTUWFuixdJg7Rqc9yoO9jOlexiWBAlv55/N761224bxyYKvVApRgFne+ihxj73S4o0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1733221005; h=Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=TDWNjtgQUjWkhrzCurapjj0S6FU9WwlJGITjLDVpbbI=; b=k50hOaf/AKP8lk99v7os5nWc1bpKO8wrHxqEkosYentlVt5Mkz29yc+LTlxK9dggMOI6Zs0BaIKWp6kVUZf4Nx2VhtMKgAWkibBIU7BGwpc+iPkdFKOO9Ru9ZJ/krwXI4rw++qgcykyDCzXH9wRYiLSMgSLeJGbh2GSRXfZp2WE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1733221005507169.23678895094713; Tue, 3 Dec 2024 02:16:45 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tIPx7-0004Mr-Oc; Tue, 03 Dec 2024 05:16:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tIPx6-0004Mi-5u for qemu-devel@nongnu.org; Tue, 03 Dec 2024 05:16:20 -0500 Received: from kylie.crudebyte.com ([5.189.157.229]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tIPx4-0000UO-D7 for qemu-devel@nongnu.org; Tue, 03 Dec 2024 05:16:19 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=crudebyte.com; s=kylie; h=Message-Id:Cc:To:Subject:Date:From:Content-Type: Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Content-ID: Content-Description; bh=TDWNjtgQUjWkhrzCurapjj0S6FU9WwlJGITjLDVpbbI=; b=e3n7a Nu5p7I8V5wMxtGFon2FsCNGy79lEm2n7fs4yEKN8Lb5nQyGMEBFI4L3u9rwbg/kvIBmV9SV2R2PiV QqyliUk8DV1vInI0lHrG7T6oOcmh7C89du+9ySHUKJLUZubaNN0/D9cBP9fcUNEVkFlHGeGesbp9T ayYtuocToADb569YmWhE8sgeIKuHIXqZTVJo7/Nt2fJ377VNoqDYrkyV0MSDbT3jYHBMpEHQvcaqD dLXUJtaSm1CgUkrrgaMVrRA/91KvKTp5v5ZLvPoUNaRk813z9mnGMJjDvAqY0HiUWvhr8Y/YHKII+ oen09lWMln1Nr6M5LJ3soew8mFSdpydSisLI++rZ3lBbo6WGV7bzi2j8qYBzKbat50HqTU3s6EKm7 6YfLjT4+hSAj/195MPK+qaq6ahTNHwzbUvQ81Jo8Wflo+nrBDb4NUDtwaVoPthI8fQ1G/q2KDx77e gMojQxVYz1RyaQtUoKNeSn6uf2tSWtXAqfd4pKvokMAQrkIKKA0pf1YmobMtDQj35xr+JXcdiFTY0 j3nigkErA1/wPvjCjJ1sDO8N12QCuaGNwpSJ1bX6vrnWBc4F/wCwZWzE7nlOgt0FiteZGtjHoHMB9 szYCw0yPDhVJ07z2yiRTdkkF9dIlH1KTh9lrpu7gekz9/Nu4W14ooLi5zQYyhw=; From: Christian Schoenebeck Date: Tue, 3 Dec 2024 10:14:28 +0100 Subject: [PATCH] 9pfs: improve v9fs_walk() tracing To: qemu-devel@nongnu.org Cc: Greg Kurz , Stefan Hajnoczi , Mads Ynddal Message-Id: Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=5.189.157.229; envelope-from=b40a9a7ede727ef287e466d484ea4eb2fe19364c@kylie.crudebyte.com; helo=kylie.crudebyte.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @crudebyte.com) X-ZM-MESSAGEID: 1733221007174116600 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 'Twalk' is the most important request type in the 9p protocol to look out for when debugging 9p communication. That's because it is the only part of the 9p protocol which actually deals with human-readable path names, whereas all other 9p request types work on numeric file IDs (FIDs) only. Improve tracing of 'Twalk' requests, e.g. let's say client wanted to walk to "/home/bob/src", then improve trace output from: v9fs_walk tag 0 id 110 fid 0 newfid 1 nwnames=3D3 to: v9fs_walk tag=3D0 id=3D110 fid=3D0 newfid=3D1 nwnames=3D3 wnames=3D{home,= bob, src} To achieve this, add a new helper function trace_v9fs_walk_wnames() which converts the received V9fsString array of individual path elements into a comma-separated string presentation for being passed to the tracing system. As this conversion is somewhat expensive, this new helper function returns immediately if tracing of event 'v9fs_walk' is currently not enabled. Signed-off-by: Christian Schoenebeck Reviewed-by: Greg Kurz --- CCing tracing maintainers in case they have better ideas how to do this. hw/9pfs/9p.c | 42 +++++++++++++++++++++++++++++++++++++----- hw/9pfs/trace-events | 2 +- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index 578517739a..c08e7e492b 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -1774,6 +1774,30 @@ static bool same_stat_id(const struct stat *a, const= struct stat *b) return a->st_dev =3D=3D b->st_dev && a->st_ino =3D=3D b->st_ino; } =20 +/* + * Returns a (newly allocated) comma-separated string presentation of the + * passed array for logging (tracing) purpose for trace event "v9fs_walk" = only. + * If tracing for that event is disabled, it immediately returns NULL inst= ead. + * + * It is caller's responsibility to free the returned string. + */ +static char *trace_v9fs_walk_wnames(V9fsString *wnames, size_t nwnames) +{ + g_autofree char **arr =3D NULL; + + if (trace_event_get_state(TRACE_V9FS_WALK) && + qemu_loglevel_mask(LOG_TRACE)) + { + arr =3D g_malloc0_n(nwnames + 1, sizeof(char *)); + for (size_t i =3D 0; i < nwnames; ++i) { + arr[i] =3D wnames[i].data; + } + return g_strjoinv(", ", arr); + } + + return NULL; +} + static void coroutine_fn v9fs_walk(void *opaque) { int name_idx, nwalked; @@ -1787,6 +1811,7 @@ static void coroutine_fn v9fs_walk(void *opaque) size_t offset =3D 7; int32_t fid, newfid; P9ARRAY_REF(V9fsString) wnames =3D NULL; + g_autofree char *trace_wnames =3D NULL; V9fsFidState *fidp; V9fsFidState *newfidp =3D NULL; V9fsPDU *pdu =3D opaque; @@ -1800,11 +1825,9 @@ static void coroutine_fn v9fs_walk(void *opaque) } offset +=3D err; =20 - trace_v9fs_walk(pdu->tag, pdu->id, fid, newfid, nwnames); - if (nwnames > P9_MAXWELEM) { err =3D -EINVAL; - goto out_nofid; + goto out_nofid_nownames; } if (nwnames) { P9ARRAY_NEW(V9fsString, wnames, nwnames); @@ -1814,15 +1837,20 @@ static void coroutine_fn v9fs_walk(void *opaque) for (i =3D 0; i < nwnames; i++) { err =3D pdu_unmarshal(pdu, offset, "s", &wnames[i]); if (err < 0) { - goto out_nofid; + goto out_nofid_nownames; } if (name_is_illegal(wnames[i].data)) { err =3D -ENOENT; - goto out_nofid; + goto out_nofid_nownames; } offset +=3D err; } + trace_wnames =3D trace_v9fs_walk_wnames(wnames, nwnames); + trace_v9fs_walk(pdu->tag, pdu->id, fid, newfid, nwnames, trace_wna= mes); + } else { + trace_v9fs_walk(pdu->tag, pdu->id, fid, newfid, nwnames, ""); } + fidp =3D get_fid(pdu, fid); if (fidp =3D=3D NULL) { err =3D -ENOENT; @@ -1957,7 +1985,11 @@ out: } v9fs_path_free(&dpath); v9fs_path_free(&path); + goto out_pdu_complete; +out_nofid_nownames: + trace_v9fs_walk(pdu->tag, pdu->id, fid, newfid, nwnames, ""); out_nofid: +out_pdu_complete: pdu_complete(pdu, err); } =20 diff --git a/hw/9pfs/trace-events b/hw/9pfs/trace-events index a12e55c165..ed9f4e7209 100644 --- a/hw/9pfs/trace-events +++ b/hw/9pfs/trace-events @@ -11,7 +11,7 @@ v9fs_stat(uint16_t tag, uint8_t id, int32_t fid) "tag %d = id %d fid %d" v9fs_stat_return(uint16_t tag, uint8_t id, int32_t mode, int32_t atime, in= t32_t mtime, int64_t length) "tag %d id %d stat=3D{mode %d atime %d mtime %= d length %"PRId64"}" v9fs_getattr(uint16_t tag, uint8_t id, int32_t fid, uint64_t request_mask)= "tag %d id %d fid %d request_mask %"PRIu64 v9fs_getattr_return(uint16_t tag, uint8_t id, uint64_t result_mask, uint32= _t mode, uint32_t uid, uint32_t gid) "tag %d id %d getattr=3D{result_mask %= "PRId64" mode %u uid %u gid %u}" -v9fs_walk(uint16_t tag, uint8_t id, int32_t fid, int32_t newfid, uint16_t = nwnames) "tag %d id %d fid %d newfid %d nwnames %d" +v9fs_walk(uint16_t tag, uint8_t id, int32_t fid, int32_t newfid, uint16_t = nwnames, const char* wnames) "tag=3D%d id=3D%d fid=3D%d newfid=3D%d nwnames= =3D%d wnames=3D{%s}" v9fs_walk_return(uint16_t tag, uint8_t id, uint16_t nwnames, void* qids) "= tag %d id %d nwnames %d qids %p" v9fs_open(uint16_t tag, uint8_t id, int32_t fid, int32_t mode) "tag %d id = %d fid %d mode %d" v9fs_open_return(uint16_t tag, uint8_t id, uint8_t type, uint32_t version,= uint64_t path, int iounit) "tag %u id %u qid=3D{type %u version %u path %"= PRIu64"} iounit %d" --=20 2.39.5