From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: [PATCH v3 4/9] xen/grant-table: Allow allocating buffers suitable for DMA Date: Tue, 12 Jun 2018 16:41:55 +0300 Message-ID: <20180612134200.17456-5-andr2000@gmail.com> References: <20180612134200.17456-1-andr2000@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lf0-x244.google.com (mail-lf0-x244.google.com [IPv6:2a00:1450:4010:c07::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id E38606E4D3 for ; Tue, 12 Jun 2018 13:42:16 +0000 (UTC) Received: by mail-lf0-x244.google.com with SMTP id y20-v6so36138030lfy.0 for ; Tue, 12 Jun 2018 06:42:16 -0700 (PDT) In-Reply-To: <20180612134200.17456-1-andr2000@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: andr2000@gmail.com, daniel.vetter@intel.com, dongwon.kim@intel.com, Oleksandr Andrushchenko List-Id: dri-devel@lists.freedesktop.org RnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVw YW0uY29tPgoKRXh0ZW5kIGdyYW50IHRhYmxlIG1vZHVsZSBBUEkgdG8gYWxsb3cgYWxsb2NhdGlu ZyBidWZmZXJzIHRoYXQgY2FuCmJlIHVzZWQgZm9yIERNQSBvcGVyYXRpb25zIGFuZCBtYXBwaW5n IGZvcmVpZ24gZ3JhbnQgcmVmZXJlbmNlcwpvbiB0b3Agb2YgdGhvc2UuClRoZSByZXN1bHRpbmcg YnVmZmVyIGlzIHNpbWlsYXIgdG8gdGhlIG9uZSBhbGxvY2F0ZWQgYnkgdGhlIGJhbGxvb24KZHJp dmVyIGluIHRlcm1zIHRoYXQgcHJvcGVyIG1lbW9yeSByZXNlcnZhdGlvbiBpcyBtYWRlCih7aW5j cmVhc2V8ZGVjcmVhc2V9X3Jlc2VydmF0aW9uIGFuZCBWQSBtYXBwaW5ncyB1cGRhdGVkIGlmIG5l ZWRlZCkuClRoaXMgaXMgdXNlZnVsIGZvciBzaGFyaW5nIGZvcmVpZ24gYnVmZmVycyB3aXRoIEhX IGRyaXZlcnMgd2hpY2gKY2Fubm90IHdvcmsgd2l0aCBzY2F0dGVyZWQgYnVmZmVycyBwcm92aWRl ZCBieSB0aGUgYmFsbG9vbiBkcml2ZXIsCmJ1dCByZXF1aXJlIERNQWFibGUgbWVtb3J5IGluc3Rl YWQuCgpTaWduZWQtb2ZmLWJ5OiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRyX2Fu ZHJ1c2hjaGVua29AZXBhbS5jb20+Ci0tLQogZHJpdmVycy94ZW4vS2NvbmZpZyAgICAgICB8IDEz ICsrKysrKwogZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYyB8IDk3ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwogaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaCB8IDE4ICsr KysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDEyOCBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEv ZHJpdmVycy94ZW4vS2NvbmZpZyBiL2RyaXZlcnMveGVuL0tjb25maWcKaW5kZXggZTVkMGMyODM3 MmVhLi4zOTUzNmRkZmJjZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL0tjb25maWcKKysrIGIv ZHJpdmVycy94ZW4vS2NvbmZpZwpAQCAtMTYxLDYgKzE2MSwxOSBAQCBjb25maWcgWEVOX0dSQU5U X0RFVl9BTExPQwogCSAgdG8gb3RoZXIgZG9tYWlucy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBs ZW1lbnQgZnJvbnRlbmQgZHJpdmVycwogCSAgb3IgYXMgcGFydCBvZiBhbiBpbnRlci1kb21haW4g c2hhcmVkIG1lbW9yeSBjaGFubmVsLgogCitjb25maWcgWEVOX0dSQU5UX0RNQV9BTExPQworCWJv b2wgIkFsbG93IGFsbG9jYXRpbmcgRE1BIGNhcGFibGUgYnVmZmVycyB3aXRoIGdyYW50IHJlZmVy ZW5jZSBtb2R1bGUiCisJZGVwZW5kcyBvbiBYRU4gJiYgSEFTX0RNQQorCWhlbHAKKwkgIEV4dGVu ZHMgZ3JhbnQgdGFibGUgbW9kdWxlIEFQSSB0byBhbGxvdyBhbGxvY2F0aW5nIERNQSBjYXBhYmxl CisJICBidWZmZXJzIGFuZCBtYXBwaW5nIGZvcmVpZ24gZ3JhbnQgcmVmZXJlbmNlcyBvbiB0b3Ag b2YgaXQuCisJICBUaGUgcmVzdWx0aW5nIGJ1ZmZlciBpcyBzaW1pbGFyIHRvIG9uZSBhbGxvY2F0 ZWQgYnkgdGhlIGJhbGxvb24KKwkgIGRyaXZlciBpbiB0ZXJtcyB0aGF0IHByb3BlciBtZW1vcnkg cmVzZXJ2YXRpb24gaXMgbWFkZQorCSAgKHtpbmNyZWFzZXxkZWNyZWFzZX1fcmVzZXJ2YXRpb24g YW5kIFZBIG1hcHBpbmdzIHVwZGF0ZWQgaWYgbmVlZGVkKS4KKwkgIFRoaXMgaXMgdXNlZnVsIGZv ciBzaGFyaW5nIGZvcmVpZ24gYnVmZmVycyB3aXRoIEhXIGRyaXZlcnMgd2hpY2gKKwkgIGNhbm5v dCB3b3JrIHdpdGggc2NhdHRlcmVkIGJ1ZmZlcnMgcHJvdmlkZWQgYnkgdGhlIGJhbGxvb24gZHJp dmVyLAorCSAgYnV0IHJlcXVpcmUgRE1BYWJsZSBtZW1vcnkgaW5zdGVhZC4KKwogY29uZmlnIFNX SU9UTEJfWEVOCiAJZGVmX2Jvb2wgeQogCXNlbGVjdCBTV0lPVExCCmRpZmYgLS1naXQgYS9kcml2 ZXJzL3hlbi9ncmFudC10YWJsZS5jIGIvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYwppbmRleCBk YmI0OGE4OWU5ODcuLjI2ZWQ0OThiNWU2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ3JhbnQt dGFibGUuYworKysgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCkBAIC00NSw2ICs0NSw5IEBA CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0 Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpZmRlZiBDT05GSUdfWEVOX0dS QU5UX0RNQV9BTExPQworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjZW5kaWYKIAog I2luY2x1ZGUgPHhlbi94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgpAQCAt NTcsNiArNjAsNyBAQAogI2lmZGVmIENPTkZJR19YODYKICNpbmNsdWRlIDxhc20veGVuL2NwdWlk Lmg+CiAjZW5kaWYKKyNpbmNsdWRlIDx4ZW4vbWVtLXJlc2VydmF0aW9uLmg+CiAjaW5jbHVkZSA8 YXNtL3hlbi9oeXBlcmNhbGwuaD4KICNpbmNsdWRlIDxhc20veGVuL2ludGVyZmFjZS5oPgogCkBA IC04MzgsNiArODQyLDk5IEBAIHZvaWQgZ250dGFiX2ZyZWVfcGFnZXMoaW50IG5yX3BhZ2VzLCBz dHJ1Y3QgcGFnZSAqKnBhZ2VzKQogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ250dGFiX2ZyZWVfcGFn ZXMpOwogCisjaWZkZWYgQ09ORklHX1hFTl9HUkFOVF9ETUFfQUxMT0MKKy8qKgorICogZ250dGFi X2RtYV9hbGxvY19wYWdlcyAtIGFsbG9jIERNQWFibGUgcGFnZXMgc3VpdGFibGUgZm9yIGdyYW50 IG1hcHBpbmcgaW50bworICogQGFyZ3M6IGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24KKyAqLwor aW50IGdudHRhYl9kbWFfYWxsb2NfcGFnZXMoc3RydWN0IGdudHRhYl9kbWFfYWxsb2NfYXJncyAq YXJncykKK3sKKwl1bnNpZ25lZCBsb25nIHBmbiwgc3RhcnRfcGZuOworCXNpemVfdCBzaXplOwor CWludCBpLCByZXQ7CisKKwlzaXplID0gYXJncy0+bnJfcGFnZXMgPDwgUEFHRV9TSElGVDsKKwlp ZiAoYXJncy0+Y29oZXJlbnQpCisJCWFyZ3MtPnZhZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGFy Z3MtPmRldiwgc2l6ZSwKKwkJCQkJCSAmYXJncy0+ZGV2X2J1c19hZGRyLAorCQkJCQkJIEdGUF9L RVJORUwgfCBfX0dGUF9OT1dBUk4pOworCWVsc2UKKwkJYXJncy0+dmFkZHIgPSBkbWFfYWxsb2Nf d2MoYXJncy0+ZGV2LCBzaXplLAorCQkJCQkgICAmYXJncy0+ZGV2X2J1c19hZGRyLAorCQkJCQkg ICBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKKwlpZiAoIWFyZ3MtPnZhZGRyKSB7CisJCXBy X2RlYnVnKCJGYWlsZWQgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlciBvZiBzaXplICV6dVxuIiwgc2l6 ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXN0YXJ0X3BmbiA9IF9fcGh5c190b19wZm4o YXJncy0+ZGV2X2J1c19hZGRyKTsKKwlmb3IgKHBmbiA9IHN0YXJ0X3BmbiwgaSA9IDA7IHBmbiA8 IHN0YXJ0X3BmbiArIGFyZ3MtPm5yX3BhZ2VzOworCQkJcGZuKyssIGkrKykgeworCQlzdHJ1Y3Qg cGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisKKwkJYXJncy0+cGFnZXNbaV0gPSBwYWdl OworCQlhcmdzLT5mcmFtZXNbaV0gPSB4ZW5fcGFnZV90b19nZm4ocGFnZSk7CisJCXhlbm1lbV9y ZXNlcnZhdGlvbl9zY3J1Yl9wYWdlKHBhZ2UpOworCX0KKworCXhlbm1lbV9yZXNlcnZhdGlvbl92 YV9tYXBwaW5nX3Jlc2V0KGFyZ3MtPm5yX3BhZ2VzLCBhcmdzLT5wYWdlcyk7CisKKwlyZXQgPSB4 ZW5tZW1fcmVzZXJ2YXRpb25fZGVjcmVhc2UoYXJncy0+bnJfcGFnZXMsIGFyZ3MtPmZyYW1lcyk7 CisJaWYgKHJldCAhPSBhcmdzLT5ucl9wYWdlcykgeworCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGRl Y3JlYXNlIHJlc2VydmF0aW9uIGZvciBETUEgYnVmZmVyXG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsK KwkJZ290byBmYWlsOworCX0KKworCXJldCA9IGdudHRhYl9wYWdlc19zZXRfcHJpdmF0ZShhcmdz LT5ucl9wYWdlcywgYXJncy0+cGFnZXMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZhaWw7CisK KwlyZXR1cm4gMDsKKworZmFpbDoKKwlnbnR0YWJfZG1hX2ZyZWVfcGFnZXMoYXJncyk7CisJcmV0 dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdudHRhYl9kbWFfYWxsb2NfcGFnZXMpOwor CisvKioKKyAqIGdudHRhYl9kbWFfZnJlZV9wYWdlcyAtIGZyZWUgRE1BYWJsZSBwYWdlcworICog QGFyZ3M6IGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24KKyAqLworaW50IGdudHRhYl9kbWFfZnJl ZV9wYWdlcyhzdHJ1Y3QgZ250dGFiX2RtYV9hbGxvY19hcmdzICphcmdzKQoreworCXNpemVfdCBz aXplOworCWludCBpLCByZXQ7CisKKwlnbnR0YWJfcGFnZXNfY2xlYXJfcHJpdmF0ZShhcmdzLT5u cl9wYWdlcywgYXJncy0+cGFnZXMpOworCisJZm9yIChpID0gMDsgaSA8IGFyZ3MtPm5yX3BhZ2Vz OyBpKyspCisJCWFyZ3MtPmZyYW1lc1tpXSA9IHBhZ2VfdG9feGVuX3BmbihhcmdzLT5wYWdlc1tp XSk7CisKKwlyZXQgPSB4ZW5tZW1fcmVzZXJ2YXRpb25faW5jcmVhc2UoYXJncy0+bnJfcGFnZXMs IGFyZ3MtPmZyYW1lcyk7CisJaWYgKHJldCAhPSBhcmdzLT5ucl9wYWdlcykgeworCQlwcl9kZWJ1 ZygiRmFpbGVkIHRvIGRlY3JlYXNlIHJlc2VydmF0aW9uIGZvciBETUEgYnVmZmVyXG4iKTsKKwkJ cmV0ID0gLUVGQVVMVDsKKwl9IGVsc2UgeworCQlyZXQgPSAwOworCX0KKworCXhlbm1lbV9yZXNl cnZhdGlvbl92YV9tYXBwaW5nX3VwZGF0ZShhcmdzLT5ucl9wYWdlcywgYXJncy0+cGFnZXMsCisJ CQkJCSAgICAgYXJncy0+ZnJhbWVzKTsKKworCXNpemUgPSBhcmdzLT5ucl9wYWdlcyA8PCBQQUdF X1NISUZUOworCWlmIChhcmdzLT5jb2hlcmVudCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoYXJncy0+ ZGV2LCBzaXplLAorCQkJCSAgYXJncy0+dmFkZHIsIGFyZ3MtPmRldl9idXNfYWRkcik7CisJZWxz ZQorCQlkbWFfZnJlZV93YyhhcmdzLT5kZXYsIHNpemUsCisJCQkgICAgYXJncy0+dmFkZHIsIGFy Z3MtPmRldl9idXNfYWRkcik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdu dHRhYl9kbWFfZnJlZV9wYWdlcyk7CisjZW5kaWYKKwogLyogSGFuZGxpbmcgb2YgcGFnZWQgb3V0 IGdyYW50IHRhcmdldHMgKEdOVFNUX2VhZ2FpbikgKi8KICNkZWZpbmUgTUFYX0RFTEFZIDI1Ngog c3RhdGljIGlubGluZSB2b2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9ncmFudF90YWJsZS5o IGIvaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaAppbmRleCBkZTAzZjI1NDJiYjcuLjliYzViYzA3 ZDRkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vZ3JhbnRfdGFibGUuaAorKysgYi9pbmNsdWRl L3hlbi9ncmFudF90YWJsZS5oCkBAIC0xOTgsNiArMTk4LDI0IEBAIHZvaWQgZ250dGFiX2ZyZWVf YXV0b194bGF0X2ZyYW1lcyh2b2lkKTsKIGludCBnbnR0YWJfYWxsb2NfcGFnZXMoaW50IG5yX3Bh Z2VzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTsKIHZvaWQgZ250dGFiX2ZyZWVfcGFnZXMoaW50IG5y X3BhZ2VzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzKTsKIAorI2lmZGVmIENPTkZJR19YRU5fR1JBTlRf RE1BX0FMTE9DCitzdHJ1Y3QgZ250dGFiX2RtYV9hbGxvY19hcmdzIHsKKwkvKiBEZXZpY2UgZm9y IHdoaWNoIERNQSBtZW1vcnkgd2lsbCBiZS93YXMgYWxsb2NhdGVkLiAqLworCXN0cnVjdCBkZXZp Y2UgKmRldjsKKwkvKiBJZiBzZXQgdGhlbiBETUEgYnVmZmVyIGlzIGNvaGVyZW50IGFuZCB3cml0 ZS1jb21iaW5lIG90aGVyd2lzZS4gKi8KKwlib29sIGNvaGVyZW50OworCisJaW50IG5yX3BhZ2Vz OworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJeGVuX3Bmbl90ICpmcmFtZXM7CisJdm9pZCAqdmFk ZHI7CisJZG1hX2FkZHJfdCBkZXZfYnVzX2FkZHI7Cit9OworCitpbnQgZ250dGFiX2RtYV9hbGxv Y19wYWdlcyhzdHJ1Y3QgZ250dGFiX2RtYV9hbGxvY19hcmdzICphcmdzKTsKK2ludCBnbnR0YWJf ZG1hX2ZyZWVfcGFnZXMoc3RydWN0IGdudHRhYl9kbWFfYWxsb2NfYXJncyAqYXJncyk7CisjZW5k aWYKKwogaW50IGdudHRhYl9wYWdlc19zZXRfcHJpdmF0ZShpbnQgbnJfcGFnZXMsIHN0cnVjdCBw YWdlICoqcGFnZXMpOwogdm9pZCBnbnR0YWJfcGFnZXNfY2xlYXJfcHJpdmF0ZShpbnQgbnJfcGFn ZXMsIHN0cnVjdCBwYWdlICoqcGFnZXMpOwogCi0tIAoyLjE3LjEKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJp LWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-lf0-f65.google.com ([209.85.215.65]:45990 "EHLO mail-lf0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933203AbeFLNmR (ORCPT ); Tue, 12 Jun 2018 09:42:17 -0400 From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, jgross@suse.com, boris.ostrovsky@oracle.com, konrad.wilk@oracle.com Cc: daniel.vetter@intel.com, andr2000@gmail.com, dongwon.kim@intel.com, matthew.d.roper@intel.com, Oleksandr Andrushchenko Subject: [PATCH v3 4/9] xen/grant-table: Allow allocating buffers suitable for DMA Date: Tue, 12 Jun 2018 16:41:55 +0300 Message-Id: <20180612134200.17456-5-andr2000@gmail.com> In-Reply-To: <20180612134200.17456-1-andr2000@gmail.com> References: <20180612134200.17456-1-andr2000@gmail.com> Sender: linux-media-owner@vger.kernel.org List-ID: From: Oleksandr Andrushchenko Extend grant table module API to allow allocating buffers that can be used for DMA operations and mapping foreign grant references on top of those. The resulting buffer is similar to the one allocated by the balloon driver in terms that proper memory reservation is made ({increase|decrease}_reservation and VA mappings updated if needed). This is useful for sharing foreign buffers with HW drivers which cannot work with scattered buffers provided by the balloon driver, but require DMAable memory instead. Signed-off-by: Oleksandr Andrushchenko --- drivers/xen/Kconfig | 13 ++++++ drivers/xen/grant-table.c | 97 +++++++++++++++++++++++++++++++++++++++ include/xen/grant_table.h | 18 ++++++++ 3 files changed, 128 insertions(+) diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index e5d0c28372ea..39536ddfbce4 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig @@ -161,6 +161,19 @@ config XEN_GRANT_DEV_ALLOC to other domains. This can be used to implement frontend drivers or as part of an inter-domain shared memory channel. +config XEN_GRANT_DMA_ALLOC + bool "Allow allocating DMA capable buffers with grant reference module" + depends on XEN && HAS_DMA + help + Extends grant table module API to allow allocating DMA capable + buffers and mapping foreign grant references on top of it. + The resulting buffer is similar to one allocated by the balloon + driver in terms that proper memory reservation is made + ({increase|decrease}_reservation and VA mappings updated if needed). + This is useful for sharing foreign buffers with HW drivers which + cannot work with scattered buffers provided by the balloon driver, + but require DMAable memory instead. + config SWIOTLB_XEN def_bool y select SWIOTLB diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index dbb48a89e987..26ed498b5e6d 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c @@ -45,6 +45,9 @@ #include #include #include +#ifdef CONFIG_XEN_GRANT_DMA_ALLOC +#include +#endif #include #include @@ -57,6 +60,7 @@ #ifdef CONFIG_X86 #include #endif +#include #include #include @@ -838,6 +842,99 @@ void gnttab_free_pages(int nr_pages, struct page **pages) } EXPORT_SYMBOL_GPL(gnttab_free_pages); +#ifdef CONFIG_XEN_GRANT_DMA_ALLOC +/** + * gnttab_dma_alloc_pages - alloc DMAable pages suitable for grant mapping into + * @args: arguments to the function + */ +int gnttab_dma_alloc_pages(struct gnttab_dma_alloc_args *args) +{ + unsigned long pfn, start_pfn; + size_t size; + int i, ret; + + size = args->nr_pages << PAGE_SHIFT; + if (args->coherent) + args->vaddr = dma_alloc_coherent(args->dev, size, + &args->dev_bus_addr, + GFP_KERNEL | __GFP_NOWARN); + else + args->vaddr = dma_alloc_wc(args->dev, size, + &args->dev_bus_addr, + GFP_KERNEL | __GFP_NOWARN); + if (!args->vaddr) { + pr_debug("Failed to allocate DMA buffer of size %zu\n", size); + return -ENOMEM; + } + + start_pfn = __phys_to_pfn(args->dev_bus_addr); + for (pfn = start_pfn, i = 0; pfn < start_pfn + args->nr_pages; + pfn++, i++) { + struct page *page = pfn_to_page(pfn); + + args->pages[i] = page; + args->frames[i] = xen_page_to_gfn(page); + xenmem_reservation_scrub_page(page); + } + + xenmem_reservation_va_mapping_reset(args->nr_pages, args->pages); + + ret = xenmem_reservation_decrease(args->nr_pages, args->frames); + if (ret != args->nr_pages) { + pr_debug("Failed to decrease reservation for DMA buffer\n"); + ret = -EFAULT; + goto fail; + } + + ret = gnttab_pages_set_private(args->nr_pages, args->pages); + if (ret < 0) + goto fail; + + return 0; + +fail: + gnttab_dma_free_pages(args); + return ret; +} +EXPORT_SYMBOL_GPL(gnttab_dma_alloc_pages); + +/** + * gnttab_dma_free_pages - free DMAable pages + * @args: arguments to the function + */ +int gnttab_dma_free_pages(struct gnttab_dma_alloc_args *args) +{ + size_t size; + int i, ret; + + gnttab_pages_clear_private(args->nr_pages, args->pages); + + for (i = 0; i < args->nr_pages; i++) + args->frames[i] = page_to_xen_pfn(args->pages[i]); + + ret = xenmem_reservation_increase(args->nr_pages, args->frames); + if (ret != args->nr_pages) { + pr_debug("Failed to decrease reservation for DMA buffer\n"); + ret = -EFAULT; + } else { + ret = 0; + } + + xenmem_reservation_va_mapping_update(args->nr_pages, args->pages, + args->frames); + + size = args->nr_pages << PAGE_SHIFT; + if (args->coherent) + dma_free_coherent(args->dev, size, + args->vaddr, args->dev_bus_addr); + else + dma_free_wc(args->dev, size, + args->vaddr, args->dev_bus_addr); + return ret; +} +EXPORT_SYMBOL_GPL(gnttab_dma_free_pages); +#endif + /* Handling of paged out grant targets (GNTST_eagain) */ #define MAX_DELAY 256 static inline void diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h index de03f2542bb7..9bc5bc07d4d3 100644 --- a/include/xen/grant_table.h +++ b/include/xen/grant_table.h @@ -198,6 +198,24 @@ void gnttab_free_auto_xlat_frames(void); int gnttab_alloc_pages(int nr_pages, struct page **pages); void gnttab_free_pages(int nr_pages, struct page **pages); +#ifdef CONFIG_XEN_GRANT_DMA_ALLOC +struct gnttab_dma_alloc_args { + /* Device for which DMA memory will be/was allocated. */ + struct device *dev; + /* If set then DMA buffer is coherent and write-combine otherwise. */ + bool coherent; + + int nr_pages; + struct page **pages; + xen_pfn_t *frames; + void *vaddr; + dma_addr_t dev_bus_addr; +}; + +int gnttab_dma_alloc_pages(struct gnttab_dma_alloc_args *args); +int gnttab_dma_free_pages(struct gnttab_dma_alloc_args *args); +#endif + int gnttab_pages_set_private(int nr_pages, struct page **pages); void gnttab_pages_clear_private(int nr_pages, struct page **pages); -- 2.17.1