Skip to content
Snippets Groups Projects
Select Git revision
  • 4b1a29a7f5425d32640b34b8a755f34e02f64d0f
  • vme-testing default
  • ci-test
  • master
  • remoteproc
  • am625-sk-ov5640
  • pcal6534-upstreaming
  • lps22df-upstreaming
  • msc-upstreaming
  • imx8mp
  • iio/noa1305
  • vme-next
  • vme-next-4.14-rc4
  • v4.14-rc4
  • v4.14-rc3
  • v4.14-rc2
  • v4.14-rc1
  • v4.13
  • vme-next-4.13-rc7
  • v4.13-rc7
  • v4.13-rc6
  • v4.13-rc5
  • v4.13-rc4
  • v4.13-rc3
  • v4.13-rc2
  • v4.13-rc1
  • v4.12
  • v4.12-rc7
  • v4.12-rc6
  • v4.12-rc5
  • v4.12-rc4
  • v4.12-rc3
32 results

fail_function.c

Blame
    • Masami Hiramatsu's avatar
      4b1a29a7
      error-injection: Support fault injection framework · 4b1a29a7
      Masami Hiramatsu authored
      Support in-kernel fault-injection framework via debugfs.
      This allows you to inject a conditional error to specified
      function using debugfs interfaces.
      
      Here is the result of test script described in
      Documentation/fault-injection/fault-injection.txt
      
        ===========
        # ./test_fail_function.sh
        1+0 records in
        1+0 records out
        1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0227404 s, 46.1 MB/s
        btrfs-progs v4.4
        See http://btrfs.wiki.kernel.org
      
       for more information.
      
        Label:              (null)
        UUID:               bfa96010-12e9-4360-aed0-42eec7af5798
        Node size:          16384
        Sector size:        4096
        Filesystem size:    1001.00MiB
        Block group profiles:
          Data:             single            8.00MiB
          Metadata:         DUP              58.00MiB
          System:           DUP              12.00MiB
        SSD detected:       no
        Incompat features:  extref, skinny-metadata
        Number of devices:  1
        Devices:
           ID        SIZE  PATH
            1  1001.00MiB  /dev/loop2
      
        mount: mount /dev/loop2 on /opt/tmpmnt failed: Cannot allocate memory
        SUCCESS!
        ===========
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Reviewed-by: default avatarJosef Bacik <jbacik@fb.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      4b1a29a7
      History
      error-injection: Support fault injection framework
      Masami Hiramatsu authored
      Support in-kernel fault-injection framework via debugfs.
      This allows you to inject a conditional error to specified
      function using debugfs interfaces.
      
      Here is the result of test script described in
      Documentation/fault-injection/fault-injection.txt
      
        ===========
        # ./test_fail_function.sh
        1+0 records in
        1+0 records out
        1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0227404 s, 46.1 MB/s
        btrfs-progs v4.4
        See http://btrfs.wiki.kernel.org
      
       for more information.
      
        Label:              (null)
        UUID:               bfa96010-12e9-4360-aed0-42eec7af5798
        Node size:          16384
        Sector size:        4096
        Filesystem size:    1001.00MiB
        Block group profiles:
          Data:             single            8.00MiB
          Metadata:         DUP              58.00MiB
          System:           DUP              12.00MiB
        SSD detected:       no
        Incompat features:  extref, skinny-metadata
        Number of devices:  1
        Devices:
           ID        SIZE  PATH
            1  1001.00MiB  /dev/loop2
      
        mount: mount /dev/loop2 on /opt/tmpmnt failed: Cannot allocate memory
        SUCCESS!
        ===========
      
      Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
      Reviewed-by: default avatarJosef Bacik <jbacik@fb.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    fail_function.c 6.97 KiB
    // SPDX-License-Identifier: GPL-2.0
    /*
     * fail_function.c: Function-based error injection
     */
    #include <linux/error-injection.h>
    #include <linux/debugfs.h>
    #include <linux/fault-inject.h>
    #include <linux/kallsyms.h>
    #include <linux/kprobes.h>
    #include <linux/module.h>
    #include <linux/mutex.h>
    #include <linux/slab.h>
    #include <linux/uaccess.h>
    
    static int fei_kprobe_handler(struct kprobe *kp, struct pt_regs *regs);
    
    struct fei_attr {
    	struct list_head list;
    	struct kprobe kp;
    	unsigned long retval;
    };
    static DEFINE_MUTEX(fei_lock);
    static LIST_HEAD(fei_attr_list);
    static DECLARE_FAULT_ATTR(fei_fault_attr);
    static struct dentry *fei_debugfs_dir;
    
    static unsigned long adjust_error_retval(unsigned long addr, unsigned long retv)
    {
    	switch (get_injectable_error_type(addr)) {
    	case EI_ETYPE_NULL:
    		if (retv != 0)
    			return 0;
    		break;
    	case EI_ETYPE_ERRNO:
    		if (retv < (unsigned long)-MAX_ERRNO)
    			return (unsigned long)-EINVAL;
    		break;
    	case EI_ETYPE_ERRNO_NULL:
    		if (retv != 0 && retv < (unsigned long)-MAX_ERRNO)
    			return (unsigned long)-EINVAL;
    		break;
    	}
    
    	return retv;
    }
    
    static struct fei_attr *fei_attr_new(const char *sym, unsigned long addr)
    {
    	struct fei_attr *attr;
    
    	attr = kzalloc(sizeof(*attr), GFP_KERNEL);
    	if (attr) {
    		attr->kp.symbol_name = kstrdup(sym, GFP_KERNEL);
    		if (!attr->kp.symbol_name) {
    			kfree(attr);
    			return NULL;
    		}
    		attr->kp.pre_handler = fei_kprobe_handler;
    		attr->retval = adjust_error_retval(addr, 0);
    		INIT_LIST_HEAD(&attr->list);
    	}
    	return attr;
    }
    
    static void fei_attr_free(struct fei_attr *attr)
    {
    	if (attr) {
    		kfree(attr->kp.symbol_name);
    		kfree(attr);
    	}