[{"id":1783887,"web_url":"http://patchwork.ozlabs.org/comment/1783887/","msgid":"<be4131f0-90a3-05d8-1f1d-7dd6b3922085@redhat.com>","list_archive_url":null,"date":"2017-10-10T16:23:51","subject":"Re: [Qemu-devel] [PATCH v2 26/27] vhost-user-scsi: use\n\tlibvhost-user glib helper","submitter":{"id":2701,"url":"http://patchwork.ozlabs.org/api/people/2701/","name":"Paolo Bonzini","email":"pbonzini@redhat.com"},"content":"On 19/09/2017 18:52, Marc-André Lureau wrote:\n> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\n> ---\n>  contrib/vhost-user-scsi/vhost-user-scsi.c | 162 +++---------------------------\n>  1 file changed, 16 insertions(+), 146 deletions(-)\n> \n> diff --git a/contrib/vhost-user-scsi/vhost-user-scsi.c b/contrib/vhost-user-scsi/vhost-user-scsi.c\n> index ff817d6643..615e2a76bb 100644\n> --- a/contrib/vhost-user-scsi/vhost-user-scsi.c\n> +++ b/contrib/vhost-user-scsi/vhost-user-scsi.c\n> @@ -11,7 +11,7 @@\n>   */\n>  \n>  #include \"qemu/osdep.h\"\n> -#include \"contrib/libvhost-user/libvhost-user.h\"\n> +#include \"contrib/libvhost-user/libvhost-user-glib.h\"\n>  #include \"standard-headers/linux/virtio_scsi.h\"\n>  #include \"iscsi/iscsi.h\"\n>  #include \"iscsi/scsi-lowlevel.h\"\n> @@ -26,95 +26,13 @@ typedef struct VusIscsiLun {\n>  } VusIscsiLun;\n>  \n>  typedef struct VusDev {\n> -    VuDev vu_dev;\n> +    VugDev parent;\n> +\n>      int server_sock;\n> -    GMainLoop *loop;\n> -    GHashTable *fdmap;   /* fd -> gsource */\n>      VusIscsiLun lun;\n> +    GMainLoop *loop;\n>  } VusDev;\n>  \n> -/** glib event loop integration for libvhost-user and misc callbacks **/\n> -\n> -QEMU_BUILD_BUG_ON((int)G_IO_IN != (int)VU_WATCH_IN);\n> -QEMU_BUILD_BUG_ON((int)G_IO_OUT != (int)VU_WATCH_OUT);\n> -QEMU_BUILD_BUG_ON((int)G_IO_PRI != (int)VU_WATCH_PRI);\n> -QEMU_BUILD_BUG_ON((int)G_IO_ERR != (int)VU_WATCH_ERR);\n> -QEMU_BUILD_BUG_ON((int)G_IO_HUP != (int)VU_WATCH_HUP);\n> -\n> -typedef struct vus_gsrc {\n> -    GSource parent;\n> -    VusDev *vdev_scsi;\n> -    GPollFD gfd;\n> -} vus_gsrc_t;\n> -\n> -static gboolean vus_gsrc_prepare(GSource *src, gint *timeout)\n> -{\n> -    assert(timeout);\n> -\n> -    *timeout = -1;\n> -    return FALSE;\n> -}\n> -\n> -static gboolean vus_gsrc_check(GSource *src)\n> -{\n> -    vus_gsrc_t *vus_src = (vus_gsrc_t *)src;\n> -\n> -    assert(vus_src);\n> -\n> -    return vus_src->gfd.revents & vus_src->gfd.events;\n> -}\n> -\n> -static gboolean vus_gsrc_dispatch(GSource *src, GSourceFunc cb, gpointer data)\n> -{\n> -    VusDev *vdev_scsi;\n> -    vus_gsrc_t *vus_src = (vus_gsrc_t *)src;\n> -\n> -    assert(vus_src);\n> -\n> -    vdev_scsi = vus_src->vdev_scsi;\n> -\n> -    assert(vdev_scsi);\n> -\n> -    ((vu_watch_cb)cb)(&vdev_scsi->vu_dev, vus_src->gfd.revents, data);\n> -\n> -    return G_SOURCE_CONTINUE;\n> -}\n> -\n> -static GSourceFuncs vus_gsrc_funcs = {\n> -    vus_gsrc_prepare,\n> -    vus_gsrc_check,\n> -    vus_gsrc_dispatch,\n> -    NULL\n> -};\n> -\n> -static GSource *vus_gsrc_new(VusDev *vdev_scsi, int fd, GIOCondition cond,\n> -                             vu_watch_cb vu_cb, GSourceFunc gsrc_cb, gpointer data)\n> -{\n> -    GSource *vus_gsrc;\n> -    vus_gsrc_t *vus_src;\n> -    guint id;\n> -\n> -    assert(vdev_scsi);\n> -    assert(fd >= 0);\n> -    assert(vu_cb || gsrc_cb);\n> -    assert(!(vu_cb && gsrc_cb));\n> -\n> -    vus_gsrc = g_source_new(&vus_gsrc_funcs, sizeof(vus_gsrc_t));\n> -    g_source_set_callback(vus_gsrc, (GSourceFunc) vu_cb, data, NULL);\n> -    vus_src = (vus_gsrc_t *)vus_gsrc;\n> -    vus_src->vdev_scsi = vdev_scsi;\n> -    vus_src->gfd.fd = fd;\n> -    vus_src->gfd.events = cond;\n> -\n> -    g_source_add_poll(vus_gsrc, &vus_src->gfd);\n> -    g_source_set_callback(vus_gsrc, gsrc_cb, data, NULL);\n> -    id = g_source_attach(vus_gsrc, NULL);\n> -    assert(id);\n> -    g_source_unref(vus_gsrc);\n> -\n> -    return vus_gsrc;\n> -}\n> -\n>  /** libiscsi integration **/\n>  \n>  typedef struct virtio_scsi_cmd_req VirtIOSCSICmdReq;\n> @@ -291,11 +209,13 @@ static int handle_cmd_sync(struct iscsi_context *ctx,\n>  \n>  static void vus_panic_cb(VuDev *vu_dev, const char *buf)\n>  {\n> +    VugDev *gdev;\n>      VusDev *vdev_scsi;\n>  \n>      assert(vu_dev);\n>  \n> -    vdev_scsi = container_of(vu_dev, VusDev, vu_dev);\n> +    gdev = container_of(vu_dev, VugDev, parent);\n> +    vdev_scsi = container_of(gdev, VusDev, parent);\n>      if (buf) {\n>          g_warning(\"vu_panic: %s\", buf);\n>      }\n> @@ -303,40 +223,16 @@ static void vus_panic_cb(VuDev *vu_dev, const char *buf)\n>      g_main_loop_quit(vdev_scsi->loop);\n>  }\n>  \n> -static void vus_add_watch_cb(VuDev *vu_dev, int fd, int vu_evt, vu_watch_cb cb,\n> -                             void *pvt)\n> -{\n> -    GSource *src;\n> -    VusDev *vdev_scsi;\n> -\n> -    assert(vu_dev);\n> -    assert(fd >= 0);\n> -    assert(cb);\n> -\n> -    vdev_scsi = container_of(vu_dev, VusDev, vu_dev);\n> -    src = vus_gsrc_new(vdev_scsi, fd, vu_evt, cb, NULL, pvt);\n> -    g_hash_table_replace(vdev_scsi->fdmap, GINT_TO_POINTER(fd), src);\n> -}\n> -\n> -static void vus_del_watch_cb(VuDev *vu_dev, int fd)\n> -{\n> -    VusDev *vdev_scsi;\n> -\n> -    assert(vu_dev);\n> -    assert(fd >= 0);\n> -\n> -    vdev_scsi = container_of(vu_dev, VusDev, vu_dev);\n> -    g_hash_table_remove(vdev_scsi->fdmap, GINT_TO_POINTER(fd));\n> -}\n> -\n>  static void vus_proc_req(VuDev *vu_dev, int idx)\n>  {\n> +    VugDev *gdev;\n>      VusDev *vdev_scsi;\n>      VuVirtq *vq;\n>  \n>      assert(vu_dev);\n>  \n> -    vdev_scsi = container_of(vu_dev, VusDev, vu_dev);\n> +    gdev = container_of(vu_dev, VugDev, parent);\n> +    vdev_scsi = container_of(gdev, VusDev, parent);\n>      if (idx < 0 || idx >= VHOST_MAX_NR_VIRTQUEUE) {\n>          g_warning(\"VQ Index out of range: %d\", idx);\n>          vus_panic_cb(vu_dev, NULL);\n> @@ -420,21 +316,6 @@ static const VuDevIface vus_iface = {\n>      .queue_set_started = vus_queue_set_started,\n>  };\n>  \n> -static gboolean vus_vhost_cb(gpointer data)\n> -{\n> -    VuDev *vu_dev = (VuDev *)data;\n> -\n> -    assert(vu_dev);\n> -\n> -    if (!vu_dispatch(vu_dev) != 0) {\n> -        g_warning(\"Error processing vhost message\");\n> -        vus_panic_cb(vu_dev, NULL);\n> -        return G_SOURCE_REMOVE;\n> -    }\n> -\n> -    return G_SOURCE_CONTINUE;\n> -}\n> -\n>  /** misc helpers **/\n>  \n>  static int unix_sock_new(char *unix_fn)\n> @@ -482,7 +363,6 @@ static void vdev_scsi_free(VusDev *vdev_scsi)\n>          close(vdev_scsi->server_sock);\n>      }\n>      g_main_loop_unref(vdev_scsi->loop);\n> -    g_hash_table_unref(vdev_scsi->fdmap);\n>      g_free(vdev_scsi);\n>  }\n>  \n> @@ -493,9 +373,6 @@ static VusDev *vdev_scsi_new(int server_sock)\n>      vdev_scsi = g_new0(VusDev, 1);\n>      vdev_scsi->server_sock = server_sock;\n>      vdev_scsi->loop = g_main_loop_new(NULL, FALSE);\n> -    vdev_scsi->fdmap =\n> -        g_hash_table_new_full(NULL, NULL, NULL,\n> -                              (GDestroyNotify) g_source_destroy);\n>  \n>      return vdev_scsi;\n>  }\n> @@ -503,11 +380,9 @@ static VusDev *vdev_scsi_new(int server_sock)\n>  static int vdev_scsi_run(VusDev *vdev_scsi)\n>  {\n>      int cli_sock;\n> -    int ret = 0;\n>  \n>      assert(vdev_scsi);\n>      assert(vdev_scsi->server_sock >= 0);\n> -    assert(vdev_scsi->loop);\n>  \n>      cli_sock = accept(vdev_scsi->server_sock, NULL, NULL);\n>      if (cli_sock < 0) {\n> @@ -515,21 +390,16 @@ static int vdev_scsi_run(VusDev *vdev_scsi)\n>          return -1;\n>      }\n>  \n> -    vu_init(&vdev_scsi->vu_dev,\n> -            cli_sock,\n> -            vus_panic_cb,\n> -            vus_add_watch_cb,\n> -            vus_del_watch_cb,\n> -            &vus_iface);\n> -\n> -    vus_gsrc_new(vdev_scsi, cli_sock, G_IO_IN, NULL, vus_vhost_cb,\n> -                 &vdev_scsi->vu_dev);\n> +    vug_init(&vdev_scsi->parent,\n> +             cli_sock,\n> +             vus_panic_cb,\n> +             &vus_iface);\n>  \n>      g_main_loop_run(vdev_scsi->loop);\n>  \n> -    vu_deinit(&vdev_scsi->vu_dev);\n> +    vug_deinit(&vdev_scsi->parent);\n>  \n> -    return ret;\n> +    return 0;\n>  }\n>  \n>  int main(int argc, char **argv)\n> \n\nReviewed-by: Paolo Bonzini <pbonzini@redhat.com>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":"ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","Received":["from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3yBMsp2Rqrz9tYT\n\tfor <incoming@patchwork.ozlabs.org>;\n\tWed, 11 Oct 2017 03:25:34 +1100 (AEDT)","from localhost ([::1]:36007 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1e1xLY-00012f-6R\n\tfor incoming@patchwork.ozlabs.org; Tue, 10 Oct 2017 12:25:32 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:60919)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <pbonzini@redhat.com>) id 1e1xK2-0000RB-5s\n\tfor qemu-devel@nongnu.org; Tue, 10 Oct 2017 12:23:59 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <pbonzini@redhat.com>) id 1e1xJy-0006x1-Uw\n\tfor qemu-devel@nongnu.org; Tue, 10 Oct 2017 12:23:58 -0400","from mail-wm0-f41.google.com ([74.125.82.41]:45868)\n\tby eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16)\n\t(Exim 4.71) (envelope-from <pbonzini@redhat.com>) id 1e1xJy-0006wp-Kf\n\tfor qemu-devel@nongnu.org; Tue, 10 Oct 2017 12:23:54 -0400","by mail-wm0-f41.google.com with SMTP id q124so6769028wmb.0\n\tfor <qemu-devel@nongnu.org>; Tue, 10 Oct 2017 09:23:54 -0700 (PDT)","from [192.168.10.165]\n\t(dynamic-adsl-78-12-246-117.clienti.tiscali.it. [78.12.246.117])\n\tby smtp.gmail.com with ESMTPSA id\n\tz10sm6227439wre.6.2017.10.10.09.23.51\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tTue, 10 Oct 2017 09:23:52 -0700 (PDT)"],"X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:subject:to:cc:references:from:message-id:date\n\t:user-agent:mime-version:in-reply-to:content-language\n\t:content-transfer-encoding;\n\tbh=AGdxLdRb3DTwW7Erm3wt8d0VaoKUL7MYwWQ4psqRcMg=;\n\tb=Cu31fiUeV6lv1VJfMgAJO8MSIi5OIFtd1KN2TgJgEBp9Nfs5nZy/MfINb11ynKS7L7\n\tlFxxsOi2E8/CRvo6eVs7d7DGS/b58VYxclhvk1lR8ZFLrwVxHmJkAsF5QFE0yWBfotOz\n\t9C6EXpBlIDd2J8RKWk/F3TBOTkMtnMP45e9FNJCy5M/U+U21XEUcASIMd5Nv85ZGPXVI\n\tZwqHDO4p5zd6bWoBix23OkxT+zZZ5wMeMMLF5fiHykqcbbBV8TWNKni9nLAJF/MnaO+W\n\tpKcAm5dNZmluBJD5IAJszw5HT+X9C7unmBQbXuibtiYd0tGX/Ev4Ypl0tXxG03Rknx7x\n\t3jhg==","X-Gm-Message-State":"AMCzsaWkY/pv0OkeZH1/MhV5VOsTx9c6qjcFCdwAgnPke5euJsT483OV\n\t4r4jaNGl1EllEbw65f7mnI46lA==","X-Google-Smtp-Source":"AOwi7QDFICY/LRMqjAPq6/t7ovgD84y1xRR6Gtc6xODgUUPGS6NgW0lllgLgXJc/zOTf8Fmy88Vk/g==","X-Received":"by 10.28.142.147 with SMTP id\n\tq141mr10733240wmd.155.1507652633475; \n\tTue, 10 Oct 2017 09:23:53 -0700 (PDT)","To":"=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n\tqemu-devel@nongnu.org","References":"<20170919165226.23022-1-marcandre.lureau@redhat.com>\n\t<20170919165226.23022-27-marcandre.lureau@redhat.com>","From":"Paolo Bonzini <pbonzini@redhat.com>","Message-ID":"<be4131f0-90a3-05d8-1f1d-7dd6b3922085@redhat.com>","Date":"Tue, 10 Oct 2017 18:23:51 +0200","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101\n\tThunderbird/52.3.0","MIME-Version":"1.0","In-Reply-To":"<20170919165226.23022-27-marcandre.lureau@redhat.com>","Content-Type":"text/plain; charset=utf-8","Content-Language":"en-US","Content-Transfer-Encoding":"8bit","X-detected-operating-system":"by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]","X-Received-From":"74.125.82.41","Subject":"Re: [Qemu-devel] [PATCH v2 26/27] vhost-user-scsi: use\n\tlibvhost-user glib helper","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"f4bug@amsat.org, changpeng.liu@intel.com, felipe@nutanix.com","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"}}]