printing_debugging

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
printing_debugging [2018/09/25 12:59] – [drivers/base/core.c] rpjdayprinting_debugging [2018/09/25 13:27] (current) – [__netdev_printk()] rpjday
Line 214: Line 214:
 </code> </code>
  
-===== netdev debugging =====+===== netdev debugging (net/core/dev.c) ===== 
 + 
 +==== Defining macros ==== 
 + 
 +<code> 
 +#define define_netdev_printk_level(func, level)                 \ 
 +void func(const struct net_device *dev, const char *fmt, ...)   \ 
 +{                                                               \ 
 +        struct va_format vaf;                                   \ 
 +        va_list args;                                           \ 
 +                                                                \ 
 +        va_start(args, fmt);                                    \ 
 +                                                                \ 
 +        vaf.fmt = fmt;                                          \ 
 +        vaf.va = &args;                                         \ 
 +                                                                \ 
 +        __netdev_printk(level, dev, &vaf);                      \ 
 +                                                                \ 
 +        va_end(args);                                           \ 
 +}                                                               \ 
 +EXPORT_SYMBOL(func); 
 + 
 +define_netdev_printk_level(netdev_emerg, KERN_EMERG); 
 +define_netdev_printk_level(netdev_alert, KERN_ALERT); 
 +define_netdev_printk_level(netdev_crit, KERN_CRIT); 
 +define_netdev_printk_level(netdev_err, KERN_ERR); 
 +define_netdev_printk_level(netdev_warn, KERN_WARNING); 
 +define_netdev_printk_level(netdev_notice, KERN_NOTICE); 
 +define_netdev_printk_level(netdev_info, KERN_INFO); 
 +</code> 
 + 
 +==== Alternate way of calling __netdev_printk() ==== 
 + 
 +<code> 
 +void netdev_printk(const char *level, const struct net_device *dev, 
 +                   const char *format, ...) 
 +
 +        struct va_format vaf; 
 +        va_list args; 
 + 
 +        va_start(args, format); 
 + 
 +        vaf.fmt = format; 
 +        vaf.va = &args; 
 + 
 +        __netdev_printk(level, dev, &vaf); 
 + 
 +        va_end(args); 
 +
 +EXPORT_SYMBOL(netdev_printk); 
 +</code> 
 + 
 +==== __netdev_printk() ==== 
 + 
 +<code> 
 +static void __netdev_printk(const char *level, const struct net_device *dev, 
 +                            struct va_format *vaf) 
 +
 +        if (dev && dev->dev.parent) { 
 +                dev_printk_emit(level[1] - '0', 
 +                                dev->dev.parent, 
 +                                "%s %s %s%s: %pV", 
 +                                dev_driver_string(dev->dev.parent), 
 +                                dev_name(dev->dev.parent), 
 +                                netdev_name(dev), netdev_reg_state(dev), 
 +                                vaf); 
 +        } else if (dev) { 
 +                printk("%s%s%s: %pV", 
 +                       level, netdev_name(dev), netdev_reg_state(dev), vaf); 
 +        } else { 
 +                printk("%s(NULL net_device): %pV", level, vaf); 
 +        } 
 +
 +</code> 
 + 
 +===== Dynamic debugging ===== 
 + 
 +... coming ...
  • printing_debugging.1537880342.txt.gz
  • Last modified: 2018/09/25 12:59
  • by rpjday