[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/3] xen-blkback: make statistics data persistent across disconnect/connect


  • To: linux-kernel@xxxxxxxxxxxxxxx, linux-block@xxxxxxxxxxxxxxx
  • From: Juergen Gross <jgross@xxxxxxxx>
  • Date: Wed, 11 Nov 2026 17:20:58 +0100
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=susede1 header.d=suse.com header.i="@suse.com" header.h="From:Date:Message-ID:To:Cc:MIME-Version:Content-Transfer-Encoding:In-Reply-To:References"; dkim=pass header.s=susede1 header.d=suse.com header.i="@suse.com" header.h="From:Date:Message-ID:To:Cc:MIME-Version:Content-Transfer-Encoding:In-Reply-To:References"
  • Authentication-results: smtp-out1.suse.de; none
  • Cc: Juergen Gross <jgross@xxxxxxxx>, Roger Pau Monné <roger@xxxxxxxxxxxxxx>, Jens Axboe <axboe@xxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • Delivery-date: Wed, 11 Nov 2026 16:21:20 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

Today the statistics data is living in struct xen_blkif_ring only.

This means that a disconnect/connect cycle will reset the data, as the
rings are freed and re-allocated in this case.

Add a struct xen_blkif_stat in struct xen_blkif and sum up the per-ring
data there when freeing the rings, and add those values to the printed
statistics data.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
 drivers/block/xen-blkback/common.h |  2 ++
 drivers/block/xen-blkback/xenbus.c | 19 ++++++++++++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/drivers/block/xen-blkback/common.h 
b/drivers/block/xen-blkback/common.h
index f8385c4b9d30..c35ec207b31d 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -327,6 +327,8 @@ struct xen_blkif {
        unsigned int            nr_rings;
 
        unsigned long           buffer_squeeze_end;
+
+       struct xen_blkif_stat   st;
 };
 
 struct seg_buf {
diff --git a/drivers/block/xen-blkback/xenbus.c 
b/drivers/block/xen-blkback/xenbus.c
index b3ef483a92fd..f0d4cec4432a 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -346,6 +346,18 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif)
         */
        write_lock(&blkif->rings_lock);
 
+       for (r = 0; r < blkif->nr_rings; r++) {
+               struct xen_blkif_ring *ring = &blkif->rings[r];
+
+               blkif->st.rd_req += ring->st.rd_req;
+               blkif->st.wr_req += ring->st.wr_req;
+               blkif->st.oo_req += ring->st.oo_req;
+               blkif->st.f_req += ring->st.f_req;
+               blkif->st.ds_req += ring->st.ds_req;
+               blkif->st.rd_sect += ring->st.rd_sect;
+               blkif->st.wr_sect += ring->st.wr_sect;
+       }
+
        rings = blkif->rings;
        blkif->rings = NULL;
        blkif->nr_rings = 0;
@@ -399,13 +411,14 @@ void xen_blkif_interface_fini(void)
                struct backend_info *be = dev_get_drvdata(&dev->dev);   \
                struct xen_blkif *blkif = be->blkif;                    \
                unsigned int i;                                         \
-               unsigned long long result = 0;                          \
+               unsigned long long result;                              \
                                                                        \
                read_lock(&blkif->rings_lock);                          \
-               if (!blkif->rings)                              \
+               result = blkif->st.name;                                \
+               if (!blkif->rings)                                      \
                        goto out;                                       \
                                                                        \
-               for (i = 0; i < blkif->nr_rings; i++) {         \
+               for (i = 0; i < blkif->nr_rings; i++) {                 \
                        struct xen_blkif_ring *ring = &blkif->rings[i]; \
                                                                        \
                        result += ring->st.name;                        \
-- 
2.56.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.