From patchwork Wed Sep 5 08:32:04 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sasha Levin X-Patchwork-Id: 1406701 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id DBF17DF28C for ; Wed, 5 Sep 2012 08:36:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758215Ab2IEIgq (ORCPT ); Wed, 5 Sep 2012 04:36:46 -0400 Received: from mail-wg0-f44.google.com ([74.125.82.44]:58173 "EHLO mail-wg0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758178Ab2IEIgf (ORCPT ); Wed, 5 Sep 2012 04:36:35 -0400 Received: by mail-wg0-f44.google.com with SMTP id dr13so393355wgb.1 for ; Wed, 05 Sep 2012 01:36:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=ApzJiHaNTEYxe7HdM0ETnhZkOzS/NgGhKXGHVjRHwh4=; b=Y5RI/n0iG8bK/7mn17kUE61dU577GGM5apJZc89ZHAngpKBrBtG8xoo/fq1wuS2ot8 pOyFtjLiS6tnZnea90YyUquBX0foP6u/3gwe3rhXopPJzPt3rhOusDaE5a1u6Ba3//sK zwYvqlW5LulBexokxmZbTENGObczcZc0e4+G4/xeBBxb4x84jsGqpYTnylQsL/+vYOg7 rMjhqdX85yrkvGJGeaCxlzRpkjPSTSzp1qmhMQYhaGIGx1dJNE6c0OIJ/+N7BK+PECGQ XCjiUQLRFRJ39GCF6H696VjBDpZv/tZkxxSh/u2TbghwRPABut2K7Xd0j00Rk3vt0+xR GHQg== Received: by 10.180.74.33 with SMTP id q1mr36466978wiv.4.1346834195172; Wed, 05 Sep 2012 01:36:35 -0700 (PDT) Received: from lappy.capriciverd.com (20.Red-80-59-140.staticIP.rima-tde.net. [80.59.140.20]) by mx.google.com with ESMTPS id q4sm27971068wix.9.2012.09.05.01.36.33 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 05 Sep 2012 01:36:34 -0700 (PDT) From: Sasha Levin To: penberg@kernel.org Cc: asias.hejun@gmail.com, mingo@elte.hu, gorcunov@openvz.org, kvm@vger.kernel.org, Sasha Levin Subject: [PATCH 30/33] kvm tools: add init/exit automatic calls Date: Wed, 5 Sep 2012 10:32:04 +0200 Message-Id: <1346833927-15740-31-git-send-email-levinsasha928@gmail.com> X-Mailer: git-send-email 1.7.12 In-Reply-To: <1346833927-15740-1-git-send-email-levinsasha928@gmail.com> References: <1346833927-15740-1-git-send-email-levinsasha928@gmail.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org This adds a method to call init/exit functions similar to the kernel's init functions. Signed-off-by: Sasha Levin --- tools/kvm/include/kvm/util-init.h | 51 +++++++++++++++++++++++++++++ tools/kvm/util/init.c | 69 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 tools/kvm/include/kvm/util-init.h create mode 100644 tools/kvm/util/init.c diff --git a/tools/kvm/include/kvm/util-init.h b/tools/kvm/include/kvm/util-init.h new file mode 100644 index 0000000..beccb4e --- /dev/null +++ b/tools/kvm/include/kvm/util-init.h @@ -0,0 +1,51 @@ +#ifndef KVM__UTIL_INIT_H +#define KVM__UTIL_INIT_H + +struct kvm; + +struct init_item { + struct hlist_node n; + const char *fn_name; + int (*init)(struct kvm *); +}; + +int init_list__init(struct kvm *kvm); +int init_list__exit(struct kvm *kvm); + +int init_list_add(struct init_item *t, int (*init)(struct kvm *), + int priority, const char *name); +int exit_list_add(struct init_item *t, int (*init)(struct kvm *), + int priority, const char *name); + +#define __init_list_add(cb, l) \ +static void __attribute__ ((constructor)) __init__##cb(void) \ +{ \ + static char name[] = #cb; \ + static struct init_item t; \ + init_list_add(&t, cb, l, name); \ +} + +#define __exit_list_add(cb, l) \ +static void __attribute__ ((constructor)) __init__##cb(void) \ +{ \ + static char name[] = #cb; \ + static struct init_item t; \ + exit_list_add(&t, cb, l, name); \ +} + +#define core_init(cb) __init_list_add(cb, 0) +#define base_init(cb) __init_list_add(cb, 2) +#define dev_base_init(cb) __init_list_add(cb, 4) +#define dev_init(cb) __init_list_add(cb, 5) +#define virtio_dev_init(cb) __init_list_add(cb, 6) +#define firmware_init(cb) __init_list_add(cb, 7) +#define late_init(cb) __init_list_add(cb, 9) + +#define core_exit(cb) __exit_list_add(cb, 0) +#define base_exit(cb) __exit_list_add(cb, 2) +#define dev_base_exit(cb) __exit_list_add(cb, 4) +#define dev_exit(cb) __exit_list_add(cb, 5) +#define virtio_dev_exit(cb) __exit_list_add(cb, 6) +#define firmware_exit(cb) __exit_list_add(cb, 7) +#define late_exit(cb) __exit_list_add(cb, 9) +#endif diff --git a/tools/kvm/util/init.c b/tools/kvm/util/init.c new file mode 100644 index 0000000..b3face1 --- /dev/null +++ b/tools/kvm/util/init.c @@ -0,0 +1,69 @@ +#include +#include + +#include "kvm/kvm.h" +#include "kvm/util-init.h" + +#define PRIORITY_LISTS 10 + +static struct hlist_head init_lists[PRIORITY_LISTS]; +static struct hlist_head exit_lists[PRIORITY_LISTS]; + +int init_list_add(struct init_item *t, int (*init)(struct kvm *), + int priority, const char *name) +{ + t->init = init; + t->fn_name = name; + hlist_add_head(&t->n, &init_lists[priority]); + + return 0; +} + +int exit_list_add(struct init_item *t, int (*init)(struct kvm *), + int priority, const char *name) +{ + t->init = init; + t->fn_name = name; + hlist_add_head(&t->n, &exit_lists[priority]); + + return 0; +} + +int init_list__init(struct kvm *kvm) +{ + unsigned int i; + int r = 0; + struct hlist_node *n; + struct init_item *t; + + for (i = 0; i < ARRAY_SIZE(init_lists); i++) + hlist_for_each_entry(t, n, &init_lists[i], n) { + r = t->init(kvm); + if (r < 0) { + pr_warning("Failed init: %s\n", t->fn_name); + goto fail; + } + } + +fail: + return r; +} + +int init_list__exit(struct kvm *kvm) +{ + int i; + int r = 0; + struct hlist_node *n; + struct init_item *t; + + for (i = ARRAY_SIZE(exit_lists) - 1; i >= 0; i--) + hlist_for_each_entry(t, n, &exit_lists[i], n) { + r = t->init(kvm); + if (r < 0) { + pr_warning("%s failed.\n", t->fn_name); + goto fail; + } + } +fail: + return r; +}