From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, Yuval Shaia <yuval.shaia.ml@gmail.com>
Subject: [PULL 20/33] hw/rdma: Replace QList by GQueue
Date: Sat, 19 Dec 2020 11:55:19 +0100 [thread overview]
Message-ID: <20201219105532.1734134-21-armbru@redhat.com> (raw)
In-Reply-To: <20201219105532.1734134-1-armbru@redhat.com>
RdmaProtectedQList provides a thread-safe queue of int64_t on top of a
QList.
rdma_protected_qlist_destroy() calls qlist_destroy_obj() directly.
qlist_destroy_obj() is actually for use by qobject_destroy() only.
The next commit will make that obvious.
The minimal fix would be calling qobject_unref() instead. But QList
is actually a bad fit here. It's designed for representing JSON
arrays. We're better off with a GQueue here. Replace.
Cc: Yuval Shaia <yuval.shaia.ml@gmail.com>
Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20201211171152.146877-8-armbru@redhat.com>
---
hw/rdma/rdma_backend_defs.h | 2 +-
hw/rdma/rdma_utils.h | 15 ++++++++-------
hw/rdma/rdma_backend.c | 10 +++++-----
hw/rdma/rdma_utils.c | 29 ++++++++++++++++-------------
4 files changed, 30 insertions(+), 26 deletions(-)
diff --git a/hw/rdma/rdma_backend_defs.h b/hw/rdma/rdma_backend_defs.h
index 0b55be3503..4e6c0ad695 100644
--- a/hw/rdma/rdma_backend_defs.h
+++ b/hw/rdma/rdma_backend_defs.h
@@ -43,7 +43,7 @@ typedef struct RdmaBackendDev {
struct ibv_context *context;
struct ibv_comp_channel *channel;
uint8_t port_num;
- RdmaProtectedQList recv_mads_list;
+ RdmaProtectedGQueue recv_mads_list;
RdmaCmMux rdmacm_mux;
} RdmaBackendDev;
diff --git a/hw/rdma/rdma_utils.h b/hw/rdma/rdma_utils.h
index e7babe96cb..9fd0efd940 100644
--- a/hw/rdma/rdma_utils.h
+++ b/hw/rdma/rdma_utils.h
@@ -28,10 +28,10 @@
#define rdma_info_report(fmt, ...) \
info_report("%s: " fmt, "rdma", ## __VA_ARGS__)
-typedef struct RdmaProtectedQList {
+typedef struct RdmaProtectedGQueue {
QemuMutex lock;
- QList *list;
-} RdmaProtectedQList;
+ GQueue *list;
+} RdmaProtectedGQueue;
typedef struct RdmaProtectedGSList {
QemuMutex lock;
@@ -40,10 +40,11 @@ typedef struct RdmaProtectedGSList {
void *rdma_pci_dma_map(PCIDevice *dev, dma_addr_t addr, dma_addr_t plen);
void rdma_pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t len);
-void rdma_protected_qlist_init(RdmaProtectedQList *list);
-void rdma_protected_qlist_destroy(RdmaProtectedQList *list);
-void rdma_protected_qlist_append_int64(RdmaProtectedQList *list, int64_t value);
-int64_t rdma_protected_qlist_pop_int64(RdmaProtectedQList *list);
+void rdma_protected_gqueue_init(RdmaProtectedGQueue *list);
+void rdma_protected_gqueue_destroy(RdmaProtectedGQueue *list);
+void rdma_protected_gqueue_append_int64(RdmaProtectedGQueue *list,
+ int64_t value);
+int64_t rdma_protected_gqueue_pop_int64(RdmaProtectedGQueue *list);
void rdma_protected_gslist_init(RdmaProtectedGSList *list);
void rdma_protected_gslist_destroy(RdmaProtectedGSList *list);
void rdma_protected_gslist_append_int32(RdmaProtectedGSList *list,
diff --git a/hw/rdma/rdma_backend.c b/hw/rdma/rdma_backend.c
index 5de010b1fa..6dcdfbbbe2 100644
--- a/hw/rdma/rdma_backend.c
+++ b/hw/rdma/rdma_backend.c
@@ -78,7 +78,7 @@ static void clean_recv_mads(RdmaBackendDev *backend_dev)
unsigned long cqe_ctx_id;
do {
- cqe_ctx_id = rdma_protected_qlist_pop_int64(&backend_dev->
+ cqe_ctx_id = rdma_protected_gqueue_pop_int64(&backend_dev->
recv_mads_list);
if (cqe_ctx_id != -ENOENT) {
qatomic_inc(&backend_dev->rdma_dev_res->stats.missing_cqe);
@@ -597,7 +597,7 @@ static unsigned int save_mad_recv_buffer(RdmaBackendDev *backend_dev,
bctx->up_ctx = ctx;
bctx->sge = *sge;
- rdma_protected_qlist_append_int64(&backend_dev->recv_mads_list, bctx_id);
+ rdma_protected_gqueue_append_int64(&backend_dev->recv_mads_list, bctx_id);
return 0;
}
@@ -1111,7 +1111,7 @@ static void process_incoming_mad_req(RdmaBackendDev *backend_dev,
trace_mad_message("recv", msg->umad.mad, msg->umad_len);
- cqe_ctx_id = rdma_protected_qlist_pop_int64(&backend_dev->recv_mads_list);
+ cqe_ctx_id = rdma_protected_gqueue_pop_int64(&backend_dev->recv_mads_list);
if (cqe_ctx_id == -ENOENT) {
rdma_warn_report("No more free MADs buffers, waiting for a while");
sleep(THR_POLL_TO);
@@ -1185,7 +1185,7 @@ static int mad_init(RdmaBackendDev *backend_dev, CharBackend *mad_chr_be)
return -EIO;
}
- rdma_protected_qlist_init(&backend_dev->recv_mads_list);
+ rdma_protected_gqueue_init(&backend_dev->recv_mads_list);
enable_rdmacm_mux_async(backend_dev);
@@ -1205,7 +1205,7 @@ static void mad_fini(RdmaBackendDev *backend_dev)
{
disable_rdmacm_mux_async(backend_dev);
qemu_chr_fe_disconnect(backend_dev->rdmacm_mux.chr_be);
- rdma_protected_qlist_destroy(&backend_dev->recv_mads_list);
+ rdma_protected_gqueue_destroy(&backend_dev->recv_mads_list);
}
int rdma_backend_get_gid_index(RdmaBackendDev *backend_dev,
diff --git a/hw/rdma/rdma_utils.c b/hw/rdma/rdma_utils.c
index 698ed4716c..98df58f689 100644
--- a/hw/rdma/rdma_utils.c
+++ b/hw/rdma/rdma_utils.c
@@ -14,8 +14,6 @@
*/
#include "qemu/osdep.h"
-#include "qapi/qmp/qlist.h"
-#include "qapi/qmp/qnum.h"
#include "trace.h"
#include "rdma_utils.h"
@@ -54,41 +52,46 @@ void rdma_pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t len)
}
}
-void rdma_protected_qlist_init(RdmaProtectedQList *list)
+void rdma_protected_gqueue_init(RdmaProtectedGQueue *list)
{
qemu_mutex_init(&list->lock);
- list->list = qlist_new();
+ list->list = g_queue_new();
}
-void rdma_protected_qlist_destroy(RdmaProtectedQList *list)
+void rdma_protected_gqueue_destroy(RdmaProtectedGQueue *list)
{
if (list->list) {
- qlist_destroy_obj(QOBJECT(list->list));
+ g_queue_free_full(list->list, g_free);
qemu_mutex_destroy(&list->lock);
list->list = NULL;
}
}
-void rdma_protected_qlist_append_int64(RdmaProtectedQList *list, int64_t value)
+void rdma_protected_gqueue_append_int64(RdmaProtectedGQueue *list,
+ int64_t value)
{
qemu_mutex_lock(&list->lock);
- qlist_append_int(list->list, value);
+ g_queue_push_tail(list->list, g_memdup(&value, sizeof(value)));
qemu_mutex_unlock(&list->lock);
}
-int64_t rdma_protected_qlist_pop_int64(RdmaProtectedQList *list)
+int64_t rdma_protected_gqueue_pop_int64(RdmaProtectedGQueue *list)
{
- QObject *obj;
+ int64_t *valp;
+ int64_t val;
qemu_mutex_lock(&list->lock);
- obj = qlist_pop(list->list);
+
+ valp = g_queue_pop_head(list->list);
qemu_mutex_unlock(&list->lock);
- if (!obj) {
+ if (!valp) {
return -ENOENT;
}
- return qnum_get_uint(qobject_to(QNum, obj));
+ val = *valp;
+ g_free(valp);
+ return val;
}
void rdma_protected_gslist_init(RdmaProtectedGSList *list)
--
2.26.2
next prev parent reply other threads:[~2020-12-19 11:09 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-19 10:54 [PULL 00/33] QAPI patches patches for 2020-12-19 Markus Armbruster
2020-12-19 10:55 ` [PULL 01/33] rocker: Revamp fp_port_get_info Markus Armbruster
2020-12-19 10:55 ` [PULL 02/33] migration: Refactor migrate_cap_add Markus Armbruster
2020-12-19 10:55 ` [PULL 03/33] qapi: Use QAPI_LIST_PREPEND() where possible Markus Armbruster
2020-12-19 10:55 ` [PULL 04/33] tests/check-qjson: Don't skip funny QNumber to JSON conversions Markus Armbruster
2020-12-19 10:55 ` [PULL 05/33] tests/check-qjson: Examine QNum more thoroughly Markus Armbruster
2020-12-19 10:55 ` [PULL 06/33] tests/check-qjson: Cover number 2^63 Markus Armbruster
2020-12-19 10:55 ` [PULL 07/33] tests/check-qjson: Replace redundant large_number() Markus Armbruster
2020-12-19 10:55 ` [PULL 08/33] tests/check-qnum: Cover qnum_to_string() for "unround" argument Markus Armbruster
2020-12-19 10:55 ` [PULL 09/33] qobject: Fix qnum_to_string() to use sufficient precision Markus Armbruster
2020-12-19 10:55 ` [PULL 10/33] test-string-output-visitor: Cover "unround" number Markus Armbruster
2020-12-19 10:55 ` [PULL 11/33] string-output-visitor: Fix to use sufficient precision Markus Armbruster
2020-12-19 10:55 ` [PULL 12/33] test-visitor-serialization: Drop insufficient precision workaround Markus Armbruster
2020-12-19 10:55 ` [PULL 13/33] test-visitor-serialization: Clean up test_primitives() Markus Armbruster
2020-12-19 10:55 ` [PULL 14/33] hmp: Simplify how qmp_human_monitor_command() gets output Markus Armbruster
2020-12-19 10:55 ` [PULL 15/33] monitor: Use GString instead of QString for output buffer Markus Armbruster
2020-12-19 10:55 ` [PULL 16/33] qobject: Make qobject_to_json_pretty() take a pretty argument Markus Armbruster
2020-12-19 10:55 ` [PULL 17/33] qobject: Use GString instead of QString to accumulate JSON Markus Armbruster
2020-12-19 10:55 ` [PULL 18/33] qobject: Change qobject_to_json()'s value to GString Markus Armbruster
2020-12-19 10:55 ` [PULL 19/33] Revert "qstring: add qstring_free()" Markus Armbruster
2020-12-19 10:55 ` Markus Armbruster [this message]
2020-12-19 10:55 ` [PULL 21/33] qobject: Move internals to qobject-internal.h Markus Armbruster
2020-12-19 10:55 ` [PULL 22/33] qmp: Fix tracing of non-string command IDs Markus Armbruster
2020-12-19 10:55 ` [PULL 23/33] block: Avoid qobject_get_try_str() Markus Armbruster
2020-12-19 10:55 ` [PULL 24/33] Revert "qobject: let object_property_get_str() use new API" Markus Armbruster
2020-12-19 10:55 ` [PULL 25/33] qobject: Drop qobject_get_try_str() Markus Armbruster
2020-12-19 10:55 ` [PULL 26/33] qobject: Drop qstring_get_try_str() Markus Armbruster
2020-12-19 10:55 ` [PULL 27/33] qobject: Factor quoted_str() out of to_json() Markus Armbruster
2020-12-19 10:55 ` [PULL 28/33] qobject: Factor JSON writer out of qobject_to_json() Markus Armbruster
2020-12-19 10:55 ` [PULL 29/33] migration: Replace migration's JSON writer by the general one Markus Armbruster
2020-12-19 10:55 ` [PULL 30/33] json: Use GString instead of QString to accumulate strings Markus Armbruster
2020-12-19 10:55 ` [PULL 31/33] keyval: Use GString to accumulate value strings Markus Armbruster
2020-12-19 10:55 ` [PULL 32/33] block: Use GString instead of QString to build filenames Markus Armbruster
2020-12-19 10:55 ` [PULL 33/33] qobject: Make QString immutable Markus Armbruster
2020-12-19 11:24 ` [PULL 00/33] QAPI patches patches for 2020-12-19 no-reply
2021-01-01 16:56 ` Peter Maydell
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=20201219105532.1734134-21-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=yuval.shaia.ml@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).