From patchwork Wed Jul 6 04:37:57 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sasha Levin X-Patchwork-Id: 948452 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p664cKYo006808 for ; Wed, 6 Jul 2011 04:38:21 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751752Ab1GFEiP (ORCPT ); Wed, 6 Jul 2011 00:38:15 -0400 Received: from mail-wy0-f174.google.com ([74.125.82.174]:62630 "EHLO mail-wy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751755Ab1GFEiO (ORCPT ); Wed, 6 Jul 2011 00:38:14 -0400 Received: by mail-wy0-f174.google.com with SMTP id 8so4408115wyg.19 for ; Tue, 05 Jul 2011 21:38:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=HQYzdHTTY6iAfWbJKYz4ad86breDq44T0UDMI3icik8=; b=FVmOQUG2CwvmDD/ljxriKmXYzts3n+ZiVzF/N4u2GFYmqAwHlATLx7Klzz1JQa8oj2 UeM2944YuhSajo/Hw0PdZq+vZpOHkTu9aEhChOlY4Wid9q8jcH3Q09lJBNxaxZ1pvxqJ GjI3LPn6i+3uycOg39axoCpSSG0ejaKo8T7ag= Received: by 10.227.2.199 with SMTP id 7mr7093774wbk.88.1309927093733; Tue, 05 Jul 2011 21:38:13 -0700 (PDT) Received: from localhost.localdomain ([31.210.184.221]) by mx.google.com with ESMTPS id gb1sm5766713wbb.54.2011.07.05.21.38.11 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 05 Jul 2011 21:38:13 -0700 (PDT) From: Sasha Levin To: kvm@vger.kernel.org Cc: Sasha Levin , Avi Kivity , Ingo Molnar , Marcelo Tosatti , "Michael S. Tsirkin" , Pekka Enberg Subject: [PATCH 4/5] ioeventfd: Introduce KVM_IOEVENTFD_FLAG_NOWRITE Date: Wed, 6 Jul 2011 07:37:57 +0300 Message-Id: <1309927078-5983-4-git-send-email-levinsasha928@gmail.com> X-Mailer: git-send-email 1.7.6 In-Reply-To: <1309927078-5983-1-git-send-email-levinsasha928@gmail.com> References: <1309927078-5983-1-git-send-email-levinsasha928@gmail.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Wed, 06 Jul 2011 04:38:21 +0000 (UTC) The new flag specifies whether writes to the address specified in the ioeventfd shouldn't raise the event. Cc: Avi Kivity Cc: Ingo Molnar Cc: Marcelo Tosatti Cc: Michael S. Tsirkin Cc: Pekka Enberg Signed-off-by: Sasha Levin --- Documentation/virtual/kvm/api.txt | 5 +++++ include/linux/kvm.h | 2 ++ virt/kvm/eventfd.c | 9 +++++++++ 3 files changed, 16 insertions(+), 0 deletions(-) diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt index 8179bc1..317d86a 100644 --- a/Documentation/virtual/kvm/api.txt +++ b/Documentation/virtual/kvm/api.txt @@ -1347,6 +1347,7 @@ The following flags are defined: #define KVM_IOEVENTFD_FLAG_PIO (1 << kvm_ioeventfd_flag_nr_pio) #define KVM_IOEVENTFD_FLAG_DEASSIGN (1 << kvm_ioeventfd_flag_nr_deassign) #define KVM_IOEVENTFD_FLAG_READ (1 << kvm_ioeventfd_flag_nr_read) +#define KVM_IOEVENTFD_FLAG_NOWRITE (1 << kvm_ioeventfd_flag_nr_nowrite) If datamatch flag is set, the event will be signaled only if the written value to the registered address is equal to datamatch in struct kvm_ioeventfd. @@ -1355,6 +1356,10 @@ If the read flag is set, the event will be signaled when the specified address is being read from. The value actually read by the guest will be the value passed in datamatch. +If the nowrite flag is set, the event won't be signaled when the specified address +is being written to. + + 5. The kvm_run structure Application code obtains a pointer to the kvm_run structure by diff --git a/include/linux/kvm.h b/include/linux/kvm.h index ce4cc89..8a12711 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h @@ -388,6 +388,7 @@ enum { kvm_ioeventfd_flag_nr_pio, kvm_ioeventfd_flag_nr_deassign, kvm_ioeventfd_flag_nr_read, + kvm_ioeventfd_flag_nr_nowrite, kvm_ioeventfd_flag_nr_max, }; @@ -395,6 +396,7 @@ enum { #define KVM_IOEVENTFD_FLAG_PIO (1 << kvm_ioeventfd_flag_nr_pio) #define KVM_IOEVENTFD_FLAG_DEASSIGN (1 << kvm_ioeventfd_flag_nr_deassign) #define KVM_IOEVENTFD_FLAG_READ (1 << kvm_ioeventfd_flag_nr_read) +#define KVM_IOEVENTFD_FLAG_NOWRITE (1 << kvm_ioeventfd_flag_nr_nowrite) #define KVM_IOEVENTFD_VALID_FLAG_MASK ((1 << kvm_ioeventfd_flag_nr_max) - 1) diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c index e0f24bf..5f2d203 100644 --- a/virt/kvm/eventfd.c +++ b/virt/kvm/eventfd.c @@ -429,6 +429,7 @@ struct _ioeventfd { struct kvm_io_device dev; bool wildcard; bool track_reads; + bool track_writes; }; static inline struct _ioeventfd * @@ -516,6 +517,10 @@ ioeventfd_write(struct kvm_io_device *this, gpa_t addr, int len, { struct _ioeventfd *p = to_ioeventfd(this); + /* Exit if signaling on writes isn't requested */ + if (!p->track_writes) + return -EOPNOTSUPP; + if (!ioeventfd_in_range(p, addr, len, val)) return -EOPNOTSUPP; @@ -624,6 +629,10 @@ kvm_assign_ioeventfd(struct kvm *kvm, struct kvm_ioeventfd *args) if (args->flags & KVM_IOEVENTFD_FLAG_READ) p->track_reads = true; + /* Don't raise signal on writes to address if requested */ + if (!(args->flags & KVM_IOEVENTFD_FLAG_NOWRITE)) + p->track_writes = true; + kvm_iodevice_init(&p->dev, &ioeventfd_ops); ret = kvm_io_bus_register_dev(kvm, bus_idx, &p->dev);