From patchwork Wed Aug 28 08:50:23 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexey Kardashevskiy X-Patchwork-Id: 270415 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 426E42C0CC9 for ; Wed, 28 Aug 2013 18:52:14 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754913Ab3H1Iun (ORCPT ); Wed, 28 Aug 2013 04:50:43 -0400 Received: from mail-pd0-f171.google.com ([209.85.192.171]:54532 "EHLO mail-pd0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754877Ab3H1Iuf (ORCPT ); Wed, 28 Aug 2013 04:50:35 -0400 Received: by mail-pd0-f171.google.com with SMTP id g10so6016132pdj.2 for ; Wed, 28 Aug 2013 01:50:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xak6ga7ux8uww3d4Se9BOZ+5KT9u+8qsbbhHRTN1IP8=; b=oo9AE+6u06yZN+uqbI2oJv5mBGTTuCJP0Mp+nw9xE4Wz473U6klKVDeREhtVPlJx4B iFoKN0NB9/uIuuMGjdaAk4BCf7OEQ0Z6+Qn9DBQ8JE2XC6JnWRva2RRtYDsyfd+867nX zA/WHp/OpZFOR4kgqEg5j5O5d0QmeK2ZztMSZRLUKkKNb6okbmu7rqMCttniRzjS7OqF 7ZxreoYEk0HV8cvHjBaSM16k60t10tnPTjGPQlP4QgRJmFWiALdqb7c6A+kg0BLBSIZX Zza/WydlXmJ/mJ0qOeW720GR4EwifRDOPcAZQqC9RzvCXNH81FDV+kdCk1Y82r6OnMEp Hmaw== X-Gm-Message-State: ALoCoQkDpsvAvGOXM7VovjqhtmoZRIik9hQ1OqGYdVDHgxk9WpijdUcR1ERoW3C4eqRs2KucbYoZ X-Received: by 10.68.232.74 with SMTP id tm10mr505331pbc.64.1377679834253; Wed, 28 Aug 2013 01:50:34 -0700 (PDT) Received: from ka1.ozlabs.ibm.com (ibmaus65.lnk.telstra.net. [165.228.126.9]) by mx.google.com with ESMTPSA id qv4sm29890412pbc.16.1969.12.31.16.00.00 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 28 Aug 2013 01:50:31 -0700 (PDT) From: Alexey Kardashevskiy To: linuxppc-dev@lists.ozlabs.org Cc: Alexey Kardashevskiy , David Gibson , Benjamin Herrenschmidt , Paul Mackerras , Gleb Natapov , Paolo Bonzini , Alexander Graf , kvm@vger.kernel.org, linux-kernel@vger.kernel.org, kvm-ppc@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH v9 11/13] KVM: PPC: add trampolines for VFIO external API Date: Wed, 28 Aug 2013 18:50:23 +1000 Message-Id: <1377679823-3780-1-git-send-email-aik@ozlabs.ru> X-Mailer: git-send-email 1.8.4.rc4 In-Reply-To: <1377679070-3515-1-git-send-email-aik@ozlabs.ru> References: <1377679070-3515-1-git-send-email-aik@ozlabs.ru> Sender: kvm-ppc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm-ppc@vger.kernel.org KVM is going to use VFIO's external API. However KVM can operate even VFIO is not compiled or loaded so KVM is linked to VFIO dynamically. This adds proxy functions for VFIO external API. Signed-off-by: Alexey Kardashevskiy --- arch/powerpc/kvm/book3s_64_vio.c | 49 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c index cae1099..047b94c 100644 --- a/arch/powerpc/kvm/book3s_64_vio.c +++ b/arch/powerpc/kvm/book3s_64_vio.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include @@ -42,6 +44,53 @@ #define ERROR_ADDR ((void *)~(unsigned long)0x0) +/* + * Dynamically linked version of the external user VFIO API. + * + * As a IOMMU group access control is implemented by VFIO, + * there is some API to vefiry that specific process can own + * a group. As KVM may run when VFIO is not loaded, KVM is not + * linked statically to VFIO, instead wrappers are used. + */ +struct vfio_group *kvmppc_vfio_group_get_external_user(struct file *filep) +{ + struct vfio_group *ret; + struct vfio_group * (*proc)(struct file *) = + symbol_get(vfio_group_get_external_user); + if (!proc) + return NULL; + + ret = proc(filep); + symbol_put(vfio_group_get_external_user); + + return ret; +} + +void kvmppc_vfio_group_put_external_user(struct vfio_group *group) +{ + void (*proc)(struct vfio_group *) = + symbol_get(vfio_group_put_external_user); + if (!proc) + return; + + proc(group); + symbol_put(vfio_group_put_external_user); +} + +int kvmppc_vfio_external_user_iommu_id(struct vfio_group *group) +{ + int ret; + int (*proc)(struct vfio_group *) = + symbol_get(vfio_external_user_iommu_id); + if (!proc) + return -EINVAL; + + ret = proc(group); + symbol_put(vfio_external_user_iommu_id); + + return ret; +} + static long kvmppc_stt_npages(unsigned long window_size) { return ALIGN((window_size >> SPAPR_TCE_SHIFT)