From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH 4/4] drm/i915: Use __sg_alloc_table_from_pages for userptr allocations Date: Thu, 4 May 2017 16:54:05 +0100 Message-ID: <20170504155405.7425-4-tvrtko.ursulin@linux.intel.com> References: <20170504155405.7425-1-tvrtko.ursulin@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x241.google.com (mail-wm0-x241.google.com [IPv6:2a00:1450:400c:c09::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id D267A6E09F for ; Thu, 4 May 2017 15:54:18 +0000 (UTC) Received: by mail-wm0-x241.google.com with SMTP id y10so4237735wmh.0 for ; Thu, 04 May 2017 08:54:18 -0700 (PDT) In-Reply-To: <20170504155405.7425-1-tvrtko.ursulin@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Intel-gfx@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCldpdGggdGhl IGFkZGl0aW9uIG9mIF9fc2dfYWxsb2NfdGFibGVfZnJvbV9wYWdlcyB3ZSBjYW4gY29udHJvbAp0 aGUgbWF4aW11bSBjb2FsbGVzY2luZyBzaXplIGFuZCBlbGltaW5hdGUgYSBzZXBhcmF0ZSBwYXRo IGZvcgphbGxvY2F0aW5nIGJhY2tpbmcgc3RvcmUgaGVyZS4KClNpbWlsYXIgdG8gODcxZGZiZDY3 ZDRlICgiZHJtL2k5MTU6IEFsbG93IGNvbXBhY3Rpb24gdXB0bwpTV0lPVExCIG1heCBzZWdtZW50 IHNpemUiKSB0aGlzIGVuYWJsZXMgbW9yZSBjb21wYWN0IHNnIGxpc3RzIHRvCmJlIGNyZWF0ZWQg YW5kIHNvIGhhcyBhIGJlbmVmaWNpYWwgZWZmZWN0IG9uIHdvcmtsb2FkcyB3aXRoIG1hbnkKYW5k L29yIGxhcmdlIG9iamVjdHMgb2YgdGhpcyBjbGFzcy4KCnYyOgogKiBSZW5hbWUgaGVscGVyIHRv IGk5MTVfc2dfc2VnbWVudF9zaXplIGFuZCBmaXggc3dpb3RsYiBvdmVycmlkZS4KICogQ29tbWl0 IG1lc3NhZ2UgdXBkYXRlLgoKdjM6CiAqIEFjdHVhbGx5IGluY2x1ZGUgdGhlIHN3aW90bGIgb3Zl cnJpZGUgZml4LgoKdjQ6CiAqIFJlZ3JvdXAgcGFyYW1ldGVycyBhIGJpdC4gKENocmlzIFdpbHNv bikKCnY1OgogKiBSZWJhc2UgZm9yIHN3aW90bGJfbWF4X3NlZ21lbnQuCiAqIEFkZCBETUEgbWFw IGZhaWx1cmUgaGFuZGxpbmcgYXMgaW4gYWJiMGRlYWNiNWE2CiAgICgiZHJtL2k5MTU6IEZhbGxi YWNrIHRvIHNpbmdsZSBQQUdFX1NJWkUgc2VnbWVudHMgZm9yIERNQSByZW1hcHBpbmciKS4KCnY2 OiBIYW5kbGUgc3dpb3RsYl9tYXhfc2VnbWVudCgpIHJldHVybmluZyAxLiAoSm9vbmFzIExhaHRp bmVuKQoKdjc6IFJlYmFzZS4KClNpZ25lZC1vZmYtYnk6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28u dXJzdWxpbkBpbnRlbC5jb20+CkNjOiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5j by51az4KQ2M6IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKUmV2aWV3ZWQtYnk6IENocmlz IFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPiAodjQpCkNjOiBKb29uYXMgTGFodGlu ZW4gPGpvb25hcy5sYWh0aW5lbkBsaW51eC5pbnRlbC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9kcnYuaCAgICAgICAgIHwgMTUgKysrKysrKwogZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9nZW0uYyAgICAgICAgIHwgIDYgKy0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1 X2dlbV91c2VycHRyLmMgfCA3OSArKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDMg ZmlsZXMgY2hhbmdlZCwgNDUgaW5zZXJ0aW9ucygrKSwgNTUgZGVsZXRpb25zKC0pCgpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfZHJ2LmgKaW5kZXggYjIwZWQxNmRhMGFkLi4zMjBjMTZkZjFjOWMgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9kcnYuaApAQCAtMjY3Niw2ICsyNjc2LDIxIEBAIHN0YXRpYyBpbmxpbmUgc3Ry dWN0IHNjYXR0ZXJsaXN0ICpfX3NnX25leHQoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKIAkgICAg ICgoKF9faXRlcikuY3VyciArPSBQQUdFX1NJWkUpIDwgKF9faXRlcikubWF4KSB8fAkJXAogCSAg ICAgKChfX2l0ZXIpID0gX19zZ3RfaXRlcihfX3NnX25leHQoKF9faXRlcikuc2dwKSwgZmFsc2Up LCAwKSkKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaTkxNV9zZ19zZWdtZW50X3NpemUo dm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHN3aW90bGJfbWF4X3NlZ21lbnQoKTsKKwor CWlmIChzaXplID09IDApCisJCXJldHVybiBTQ0FUVEVSTElTVF9NQVhfU0VHTUVOVDsKKworCXNp emUgPSByb3VuZGRvd24oc2l6ZSwgUEFHRV9TSVpFKTsKKwkvKiBzd2lvdGxiX21heF9zZWdtZW50 X3NpemUgY2FuIHJldHVybiAxIGJ5dGUgd2hlbiBpdCBtZWFucyBvbmUgcGFnZS4gKi8KKwlpZiAo c2l6ZSA8IFBBR0VfU0laRSkKKwkJc2l6ZSA9IFBBR0VfU0laRTsKKworCXJldHVybiBzaXplOwor fQorCiBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyAqCiBpbnRl bF9pbmZvKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2dlbS5jCmluZGV4IGY5YzZiOWI1MDAyYy4uYjI3Mjc5MDVlZjJiIDEwMDY0NAot LS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTIzMzYsNyArMjMzNiw3IEBAIGk5MTVfZ2VtX29iamVjdF9n ZXRfcGFnZXNfZ3R0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiAJc3RydWN0IHNn dF9pdGVyIHNndF9pdGVyOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGxvbmcgbGFz dF9wZm4gPSAwOwkvKiBzdXBwcmVzcyBnY2Mgd2FybmluZyAqLwotCXVuc2lnbmVkIGludCBtYXhf c2VnbWVudDsKKwl1bnNpZ25lZCBpbnQgbWF4X3NlZ21lbnQgPSBpOTE1X3NnX3NlZ21lbnRfc2l6 ZSgpOwogCWludCByZXQ7CiAJZ2ZwX3QgZ2ZwOwogCkBAIC0yMzQ3LDEwICsyMzQ3LDYgQEAgaTkx NV9nZW1fb2JqZWN0X2dldF9wYWdlc19ndHQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aikKIAlHRU1fQlVHX09OKG9iai0+YmFzZS5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9HUFVfRE9N QUlOUyk7CiAJR0VNX0JVR19PTihvYmotPmJhc2Uud3JpdGVfZG9tYWluICYgSTkxNV9HRU1fR1BV X0RPTUFJTlMpOwogCi0JbWF4X3NlZ21lbnQgPSBzd2lvdGxiX21heF9zZWdtZW50KCk7Ci0JaWYg KCFtYXhfc2VnbWVudCkKLQkJbWF4X3NlZ21lbnQgPSByb3VuZGRvd24oVUlOVF9NQVgsIFBBR0Vf U0laRSk7Ci0KIAlzdCA9IGttYWxsb2Moc2l6ZW9mKCpzdCksIEdGUF9LRVJORUwpOwogCWlmIChz dCA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3VzZXJwdHIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2k5MTVfZ2VtX3VzZXJwdHIuYwppbmRleCA1OGNjZjhiOGNhMWMuLmQwMDMwNzY3MDJhZCAxMDA2 NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdXNlcnB0ci5jCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3VzZXJwdHIuYwpAQCAtMzk5LDY0ICszOTksNDIg QEAgc3RydWN0IGdldF9wYWdlc193b3JrIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiB9 OwogCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfU1dJT1RMQikKLSNkZWZpbmUgc3dpb3RsYl9hY3Rp dmUoKSBzd2lvdGxiX25yX3RibCgpCi0jZWxzZQotI2RlZmluZSBzd2lvdGxiX2FjdGl2ZSgpIDAK LSNlbmRpZgotCi1zdGF0aWMgaW50Ci1zdF9zZXRfcGFnZXMoc3RydWN0IHNnX3RhYmxlICoqc3Qs IHN0cnVjdCBwYWdlICoqcHZlYywgaW50IG51bV9wYWdlcykKLXsKLQlzdHJ1Y3Qgc2NhdHRlcmxp c3QgKnNnOwotCWludCByZXQsIG47Ci0KLQkqc3QgPSBrbWFsbG9jKHNpemVvZigqKnN0KSwgR0ZQ X0tFUk5FTCk7Ci0JaWYgKCpzdCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChz d2lvdGxiX2FjdGl2ZSgpKSB7Ci0JCXJldCA9IHNnX2FsbG9jX3RhYmxlKCpzdCwgbnVtX3BhZ2Vz LCBHRlBfS0VSTkVMKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOwotCi0JCWZvcl9lYWNoX3Nn KCgqc3QpLT5zZ2wsIHNnLCBudW1fcGFnZXMsIG4pCi0JCQlzZ19zZXRfcGFnZShzZywgcHZlY1tu XSwgUEFHRV9TSVpFLCAwKTsKLQl9IGVsc2UgewotCQlyZXQgPSBzZ19hbGxvY190YWJsZV9mcm9t X3BhZ2VzKCpzdCwgcHZlYywgbnVtX3BhZ2VzLAotCQkJCQkJMCwgbnVtX3BhZ2VzIDw8IFBBR0Vf U0hJRlQsCi0JCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOwotCX0K LQotCXJldHVybiAwOwotCi1lcnI6Ci0Ja2ZyZWUoKnN0KTsKLQkqc3QgPSBOVUxMOwotCXJldHVy biByZXQ7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKgotX19pOTE1X2dlbV91c2VycHRy X3NldF9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAotCQkJICAgICBzdHJ1 Y3QgcGFnZSAqKnB2ZWMsIGludCBudW1fcGFnZXMpCitfX2k5MTVfZ2VtX3VzZXJwdHJfYWxsb2Nf cGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCSAgICAgICBzdHJ1Y3Qg cGFnZSAqKnB2ZWMsIGludCBudW1fcGFnZXMpCiB7Ci0Jc3RydWN0IHNnX3RhYmxlICpwYWdlczsK Kwl1bnNpZ25lZCBpbnQgbWF4X3NlZ21lbnQgPSBpOTE1X3NnX3NlZ21lbnRfc2l6ZSgpOworCXN0 cnVjdCBzZ190YWJsZSAqc3Q7CiAJaW50IHJldDsKIAotCXJldCA9IHN0X3NldF9wYWdlcygmcGFn ZXMsIHB2ZWMsIG51bV9wYWdlcyk7Ci0JaWYgKHJldCkKKwlzdCA9IGttYWxsb2Moc2l6ZW9mKCpz dCksIEdGUF9LRVJORUwpOworCWlmICghc3QpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwor CithbGxvY190YWJsZToKKwlyZXQgPSBfX3NnX2FsbG9jX3RhYmxlX2Zyb21fcGFnZXMoc3QsIHB2 ZWMsIG51bV9wYWdlcywKKwkJCQkJICAwLCBudW1fcGFnZXMgPDwgUEFHRV9TSElGVCwKKwkJCQkJ ICBtYXhfc2VnbWVudCwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KSB7CisJCWtmcmVl KHN0KTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXQgPSBpOTE1X2dlbV9ndHRf cHJlcGFyZV9wYWdlcyhvYmosIHBhZ2VzKTsKKwlyZXQgPSBpOTE1X2dlbV9ndHRfcHJlcGFyZV9w YWdlcyhvYmosIHN0KTsKIAlpZiAocmV0KSB7Ci0JCXNnX2ZyZWVfdGFibGUocGFnZXMpOwotCQlr ZnJlZShwYWdlcyk7CisJCXNnX2ZyZWVfdGFibGUoc3QpOworCisJCWlmIChtYXhfc2VnbWVudCA+ IFBBR0VfU0laRSkgeworCQkJbWF4X3NlZ21lbnQgPSBQQUdFX1NJWkU7CisJCQlnb3RvIGFsbG9j X3RhYmxlOworCQl9CisKKwkJa2ZyZWUoc3QpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0K IAotCXJldHVybiBwYWdlczsKKwlyZXR1cm4gc3Q7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTU0MCw3 ICs1MTgsOCBAQCBfX2k5MTVfZ2VtX3VzZXJwdHJfZ2V0X3BhZ2VzX3dvcmtlcihzdHJ1Y3Qgd29y a19zdHJ1Y3QgKl93b3JrKQogCQlzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzID0gRVJSX1BUUihyZXQp OwogCiAJCWlmIChwaW5uZWQgPT0gbnBhZ2VzKSB7Ci0JCQlwYWdlcyA9IF9faTkxNV9nZW1fdXNl cnB0cl9zZXRfcGFnZXMob2JqLCBwdmVjLCBucGFnZXMpOworCQkJcGFnZXMgPSBfX2k5MTVfZ2Vt X3VzZXJwdHJfYWxsb2NfcGFnZXMob2JqLCBwdmVjLAorCQkJCQkJCSAgICAgICBucGFnZXMpOwog CQkJaWYgKCFJU19FUlIocGFnZXMpKSB7CiAJCQkJX19pOTE1X2dlbV9vYmplY3Rfc2V0X3BhZ2Vz KG9iaiwgcGFnZXMpOwogCQkJCXBpbm5lZCA9IDA7CkBAIC02NjEsNyArNjQwLDcgQEAgaTkxNV9n ZW1fdXNlcnB0cl9nZXRfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIAkJ cGFnZXMgPSBfX2k5MTVfZ2VtX3VzZXJwdHJfZ2V0X3BhZ2VzX3NjaGVkdWxlKG9iaik7CiAJCWFj dGl2ZSA9IHBhZ2VzID09IEVSUl9QVFIoLUVBR0FJTik7CiAJfSBlbHNlIHsKLQkJcGFnZXMgPSBf X2k5MTVfZ2VtX3VzZXJwdHJfc2V0X3BhZ2VzKG9iaiwgcHZlYywgbnVtX3BhZ2VzKTsKKwkJcGFn ZXMgPSBfX2k5MTVfZ2VtX3VzZXJwdHJfYWxsb2NfcGFnZXMob2JqLCBwdmVjLCBudW1fcGFnZXMp OwogCQlhY3RpdmUgPSAhSVNfRVJSKHBhZ2VzKTsKIAl9CiAJaWYgKGFjdGl2ZSkKLS0gCjIuOS4z CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1n ZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754126AbdEDPzA (ORCPT ); Thu, 4 May 2017 11:55:00 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:33304 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752747AbdEDPyT (ORCPT ); Thu, 4 May 2017 11:54:19 -0400 From: Tvrtko Ursulin X-Google-Original-From: Tvrtko Ursulin To: Intel-gfx@lists.freedesktop.org Cc: tursulin@ursulin.net, Tvrtko Ursulin , Chris Wilson , linux-kernel@vger.kernel.org, Joonas Lahtinen Subject: [PATCH 4/4] drm/i915: Use __sg_alloc_table_from_pages for userptr allocations Date: Thu, 4 May 2017 16:54:05 +0100 Message-Id: <20170504155405.7425-4-tvrtko.ursulin@linux.intel.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170504155405.7425-1-tvrtko.ursulin@linux.intel.com> References: <20170504155405.7425-1-tvrtko.ursulin@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Tvrtko Ursulin With the addition of __sg_alloc_table_from_pages we can control the maximum coallescing size and eliminate a separate path for allocating backing store here. Similar to 871dfbd67d4e ("drm/i915: Allow compaction upto SWIOTLB max segment size") this enables more compact sg lists to be created and so has a beneficial effect on workloads with many and/or large objects of this class. v2: * Rename helper to i915_sg_segment_size and fix swiotlb override. * Commit message update. v3: * Actually include the swiotlb override fix. v4: * Regroup parameters a bit. (Chris Wilson) v5: * Rebase for swiotlb_max_segment. * Add DMA map failure handling as in abb0deacb5a6 ("drm/i915: Fallback to single PAGE_SIZE segments for DMA remapping"). v6: Handle swiotlb_max_segment() returning 1. (Joonas Lahtinen) v7: Rebase. Signed-off-by: Tvrtko Ursulin Cc: Chris Wilson Cc: linux-kernel@vger.kernel.org Reviewed-by: Chris Wilson (v4) Cc: Joonas Lahtinen --- drivers/gpu/drm/i915/i915_drv.h | 15 +++++++ drivers/gpu/drm/i915/i915_gem.c | 6 +-- drivers/gpu/drm/i915/i915_gem_userptr.c | 79 ++++++++++++--------------------- 3 files changed, 45 insertions(+), 55 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index b20ed16da0ad..320c16df1c9c 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2676,6 +2676,21 @@ static inline struct scatterlist *__sg_next(struct scatterlist *sg) (((__iter).curr += PAGE_SIZE) < (__iter).max) || \ ((__iter) = __sgt_iter(__sg_next((__iter).sgp), false), 0)) +static inline unsigned int i915_sg_segment_size(void) +{ + unsigned int size = swiotlb_max_segment(); + + if (size == 0) + return SCATTERLIST_MAX_SEGMENT; + + size = rounddown(size, PAGE_SIZE); + /* swiotlb_max_segment_size can return 1 byte when it means one page. */ + if (size < PAGE_SIZE) + size = PAGE_SIZE; + + return size; +} + static inline const struct intel_device_info * intel_info(const struct drm_i915_private *dev_priv) { diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index f9c6b9b5002c..b2727905ef2b 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -2336,7 +2336,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) struct sgt_iter sgt_iter; struct page *page; unsigned long last_pfn = 0; /* suppress gcc warning */ - unsigned int max_segment; + unsigned int max_segment = i915_sg_segment_size(); int ret; gfp_t gfp; @@ -2347,10 +2347,6 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) GEM_BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS); GEM_BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS); - max_segment = swiotlb_max_segment(); - if (!max_segment) - max_segment = rounddown(UINT_MAX, PAGE_SIZE); - st = kmalloc(sizeof(*st), GFP_KERNEL); if (st == NULL) return ERR_PTR(-ENOMEM); diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c index 58ccf8b8ca1c..d003076702ad 100644 --- a/drivers/gpu/drm/i915/i915_gem_userptr.c +++ b/drivers/gpu/drm/i915/i915_gem_userptr.c @@ -399,64 +399,42 @@ struct get_pages_work { struct task_struct *task; }; -#if IS_ENABLED(CONFIG_SWIOTLB) -#define swiotlb_active() swiotlb_nr_tbl() -#else -#define swiotlb_active() 0 -#endif - -static int -st_set_pages(struct sg_table **st, struct page **pvec, int num_pages) -{ - struct scatterlist *sg; - int ret, n; - - *st = kmalloc(sizeof(**st), GFP_KERNEL); - if (*st == NULL) - return -ENOMEM; - - if (swiotlb_active()) { - ret = sg_alloc_table(*st, num_pages, GFP_KERNEL); - if (ret) - goto err; - - for_each_sg((*st)->sgl, sg, num_pages, n) - sg_set_page(sg, pvec[n], PAGE_SIZE, 0); - } else { - ret = sg_alloc_table_from_pages(*st, pvec, num_pages, - 0, num_pages << PAGE_SHIFT, - GFP_KERNEL); - if (ret) - goto err; - } - - return 0; - -err: - kfree(*st); - *st = NULL; - return ret; -} - static struct sg_table * -__i915_gem_userptr_set_pages(struct drm_i915_gem_object *obj, - struct page **pvec, int num_pages) +__i915_gem_userptr_alloc_pages(struct drm_i915_gem_object *obj, + struct page **pvec, int num_pages) { - struct sg_table *pages; + unsigned int max_segment = i915_sg_segment_size(); + struct sg_table *st; int ret; - ret = st_set_pages(&pages, pvec, num_pages); - if (ret) + st = kmalloc(sizeof(*st), GFP_KERNEL); + if (!st) + return ERR_PTR(-ENOMEM); + +alloc_table: + ret = __sg_alloc_table_from_pages(st, pvec, num_pages, + 0, num_pages << PAGE_SHIFT, + max_segment, + GFP_KERNEL); + if (ret) { + kfree(st); return ERR_PTR(ret); + } - ret = i915_gem_gtt_prepare_pages(obj, pages); + ret = i915_gem_gtt_prepare_pages(obj, st); if (ret) { - sg_free_table(pages); - kfree(pages); + sg_free_table(st); + + if (max_segment > PAGE_SIZE) { + max_segment = PAGE_SIZE; + goto alloc_table; + } + + kfree(st); return ERR_PTR(ret); } - return pages; + return st; } static int @@ -540,7 +518,8 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work) struct sg_table *pages = ERR_PTR(ret); if (pinned == npages) { - pages = __i915_gem_userptr_set_pages(obj, pvec, npages); + pages = __i915_gem_userptr_alloc_pages(obj, pvec, + npages); if (!IS_ERR(pages)) { __i915_gem_object_set_pages(obj, pages); pinned = 0; @@ -661,7 +640,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) pages = __i915_gem_userptr_get_pages_schedule(obj); active = pages == ERR_PTR(-EAGAIN); } else { - pages = __i915_gem_userptr_set_pages(obj, pvec, num_pages); + pages = __i915_gem_userptr_alloc_pages(obj, pvec, num_pages); active = !IS_ERR(pages); } if (active) -- 2.9.3