From patchwork Tue Jun 28 17:33:58 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 641672 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rfDK119kHz9snm for ; Wed, 29 Jun 2016 04:06:45 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=qRfXWjMa; dkim-atps=neutral Received: from localhost ([::1]:38582 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bHxPG-0007LA-Rc for incoming@patchwork.ozlabs.org; Tue, 28 Jun 2016 14:06:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59809) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bHwup-00016d-HP for qemu-devel@nongnu.org; Tue, 28 Jun 2016 13:35:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bHwuk-0003Hj-E9 for qemu-devel@nongnu.org; Tue, 28 Jun 2016 13:35:15 -0400 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:35936) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bHwuk-0003HB-3t for qemu-devel@nongnu.org; Tue, 28 Jun 2016 13:35:10 -0400 Received: by mail-wm0-x244.google.com with SMTP id c82so7692083wme.3 for ; Tue, 28 Jun 2016 10:35:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=voY6mjXGMGQoPuAEgFOf49evNi0abh3fc9f8tgSj238=; b=qRfXWjMat4ekNC5seumKCCdKGj8Wn77c00EIgrmDFtQyXUp1JaK7LTwszazW5aXYKz W4so6BylZtYMkmczLzyyJLI5DCdnC2sfVq1xWFLdZ1549nSMHfg0oFXTAcrl2ah1UpGH qcwNqsPfj9ps5HDosBTs8Uk7SxqCCGoOW8agvqpylUGn7JKG8zVd5+34kpnggJSW1Mjb xRWc0QvtihF0Hi6LGJMOTvLT7kDhZQ+uwUHnAmc69TqPMfUdDC7h7Iqqb/XqbEWxZocT 0D8IejRwM+gi4Y4HWLTASECXDJmoWQAHv2HSaN1uno9M1X72Fk2OSqFWH5pJiRBSTeoV NWZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=voY6mjXGMGQoPuAEgFOf49evNi0abh3fc9f8tgSj238=; b=Zv6QFqYwkCLHnHxGKuev7zziS7QDeSDPq2F1lNU42bHELhtZtVU+cc52Z5D29YAPgD wmLIYz7hOCv3mA3J0Fh72PPxyyHupiRGciv4QqT30AMCGo5AHQjjzUpgh3iRInaX01JZ IRf2hfkQfnpsGxqjHzc/Dbvaal3VAvStqaHx/jdE1ArwQnScwNFCujhMLdnnt77v3ju4 9L6GcZXYPhhuIapX6lSnTbkGHB5bUo8kiAWPP7QryEnSyzl9m4kOAXqcZs97ntND2rlw sOFrmm3nQ56Ux+7OSDeolE+9lWXVp3qswv8MGvGTgv00cjfFcO3W1e0hazwmtpvePnD/ VFGg== X-Gm-Message-State: ALyK8tJfy9yP0jSoOaLIQc/5OB5J2ium5Zz+IpEDHWVSBH8sWJF9XADH8xgFgd50OkTrTw== X-Received: by 10.194.97.201 with SMTP id ec9mr4164804wjb.117.1467135309430; Tue, 28 Jun 2016 10:35:09 -0700 (PDT) Received: from donizetti.lan (94-39-188-118.adsl-ull.clienti.tiscali.it. [94.39.188.118]) by smtp.gmail.com with ESMTPSA id c142sm5305wme.18.2016.06.28.10.35.07 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Jun 2016 10:35:07 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 28 Jun 2016 19:33:58 +0200 Message-Id: <1467135242-874-29-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1467135242-874-1-git-send-email-pbonzini@redhat.com> References: <1467135242-874-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::244 Subject: [Qemu-devel] [PULL 28/32] char: change qemu_chr_fe_add_watch to return unsigned X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" g_source_attach can return any value between 1 and UINT_MAX if you let QEMU run long enough. However, qemu_chr_fe_add_watch can also return a negative errno value when the device is disconnected or does not support chr_add_watch. Change it to return zero to avoid overloading these values. Fix the cadence_uart which asserts in this case (easily obtained with "-serial pty"). Tested-by: Bret Ketchum Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Paolo Bonzini --- hw/char/cadence_uart.c | 9 ++++++--- include/sysemu/char.h | 16 ++++++++++++++-- net/vhost-user.c | 2 +- qemu-char.c | 8 ++++---- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c index 844542f..e3bc52f 100644 --- a/hw/char/cadence_uart.c +++ b/hw/char/cadence_uart.c @@ -295,9 +295,12 @@ static gboolean cadence_uart_xmit(GIOChannel *chan, GIOCondition cond, } if (s->tx_count) { - int r = qemu_chr_fe_add_watch(s->chr, G_IO_OUT|G_IO_HUP, - cadence_uart_xmit, s); - assert(r); + guint r = qemu_chr_fe_add_watch(s->chr, G_IO_OUT|G_IO_HUP, + cadence_uart_xmit, s); + if (!r) { + s->tx_count = 0; + return FALSE; + } } uart_update_status(s); diff --git a/include/sysemu/char.h b/include/sysemu/char.h index 1eb2d0f..57df10a 100644 --- a/include/sysemu/char.h +++ b/include/sysemu/char.h @@ -221,8 +221,20 @@ void qemu_chr_fe_event(CharDriverState *s, int event); void qemu_chr_fe_printf(CharDriverState *s, const char *fmt, ...) GCC_FMT_ATTR(2, 3); -int qemu_chr_fe_add_watch(CharDriverState *s, GIOCondition cond, - GIOFunc func, void *user_data); +/** + * @qemu_chr_fe_add_watch: + * + * If the backend is connected, create and add a #GSource that fires + * when the given condition (typically G_IO_OUT|G_IO_HUP or G_IO_HUP) + * is active; return the #GSource's tag. If it is disconnected, + * return 0. + * + * @cond the condition to poll for + * @func the function to call when the condition happens + * @user_data the opaque pointer to pass to @func + */ +guint qemu_chr_fe_add_watch(CharDriverState *s, GIOCondition cond, + GIOFunc func, void *user_data); /** * @qemu_chr_fe_write: diff --git a/net/vhost-user.c b/net/vhost-user.c index d72ce9b..636899a 100644 --- a/net/vhost-user.c +++ b/net/vhost-user.c @@ -22,7 +22,7 @@ typedef struct VhostUserState { NetClientState nc; CharDriverState *chr; VHostNetState *vhost_net; - int watch; + guint watch; uint64_t acked_features; } VhostUserState; diff --git a/qemu-char.c b/qemu-char.c index 016badb..4aeafe8 100644 --- a/qemu-char.c +++ b/qemu-char.c @@ -3966,19 +3966,19 @@ void qemu_chr_fe_event(struct CharDriverState *chr, int event) } } -int qemu_chr_fe_add_watch(CharDriverState *s, GIOCondition cond, - GIOFunc func, void *user_data) +guint qemu_chr_fe_add_watch(CharDriverState *s, GIOCondition cond, + GIOFunc func, void *user_data) { GSource *src; guint tag; if (s->chr_add_watch == NULL) { - return -ENOSYS; + return 0; } src = s->chr_add_watch(s, cond); if (!src) { - return -EINVAL; + return 0; } g_source_set_callback(src, (GSourceFunc)func, user_data, NULL);