root/arch/arm64/include/asm/simd.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. may_use_simd
  2. may_use_simd

   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * Copyright (C) 2017 Linaro Ltd. <ard.biesheuvel@linaro.org>
   4  */
   5 
   6 #ifndef __ASM_SIMD_H
   7 #define __ASM_SIMD_H
   8 
   9 #include <linux/compiler.h>
  10 #include <linux/irqflags.h>
  11 #include <linux/percpu.h>
  12 #include <linux/preempt.h>
  13 #include <linux/types.h>
  14 
  15 DECLARE_PER_CPU(bool, fpsimd_context_busy);
  16 
  17 #ifdef CONFIG_KERNEL_MODE_NEON
  18 
  19 /*
  20  * may_use_simd - whether it is allowable at this time to issue SIMD
  21  *                instructions or access the SIMD register file
  22  *
  23  * Callers must not assume that the result remains true beyond the next
  24  * preempt_enable() or return from softirq context.
  25  */
  26 static __must_check inline bool may_use_simd(void)
  27 {
  28         /*
  29          * fpsimd_context_busy is only set while preemption is disabled,
  30          * and is clear whenever preemption is enabled. Since
  31          * this_cpu_read() is atomic w.r.t. preemption, fpsimd_context_busy
  32          * cannot change under our feet -- if it's set we cannot be
  33          * migrated, and if it's clear we cannot be migrated to a CPU
  34          * where it is set.
  35          */
  36         return !in_irq() && !irqs_disabled() && !in_nmi() &&
  37                 !this_cpu_read(fpsimd_context_busy);
  38 }
  39 
  40 #else /* ! CONFIG_KERNEL_MODE_NEON */
  41 
  42 static __must_check inline bool may_use_simd(void) {
  43         return false;
  44 }
  45 
  46 #endif /* ! CONFIG_KERNEL_MODE_NEON */
  47 
  48 #endif

/* [<][>][^][v][top][bottom][index][help] */