From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Martin Subject: [PATCH v5 23/30] arm64/sve: Add sysctl to set the default vector length for new processes Date: Tue, 31 Oct 2017 15:51:15 +0000 Message-ID: <1509465082-30427-24-git-send-email-Dave.Martin@arm.com> References: <1509465082-30427-1-git-send-email-Dave.Martin@arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1509465082-30427-1-git-send-email-Dave.Martin@arm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu To: linux-arm-kernel@lists.infradead.org Cc: linux-arch@vger.kernel.org, Okamoto Takayuki , libc-alpha@sourceware.org, Ard Biesheuvel , Szabolcs Nagy , Catalin Marinas , Will Deacon , kvmarm@lists.cs.columbia.edu List-Id: linux-arch.vger.kernel.org QmVjYXVzZSBvZiB0aGUgZWZmZWN0IG9mIFNWRSBvbiB0aGUgc2l6ZSBvZiB0aGUgc2lnbmFsIGZy YW1lLCB0aGUKZGVmYXVsdCB2ZWN0b3IgbGVuZ3RoIHVzZWQgZm9yIG5ldyBwcm9jZXNzZXMgaW52 b2x2ZXMgYSB0cmFkZW9mZgpiZXR3ZWVuIHBlcmZvcm1hbmNlIG9mIFNWRS1lbmFibGVkIHNvZnR3 YXJlIG9uIHRoZSBvbmUgaGFuZCwgYW5kCnJlbGlhYmlsaXR5IG9mIG5vbi1TVkUtYXdhcmUgc29m dHdhcmUgb24gdGhlIG90aGVyIGhhbmQuCgpGb3IgdGhpcyByZWFzb24sIHRoZSBiZXN0IGNob2lj ZSBkZXBlbmRzIG9uIHRoZSByZXBlcnRvaXJlIG9mCnVzZXJzcGFjZSBzb2Z0d2FyZSBpbiB1c2Ug YW5kIGlzIHRodXMgYmVzdCBsZWZ0IHVwIHRvIGRpc3RybwptYWludGFpbmVycywgc3lzYWRtaW5z IGFuZCBkZXZlbG9wZXJzLgoKSWYgQ09ORklHX1NZU0NUTCBhbmQgQ09ORklHX1BST0NfU1lTQ1RM IGFyZSBlbmFibGVkLCB0aGlzIHBhdGNoCmV4cG9zZXMgdGhlIGRlZmF1bHQgdmVjdG9yIGxlbmd0 aCBpbgovcHJvYy9zeXMvYWJpL3N2ZV9kZWZhdWx0X3ZlY3Rvcl9sZW5ndGgsIHdoZXJlIGJvb3Qg c2NyaXB0cyBvciB0aGUKYWR2ZW50dXJvdXMgY2FuIHBva2UgaXQuCgpJbiBjb21tb24gd2l0aCBv dGhlciBhcm02NCBBQkkgc3lzY3RscywgdGhpcyBjb250cm9sIGlzIGN1cnJlbnRseQpnbG9iYWw6 IHNldHRpbmcgaXQgcmVxdWlyZXMgQ0FQX1NZU19BRE1JTiBpbiB0aGUgcm9vdCB1c2VyCm5hbWVz cGFjZSwgYnV0IHRoZSB2YWx1ZSBzZXQgaXMgZWZmZWN0aXZlIGZvciBzdWJzZXF1ZW50IGV4ZWNz IGluCmFsbCBuYW1lc3BhY2VzLiAgVGhlIGNvbnRyb2wgb25seSBhZmZlY3RzIF9uZXdfIHByb2Nl c3NlcywgaG93ZXZlcjoKY2hhbmdpbmcgaXQgZG9lcyBub3QgYWZmZWN0IHRoZSB2ZWN0b3IgbGVu Z3RoIG9mIGFueSBleGlzdGluZwpwcm9jZXNzLgoKVGhlIGludGVuZGVkIHVzYWdlIG1vZGVsIGlz IHRoYXQgaWYgdXNlcnNwYWNlIGlzIGtub3duIHRvIGJlIGZ1bGx5ClNWRS10b2xlcmFudCAob3Ig YSBkZXZlbG9wZXIgaXMgY3VyaW91cyB0byBmaW5kIG91dCkgdGhlbiB0aGlzCnBhcmFtZXRlciBj YW4gYmUgY3JhbmtlZCB1cCBkdXJpbmcgc3lzdGVtIHN0YXJ0dXAuCgpTaWduZWQtb2ZmLWJ5OiBE YXZlIE1hcnRpbiA8RGF2ZS5NYXJ0aW5AYXJtLmNvbT4KUmV2aWV3ZWQtYnk6IEFsZXggQmVubsOp ZSA8YWxleC5iZW5uZWVAbGluYXJvLm9yZz4KUmV2aWV3ZWQtYnk6IENhdGFsaW4gTWFyaW5hcyA8 Y2F0YWxpbi5tYXJpbmFzQGFybS5jb20+Ci0tLQogYXJjaC9hcm02NC9rZXJuZWwvZnBzaW1kLmMg fCA2MiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiAxIGZp bGUgY2hhbmdlZCwgNjEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBh L2FyY2gvYXJtNjQva2VybmVsL2Zwc2ltZC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZnBzaW1kLmMK aW5kZXggY2JiMmM2My4uNGRhNjRmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvZnBz aW1kLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvZnBzaW1kLmMKQEAgLTM2LDYgKzM2LDcgQEAK ICNpbmNsdWRlIDxsaW51eC9zY2hlZC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwu aD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAK ICNpbmNsdWRlIDxhc20vZnBzaW1kLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KQEAgLTMz NCw2ICszMzUsNjUgQEAgc3RhdGljIHVuc2lnbmVkIGludCBmaW5kX3N1cHBvcnRlZF92ZWN0b3Jf bGVuZ3RoKHVuc2lnbmVkIGludCB2bCkKIAlyZXR1cm4gc3ZlX3ZsX2Zyb21fdnEoYml0X3RvX3Zx KGJpdCkpOwogfQogCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCitzdGF0aWMgaW50IHN2ZV9wcm9j X2RvX2RlZmF1bHRfdmwoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCQkg IHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJCQkgIGxvZmZfdCAqcHBvcykK K3sKKwlpbnQgcmV0OworCWludCB2bCA9IHN2ZV9kZWZhdWx0X3ZsOworCXN0cnVjdCBjdGxfdGFi bGUgdG1wX3RhYmxlID0geworCQkuZGF0YSA9ICZ2bCwKKwkJLm1heGxlbiA9IHNpemVvZih2bCks CisJfTsKKworCXJldCA9IHByb2NfZG9pbnR2ZWMoJnRtcF90YWJsZSwgd3JpdGUsIGJ1ZmZlciwg bGVucCwgcHBvcyk7CisJaWYgKHJldCB8fCAhd3JpdGUpCisJCXJldHVybiByZXQ7CisKKwkvKiBX cml0aW5nIC0xIGhhcyB0aGUgc3BlY2lhbCBtZWFuaW5nICJzZXQgdG8gbWF4IjogKi8KKwlpZiAo dmwgPT0gLTEpIHsKKwkJLyogRmFpbCBzYWZlIGlmIHN2ZV9tYXhfdmwgd2Fzbid0IGluaXRpYWxp c2VkICovCisJCWlmIChXQVJOX09OKCFzdmVfdmxfdmFsaWQoc3ZlX21heF92bCkpKQorCQkJdmwg PSBTVkVfVkxfTUlOOworCQllbHNlCisJCQl2bCA9IHN2ZV9tYXhfdmw7CisKKwkJZ290byBjaG9z ZW47CisJfQorCisJaWYgKCFzdmVfdmxfdmFsaWQodmwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwor CXZsID0gZmluZF9zdXBwb3J0ZWRfdmVjdG9yX2xlbmd0aCh2bCk7CitjaG9zZW46CisJc3ZlX2Rl ZmF1bHRfdmwgPSB2bDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUg c3ZlX2RlZmF1bHRfdmxfdGFibGVbXSA9IHsKKwl7CisJCS5wcm9jbmFtZQk9ICJzdmVfZGVmYXVs dF92ZWN0b3JfbGVuZ3RoIiwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHN2 ZV9wcm9jX2RvX2RlZmF1bHRfdmwsCisJfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgX19pbml0 IHN2ZV9zeXNjdGxfaW5pdCh2b2lkKQoreworCWlmIChzeXN0ZW1fc3VwcG9ydHNfc3ZlKCkpCisJ CWlmICghcmVnaXN0ZXJfc3lzY3RsKCJhYmkiLCBzdmVfZGVmYXVsdF92bF90YWJsZSkpCisJCQly ZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCisjZWxzZSAvKiAhIENPTkZJR19TWVND VEwgKi8KK3N0YXRpYyBpbnQgX19pbml0IHN2ZV9zeXNjdGxfaW5pdCh2b2lkKSB7IHJldHVybiAw OyB9CisjZW5kaWYgLyogISBDT05GSUdfU1lTQ1RMICovCisKICNkZWZpbmUgWlJFRyhzdmVfc3Rh dGUsIHZxLCBuKSAoKGNoYXIgKikoc3ZlX3N0YXRlKSArCQlcCiAJKFNWRV9TSUdfWlJFR19PRkZT RVQodnEsIG4pIC0gU1ZFX1NJR19SRUdTX09GRlNFVCkpCiAKQEAgLTEyMDgsNiArMTI2OCw2IEBA IHN0YXRpYyBpbnQgX19pbml0IGZwc2ltZF9pbml0KHZvaWQpCiAJaWYgKCEoZWxmX2h3Y2FwICYg SFdDQVBfQVNJTUQpKQogCQlwcl9ub3RpY2UoIkFkdmFuY2VkIFNJTUQgaXMgbm90IGltcGxlbWVu dGVkXG4iKTsKIAotCXJldHVybiAwOworCXJldHVybiBzdmVfc3lzY3RsX2luaXQoKTsKIH0KIGNv cmVfaW5pdGNhbGwoZnBzaW1kX2luaXQpOwotLSAKMi4xLjQKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmt2bWFybSBtYWlsaW5nIGxpc3QKa3ZtYXJtQGxp c3RzLmNzLmNvbHVtYmlhLmVkdQpodHRwczovL2xpc3RzLmNzLmNvbHVtYmlhLmVkdS9tYWlsbWFu L2xpc3RpbmZvL2t2bWFybQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com ([217.140.101.70]:37834 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932196AbdJaPwQ (ORCPT ); Tue, 31 Oct 2017 11:52:16 -0400 From: Dave Martin Subject: [PATCH v5 23/30] arm64/sve: Add sysctl to set the default vector length for new processes Date: Tue, 31 Oct 2017 15:51:15 +0000 Message-ID: <1509465082-30427-24-git-send-email-Dave.Martin@arm.com> In-Reply-To: <1509465082-30427-1-git-send-email-Dave.Martin@arm.com> References: <1509465082-30427-1-git-send-email-Dave.Martin@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-arch-owner@vger.kernel.org List-ID: To: linux-arm-kernel@lists.infradead.org Cc: Catalin Marinas , Will Deacon , Ard Biesheuvel , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Szabolcs Nagy , Okamoto Takayuki , kvmarm@lists.cs.columbia.edu, libc-alpha@sourceware.org, linux-arch@vger.kernel.org Message-ID: <20171031155115.XyJWzJ60HAk6lJq0yD_MjiU6glvtBPfvXCKfIL43QKU@z> Because of the effect of SVE on the size of the signal frame, the default vector length used for new processes involves a tradeoff between performance of SVE-enabled software on the one hand, and reliability of non-SVE-aware software on the other hand. For this reason, the best choice depends on the repertoire of userspace software in use and is thus best left up to distro maintainers, sysadmins and developers. If CONFIG_SYSCTL and CONFIG_PROC_SYSCTL are enabled, this patch exposes the default vector length in /proc/sys/abi/sve_default_vector_length, where boot scripts or the adventurous can poke it. In common with other arm64 ABI sysctls, this control is currently global: setting it requires CAP_SYS_ADMIN in the root user namespace, but the value set is effective for subsequent execs in all namespaces. The control only affects _new_ processes, however: changing it does not affect the vector length of any existing process. The intended usage model is that if userspace is known to be fully SVE-tolerant (or a developer is curious to find out) then this parameter can be cranked up during system startup. Signed-off-by: Dave Martin Reviewed-by: Alex Bennée Reviewed-by: Catalin Marinas --- arch/arm64/kernel/fpsimd.c | 62 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index cbb2c63..4da64fc 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -334,6 +335,65 @@ static unsigned int find_supported_vector_length(unsigned int vl) return sve_vl_from_vq(bit_to_vq(bit)); } +#ifdef CONFIG_SYSCTL + +static int sve_proc_do_default_vl(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, + loff_t *ppos) +{ + int ret; + int vl = sve_default_vl; + struct ctl_table tmp_table = { + .data = &vl, + .maxlen = sizeof(vl), + }; + + ret = proc_dointvec(&tmp_table, write, buffer, lenp, ppos); + if (ret || !write) + return ret; + + /* Writing -1 has the special meaning "set to max": */ + if (vl == -1) { + /* Fail safe if sve_max_vl wasn't initialised */ + if (WARN_ON(!sve_vl_valid(sve_max_vl))) + vl = SVE_VL_MIN; + else + vl = sve_max_vl; + + goto chosen; + } + + if (!sve_vl_valid(vl)) + return -EINVAL; + + vl = find_supported_vector_length(vl); +chosen: + sve_default_vl = vl; + return 0; +} + +static struct ctl_table sve_default_vl_table[] = { + { + .procname = "sve_default_vector_length", + .mode = 0644, + .proc_handler = sve_proc_do_default_vl, + }, + { } +}; + +static int __init sve_sysctl_init(void) +{ + if (system_supports_sve()) + if (!register_sysctl("abi", sve_default_vl_table)) + return -EINVAL; + + return 0; +} + +#else /* ! CONFIG_SYSCTL */ +static int __init sve_sysctl_init(void) { return 0; } +#endif /* ! CONFIG_SYSCTL */ + #define ZREG(sve_state, vq, n) ((char *)(sve_state) + \ (SVE_SIG_ZREG_OFFSET(vq, n) - SVE_SIG_REGS_OFFSET)) @@ -1208,6 +1268,6 @@ static int __init fpsimd_init(void) if (!(elf_hwcap & HWCAP_ASIMD)) pr_notice("Advanced SIMD is not implemented\n"); - return 0; + return sve_sysctl_init(); } core_initcall(fpsimd_init); -- 2.1.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave.Martin@arm.com (Dave Martin) Date: Tue, 31 Oct 2017 15:51:15 +0000 Subject: [PATCH v5 23/30] arm64/sve: Add sysctl to set the default vector length for new processes In-Reply-To: <1509465082-30427-1-git-send-email-Dave.Martin@arm.com> References: <1509465082-30427-1-git-send-email-Dave.Martin@arm.com> Message-ID: <1509465082-30427-24-git-send-email-Dave.Martin@arm.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Because of the effect of SVE on the size of the signal frame, the default vector length used for new processes involves a tradeoff between performance of SVE-enabled software on the one hand, and reliability of non-SVE-aware software on the other hand. For this reason, the best choice depends on the repertoire of userspace software in use and is thus best left up to distro maintainers, sysadmins and developers. If CONFIG_SYSCTL and CONFIG_PROC_SYSCTL are enabled, this patch exposes the default vector length in /proc/sys/abi/sve_default_vector_length, where boot scripts or the adventurous can poke it. In common with other arm64 ABI sysctls, this control is currently global: setting it requires CAP_SYS_ADMIN in the root user namespace, but the value set is effective for subsequent execs in all namespaces. The control only affects _new_ processes, however: changing it does not affect the vector length of any existing process. The intended usage model is that if userspace is known to be fully SVE-tolerant (or a developer is curious to find out) then this parameter can be cranked up during system startup. Signed-off-by: Dave Martin Reviewed-by: Alex Benn?e Reviewed-by: Catalin Marinas --- arch/arm64/kernel/fpsimd.c | 62 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c index cbb2c63..4da64fc 100644 --- a/arch/arm64/kernel/fpsimd.c +++ b/arch/arm64/kernel/fpsimd.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -334,6 +335,65 @@ static unsigned int find_supported_vector_length(unsigned int vl) return sve_vl_from_vq(bit_to_vq(bit)); } +#ifdef CONFIG_SYSCTL + +static int sve_proc_do_default_vl(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, + loff_t *ppos) +{ + int ret; + int vl = sve_default_vl; + struct ctl_table tmp_table = { + .data = &vl, + .maxlen = sizeof(vl), + }; + + ret = proc_dointvec(&tmp_table, write, buffer, lenp, ppos); + if (ret || !write) + return ret; + + /* Writing -1 has the special meaning "set to max": */ + if (vl == -1) { + /* Fail safe if sve_max_vl wasn't initialised */ + if (WARN_ON(!sve_vl_valid(sve_max_vl))) + vl = SVE_VL_MIN; + else + vl = sve_max_vl; + + goto chosen; + } + + if (!sve_vl_valid(vl)) + return -EINVAL; + + vl = find_supported_vector_length(vl); +chosen: + sve_default_vl = vl; + return 0; +} + +static struct ctl_table sve_default_vl_table[] = { + { + .procname = "sve_default_vector_length", + .mode = 0644, + .proc_handler = sve_proc_do_default_vl, + }, + { } +}; + +static int __init sve_sysctl_init(void) +{ + if (system_supports_sve()) + if (!register_sysctl("abi", sve_default_vl_table)) + return -EINVAL; + + return 0; +} + +#else /* ! CONFIG_SYSCTL */ +static int __init sve_sysctl_init(void) { return 0; } +#endif /* ! CONFIG_SYSCTL */ + #define ZREG(sve_state, vq, n) ((char *)(sve_state) + \ (SVE_SIG_ZREG_OFFSET(vq, n) - SVE_SIG_REGS_OFFSET)) @@ -1208,6 +1268,6 @@ static int __init fpsimd_init(void) if (!(elf_hwcap & HWCAP_ASIMD)) pr_notice("Advanced SIMD is not implemented\n"); - return 0; + return sve_sysctl_init(); } core_initcall(fpsimd_init); -- 2.1.4