Hi Aleksa,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on tip/perf/core]
[also build test ERROR on v4.19 next-20181101]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Aleksa-Sarai/kretprobe-produce-sane-stack-traces/20181102-034111
config: i386-randconfig-h1-11021006 (attached as .config)
compiler: gcc-4.9 (Debian 4.9.4-2) 4.9.4
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   kernel/kprobes.c: In function 'pre_handler_kretprobe':
   kernel/kprobes.c:1846:10: error: variable 'trace' has initializer but 
incomplete type
      struct stack_trace trace = {};
             ^
   kernel/kprobes.c:1846:22: error: storage size of 'trace' isn't known
      struct stack_trace trace = {};
                         ^
>> kernel/kprobes.c:1858:3: error: implicit declaration of function 
>> 'save_stack_trace_regs' [-Werror=implicit-function-declaration]
      save_stack_trace_regs(regs, &trace);
      ^
   kernel/kprobes.c:1846:22: warning: unused variable 'trace' 
[-Wunused-variable]
      struct stack_trace trace = {};
                         ^
   kernel/kprobes.c: In function 'kretprobe_save_stack_trace':
>> kernel/kprobes.c:1922:16: error: dereferencing pointer to incomplete type
     for (i = trace->skip; i < krt->nr_entries; i++) {
                   ^
   kernel/kprobes.c:1923:12: error: dereferencing pointer to incomplete type
      if (trace->nr_entries >= trace->max_entries)
               ^
   kernel/kprobes.c:1923:33: error: dereferencing pointer to incomplete type
      if (trace->nr_entries >= trace->max_entries)
                                    ^
   kernel/kprobes.c:1925:8: error: dereferencing pointer to incomplete type
      trace->entries[trace->nr_entries++] = krt->entries[i];
           ^
   kernel/kprobes.c:1925:23: error: dereferencing pointer to incomplete type
      trace->entries[trace->nr_entries++] = krt->entries[i];
                          ^
   cc1: some warnings being treated as errors

vim +/save_stack_trace_regs +1858 kernel/kprobes.c

  1819  
  1820  #ifdef CONFIG_KRETPROBES
  1821  /*
  1822   * This kprobe pre_handler is registered with every kretprobe. When 
probe
  1823   * hits it will set up the return probe.
  1824   */
  1825  static int pre_handler_kretprobe(struct kprobe *p, struct pt_regs *regs)
  1826  {
  1827          struct kretprobe *rp = container_of(p, struct kretprobe, kp);
  1828          unsigned long hash, flags = 0;
  1829          struct kretprobe_instance *ri;
  1830  
  1831          /*
  1832           * To avoid deadlocks, prohibit return probing in NMI contexts,
  1833           * just skip the probe and increase the (inexact) 'nmissed'
  1834           * statistical counter, so that the user is informed that
  1835           * something happened:
  1836           */
  1837          if (unlikely(in_nmi())) {
  1838                  rp->nmissed++;
  1839                  return 0;
  1840          }
  1841  
  1842          /* TODO: consider to only swap the RA after the last 
pre_handler fired */
  1843          hash = hash_ptr(current, KPROBE_HASH_BITS);
  1844          raw_spin_lock_irqsave(&rp->lock, flags);
  1845          if (!hlist_empty(&rp->free_instances)) {
> 1846                  struct stack_trace trace = {};
  1847  
  1848                  ri = hlist_entry(rp->free_instances.first,
  1849                                  struct kretprobe_instance, hlist);
  1850                  hlist_del(&ri->hlist);
  1851                  raw_spin_unlock_irqrestore(&rp->lock, flags);
  1852  
  1853                  ri->rp = rp;
  1854                  ri->task = current;
  1855  
  1856                  trace.entries = &ri->entry.entries[0];
  1857                  trace.max_entries = KRETPROBE_TRACE_SIZE;
> 1858                  save_stack_trace_regs(regs, &trace);
  1859                  ri->entry.nr_entries = trace.nr_entries;
  1860  
  1861                  if (rp->entry_handler && rp->entry_handler(ri, regs)) {
  1862                          raw_spin_lock_irqsave(&rp->lock, flags);
  1863                          hlist_add_head(&ri->hlist, &rp->free_instances);
  1864                          raw_spin_unlock_irqrestore(&rp->lock, flags);
  1865                          return 0;
  1866                  }
  1867  
  1868                  arch_prepare_kretprobe(ri, regs);
  1869  
  1870                  /* XXX(hch): why is there no hlist_move_head? */
  1871                  INIT_HLIST_NODE(&ri->hlist);
  1872                  kretprobe_table_lock(hash, &flags);
  1873                  hlist_add_head(&ri->hlist, &kretprobe_inst_table[hash]);
  1874                  kretprobe_table_unlock(hash, &flags);
  1875          } else {
  1876                  rp->nmissed++;
  1877                  raw_spin_unlock_irqrestore(&rp->lock, flags);
  1878          }
  1879          return 0;
  1880  }
  1881  NOKPROBE_SYMBOL(pre_handler_kretprobe);
  1882  
  1883  /*
  1884   * Return the kretprobe_instance associated with the current_kprobe. 
Calling
  1885   * this is only reasonable from within a kretprobe handler context 
(otherwise
  1886   * return NULL).
  1887   *
  1888   * Must be called within a kretprobe_hash_lock(current, ...) context.
  1889   */
  1890  struct kretprobe_instance *current_kretprobe_instance(void)
  1891  {
  1892          struct kprobe *kp;
  1893          struct kretprobe *rp;
  1894          struct kretprobe_instance *ri;
  1895          struct hlist_head *head;
  1896          unsigned long hash = hash_ptr(current, KPROBE_HASH_BITS);
  1897  
  1898          kp = kprobe_running();
  1899          if (!kp || !kprobe_is_retprobe(kp))
  1900                  return NULL;
  1901          if (WARN_ON(!kretprobe_hash_is_locked(current)))
  1902                  return NULL;
  1903  
  1904          rp = container_of(kp, struct kretprobe, kp);
  1905          head = &kretprobe_inst_table[hash];
  1906  
  1907          hlist_for_each_entry(ri, head, hlist) {
  1908                  if (ri->task == current && ri->rp == rp)
  1909                          return ri;
  1910          }
  1911          return NULL;
  1912  }
  1913  EXPORT_SYMBOL_GPL(current_kretprobe_instance);
  1914  NOKPROBE_SYMBOL(current_kretprobe_instance);
  1915  
  1916  void kretprobe_save_stack_trace(struct kretprobe_instance *ri,
  1917                                  struct stack_trace *trace)
  1918  {
  1919          int i;
  1920          struct kretprobe_trace *krt = &ri->entry;
  1921  
> 1922          for (i = trace->skip; i < krt->nr_entries; i++) {
  1923                  if (trace->nr_entries >= trace->max_entries)
  1924                          break;
  1925                  trace->entries[trace->nr_entries++] = krt->entries[i];
  1926          }
  1927  }
  1928  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

Reply via email to