__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __ASM_ASM_ASID_H
#define __ASM_ASM_ASID_H
#include <linux/atomic.h>
#include <linux/compiler.h>
#include <linux/cpumask.h>
#include <linux/percpu.h>
#include <linux/spinlock.h>
struct asid_info
{
atomic64_t generation;
unsigned long *map;
atomic64_t __percpu *active;
u64 __percpu *reserved;
u32 bits;
/* Lock protecting the structure */
raw_spinlock_t lock;
/* Which CPU requires context flush on next call */
cpumask_t flush_pending;
/* Number of ASID allocated by context (shift value) */
unsigned int ctxt_shift;
/* Callback to locally flush the context. */
void (*flush_cpu_ctxt_cb)(void);
};
#define NUM_ASIDS(info) (1UL << ((info)->bits))
#define NUM_CTXT_ASIDS(info) (NUM_ASIDS(info) >> (info)->ctxt_shift)
#define active_asid(info, cpu) *per_cpu_ptr((info)->active, cpu)
void asid_new_context(struct asid_info *info, atomic64_t *pasid,
unsigned int cpu, struct mm_struct *mm);
/*
* Check the ASID is still valid for the context. If not generate a new ASID.
*
* @pasid: Pointer to the current ASID batch
* @cpu: current CPU ID. Must have been acquired through get_cpu()
*/
static inline void asid_check_context(struct asid_info *info,
atomic64_t *pasid, unsigned int cpu,
struct mm_struct *mm)
{
u64 asid, old_active_asid;
asid = atomic64_read(pasid);
/*
* The memory ordering here is subtle.
* If our active_asid is non-zero and the ASID matches the current
* generation, then we update the active_asid entry with a relaxed
* cmpxchg. Racing with a concurrent rollover means that either:
*
* - We get a zero back from the cmpxchg and end up waiting on the
* lock. Taking the lock synchronises with the rollover and so
* we are forced to see the updated generation.
*
* - We get a valid ASID back from the cmpxchg, which means the
* relaxed xchg in flush_context will treat us as reserved
* because atomic RmWs are totally ordered for a given location.
*/
old_active_asid = atomic64_read(&active_asid(info, cpu));
if (old_active_asid &&
!((asid ^ atomic64_read(&info->generation)) >> info->bits) &&
atomic64_cmpxchg_relaxed(&active_asid(info, cpu),
old_active_asid, asid))
return;
asid_new_context(info, pasid, cpu, mm);
}
int asid_allocator_init(struct asid_info *info,
u32 bits, unsigned int asid_per_ctxt,
void (*flush_cpu_ctxt_cb)(void));
#endif
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| Kbuild | File | 346 B | 0644 |
|
| addrspace.h | File | 231 B | 0644 |
|
| asid.h | File | 2.38 KB | 0644 |
|
| atomic.h | File | 4.26 KB | 0644 |
|
| barrier.h | File | 2.53 KB | 0644 |
|
| bitops.h | File | 1.29 KB | 0644 |
|
| bug.h | File | 565 B | 0644 |
|
| cache.h | File | 861 B | 0644 |
|
| cacheflush.h | File | 193 B | 0644 |
|
| cachetype.h | File | 174 B | 0644 |
|
| checksum.h | File | 944 B | 0644 |
|
| clocksource.h | File | 159 B | 0644 |
|
| cmpxchg.h | File | 4.16 KB | 0644 |
|
| elf.h | File | 2.66 KB | 0644 |
|
| fixmap.h | File | 747 B | 0644 |
|
| ftrace.h | File | 629 B | 0644 |
|
| futex.h | File | 2.54 KB | 0644 |
|
| highmem.h | File | 1.09 KB | 0644 |
|
| io.h | File | 1.33 KB | 0644 |
|
| irq_work.h | File | 208 B | 0644 |
|
| irqflags.h | File | 1.11 KB | 0644 |
|
| jump_label.h | File | 1.16 KB | 0644 |
|
| kprobes.h | File | 1.13 KB | 0644 |
|
| memory.h | File | 657 B | 0644 |
|
| mmu.h | File | 216 B | 0644 |
|
| mmu_context.h | File | 959 B | 0644 |
|
| page.h | File | 2.34 KB | 0644 |
|
| pci.h | File | 277 B | 0644 |
|
| perf_event.h | File | 359 B | 0644 |
|
| pgalloc.h | File | 1.61 KB | 0644 |
|
| pgtable.h | File | 6.71 KB | 0644 |
|
| probes.h | File | 554 B | 0644 |
|
| processor.h | File | 2.27 KB | 0644 |
|
| ptrace.h | File | 2.53 KB | 0644 |
|
| reg_ops.h | File | 382 B | 0644 |
|
| seccomp.h | File | 283 B | 0644 |
|
| sections.h | File | 246 B | 0644 |
|
| shmparam.h | File | 197 B | 0644 |
|
| smp.h | File | 643 B | 0644 |
|
| spinlock.h | File | 267 B | 0644 |
|
| spinlock_types.h | File | 235 B | 0644 |
|
| stackprotector.h | File | 526 B | 0644 |
|
| string.h | File | 233 B | 0644 |
|
| switch_to.h | File | 923 B | 0644 |
|
| syscall.h | File | 1.32 KB | 0644 |
|
| syscalls.h | File | 351 B | 0644 |
|
| tcm.h | File | 665 B | 0644 |
|
| thread_info.h | File | 2.74 KB | 0644 |
|
| tlb.h | File | 179 B | 0644 |
|
| tlbflush.h | File | 824 B | 0644 |
|
| traps.h | File | 1.41 KB | 0644 |
|
| uaccess.h | File | 4.86 KB | 0644 |
|
| unistd.h | File | 164 B | 0644 |
|
| uprobes.h | File | 669 B | 0644 |
|
| vdso.h | File | 724 B | 0644 |
|
| vmalloc.h | File | 90 B | 0644 |
|