]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge branch 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 12 Dec 2016 21:49:57 +0000 (13:49 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 12 Dec 2016 21:49:57 +0000 (13:49 -0800)
Pull x86 asm updates from Ingo Molnar:
 "The main changes in this development cycle were:

   - a large number of call stack dumping/printing improvements: higher
     robustness, better cross-context dumping, improved output, etc.
     (Josh Poimboeuf)

   - vDSO getcpu() performance improvement for future Intel CPUs with
     the RDPID instruction (Andy Lutomirski)

   - add two new Intel AVX512 features and the CPUID support
     infrastructure for it: AVX512IFMA and AVX512VBMI. (Gayatri Kammela,
     He Chen)

   - more copy-user unification (Borislav Petkov)

   - entry code assembly macro simplifications (Alexander Kuleshov)

   - vDSO C/R support improvements (Dmitry Safonov)

   - misc fixes and cleanups (Borislav Petkov, Paul Bolle)"

* 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (40 commits)
  scripts/decode_stacktrace.sh: Fix address line detection on x86
  x86/boot/64: Use defines for page size
  x86/dumpstack: Make stack name tags more comprehensible
  selftests/x86: Add test_vdso to test getcpu()
  x86/vdso: Use RDPID in preference to LSL when available
  x86/dumpstack: Handle NULL stack pointer in show_trace_log_lvl()
  x86/cpufeatures: Enable new AVX512 cpu features
  x86/cpuid: Provide get_scattered_cpuid_leaf()
  x86/cpuid: Cleanup cpuid_regs definitions
  x86/copy_user: Unify the code by removing the 64-bit asm _copy_*_user() variants
  x86/unwind: Ensure stack grows down
  x86/vdso: Set vDSO pointer only after success
  x86/prctl/uapi: Remove #ifdef for CHECKPOINT_RESTORE
  x86/unwind: Detect bad stack return address
  x86/dumpstack: Warn on stack recursion
  x86/unwind: Warn on bad frame pointer
  x86/decoder: Use stderr if insn sanity test fails
  x86/decoder: Use stdout if insn decoder test is successful
  mm/page_alloc: Remove kernel address exposure in free_reserved_area()
  x86/dumpstack: Remove raw stack dump
  ...

1  2 
Documentation/kernel-parameters.txt
arch/x86/include/asm/cpufeatures.h
arch/x86/include/asm/processor.h
arch/x86/kernel/dumpstack.c
arch/x86/kernel/head_32.S
arch/x86/kernel/smpboot.c
kernel/sysctl.c

index 86a31dfc036e5c6d135828068d2e03ddda3f6833,049a9172ed2268b9e16ffa07eac04e14350bd6f5..7c817dc45d45b4fc1365aff26681b9cfbe8c4eee
@@@ -1062,11 -1062,6 +1062,11 @@@ bytes respectively. Such letter suffixe
  
        dscc4.setup=    [NET]
  
 +      dump_apple_properties   [X86]
 +                      Dump name and content of EFI device properties on
 +                      x86 Macs.  Useful for driver authors to determine
 +                      what data is available or for reverse-engineering.
 +
        dyndbg[="val"]          [KNL,DYNAMIC_DEBUG]
        module.dyndbg[="val"]
                        Enable debug messages at boot time.  See
                        kmemcheck=2 (one-shot mode)
                        Default: 2 (one-shot mode)
  
-       kstack=N        [X86] Print N words from the kernel stack
-                       in oops dumps.
        kvm.ignore_msrs=[KVM] Ignore guest accesses to unhandled MSRs.
                        Default is 0 (don't ignore, but inject #GP)
  
index d625b651e526605dad64ab369b13bbd450fcba3e,eac7572bf8bb41d6a5acd96d8eab95e86f5cebad..4dba597c5807033c3edec86ff9f3efde249c785f
  #define X86_FEATURE_HW_PSTATE ( 7*32+ 8) /* AMD HW-PState */
  #define X86_FEATURE_PROC_FEEDBACK ( 7*32+ 9) /* AMD ProcFeedbackInterface */
  
 +#define X86_FEATURE_INTEL_PPIN        ( 7*32+14) /* Intel Processor Inventory Number */
  #define X86_FEATURE_INTEL_PT  ( 7*32+15) /* Intel Processor Trace */
  #define X86_FEATURE_AVX512_4VNNIW (7*32+16) /* AVX-512 Neural Network Instructions */
  #define X86_FEATURE_AVX512_4FMAPS (7*32+17) /* AVX-512 Multiply Accumulation Single precision */
  #define X86_FEATURE_RDSEED    ( 9*32+18) /* The RDSEED instruction */
  #define X86_FEATURE_ADX               ( 9*32+19) /* The ADCX and ADOX instructions */
  #define X86_FEATURE_SMAP      ( 9*32+20) /* Supervisor Mode Access Prevention */
+ #define X86_FEATURE_AVX512IFMA  ( 9*32+21) /* AVX-512 Integer Fused Multiply-Add instructions */
  #define X86_FEATURE_CLFLUSHOPT        ( 9*32+23) /* CLFLUSHOPT instruction */
  #define X86_FEATURE_CLWB      ( 9*32+24) /* CLWB instruction */
  #define X86_FEATURE_AVX512PF  ( 9*32+26) /* AVX-512 Prefetch */
  #define X86_FEATURE_AVIC      (15*32+13) /* Virtual Interrupt Controller */
  
  /* Intel-defined CPU features, CPUID level 0x00000007:0 (ecx), word 16 */
+ #define X86_FEATURE_AVX512VBMI  (16*32+ 1) /* AVX512 Vector Bit Manipulation instructions*/
  #define X86_FEATURE_PKU               (16*32+ 3) /* Protection Keys for Userspace */
  #define X86_FEATURE_OSPKE     (16*32+ 4) /* OS Protection Keys Enable */
+ #define X86_FEATURE_RDPID     (16*32+ 22) /* RDPID instruction */
  
  /* AMD-defined CPU features, CPUID level 0x80000007 (ebx), word 17 */
  #define X86_FEATURE_OVERFLOW_RECOV (17*32+0) /* MCA overflow recovery support */
index c84605bb2a15d089502d0214d5625d463bd69d7b,e7f8c62701d4af54315238c99b533dd68dacf650..1f6a92903b09379e4d7152e219e04cef15a60177
@@@ -137,6 -137,17 +137,17 @@@ struct cpuinfo_x86 
        u32                     microcode;
  };
  
+ struct cpuid_regs {
+       u32 eax, ebx, ecx, edx;
+ };
+ enum cpuid_regs_idx {
+       CPUID_EAX = 0,
+       CPUID_EBX,
+       CPUID_ECX,
+       CPUID_EDX,
+ };
  #define X86_VENDOR_INTEL      0
  #define X86_VENDOR_CYRIX      1
  #define X86_VENDOR_AMD                2
@@@ -178,6 -189,9 +189,9 @@@ extern void identify_secondary_cpu(stru
  extern void print_cpu_info(struct cpuinfo_x86 *);
  void print_cpu_msr(struct cpuinfo_x86 *);
  extern void init_scattered_cpuid_features(struct cpuinfo_x86 *c);
+ extern u32 get_scattered_cpuid_leaf(unsigned int level,
+                                   unsigned int sub_leaf,
+                                   enum cpuid_regs_idx reg);
  extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
  extern void init_amd_cacheinfo(struct cpuinfo_x86 *c);
  
@@@ -588,6 -602,8 +602,6 @@@ static __always_inline void cpu_relax(v
        rep_nop();
  }
  
 -#define cpu_relax_lowlatency() cpu_relax()
 -
  /* Stop speculative execution and prefetching of modified code. */
  static inline void sync_core(void)
  {
index 85f854b98a9d24c3e0e6a3d9d83fd6c5b6c57e3f,0e5c9d0f6c282afdff7df115882c1ff09b43fc1c..0cfd01d2754cc9e074c5f44cb79b212e3afa7e68
@@@ -22,7 -22,6 +22,6 @@@
  int panic_on_unrecovered_nmi;
  int panic_on_io_nmi;
  unsigned int code_bytes = 64;
- int kstack_depth_to_print = 3 * STACKSLOTS_PER_LINE;
  static int die_counter;
  
  bool in_task_stack(unsigned long *stack, struct task_struct *task,
@@@ -46,14 -45,7 +45,7 @@@ static void printk_stack_address(unsign
                                 char *log_lvl)
  {
        touch_nmi_watchdog();
-       printk("%s [<%p>] %s%pB\n",
-               log_lvl, (void *)address, reliable ? "" : "? ",
-               (void *)address);
- }
- void printk_address(unsigned long address)
- {
-       pr_cont(" [<%p>] %pS\n", (void *)address, (void *)address);
+       printk("%s %s%pB\n", log_lvl, reliable ? "" : "? ", (void *)address);
  }
  
  void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
@@@ -67,6 -59,7 +59,7 @@@
        printk("%sCall Trace:\n", log_lvl);
  
        unwind_start(&state, task, regs, stack);
+       stack = stack ? : get_stack_pointer(task, regs);
  
        /*
         * Iterate through the stacks, starting with the current stack pointer.
@@@ -82,8 -75,8 +75,8 @@@
         * - softirq stack
         * - hardirq stack
         */
-       for (; stack; stack = stack_info.next_sp) {
-               const char *str_begin, *str_end;
+       for (regs = NULL; stack; stack = stack_info.next_sp) {
+               const char *stack_name;
  
                /*
                 * If we overflowed the task stack into a guard page, jump back
@@@ -95,9 -88,9 +88,9 @@@
                if (get_stack_info(stack, task, &stack_info, &visit_mask))
                        break;
  
-               stack_type_str(stack_info.type, &str_begin, &str_end);
-               if (str_begin)
-                       printk("%s <%s> ", log_lvl, str_begin);
+               stack_name = stack_type_name(stack_info.type);
+               if (stack_name)
+                       printk("%s <%s>\n", log_lvl, stack_name);
  
                /*
                 * Scan the stack, printing any text addresses we find.  At the
                for (; stack < stack_info.end; stack++) {
                        unsigned long real_addr;
                        int reliable = 0;
 -                      unsigned long addr = *stack;
 +                      unsigned long addr = READ_ONCE_NOCHECK(*stack);
                        unsigned long *ret_addr_p =
                                unwind_get_return_address_ptr(&state);
  
                        if (!__kernel_text_address(addr))
                                continue;
  
+                       /*
+                        * Don't print regs->ip again if it was already printed
+                        * by __show_regs() below.
+                        */
+                       if (regs && stack == &regs->ip) {
+                               unwind_next_frame(&state);
+                               continue;
+                       }
                        if (stack == ret_addr_p)
                                reliable = 1;
  
                         * of the addresses will just be printed as unreliable.
                         */
                        unwind_next_frame(&state);
+                       /* if the frame has entry regs, print them */
+                       regs = unwind_get_entry_regs(&state);
+                       if (regs)
+                               __show_regs(regs, 0);
                }
  
-               if (str_end)
-                       printk("%s <%s> ", log_lvl, str_end);
+               if (stack_name)
+                       printk("%s </%s>\n", log_lvl, stack_name);
        }
  }
  
@@@ -164,12 -171,12 +171,12 @@@ void show_stack(struct task_struct *tas
        if (!sp && task == current)
                sp = get_stack_pointer(current, NULL);
  
-       show_stack_log_lvl(task, NULL, sp, "");
+       show_trace_log_lvl(task, NULL, sp, KERN_DEFAULT);
  }
  
  void show_stack_regs(struct pt_regs *regs)
  {
-       show_stack_log_lvl(current, regs, NULL, "");
+       show_trace_log_lvl(current, regs, NULL, KERN_DEFAULT);
  }
  
  static arch_spinlock_t die_lock = __ARCH_SPIN_LOCK_UNLOCKED;
@@@ -261,14 -268,11 +268,11 @@@ int __die(const char *str, struct pt_re
                sp = kernel_stack_pointer(regs);
                savesegment(ss, ss);
        }
-       printk(KERN_EMERG "EIP: [<%08lx>] ", regs->ip);
-       print_symbol("%s", regs->ip);
-       printk(" SS:ESP %04x:%08lx\n", ss, sp);
+       printk(KERN_EMERG "EIP: %pS SS:ESP: %04x:%08lx\n",
+              (void *)regs->ip, ss, sp);
  #else
        /* Executive summary in case the oops scrolled away */
-       printk(KERN_ALERT "RIP ");
-       printk_address(regs->ip);
-       printk(" RSP <%016lx>\n", regs->sp);
+       printk(KERN_ALERT "RIP: %pS RSP: %016lx\n", (void *)regs->ip, regs->sp);
  #endif
        return 0;
  }
@@@ -291,22 -295,6 +295,6 @@@ void die(const char *str, struct pt_reg
        oops_end(flags, regs, sig);
  }
  
- static int __init kstack_setup(char *s)
- {
-       ssize_t ret;
-       unsigned long val;
-       if (!s)
-               return -EINVAL;
-       ret = kstrtoul(s, 0, &val);
-       if (ret)
-               return ret;
-       kstack_depth_to_print = val;
-       return 0;
- }
- early_param("kstack", kstack_setup);
  static int __init code_bytes_setup(char *s)
  {
        ssize_t ret;
index 2dabea46f03935f435493117c058a297f5011878,df541ac2071e12ba79e9fa32631b2b251124f9bb..4e8577d03372c747c61e254e093a8c2ae7e4298c
@@@ -63,6 -63,8 +63,8 @@@
  #define PAGE_TABLE_SIZE(pages) ((pages) / PTRS_PER_PGD)
  #endif
  
+ #define SIZEOF_PTREGS 17*4
  /*
   * Number of possible pages in the lowmem region.
   *
@@@ -248,19 -250,19 +250,19 @@@ page_pde_offset = (__PAGE_OFFSET >> 20)
  #ifdef CONFIG_PARAVIRT
        /* This is can only trip for a broken bootloader... */
        cmpw $0x207, pa(boot_params + BP_version)
-       jb default_entry
+       jb .Ldefault_entry
  
        /* Paravirt-compatible boot parameters.  Look to see what architecture
                we're booting under. */
        movl pa(boot_params + BP_hardware_subarch), %eax
        cmpl $num_subarch_entries, %eax
-       jae bad_subarch
+       jae .Lbad_subarch
  
        movl pa(subarch_entries)(,%eax,4), %eax
        subl $__PAGE_OFFSET, %eax
        jmp *%eax
  
- bad_subarch:
.Lbad_subarch:
  WEAK(lguest_entry)
  WEAK(xen_entry)
        /* Unknown implementation; there's really
        __INITDATA
  
  subarch_entries:
-       .long default_entry             /* normal x86/PC */
+       .long .Ldefault_entry           /* normal x86/PC */
        .long lguest_entry              /* lguest hypervisor */
        .long xen_entry                 /* Xen hypervisor */
-       .long default_entry             /* Moorestown MID */
+       .long .Ldefault_entry           /* Moorestown MID */
  num_subarch_entries = (. - subarch_entries) / 4
  .previous
  #else
-       jmp default_entry
+       jmp .Ldefault_entry
  #endif /* CONFIG_PARAVIRT */
  
  #ifdef CONFIG_HOTPLUG_CPU
  ENTRY(start_cpu0)
        movl initial_stack, %ecx
        movl %ecx, %esp
-       jmp  *(initial_code)
+       call *(initial_code)
+ 1:    jmp 1b
  ENDPROC(start_cpu0)
  #endif
  
@@@ -317,7 -320,7 +320,7 @@@ ENTRY(startup_32_smp
        call load_ucode_ap
  #endif
  
- default_entry:
.Ldefault_entry:
  #define CR0_STATE     (X86_CR0_PE | X86_CR0_MP | X86_CR0_ET | \
                         X86_CR0_NE | X86_CR0_WP | X86_CR0_AM | \
                         X86_CR0_PG)
        pushfl
        popl %eax                       # get EFLAGS
        testl $X86_EFLAGS_ID,%eax       # did EFLAGS.ID remained set?
-       jz enable_paging                # hw disallowed setting of ID bit
+       jz .Lenable_paging              # hw disallowed setting of ID bit
                                        # which means no CPUID and no CR4
  
        xorl %eax,%eax
        movl $1,%eax
        cpuid
        andl $~1,%edx                   # Ignore CPUID.FPU
-       jz enable_paging                # No flags or only CPUID.FPU = no CR4
+       jz .Lenable_paging              # No flags or only CPUID.FPU = no CR4
  
        movl pa(mmu_cr4_features),%eax
        movl %eax,%cr4
  
        testb $X86_CR4_PAE, %al         # check if PAE is enabled
-       jz enable_paging
+       jz .Lenable_paging
  
        /* Check if extended functions are implemented */
        movl $0x80000000, %eax
        /* Value must be in the range 0x80000001 to 0x8000ffff */
        subl $0x80000001, %eax
        cmpl $(0x8000ffff-0x80000001), %eax
-       ja enable_paging
+       ja .Lenable_paging
  
        /* Clear bogus XD_DISABLE bits */
        call verify_cpu
        cpuid
        /* Execute Disable bit supported? */
        btl $(X86_FEATURE_NX & 31), %edx
-       jnc enable_paging
+       jnc .Lenable_paging
  
        /* Setup EFER (Extended Feature Enable Register) */
        movl $MSR_EFER, %ecx
        /* Make changes effective */
        wrmsr
  
- enable_paging:
.Lenable_paging:
  
  /*
   * Enable paging
   */
        movb $4,X86                     # at least 486
        cmpl $-1,X86_CPUID
-       je is486
+       je .Lis486
  
        /* get vendor info */
        xorl %eax,%eax                  # call CPUID with 0 -> return vendor ID
        movl %ecx,X86_VENDOR_ID+8       # last 4 chars
  
        orl %eax,%eax                   # do we have processor info as well?
-       je is486
+       je .Lis486
  
        movl $1,%eax            # Use the CPUID instruction to get CPU type
        cpuid
        movb %cl,X86_MASK
        movl %edx,X86_CAPABILITY
  
- is486:
.Lis486:
        movl $0x50022,%ecx      # set AM, WP, NE and MP
        movl %cr0,%eax
        andl $0x80000011,%eax   # Save PG,PE,ET
        xorl %eax,%eax                  # Clear LDT
        lldt %ax
  
-       pushl $0                # fake return address for unwinder
-       jmp *(initial_code)
+       call *(initial_code)
+ 1:    jmp 1b
+ ENDPROC(startup_32_smp)
  
  #include "verify_cpu.S"
  
@@@ -665,17 -669,14 +669,17 @@@ __PAGE_ALIGNED_BS
  initial_pg_pmd:
        .fill 1024*KPMDS,4,0
  #else
 -ENTRY(initial_page_table)
 +.globl initial_page_table
 +initial_page_table:
        .fill 1024,4,0
  #endif
  initial_pg_fixmap:
        .fill 1024,4,0
 -ENTRY(empty_zero_page)
 +.globl empty_zero_page
 +empty_zero_page:
        .fill 4096,1,0
 -ENTRY(swapper_pg_dir)
 +.globl swapper_pg_dir
 +swapper_pg_dir:
        .fill 1024,4,0
  EXPORT_SYMBOL(empty_zero_page)
  
@@@ -709,7 -710,12 +713,12 @@@ ENTRY(initial_page_table
  .data
  .balign 4
  ENTRY(initial_stack)
-       .long init_thread_union+THREAD_SIZE
+       /*
+        * The SIZEOF_PTREGS gap is a convention which helps the in-kernel
+        * unwinder reliably detect the end of the stack.
+        */
+       .long init_thread_union + THREAD_SIZE - SIZEOF_PTREGS - \
+             TOP_OF_KERNEL_STACK_PADDING;
  
  __INITRODATA
  int_msg:
index 118e792a7be62a875d9e8b6026ff91c398e490b4,95d6fc549ad59d89c7f3b0eb8c63ecc52fae6d05..8add3a5b8635f20120bc68b60e3ea995bf236bd7
@@@ -109,17 -109,6 +109,17 @@@ static bool logical_packages_frozen __r
  /* Maximum number of SMT threads on any online core */
  int __max_smt_threads __read_mostly;
  
 +/* Flag to indicate if a complete sched domain rebuild is required */
 +bool x86_topology_update;
 +
 +int arch_update_cpu_topology(void)
 +{
 +      int retval = x86_topology_update;
 +
 +      x86_topology_update = false;
 +      return retval;
 +}
 +
  static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
  {
        unsigned long flags;
@@@ -482,42 -471,22 +482,42 @@@ static bool match_die(struct cpuinfo_x8
        return false;
  }
  
 +#if defined(CONFIG_SCHED_SMT) || defined(CONFIG_SCHED_MC)
 +static inline int x86_sched_itmt_flags(void)
 +{
 +      return sysctl_sched_itmt_enabled ? SD_ASYM_PACKING : 0;
 +}
 +
 +#ifdef CONFIG_SCHED_MC
 +static int x86_core_flags(void)
 +{
 +      return cpu_core_flags() | x86_sched_itmt_flags();
 +}
 +#endif
 +#ifdef CONFIG_SCHED_SMT
 +static int x86_smt_flags(void)
 +{
 +      return cpu_smt_flags() | x86_sched_itmt_flags();
 +}
 +#endif
 +#endif
 +
  static struct sched_domain_topology_level x86_numa_in_package_topology[] = {
  #ifdef CONFIG_SCHED_SMT
 -      { cpu_smt_mask, cpu_smt_flags, SD_INIT_NAME(SMT) },
 +      { cpu_smt_mask, x86_smt_flags, SD_INIT_NAME(SMT) },
  #endif
  #ifdef CONFIG_SCHED_MC
 -      { cpu_coregroup_mask, cpu_core_flags, SD_INIT_NAME(MC) },
 +      { cpu_coregroup_mask, x86_core_flags, SD_INIT_NAME(MC) },
  #endif
        { NULL, },
  };
  
  static struct sched_domain_topology_level x86_topology[] = {
  #ifdef CONFIG_SCHED_SMT
 -      { cpu_smt_mask, cpu_smt_flags, SD_INIT_NAME(SMT) },
 +      { cpu_smt_mask, x86_smt_flags, SD_INIT_NAME(SMT) },
  #endif
  #ifdef CONFIG_SCHED_MC
 -      { cpu_coregroup_mask, cpu_core_flags, SD_INIT_NAME(MC) },
 +      { cpu_coregroup_mask, x86_core_flags, SD_INIT_NAME(MC) },
  #endif
        { cpu_cpu_mask, SD_INIT_NAME(DIE) },
        { NULL, },
@@@ -852,6 -821,14 +852,6 @@@ wakeup_secondary_cpu_via_init(int phys_
        return (send_status | accept_status);
  }
  
 -void smp_announce(void)
 -{
 -      int num_nodes = num_online_nodes();
 -
 -      printk(KERN_INFO "x86: Booted up %d node%s, %d CPUs\n",
 -             num_nodes, (num_nodes > 1 ? "s" : ""), num_online_cpus());
 -}
 -
  /* reduce the number of lines printed when booting a large cpu count system */
  static void announce_cpu(int cpu, int apicid)
  {
@@@ -987,9 -964,7 +987,7 @@@ static int do_boot_cpu(int apicid, int 
        int cpu0_nmi_registered = 0;
        unsigned long timeout;
  
-       idle->thread.sp = (unsigned long) (((struct pt_regs *)
-                         (THREAD_SIZE +  task_stack_page(idle))) - 1);
+       idle->thread.sp = (unsigned long)task_pt_regs(idle);
        early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu);
        initial_code = (unsigned long)start_secondary;
        initial_stack  = idle->thread.sp;
diff --combined kernel/sysctl.c
index 739fb17371af149a28c1d59ecde507a94217fe25,17a5a82532946e7a98114a921eefbe640ab6afd3..39b3368f6de67119b830f3bc3db4382b00a54728
@@@ -347,6 -347,13 +347,6 @@@ static struct ctl_table kern_table[] = 
                .mode           = 0644,
                .proc_handler   = proc_dointvec,
        },
 -      {
 -              .procname       = "sched_shares_window_ns",
 -              .data           = &sysctl_sched_shares_window,
 -              .maxlen         = sizeof(unsigned int),
 -              .mode           = 0644,
 -              .proc_handler   = proc_dointvec,
 -      },
  #ifdef CONFIG_SCHEDSTATS
        {
                .procname       = "sched_schedstats",
                .mode           = 0444,
                .proc_handler   = proc_dointvec,
        },
-       {
-               .procname       = "kstack_depth_to_print",
-               .data           = &kstack_depth_to_print,
-               .maxlen         = sizeof(int),
-               .mode           = 0644,
-               .proc_handler   = proc_dointvec,
-       },
        {
                .procname       = "io_delay_type",
                .data           = &io_delay_type,