From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sasha Levin Subject: [PATCH AUTOSEL 4.20 045/105] pvcalls-front: Avoid get_free_pages(GFP_KERNEL) under spinlock Date: Tue, 12 Feb 2019 21:32:36 -0500 Message-ID: <20190213023336.19019-45-sashal@kernel.org> References: <20190213023336.19019-1-sashal@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gtkNs-0008WT-5K for xen-devel@lists.xenproject.org; Wed, 13 Feb 2019 02:34:48 +0000 In-Reply-To: <20190213023336.19019-1-sashal@kernel.org> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Juergen Gross , Sasha Levin , Stefano Stabellini , Julia Lawall , xen-devel@lists.xenproject.org, Boris Ostrovsky , Wen Yang List-Id: xen-devel@lists.xenproject.org RnJvbTogV2VuIFlhbmcgPHdlbi55YW5nOTlAenRlLmNvbS5jbj4KClsgVXBzdHJlYW0gY29tbWl0 IDlmNTFjMDVkYzQxYTZkNjk0MjNlM2QwM2QxOGViN2FiMjJmOWVjMTkgXQoKVGhlIHByb2JsZW0g aXMgdGhhdCB3ZSBjYWxsIHRoaXMgd2l0aCBhIHNwaW4gbG9jayBoZWxkLgpUaGUgY2FsbCB0cmVl IGlzOgpwdmNhbGxzX2Zyb250X2FjY2VwdCgpIGhvbGRzIGJlZGF0YS0+c29ja2V0X2xvY2suCiAg ICAtPiBjcmVhdGVfYWN0aXZlKCkKICAgICAgICAtPiBfX2dldF9mcmVlX3BhZ2VzKCkgdXNlcyBH RlBfS0VSTkVMCgpUaGUgY3JlYXRlX2FjdGl2ZSgpIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZy b20gcHZjYWxsc19mcm9udF9hY2NlcHQoKQp3aXRoIGEgc3Bpbl9sb2NrIGhlbGQsIFRoZSBhbGxv Y2F0aW9uIGlzIG5vdCBhbGxvd2VkIHRvIHNsZWVwIGFuZApHRlBfS0VSTkVMIGlzIG5vdCBzdWZm aWNpZW50LgoKVGhpcyBpc3N1ZSB3YXMgZGV0ZWN0ZWQgYnkgdXNpbmcgdGhlIENvY2NpbmVsbGUg c29mdHdhcmUuCgp2MjogQWRkIGEgZnVuY3Rpb24gZG9pbmcgdGhlIGFsbG9jYXRpb25zIHdoaWNo IGlzIGNhbGxlZAogICAgb3V0c2lkZSB0aGUgbG9jayBhbmQgcGFzc2luZyB0aGUgYWxsb2NhdGVk IGRhdGEgdG8KICAgIGNyZWF0ZV9hY3RpdmUoKS4KCnYzOiBVc2UgdGhlIG1hdGNoaW5nIGRlYWxs b2NhdG9ycyBpLmUuLCBmcmVlX3BhZ2UoKQogICAgYW5kIGZyZWVfcGFnZXMoKSwgcmVzcGVjdGl2 ZWx5LgoKdjQ6IEl0IHdvdWxkIGJlIGJldHRlciB0byBwcmUtcG9wdWxhdGUgbWFwIChzdHJ1Y3Qg c29ja19tYXBwaW5nKSwKICAgIHJhdGhlciB0aGFuIGludHJvZHVjaW5nIG9uZSBtb3JlIG5ldyBz dHJ1Y3QuCgp2NTogU2luY2UgYWxsb2NhdGluZyB0aGUgZGF0YSBvdXRzaWRlIG9mIHRoaXMgY2Fs bCBpdCBzaG91bGQgYWxzbwogICAgYmUgZnJlZWQgb3V0c2lkZSwgd2hlbiBjcmVhdGVfYWN0aXZl KCkgZmFpbHMuCiAgICBNb3ZlIGt6YWxsb2Moc2l6ZW9mKCptYXAyKSwgR0ZQX0FUT01JQykgb3V0 c2lkZSBzcGlubG9jayBhbmQKICAgIHVzZSBHRlBfS0VSTkVMIGluc3RlYWQuCgp2NjogRHJvcCB0 aGUgc3VwZXJmbHVvdXMgY2FsbHMuCgpTdWdnZXN0ZWQtYnk6IEp1ZXJnZW4gR3Jvc3MgPGpncm9z c0BzdXNlLmNvbT4KU3VnZ2VzdGVkLWJ5OiBCb3JpcyBPc3Ryb3Zza3kgPGJvcmlzLm9zdHJvdnNr eUBvcmFjbGUuY29tPgpTdWdnZXN0ZWQtYnk6IFN0ZWZhbm8gU3RhYmVsbGluaSA8c3N0YWJlbGxp bmlAa2VybmVsLm9yZz4KU2lnbmVkLW9mZi1ieTogV2VuIFlhbmcgPHdlbi55YW5nOTlAenRlLmNv bS5jbj4KQWNrZWQtYnk6IFN0ZWZhbm8gU3RhYmVsbGluaSA8c3N0YWJlbGxpbmlAa2VybmVsLm9y Zz4KQ0M6IEp1bGlhIExhd2FsbCA8anVsaWEubGF3YWxsQGxpcDYuZnI+CkNDOiBCb3JpcyBPc3Ry b3Zza3kgPGJvcmlzLm9zdHJvdnNreUBvcmFjbGUuY29tPgpDQzogSnVlcmdlbiBHcm9zcyA8amdy b3NzQHN1c2UuY29tPgpDQzogU3RlZmFubyBTdGFiZWxsaW5pIDxzc3RhYmVsbGluaUBrZXJuZWwu b3JnPgpDQzogeGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCkNDOiBsaW51eC1rZXJuZWxA dmdlci5rZXJuZWwub3JnClNpZ25lZC1vZmYtYnk6IEJvcmlzIE9zdHJvdnNreSA8Ym9yaXMub3N0 cm92c2t5QG9yYWNsZS5jb20+ClNpZ25lZC1vZmYtYnk6IFNhc2hhIExldmluIDxzYXNoYWxAa2Vy bmVsLm9yZz4KLS0tCiBkcml2ZXJzL3hlbi9wdmNhbGxzLWZyb250LmMgfCA4MSArKysrKysrKysr KysrKysrKysrKysrKysrKystLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgNTkgaW5zZXJ0aW9u cygrKSwgMjIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vcHZjYWxscy1m cm9udC5jIGIvZHJpdmVycy94ZW4vcHZjYWxscy1mcm9udC5jCmluZGV4IDAxNTg4NTgyYWU2Ni4u NjM1NzE2MGQ0NjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9wdmNhbGxzLWZyb250LmMKKysr IGIvZHJpdmVycy94ZW4vcHZjYWxscy1mcm9udC5jCkBAIC0zNDEsNiArMzQxLDM5IEBAIGludCBw dmNhbGxzX2Zyb250X3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogCXJldHVybiByZXQ7CiB9 CiAKK3N0YXRpYyB2b2lkIGZyZWVfYWN0aXZlX3Jpbmcoc3RydWN0IHNvY2tfbWFwcGluZyAqbWFw KQoreworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpbWFwLT5hY3RpdmUuZGF0YS5pbiwKKwkJ CW1hcC0+YWN0aXZlLnJpbmctPnJpbmdfb3JkZXIpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9u ZyltYXAtPmFjdGl2ZS5yaW5nKTsKK30KKworc3RhdGljIGludCBhbGxvY19hY3RpdmVfcmluZyhz dHJ1Y3Qgc29ja19tYXBwaW5nICptYXApCit7CisJdm9pZCAqYnl0ZXM7CisKKwltYXAtPmFjdGl2 ZS5yaW5nID0gKHN0cnVjdCBwdmNhbGxzX2RhdGFfaW50ZiAqKQorCQlnZXRfemVyb2VkX3BhZ2Uo R0ZQX0tFUk5FTCk7CisJaWYgKCFtYXAtPmFjdGl2ZS5yaW5nKQorCQlnb3RvIG91dDsKKworCW1h cC0+YWN0aXZlLnJpbmctPnJpbmdfb3JkZXIgPSBQVkNBTExTX1JJTkdfT1JERVI7CisJYnl0ZXMg PSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCisJCQkJ CVBWQ0FMTFNfUklOR19PUkRFUik7CisJaWYgKCFieXRlcykKKwkJZ290byBvdXQ7CisKKwltYXAt PmFjdGl2ZS5kYXRhLmluID0gYnl0ZXM7CisJbWFwLT5hY3RpdmUuZGF0YS5vdXQgPSBieXRlcyAr CisJCVhFTl9GTEVYX1JJTkdfU0laRShQVkNBTExTX1JJTkdfT1JERVIpOworCisJcmV0dXJuIDA7 CisKK291dDoKKwlmcmVlX2FjdGl2ZV9yaW5nKG1hcCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisK IHN0YXRpYyBpbnQgY3JlYXRlX2FjdGl2ZShzdHJ1Y3Qgc29ja19tYXBwaW5nICptYXAsIGludCAq ZXZ0Y2huKQogewogCXZvaWQgKmJ5dGVzOwpAQCAtMzQ5LDE1ICszODIsNyBAQCBzdGF0aWMgaW50 IGNyZWF0ZV9hY3RpdmUoc3RydWN0IHNvY2tfbWFwcGluZyAqbWFwLCBpbnQgKmV2dGNobikKIAkq ZXZ0Y2huID0gLTE7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmbWFwLT5hY3RpdmUuaW5mbGlnaHRf Y29ubl9yZXEpOwogCi0JbWFwLT5hY3RpdmUucmluZyA9IChzdHJ1Y3QgcHZjYWxsc19kYXRhX2lu dGYgKikKLQkJX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKLQlpZiAo bWFwLT5hY3RpdmUucmluZyA9PSBOVUxMKQotCQlnb3RvIG91dF9lcnJvcjsKLQltYXAtPmFjdGl2 ZS5yaW5nLT5yaW5nX29yZGVyID0gUFZDQUxMU19SSU5HX09SREVSOwotCWJ5dGVzID0gKHZvaWQg KilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAotCQkJCQlQVkNBTExT X1JJTkdfT1JERVIpOwotCWlmIChieXRlcyA9PSBOVUxMKQotCQlnb3RvIG91dF9lcnJvcjsKKwli eXRlcyA9IG1hcC0+YWN0aXZlLmRhdGEuaW47CiAJZm9yIChpID0gMDsgaSA8ICgxIDw8IFBWQ0FM TFNfUklOR19PUkRFUik7IGkrKykKIAkJbWFwLT5hY3RpdmUucmluZy0+cmVmW2ldID0gZ250dGFi X2dyYW50X2ZvcmVpZ25fYWNjZXNzKAogCQkJcHZjYWxsc19mcm9udF9kZXYtPm90aGVyZW5kX2lk LApAQCAtMzY3LDEwICszOTIsNiBAQCBzdGF0aWMgaW50IGNyZWF0ZV9hY3RpdmUoc3RydWN0IHNv Y2tfbWFwcGluZyAqbWFwLCBpbnQgKmV2dGNobikKIAkJcHZjYWxsc19mcm9udF9kZXYtPm90aGVy ZW5kX2lkLAogCQlwZm5fdG9fZ2ZuKHZpcnRfdG9fcGZuKCh2b2lkICopbWFwLT5hY3RpdmUucmlu ZykpLCAwKTsKIAotCW1hcC0+YWN0aXZlLmRhdGEuaW4gPSBieXRlczsKLQltYXAtPmFjdGl2ZS5k YXRhLm91dCA9IGJ5dGVzICsKLQkJWEVOX0ZMRVhfUklOR19TSVpFKFBWQ0FMTFNfUklOR19PUkRF Uik7Ci0KIAlyZXQgPSB4ZW5idXNfYWxsb2NfZXZ0Y2huKHB2Y2FsbHNfZnJvbnRfZGV2LCBldnRj aG4pOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2Vycm9yOwpAQCAtMzkxLDggKzQxMiw2IEBAIHN0 YXRpYyBpbnQgY3JlYXRlX2FjdGl2ZShzdHJ1Y3Qgc29ja19tYXBwaW5nICptYXAsIGludCAqZXZ0 Y2huKQogb3V0X2Vycm9yOgogCWlmICgqZXZ0Y2huID49IDApCiAJCXhlbmJ1c19mcmVlX2V2dGNo bihwdmNhbGxzX2Zyb250X2RldiwgKmV2dGNobik7Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9u ZyltYXAtPmFjdGl2ZS5kYXRhLmluLCBQVkNBTExTX1JJTkdfT1JERVIpOwotCWZyZWVfcGFnZSgo dW5zaWduZWQgbG9uZyltYXAtPmFjdGl2ZS5yaW5nKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00 MTIsMTcgKzQzMSwyNCBAQCBpbnQgcHZjYWxsc19mcm9udF9jb25uZWN0KHN0cnVjdCBzb2NrZXQg KnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKIAkJcmV0dXJuIFBUUl9FUlIobWFwKTsKIAog CWJlZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcHZjYWxsc19mcm9udF9kZXYtPmRldik7CisJcmV0 ID0gYWxsb2NfYWN0aXZlX3JpbmcobWFwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwdmNhbGxzX2V4 aXRfc29jayhzb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAlzcGluX2xvY2soJmJlZGF0YS0+ c29ja2V0X2xvY2spOwogCXJldCA9IGdldF9yZXF1ZXN0KGJlZGF0YSwgJnJlcV9pZCk7CiAJaWYg KHJldCA8IDApIHsKIAkJc3Bpbl91bmxvY2soJmJlZGF0YS0+c29ja2V0X2xvY2spOworCQlmcmVl X2FjdGl2ZV9yaW5nKG1hcCk7CiAJCXB2Y2FsbHNfZXhpdF9zb2NrKHNvY2spOwogCQlyZXR1cm4g cmV0OwogCX0KIAlyZXQgPSBjcmVhdGVfYWN0aXZlKG1hcCwgJmV2dGNobik7CiAJaWYgKHJldCA8 IDApIHsKIAkJc3Bpbl91bmxvY2soJmJlZGF0YS0+c29ja2V0X2xvY2spOworCQlmcmVlX2FjdGl2 ZV9yaW5nKG1hcCk7CiAJCXB2Y2FsbHNfZXhpdF9zb2NrKHNvY2spOwogCQlyZXR1cm4gcmV0Owog CX0KQEAgLTc4NCwyNSArODEwLDM2IEBAIGludCBwdmNhbGxzX2Zyb250X2FjY2VwdChzdHJ1Y3Qg c29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrLCBpbnQgZmxhZ3MpCiAJCX0KIAl9 CiAKLQlzcGluX2xvY2soJmJlZGF0YS0+c29ja2V0X2xvY2spOwotCXJldCA9IGdldF9yZXF1ZXN0 KGJlZGF0YSwgJnJlcV9pZCk7Ci0JaWYgKHJldCA8IDApIHsKKwltYXAyID0ga3phbGxvYyhzaXpl b2YoKm1hcDIpLCBHRlBfS0VSTkVMKTsKKwlpZiAobWFwMiA9PSBOVUxMKSB7CiAJCWNsZWFyX2Jp dChQVkNBTExTX0ZMQUdfQUNDRVBUX0lORkxJR0hULAogCQkJICAodm9pZCAqKSZtYXAtPnBhc3Np dmUuZmxhZ3MpOwotCQlzcGluX3VubG9jaygmYmVkYXRhLT5zb2NrZXRfbG9jayk7CisJCXB2Y2Fs bHNfZXhpdF9zb2NrKHNvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0ID0gYWxsb2Nf YWN0aXZlX3JpbmcobWFwMik7CisJaWYgKHJldCA8IDApIHsKKwkJY2xlYXJfYml0KFBWQ0FMTFNf RkxBR19BQ0NFUFRfSU5GTElHSFQsCisJCQkJKHZvaWQgKikmbWFwLT5wYXNzaXZlLmZsYWdzKTsK KwkJa2ZyZWUobWFwMik7CiAJCXB2Y2FsbHNfZXhpdF9zb2NrKHNvY2spOwogCQlyZXR1cm4gcmV0 OwogCX0KLQltYXAyID0ga3phbGxvYyhzaXplb2YoKm1hcDIpLCBHRlBfQVRPTUlDKTsKLQlpZiAo bWFwMiA9PSBOVUxMKSB7CisJc3Bpbl9sb2NrKCZiZWRhdGEtPnNvY2tldF9sb2NrKTsKKwlyZXQg PSBnZXRfcmVxdWVzdChiZWRhdGEsICZyZXFfaWQpOworCWlmIChyZXQgPCAwKSB7CiAJCWNsZWFy X2JpdChQVkNBTExTX0ZMQUdfQUNDRVBUX0lORkxJR0hULAogCQkJICAodm9pZCAqKSZtYXAtPnBh c3NpdmUuZmxhZ3MpOwogCQlzcGluX3VubG9jaygmYmVkYXRhLT5zb2NrZXRfbG9jayk7CisJCWZy ZWVfYWN0aXZlX3JpbmcobWFwMik7CisJCWtmcmVlKG1hcDIpOwogCQlwdmNhbGxzX2V4aXRfc29j ayhzb2NrKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiByZXQ7CiAJfQorCiAJcmV0ID0g Y3JlYXRlX2FjdGl2ZShtYXAyLCAmZXZ0Y2huKTsKIAlpZiAocmV0IDwgMCkgeworCQlmcmVlX2Fj dGl2ZV9yaW5nKG1hcDIpOwogCQlrZnJlZShtYXAyKTsKIAkJY2xlYXJfYml0KFBWQ0FMTFNfRkxB R19BQ0NFUFRfSU5GTElHSFQsCiAJCQkgICh2b2lkICopJm1hcC0+cGFzc2l2ZS5mbGFncyk7Ci0t IAoyLjE5LjEKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpo dHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVuLWRldmVs From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0F4DEC282C4 for ; Wed, 13 Feb 2019 03:03:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CA43A2190A for ; Wed, 13 Feb 2019 03:03:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1550026988; bh=EtNnjpe5ajSv7EpOWQztmnKgEZaR2KD9x+GaCWCYZ0g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=p/unReBMNHiBvXgrvdlHW+6IBEgp4FqFwxjNCENqTWHok2sUJ2059G014yJfXt/yQ pOX8X8MqifSy0RoV7K18vzHiJB3TRJgxtU9fsmRxXZsxUVmBgJVx0JsBRgVfoP+3L1 fJepxjRcA6+zafl80KwoHeoTYtdR6PIfOoXi1AQU= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390390AbfBMDDH (ORCPT ); Tue, 12 Feb 2019 22:03:07 -0500 Received: from mail.kernel.org ([198.145.29.99]:38328 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729685AbfBMCer (ORCPT ); Tue, 12 Feb 2019 21:34:47 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 2E24B222C9; Wed, 13 Feb 2019 02:34:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1550025286; bh=EtNnjpe5ajSv7EpOWQztmnKgEZaR2KD9x+GaCWCYZ0g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OmDGFBC3ZLraCymMVh077Uez2IIG6e8g9TAUx/17KqdHjZUtUM+m0i2WrF2QgcG+T 95gLIWKm+f36Y46msP+6NQ9BG27Y3mrx8PundM0hyZonlfiUnh9c/LvYtO/sUcR3bS iMQNH+0RauRyJZ9u3wYJTTq202EbkIEmZF+7tqNs= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Wen Yang , Julia Lawall , Boris Ostrovsky , Juergen Gross , Stefano Stabellini , xen-devel@lists.xenproject.org, Sasha Levin Subject: [PATCH AUTOSEL 4.20 045/105] pvcalls-front: Avoid get_free_pages(GFP_KERNEL) under spinlock Date: Tue, 12 Feb 2019 21:32:36 -0500 Message-Id: <20190213023336.19019-45-sashal@kernel.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190213023336.19019-1-sashal@kernel.org> References: <20190213023336.19019-1-sashal@kernel.org> MIME-Version: 1.0 X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wen Yang [ Upstream commit 9f51c05dc41a6d69423e3d03d18eb7ab22f9ec19 ] The problem is that we call this with a spin lock held. The call tree is: pvcalls_front_accept() holds bedata->socket_lock. -> create_active() -> __get_free_pages() uses GFP_KERNEL The create_active() function is only called from pvcalls_front_accept() with a spin_lock held, The allocation is not allowed to sleep and GFP_KERNEL is not sufficient. This issue was detected by using the Coccinelle software. v2: Add a function doing the allocations which is called outside the lock and passing the allocated data to create_active(). v3: Use the matching deallocators i.e., free_page() and free_pages(), respectively. v4: It would be better to pre-populate map (struct sock_mapping), rather than introducing one more new struct. v5: Since allocating the data outside of this call it should also be freed outside, when create_active() fails. Move kzalloc(sizeof(*map2), GFP_ATOMIC) outside spinlock and use GFP_KERNEL instead. v6: Drop the superfluous calls. Suggested-by: Juergen Gross Suggested-by: Boris Ostrovsky Suggested-by: Stefano Stabellini Signed-off-by: Wen Yang Acked-by: Stefano Stabellini CC: Julia Lawall CC: Boris Ostrovsky CC: Juergen Gross CC: Stefano Stabellini CC: xen-devel@lists.xenproject.org CC: linux-kernel@vger.kernel.org Signed-off-by: Boris Ostrovsky Signed-off-by: Sasha Levin --- drivers/xen/pvcalls-front.c | 81 +++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 22 deletions(-) diff --git a/drivers/xen/pvcalls-front.c b/drivers/xen/pvcalls-front.c index 01588582ae66..6357160d466a 100644 --- a/drivers/xen/pvcalls-front.c +++ b/drivers/xen/pvcalls-front.c @@ -341,6 +341,39 @@ int pvcalls_front_socket(struct socket *sock) return ret; } +static void free_active_ring(struct sock_mapping *map) +{ + free_pages((unsigned long)map->active.data.in, + map->active.ring->ring_order); + free_page((unsigned long)map->active.ring); +} + +static int alloc_active_ring(struct sock_mapping *map) +{ + void *bytes; + + map->active.ring = (struct pvcalls_data_intf *) + get_zeroed_page(GFP_KERNEL); + if (!map->active.ring) + goto out; + + map->active.ring->ring_order = PVCALLS_RING_ORDER; + bytes = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, + PVCALLS_RING_ORDER); + if (!bytes) + goto out; + + map->active.data.in = bytes; + map->active.data.out = bytes + + XEN_FLEX_RING_SIZE(PVCALLS_RING_ORDER); + + return 0; + +out: + free_active_ring(map); + return -ENOMEM; +} + static int create_active(struct sock_mapping *map, int *evtchn) { void *bytes; @@ -349,15 +382,7 @@ static int create_active(struct sock_mapping *map, int *evtchn) *evtchn = -1; init_waitqueue_head(&map->active.inflight_conn_req); - map->active.ring = (struct pvcalls_data_intf *) - __get_free_page(GFP_KERNEL | __GFP_ZERO); - if (map->active.ring == NULL) - goto out_error; - map->active.ring->ring_order = PVCALLS_RING_ORDER; - bytes = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, - PVCALLS_RING_ORDER); - if (bytes == NULL) - goto out_error; + bytes = map->active.data.in; for (i = 0; i < (1 << PVCALLS_RING_ORDER); i++) map->active.ring->ref[i] = gnttab_grant_foreign_access( pvcalls_front_dev->otherend_id, @@ -367,10 +392,6 @@ static int create_active(struct sock_mapping *map, int *evtchn) pvcalls_front_dev->otherend_id, pfn_to_gfn(virt_to_pfn((void *)map->active.ring)), 0); - map->active.data.in = bytes; - map->active.data.out = bytes + - XEN_FLEX_RING_SIZE(PVCALLS_RING_ORDER); - ret = xenbus_alloc_evtchn(pvcalls_front_dev, evtchn); if (ret) goto out_error; @@ -391,8 +412,6 @@ static int create_active(struct sock_mapping *map, int *evtchn) out_error: if (*evtchn >= 0) xenbus_free_evtchn(pvcalls_front_dev, *evtchn); - free_pages((unsigned long)map->active.data.in, PVCALLS_RING_ORDER); - free_page((unsigned long)map->active.ring); return ret; } @@ -412,17 +431,24 @@ int pvcalls_front_connect(struct socket *sock, struct sockaddr *addr, return PTR_ERR(map); bedata = dev_get_drvdata(&pvcalls_front_dev->dev); + ret = alloc_active_ring(map); + if (ret < 0) { + pvcalls_exit_sock(sock); + return ret; + } spin_lock(&bedata->socket_lock); ret = get_request(bedata, &req_id); if (ret < 0) { spin_unlock(&bedata->socket_lock); + free_active_ring(map); pvcalls_exit_sock(sock); return ret; } ret = create_active(map, &evtchn); if (ret < 0) { spin_unlock(&bedata->socket_lock); + free_active_ring(map); pvcalls_exit_sock(sock); return ret; } @@ -784,25 +810,36 @@ int pvcalls_front_accept(struct socket *sock, struct socket *newsock, int flags) } } - spin_lock(&bedata->socket_lock); - ret = get_request(bedata, &req_id); - if (ret < 0) { + map2 = kzalloc(sizeof(*map2), GFP_KERNEL); + if (map2 == NULL) { clear_bit(PVCALLS_FLAG_ACCEPT_INFLIGHT, (void *)&map->passive.flags); - spin_unlock(&bedata->socket_lock); + pvcalls_exit_sock(sock); + return -ENOMEM; + } + ret = alloc_active_ring(map2); + if (ret < 0) { + clear_bit(PVCALLS_FLAG_ACCEPT_INFLIGHT, + (void *)&map->passive.flags); + kfree(map2); pvcalls_exit_sock(sock); return ret; } - map2 = kzalloc(sizeof(*map2), GFP_ATOMIC); - if (map2 == NULL) { + spin_lock(&bedata->socket_lock); + ret = get_request(bedata, &req_id); + if (ret < 0) { clear_bit(PVCALLS_FLAG_ACCEPT_INFLIGHT, (void *)&map->passive.flags); spin_unlock(&bedata->socket_lock); + free_active_ring(map2); + kfree(map2); pvcalls_exit_sock(sock); - return -ENOMEM; + return ret; } + ret = create_active(map2, &evtchn); if (ret < 0) { + free_active_ring(map2); kfree(map2); clear_bit(PVCALLS_FLAG_ACCEPT_INFLIGHT, (void *)&map->passive.flags); -- 2.19.1