diff mbox series

[v2,01/23] asm-generic: add generic MMU versions of mmu context functions

Message ID 20200826145249.745432-2-npiggin@gmail.com (mailing list archive)
State New, archived
Headers show
Series Use asm-generic for mmu_context no-op functions | expand

Commit Message

Nicholas Piggin Aug. 26, 2020, 2:52 p.m. UTC
Many of these are no-ops on many architectures, so extend mmu_context.h
to cover MMU and NOMMU, and split the NOMMU bits out to nommu_context.h

Cc: Arnd Bergmann <arnd@arndb.de>
Cc: linux-arch@vger.kernel.org
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 arch/microblaze/include/asm/mmu_context.h |  2 +-
 arch/sh/include/asm/mmu_context.h         |  2 +-
 include/asm-generic/mmu_context.h         | 57 +++++++++++++++++------
 include/asm-generic/nommu_context.h       | 19 ++++++++
 4 files changed, 64 insertions(+), 16 deletions(-)
 create mode 100644 include/asm-generic/nommu_context.h

Comments

kernel test robot Aug. 26, 2020, 6:13 p.m. UTC | #1
Hi Nicholas,

I love your patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on asm-generic/master sparc-next/master xtensa/for_next v5.9-rc2 next-20200826]
[cannot apply to sparc/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Nicholas-Piggin/Use-asm-generic-for-mmu_context-no-op-functions/20200826-225632
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 2ac69819ba9e3d8d550bb5d2d2df74848e556812
config: c6x-allyesconfig (attached as .config)
compiler: c6x-elf-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=c6x 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   In file included from ./arch/c6x/include/generated/asm/mmu_context.h:1,
                    from kernel/fork.c:101:
   include/asm-generic/mmu_context.h: In function 'activate_mm':
>> include/asm-generic/mmu_context.h:59:2: error: implicit declaration of function 'switch_mm' [-Werror=implicit-function-declaration]
      59 |  switch_mm(prev_mm, next_mm, current);
         |  ^~~~~~~~~
   kernel/fork.c: At top level:
   kernel/fork.c:160:13: warning: no previous prototype for 'arch_release_task_struct' [-Wmissing-prototypes]
     160 | void __weak arch_release_task_struct(struct task_struct *tsk)
         |             ^~~~~~~~~~~~~~~~~~~~~~~~
   kernel/fork.c:743:20: warning: no previous prototype for 'arch_task_cache_init' [-Wmissing-prototypes]
     743 | void __init __weak arch_task_cache_init(void) { }
         |                    ^~~~~~~~~~~~~~~~~~~~
   kernel/fork.c:834:12: warning: no previous prototype for 'arch_dup_task_struct' [-Wmissing-prototypes]
     834 | int __weak arch_dup_task_struct(struct task_struct *dst,
         |            ^~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors
--
   In file included from ./arch/c6x/include/generated/asm/mmu_context.h:1,
                    from kernel/exit.c:69:
   include/asm-generic/mmu_context.h: In function 'activate_mm':
>> include/asm-generic/mmu_context.h:59:2: error: implicit declaration of function 'switch_mm' [-Werror=implicit-function-declaration]
      59 |  switch_mm(prev_mm, next_mm, current);
         |  ^~~~~~~~~
   kernel/exit.c: At top level:
   kernel/exit.c:1754:13: warning: no previous prototype for 'abort' [-Wmissing-prototypes]
    1754 | __weak void abort(void)
         |             ^~~~~
   cc1: some warnings being treated as errors
--
   In file included from ./arch/c6x/include/generated/asm/mmu_context.h:1,
                    from include/linux/mmu_context.h:5,
                    from kernel/kthread.c:12:
   include/asm-generic/mmu_context.h: In function 'activate_mm':
>> include/asm-generic/mmu_context.h:59:2: error: implicit declaration of function 'switch_mm' [-Werror=implicit-function-declaration]
      59 |  switch_mm(prev_mm, next_mm, current);
         |  ^~~~~~~~~
   cc1: some warnings being treated as errors
--
   In file included from ./arch/c6x/include/generated/asm/mmu_context.h:1,
                    from include/linux/mmu_context.h:5,
                    from kernel/sched/sched.h:54,
                    from kernel/sched/rt.c:6:
   include/asm-generic/mmu_context.h: In function 'activate_mm':
>> include/asm-generic/mmu_context.h:59:2: error: implicit declaration of function 'switch_mm' [-Werror=implicit-function-declaration]
      59 |  switch_mm(prev_mm, next_mm, current);
         |  ^~~~~~~~~
   kernel/sched/rt.c: At top level:
   kernel/sched/rt.c:668:6: warning: no previous prototype for 'sched_rt_bandwidth_account' [-Wmissing-prototypes]
     668 | bool sched_rt_bandwidth_account(struct rt_rq *rt_rq)
         |      ^~~~~~~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors

# https://github.com/0day-ci/linux/commit/96f6fa7969b31878ea85427182e4d9201ab3f592
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Nicholas-Piggin/Use-asm-generic-for-mmu_context-no-op-functions/20200826-225632
git checkout 96f6fa7969b31878ea85427182e4d9201ab3f592
vim +/switch_mm +59 include/asm-generic/mmu_context.h

    49	
    50	/**
    51	 * activate_mm - called after exec switches the current task to a new mm, to switch to it
    52	 * @prev_mm: previous mm of this task
    53	 * @next_mm: new mm
    54	 */
    55	#ifndef activate_mm
    56	static inline void activate_mm(struct mm_struct *prev_mm,
    57				       struct mm_struct *next_mm)
    58	{
  > 59		switch_mm(prev_mm, next_mm, current);
    60	}
    61	#endif
    62	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Mike Rapoport Sept. 1, 2020, 6:49 a.m. UTC | #2
On Thu, Aug 27, 2020 at 12:52:27AM +1000, Nicholas Piggin wrote:
> Many of these are no-ops on many architectures, so extend mmu_context.h
> to cover MMU and NOMMU, and split the NOMMU bits out to nommu_context.h
> 
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: linux-arch@vger.kernel.org
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
>  arch/microblaze/include/asm/mmu_context.h |  2 +-
>  arch/sh/include/asm/mmu_context.h         |  2 +-
>  include/asm-generic/mmu_context.h         | 57 +++++++++++++++++------
>  include/asm-generic/nommu_context.h       | 19 ++++++++
>  4 files changed, 64 insertions(+), 16 deletions(-)
>  create mode 100644 include/asm-generic/nommu_context.h
> 
> diff --git a/arch/microblaze/include/asm/mmu_context.h b/arch/microblaze/include/asm/mmu_context.h
> index f74f9da07fdc..34004efb3def 100644
> --- a/arch/microblaze/include/asm/mmu_context.h
> +++ b/arch/microblaze/include/asm/mmu_context.h
> @@ -2,5 +2,5 @@
>  #ifdef CONFIG_MMU
>  # include <asm/mmu_context_mm.h>
>  #else
> -# include <asm-generic/mmu_context.h>
> +# include <asm-generic/nommu_context.h>
>  #endif
> diff --git a/arch/sh/include/asm/mmu_context.h b/arch/sh/include/asm/mmu_context.h
> index f664e51e8a15..461b1304580b 100644
> --- a/arch/sh/include/asm/mmu_context.h
> +++ b/arch/sh/include/asm/mmu_context.h
> @@ -133,7 +133,7 @@ static inline void switch_mm(struct mm_struct *prev,
>  #define set_TTB(pgd)			do { } while (0)
>  #define get_TTB()			(0)
>  
> -#include <asm-generic/mmu_context.h>
> +#include <asm-generic/nommu_context.h>
>  
>  #endif /* CONFIG_MMU */
>  
> diff --git a/include/asm-generic/mmu_context.h b/include/asm-generic/mmu_context.h
> index 6be9106fb6fb..86cea80a50df 100644
> --- a/include/asm-generic/mmu_context.h
> +++ b/include/asm-generic/mmu_context.h
> @@ -3,44 +3,73 @@
>  #define __ASM_GENERIC_MMU_CONTEXT_H
>  
>  /*
> - * Generic hooks for NOMMU architectures, which do not need to do
> - * anything special here.
> + * Generic hooks to implement no-op functionality.
>   */
>  
> -#include <asm-generic/mm_hooks.h>
> -
>  struct task_struct;
>  struct mm_struct;
>  
> +/*
> + * enter_lazy_tlb - Called when "tsk" is about to enter lazy TLB mode.
> + *
> + * @mm:  the currently active mm context which is becoming lazy
> + * @tsk: task which is entering lazy tlb
> + *
> + * tsk->mm will be NULL
> + */
> +#ifndef enter_lazy_tlb
>  static inline void enter_lazy_tlb(struct mm_struct *mm,
>  			struct task_struct *tsk)
>  {
>  }
> +#endif
>  
> +/**
> + * init_new_context - Initialize context of a new mm_struct.
> + * @tsk: task struct for the mm
> + * @mm:  the new mm struct

'make *docs' will complain here about missing Return: description

> + */
> +#ifndef init_new_context
>  static inline int init_new_context(struct task_struct *tsk,
>  			struct mm_struct *mm)
>  {
>  	return 0;
>  }
> +#endif

Most architectures have non-trivial init_new_context, maybe this
should go into nommu_context.h?

> +/**
> + * destroy_context - Undo init_new_context when the mm is going away
> + * @mm: old mm struct
> + */
> +#ifndef destroy_context
>  static inline void destroy_context(struct mm_struct *mm)
>  {
>  }
> +#endif
>  
> -static inline void deactivate_mm(struct task_struct *task,
> -			struct mm_struct *mm)
> -{
> -}
> -
> -static inline void switch_mm(struct mm_struct *prev,
> -			struct mm_struct *next,
> -			struct task_struct *tsk)
> +/**
> + * activate_mm - called after exec switches the current task to a new mm, to switch to it
> + * @prev_mm: previous mm of this task
> + * @next_mm: new mm
> + */
> +#ifndef activate_mm
> +static inline void activate_mm(struct mm_struct *prev_mm,
> +			       struct mm_struct *next_mm)
>  {
> +	switch_mm(prev_mm, next_mm, current);
>  }
> +#endif
>  
> -static inline void activate_mm(struct mm_struct *prev_mm,
> -			       struct mm_struct *next_mm)
> +/**
> + * dectivate_mm - called when an mm is released after exit or exec switches away from it
> + * @tsk: the task
> + * @mm:  the old mm
> + */
> +#ifndef deactivate_mm
> +static inline void deactivate_mm(struct task_struct *tsk,
> +			struct mm_struct *mm)
>  {
>  }
> +#endif
>  
>  #endif /* __ASM_GENERIC_MMU_CONTEXT_H */
> diff --git a/include/asm-generic/nommu_context.h b/include/asm-generic/nommu_context.h
> new file mode 100644
> index 000000000000..4f916f9e16cd
> --- /dev/null
> +++ b/include/asm-generic/nommu_context.h
> @@ -0,0 +1,19 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef __ASM_GENERIC_NOMMU_H
> +#define __ASM_GENERIC_NOMMU_H
> +
> +/*
> + * Generic hooks for NOMMU architectures, which do not need to do
> + * anything special here.
> + */
> +#include <asm-generic/mm_hooks.h>
> +
> +static inline void switch_mm(struct mm_struct *prev,
> +			struct mm_struct *next,
> +			struct task_struct *tsk)
> +{
> +}
> +
> +#include <asm-generic/mmu_context.h>
> +
> +#endif /* __ASM_GENERIC_NOMMU_H */
> -- 
> 2.23.0
> 
>
Nicholas Piggin Sept. 1, 2020, 7:14 a.m. UTC | #3
Excerpts from Mike Rapoport's message of September 1, 2020 4:49 pm:
> On Thu, Aug 27, 2020 at 12:52:27AM +1000, Nicholas Piggin wrote:
>> Many of these are no-ops on many architectures, so extend mmu_context.h
>> to cover MMU and NOMMU, and split the NOMMU bits out to nommu_context.h
>> 
>> Cc: Arnd Bergmann <arnd@arndb.de>
>> Cc: linux-arch@vger.kernel.org
>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>> ---
>>  arch/microblaze/include/asm/mmu_context.h |  2 +-
>>  arch/sh/include/asm/mmu_context.h         |  2 +-
>>  include/asm-generic/mmu_context.h         | 57 +++++++++++++++++------
>>  include/asm-generic/nommu_context.h       | 19 ++++++++
>>  4 files changed, 64 insertions(+), 16 deletions(-)
>>  create mode 100644 include/asm-generic/nommu_context.h
>> 
>> diff --git a/arch/microblaze/include/asm/mmu_context.h b/arch/microblaze/include/asm/mmu_context.h
>> index f74f9da07fdc..34004efb3def 100644
>> --- a/arch/microblaze/include/asm/mmu_context.h
>> +++ b/arch/microblaze/include/asm/mmu_context.h
>> @@ -2,5 +2,5 @@
>>  #ifdef CONFIG_MMU
>>  # include <asm/mmu_context_mm.h>
>>  #else
>> -# include <asm-generic/mmu_context.h>
>> +# include <asm-generic/nommu_context.h>
>>  #endif
>> diff --git a/arch/sh/include/asm/mmu_context.h b/arch/sh/include/asm/mmu_context.h
>> index f664e51e8a15..461b1304580b 100644
>> --- a/arch/sh/include/asm/mmu_context.h
>> +++ b/arch/sh/include/asm/mmu_context.h
>> @@ -133,7 +133,7 @@ static inline void switch_mm(struct mm_struct *prev,
>>  #define set_TTB(pgd)			do { } while (0)
>>  #define get_TTB()			(0)
>>  
>> -#include <asm-generic/mmu_context.h>
>> +#include <asm-generic/nommu_context.h>
>>  
>>  #endif /* CONFIG_MMU */
>>  
>> diff --git a/include/asm-generic/mmu_context.h b/include/asm-generic/mmu_context.h
>> index 6be9106fb6fb..86cea80a50df 100644
>> --- a/include/asm-generic/mmu_context.h
>> +++ b/include/asm-generic/mmu_context.h
>> @@ -3,44 +3,73 @@
>>  #define __ASM_GENERIC_MMU_CONTEXT_H
>>  
>>  /*
>> - * Generic hooks for NOMMU architectures, which do not need to do
>> - * anything special here.
>> + * Generic hooks to implement no-op functionality.
>>   */
>>  
>> -#include <asm-generic/mm_hooks.h>
>> -
>>  struct task_struct;
>>  struct mm_struct;
>>  
>> +/*
>> + * enter_lazy_tlb - Called when "tsk" is about to enter lazy TLB mode.
>> + *
>> + * @mm:  the currently active mm context which is becoming lazy
>> + * @tsk: task which is entering lazy tlb
>> + *
>> + * tsk->mm will be NULL
>> + */
>> +#ifndef enter_lazy_tlb
>>  static inline void enter_lazy_tlb(struct mm_struct *mm,
>>  			struct task_struct *tsk)
>>  {
>>  }
>> +#endif
>>  
>> +/**
>> + * init_new_context - Initialize context of a new mm_struct.
>> + * @tsk: task struct for the mm
>> + * @mm:  the new mm struct
> 
> 'make *docs' will complain here about missing Return: description

Thanks, I added something. Looks like we can't get rid of it, sparc
and um can return error. Oh well.

>> + */
>> +#ifndef init_new_context
>>  static inline int init_new_context(struct task_struct *tsk,
>>  			struct mm_struct *mm)
>>  {
>>  	return 0;
>>  }
>> +#endif
> 
> Most architectures have non-trivial init_new_context, maybe this
> should go into nommu_context.h?

Hmm, I guess you could go either way. A few do have no-op functions so I 
think that qualifies them if the rule is less ambiguous and we provide 
no-op for functions unless it does not make any sense (e.g., switch_mm 
for MMU). More importantly I already have the code written and am lazy  
:)

Thanks,
Nick
diff mbox series

Patch

diff --git a/arch/microblaze/include/asm/mmu_context.h b/arch/microblaze/include/asm/mmu_context.h
index f74f9da07fdc..34004efb3def 100644
--- a/arch/microblaze/include/asm/mmu_context.h
+++ b/arch/microblaze/include/asm/mmu_context.h
@@ -2,5 +2,5 @@ 
 #ifdef CONFIG_MMU
 # include <asm/mmu_context_mm.h>
 #else
-# include <asm-generic/mmu_context.h>
+# include <asm-generic/nommu_context.h>
 #endif
diff --git a/arch/sh/include/asm/mmu_context.h b/arch/sh/include/asm/mmu_context.h
index f664e51e8a15..461b1304580b 100644
--- a/arch/sh/include/asm/mmu_context.h
+++ b/arch/sh/include/asm/mmu_context.h
@@ -133,7 +133,7 @@  static inline void switch_mm(struct mm_struct *prev,
 #define set_TTB(pgd)			do { } while (0)
 #define get_TTB()			(0)
 
-#include <asm-generic/mmu_context.h>
+#include <asm-generic/nommu_context.h>
 
 #endif /* CONFIG_MMU */
 
diff --git a/include/asm-generic/mmu_context.h b/include/asm-generic/mmu_context.h
index 6be9106fb6fb..86cea80a50df 100644
--- a/include/asm-generic/mmu_context.h
+++ b/include/asm-generic/mmu_context.h
@@ -3,44 +3,73 @@ 
 #define __ASM_GENERIC_MMU_CONTEXT_H
 
 /*
- * Generic hooks for NOMMU architectures, which do not need to do
- * anything special here.
+ * Generic hooks to implement no-op functionality.
  */
 
-#include <asm-generic/mm_hooks.h>
-
 struct task_struct;
 struct mm_struct;
 
+/*
+ * enter_lazy_tlb - Called when "tsk" is about to enter lazy TLB mode.
+ *
+ * @mm:  the currently active mm context which is becoming lazy
+ * @tsk: task which is entering lazy tlb
+ *
+ * tsk->mm will be NULL
+ */
+#ifndef enter_lazy_tlb
 static inline void enter_lazy_tlb(struct mm_struct *mm,
 			struct task_struct *tsk)
 {
 }
+#endif
 
+/**
+ * init_new_context - Initialize context of a new mm_struct.
+ * @tsk: task struct for the mm
+ * @mm:  the new mm struct
+ */
+#ifndef init_new_context
 static inline int init_new_context(struct task_struct *tsk,
 			struct mm_struct *mm)
 {
 	return 0;
 }
+#endif
 
+/**
+ * destroy_context - Undo init_new_context when the mm is going away
+ * @mm: old mm struct
+ */
+#ifndef destroy_context
 static inline void destroy_context(struct mm_struct *mm)
 {
 }
+#endif
 
-static inline void deactivate_mm(struct task_struct *task,
-			struct mm_struct *mm)
-{
-}
-
-static inline void switch_mm(struct mm_struct *prev,
-			struct mm_struct *next,
-			struct task_struct *tsk)
+/**
+ * activate_mm - called after exec switches the current task to a new mm, to switch to it
+ * @prev_mm: previous mm of this task
+ * @next_mm: new mm
+ */
+#ifndef activate_mm
+static inline void activate_mm(struct mm_struct *prev_mm,
+			       struct mm_struct *next_mm)
 {
+	switch_mm(prev_mm, next_mm, current);
 }
+#endif
 
-static inline void activate_mm(struct mm_struct *prev_mm,
-			       struct mm_struct *next_mm)
+/**
+ * dectivate_mm - called when an mm is released after exit or exec switches away from it
+ * @tsk: the task
+ * @mm:  the old mm
+ */
+#ifndef deactivate_mm
+static inline void deactivate_mm(struct task_struct *tsk,
+			struct mm_struct *mm)
 {
 }
+#endif
 
 #endif /* __ASM_GENERIC_MMU_CONTEXT_H */
diff --git a/include/asm-generic/nommu_context.h b/include/asm-generic/nommu_context.h
new file mode 100644
index 000000000000..4f916f9e16cd
--- /dev/null
+++ b/include/asm-generic/nommu_context.h
@@ -0,0 +1,19 @@ 
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __ASM_GENERIC_NOMMU_H
+#define __ASM_GENERIC_NOMMU_H
+
+/*
+ * Generic hooks for NOMMU architectures, which do not need to do
+ * anything special here.
+ */
+#include <asm-generic/mm_hooks.h>
+
+static inline void switch_mm(struct mm_struct *prev,
+			struct mm_struct *next,
+			struct task_struct *tsk)
+{
+}
+
+#include <asm-generic/mmu_context.h>
+
+#endif /* __ASM_GENERIC_NOMMU_H */