All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pavel Butsykin <pbutsykin@virtuozzo.com>
To: qemu-block@nongnu.org, qemu-devel@nongnu.org
Cc: kwolf@redhat.com, mreitz@redhat.com, stefanha@redhat.com,
	den@openvz.org, jsnow@redhat.com, eblake@redhat.com,
	famz@redhat.com
Subject: [Qemu-devel] [PATCH RFC v2 19/22] block/pcache: add pcache node assert
Date: Mon, 29 Aug 2016 20:10:18 +0300	[thread overview]
Message-ID: <20160829171021.4902-20-pbutsykin@virtuozzo.com> (raw)
In-Reply-To: <20160829171021.4902-1-pbutsykin@virtuozzo.com>

In case of node assert we will print the fields of a pcache node, this can be
useful for catching bugs.

Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com>
---
 block/pcache.c | 52 +++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 17 deletions(-)

diff --git a/block/pcache.c b/block/pcache.c
index 287156a..7b4a9a9 100644
--- a/block/pcache.c
+++ b/block/pcache.c
@@ -38,6 +38,24 @@
 #define DPRINTF(fmt, ...) do { } while (0)
 #endif
 
+#define NODE_PRINT(_node) \
+    printf("node:\n"      \
+           "num: %jd size: %d\n"   \
+           "ref: %d\nstatus: %d\n" \
+           "node_wait_cnt: %d\n"   \
+           "data: %p\nlock %u\n",  \
+           (_node)->cm.sector_num, (_node)->cm.nb_sectors,    \
+           (_node)->ref, (_node)->status, (_node)->wait.cnt,  \
+           (_node)->data, (_node)->lock.locked)
+
+#define NODE_ASSERT(_assert, _node) \
+    do {                            \
+        if (!(_assert)) {           \
+            NODE_PRINT(_node);      \
+            assert(_assert);        \
+        }                           \
+    } while (0)
+
 typedef struct RbNodeKey {
     uint64_t    num;
     uint32_t    size;
@@ -201,7 +219,7 @@ enum {
 static inline void pcache_node_unref(BDRVPCacheState *s, PCNode *node)
 {
     if (atomic_fetch_dec(&node->ref) == 0) {
-        assert(node->status == NODE_REMOVE_STATUS);
+        NODE_ASSERT(node->status == NODE_REMOVE_STATUS, node);
 
         node->status = NODE_GHOST_STATUS;
 
@@ -217,8 +235,8 @@ static inline void pcache_node_unref(BDRVPCacheState *s, PCNode *node)
 
 static inline PCNode *pcache_node_ref(PCNode *node)
 {
-    assert(node->status == NODE_SUCCESS_STATUS ||
-           node->status == NODE_WAIT_STATUS);
+    NODE_ASSERT(node->status == NODE_SUCCESS_STATUS ||
+                node->status == NODE_WAIT_STATUS, node);
     atomic_inc(&node->ref);
 
     return node;
@@ -422,8 +440,8 @@ static PrefCachePartReq *pcache_req_get(PrefCacheAIOCB *acb, PCNode *node)
     req->node = node;
     req->acb = acb;
 
-    assert(acb->sector_num <= node->cm.sector_num + node->cm.nb_sectors);
-
+    NODE_ASSERT(acb->sector_num <= node->cm.sector_num + node->cm.nb_sectors,
+                node);
     qemu_iovec_init(&req->qiov, 1);
     qemu_iovec_add(&req->qiov, node->data,
                    node->cm.nb_sectors << BDRV_SECTOR_BITS);
@@ -554,10 +572,10 @@ static inline void pcache_node_read_wait(PrefCacheAIOCB *acb, PCNode *node)
 
 static void pcache_node_read(PrefCacheAIOCB *acb, PCNode* node)
 {
-    assert(node->status == NODE_SUCCESS_STATUS ||
-           node->status == NODE_WAIT_STATUS    ||
-           node->status == NODE_REMOVE_STATUS);
-    assert(node->data != NULL);
+    NODE_ASSERT(node->status == NODE_SUCCESS_STATUS ||
+                node->status == NODE_WAIT_STATUS    ||
+                node->status == NODE_REMOVE_STATUS, node);
+    NODE_ASSERT(node->data != NULL, node);
 
     qemu_co_mutex_lock(&node->lock);
     if (node->status == NODE_WAIT_STATUS) {
@@ -694,13 +712,13 @@ static void pcache_complete_acb_wait_queue(BDRVPCacheState *s, PCNode *node)
 
         pcache_node_read_buf(wait_acb, node);
 
-        assert(node->ref != 0);
+        NODE_ASSERT(node->ref != 0, node);
         pcache_node_unref(s, node);
 
         complete_aio_request(wait_acb);
         atomic_dec(&node->wait.cnt);
     }
-    assert(atomic_read(&node->wait.cnt) == 0);
+    NODE_ASSERT(atomic_read(&node->wait.cnt) == 0, node);
 }
 
 static void pcache_node_submit(PrefCachePartReq *req)
@@ -709,8 +727,8 @@ static void pcache_node_submit(PrefCachePartReq *req)
     BDRVPCacheState *s = req->acb->s;
 
     assert(node != NULL);
-    assert(atomic_read(&node->ref) != 0);
-    assert(node->data != NULL);
+    NODE_ASSERT(atomic_read(&node->ref) != 0, node);
+    NODE_ASSERT(node->data != NULL, node);
 
     qemu_co_mutex_lock(&node->lock);
     if (node->status == NODE_WAIT_STATUS) {
@@ -733,7 +751,7 @@ static void pcache_merge_requests(PrefCacheAIOCB *acb)
         QTAILQ_REMOVE(&acb->requests.list, req, entry);
 
         assert(req != NULL);
-        assert(node->status == NODE_WAIT_STATUS);
+        NODE_ASSERT(node->status == NODE_WAIT_STATUS, node);
 
         pcache_node_submit(req);
 
@@ -768,7 +786,7 @@ static void pcache_try_node_drop(PrefCacheAIOCB *acb)
             return;
         }
         if (node->status != NODE_WAIT_STATUS) {
-            assert(node->status == NODE_SUCCESS_STATUS);
+            NODE_ASSERT(node->status == NODE_SUCCESS_STATUS, node);
             pcache_node_drop(s, node);
         }
         key.num = node->cm.sector_num + node->cm.nb_sectors;
@@ -1081,8 +1099,8 @@ fail:
 
 static void pcache_node_check_and_free(BDRVPCacheState *s, PCNode *node)
 {
-    assert(node->status == NODE_SUCCESS_STATUS);
-    assert(node->ref == 0);
+    NODE_ASSERT(node->status == NODE_SUCCESS_STATUS, node);
+    NODE_ASSERT(node->ref == 0, node);
 
     node->status = NODE_REMOVE_STATUS;
     rb_erase(&node->cm.rb_node, &s->pcache.tree.root);
-- 
2.8.3

  parent reply	other threads:[~2016-08-30  2:44 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-29 17:09 [Qemu-devel] [PATCH RFC v2 00/22] I/O prefetch cache Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 01/22] block/pcache: empty pcache driver filter Pavel Butsykin
2016-09-01 14:31   ` Kevin Wolf
2016-09-06 15:20     ` Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 02/22] block/pcache: add own AIOCB block Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 03/22] util/rbtree: add rbtree from linux kernel Pavel Butsykin
2016-09-01 14:37   ` Kevin Wolf
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 04/22] block/pcache: add pcache debug build Pavel Butsykin
2016-09-08 15:11   ` Eric Blake
2016-09-08 15:49     ` Pavel Butsykin
2016-09-08 16:05       ` Pavel Butsykin
2016-09-08 18:42         ` Eric Blake
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 05/22] block/pcache: add aio requests into cache Pavel Butsykin
2016-09-01 15:28   ` Kevin Wolf
2016-09-06 16:54     ` Pavel Butsykin
2016-09-06 17:07       ` Kevin Wolf
2016-09-07 16:21         ` Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 06/22] block/pcache: restrict cache size Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 07/22] block/pcache: introduce LRU as method of memory Pavel Butsykin
2016-09-02  8:49   ` Kevin Wolf
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 08/22] block/pcache: implement pickup parts of the cache Pavel Butsykin
2016-09-02  8:59   ` Kevin Wolf
2016-09-08 12:29     ` Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 09/22] block/pcache: separation AIOCB on requests Pavel Butsykin
2016-09-02  9:10   ` Kevin Wolf
2016-09-08 15:47     ` Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 10/22] block/pcache: add check node leak Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 11/22] add QEMU style defines for __sync_add_and_fetch Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 12/22] block/pcache: implement read cache to qiov and drop node during aio write Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 13/22] block/pcache: add generic request complete Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 14/22] block/pcache: add support for rescheduling requests Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 15/22] block/pcache: simple readahead one chunk forward Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 16/22] block/pcache: pcache readahead node around Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 17/22] block/pcache: skip readahead for non-sequential requests Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 18/22] block/pcache: add pcache skip large aio read Pavel Butsykin
2016-08-29 17:10 ` Pavel Butsykin [this message]
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 20/22] block/pcache: implement pcache error handling of aio cb Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 21/22] block/pcache: add write through node Pavel Butsykin
2016-08-29 17:10 ` [Qemu-devel] [PATCH RFC v2 22/22] block/pcache: drop used pcache node Pavel Butsykin
2016-09-01 14:17 ` [Qemu-devel] [PATCH RFC v2 00/22] I/O prefetch cache Kevin Wolf
2016-09-06 12:36   ` Pavel Butsykin
2016-09-01 15:26 ` Avi Kivity
2016-09-06 12:40   ` Pavel Butsykin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160829171021.4902-20-pbutsykin@virtuozzo.com \
    --to=pbutsykin@virtuozzo.com \
    --cc=den@openvz.org \
    --cc=eblake@redhat.com \
    --cc=famz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.