From patchwork Tue Jul 24 22:33:58 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nicholas A. Bellinger" X-Patchwork-Id: 1233521 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 56FBE4025E for ; Tue, 24 Jul 2012 22:37:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755229Ab2GXWhS (ORCPT ); Tue, 24 Jul 2012 18:37:18 -0400 Received: from mail.linux-iscsi.org ([67.23.28.174]:40980 "EHLO linux-iscsi.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755274Ab2GXWhO (ORCPT ); Tue, 24 Jul 2012 18:37:14 -0400 Received: from linux-iscsi.org (localhost [127.0.0.1]) by linux-iscsi.org (Postfix) with ESMTP id AE6E422D9DD; Tue, 24 Jul 2012 22:34:12 +0000 (UTC) From: "Nicholas A. Bellinger" To: target-devel Cc: lf-virt , kvm-devel , qemu-devel , Stefan Hajnoczi , Zhi Yong Wu , Anthony Liguori , Paolo Bonzini , "Michael S. Tsirkin" , Christoph Hellwig , Jens Axboe , Hannes Reinecke , Anthony Liguori Subject: [RFC 1/9] notifier: add validity check and notify function Date: Tue, 24 Jul 2012 22:33:58 +0000 Message-Id: <1343169246-17636-2-git-send-email-nab@linux-iscsi.org> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1343169246-17636-1-git-send-email-nab@linux-iscsi.org> References: <1343169246-17636-1-git-send-email-nab@linux-iscsi.org> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Stefan Hajnoczi Event notifiers that have not had the event_notifier_init() function called on them are invalid. The event_notifier_valid() function checks whether or not an event notifier is valild. This can be used to check whether a notifier is in use or not. It sometimes useful to notify the event notifier, for example when vhost is on the receiving end of the event notifier and qemu needs to notify it. The event_notifier_notify() function will signal the eventfd and increment it by one. Signed-off-by: Stefan Hajnoczi Cc: Anthony Liguori Cc: Paolo Bonzini Signed-off-by: Nicholas Bellinger --- event_notifier.c | 21 +++++++++++++++++++++ event_notifier.h | 4 ++++ 2 files changed, 25 insertions(+), 0 deletions(-) diff --git a/event_notifier.c b/event_notifier.c index 2c207e1..efe00ea 100644 --- a/event_notifier.c +++ b/event_notifier.c @@ -25,6 +25,7 @@ void event_notifier_init_fd(EventNotifier *e, int fd) int event_notifier_init(EventNotifier *e, int active) { + assert(!event_notifier_valid(e)); #ifdef CONFIG_EVENTFD int fd = eventfd(!!active, EFD_NONBLOCK | EFD_CLOEXEC); if (fd < 0) @@ -39,6 +40,12 @@ int event_notifier_init(EventNotifier *e, int active) void event_notifier_cleanup(EventNotifier *e) { close(e->fd); + e->fd = -1; +} + +bool event_notifier_valid(EventNotifier *e) +{ + return e->fd != -1; } int event_notifier_get_fd(EventNotifier *e) @@ -65,3 +72,17 @@ int event_notifier_test_and_clear(EventNotifier *e) int r = read(e->fd, &value, sizeof(value)); return r == sizeof(value); } + +int event_notifier_notify(EventNotifier *e) +{ + uint64_t value = 1; + int r; + + assert(event_notifier_valid(e)); + r = write(e->fd, &value, sizeof(value)); + if (r < 0) { + return -errno; + } + assert(r == sizeof(value)); + return 0; +} diff --git a/event_notifier.h b/event_notifier.h index f0ec2f2..eea10a9 100644 --- a/event_notifier.h +++ b/event_notifier.h @@ -15,6 +15,8 @@ #include "qemu-common.h" +#define EVENT_NOTIFIER_INITIALIZER ((EventNotifier){ .fd = -1 }) + struct EventNotifier { int fd; }; @@ -24,9 +26,11 @@ typedef void EventNotifierHandler(EventNotifier *); void event_notifier_init_fd(EventNotifier *, int fd); int event_notifier_init(EventNotifier *, int active); void event_notifier_cleanup(EventNotifier *); +bool event_notifier_valid(EventNotifier *e); int event_notifier_get_fd(EventNotifier *); int event_notifier_set(EventNotifier *); int event_notifier_test_and_clear(EventNotifier *); int event_notifier_set_handler(EventNotifier *, EventNotifierHandler *); +int event_notifier_notify(EventNotifier *e); #endif