[RFC PATCH 22/22] riscv: s64ilp32: Temporary workaround solution to gcc problem

guoren
2023-05-18T13:16:49Z

There is an existing problem in 64ilp32 gcc that combines two pointers
in one register. Liao is solving that problem. Before he finishes the
job, we could prevent it with a simple noinline attribute, fortunately.

struct path {
struct vfsmount *mnt;
struct dentry *dentry;
} __randomize_layout;

struct nameidata {
struct path path;
struct qstr last;
struct path root;
...
} __randomize_layout;

struct nameidata *nd
...
nd->path = nd->root;
6c88 ld a0,24(s1)
^^ // Wrong arg of mntget
e088 sd a0,0(s1)
// Need inserting "lw a0,0(s1)" here
mntget(path->mnt);
2a6150ef jal c01ce946 <mntget>

Any gcc helps are welcome :)

Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
Signed-off-by: Guo Ren <guoren@kernel.org>
Cc: LiaoShihua <shihua@iscas.ac.cn>
---
fs/namei.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/namei.c b/fs/namei.c
index edfedfbccaef..22a2ef77e074 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -541,7 +541,7 @@ EXPORT_SYMBOL(inode_permission);
*
* Given a path increment the reference count to the dentry and the vfsmount.
*/
-void path_get(const struct path *path)
+void noinline path_get(const struct path *path)
{
mntget(path->mnt);
dget(path->dentry);
--
2.36.1