cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

failslab.c (1469B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <linux/fault-inject.h>
      3#include <linux/slab.h>
      4#include <linux/mm.h>
      5#include "slab.h"
      6
      7static struct {
      8	struct fault_attr attr;
      9	bool ignore_gfp_reclaim;
     10	bool cache_filter;
     11} failslab = {
     12	.attr = FAULT_ATTR_INITIALIZER,
     13	.ignore_gfp_reclaim = true,
     14	.cache_filter = false,
     15};
     16
     17bool __should_failslab(struct kmem_cache *s, gfp_t gfpflags)
     18{
     19	/* No fault-injection for bootstrap cache */
     20	if (unlikely(s == kmem_cache))
     21		return false;
     22
     23	if (gfpflags & __GFP_NOFAIL)
     24		return false;
     25
     26	if (failslab.ignore_gfp_reclaim &&
     27			(gfpflags & __GFP_DIRECT_RECLAIM))
     28		return false;
     29
     30	if (failslab.cache_filter && !(s->flags & SLAB_FAILSLAB))
     31		return false;
     32
     33	if (gfpflags & __GFP_NOWARN)
     34		failslab.attr.no_warn = true;
     35
     36	return should_fail(&failslab.attr, s->object_size);
     37}
     38
     39static int __init setup_failslab(char *str)
     40{
     41	return setup_fault_attr(&failslab.attr, str);
     42}
     43__setup("failslab=", setup_failslab);
     44
     45#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
     46static int __init failslab_debugfs_init(void)
     47{
     48	struct dentry *dir;
     49	umode_t mode = S_IFREG | 0600;
     50
     51	dir = fault_create_debugfs_attr("failslab", NULL, &failslab.attr);
     52	if (IS_ERR(dir))
     53		return PTR_ERR(dir);
     54
     55	debugfs_create_bool("ignore-gfp-wait", mode, dir,
     56			    &failslab.ignore_gfp_reclaim);
     57	debugfs_create_bool("cache-filter", mode, dir,
     58			    &failslab.cache_filter);
     59
     60	return 0;
     61}
     62
     63late_initcall(failslab_debugfs_init);
     64
     65#endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */