diff options
| -rw-r--r-- | lib/dma-debug.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index cdd205d6bf7c..c01f64780caf 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
| @@ -99,6 +99,15 @@ static struct dentry *show_num_errors_dent __read_mostly; | |||
| 99 | static struct dentry *num_free_entries_dent __read_mostly; | 99 | static struct dentry *num_free_entries_dent __read_mostly; |
| 100 | static struct dentry *min_free_entries_dent __read_mostly; | 100 | static struct dentry *min_free_entries_dent __read_mostly; |
| 101 | 101 | ||
| 102 | /* per-driver filter related state */ | ||
| 103 | |||
| 104 | #define NAME_MAX_LEN 64 | ||
| 105 | |||
| 106 | static char current_driver_name[NAME_MAX_LEN] __read_mostly; | ||
| 107 | static struct device_driver *current_driver __read_mostly; | ||
| 108 | |||
| 109 | static DEFINE_RWLOCK(driver_name_lock); | ||
| 110 | |||
| 102 | static const char *type2name[4] = { "single", "page", | 111 | static const char *type2name[4] = { "single", "page", |
| 103 | "scather-gather", "coherent" }; | 112 | "scather-gather", "coherent" }; |
| 104 | 113 | ||
| @@ -128,9 +137,47 @@ static inline void dump_entry_trace(struct dma_debug_entry *entry) | |||
| 128 | #endif | 137 | #endif |
| 129 | } | 138 | } |
| 130 | 139 | ||
| 140 | static bool driver_filter(struct device *dev) | ||
| 141 | { | ||
| 142 | /* driver filter off */ | ||
| 143 | if (likely(!current_driver_name[0])) | ||
| 144 | return true; | ||
| 145 | |||
| 146 | /* driver filter on and initialized */ | ||
| 147 | if (current_driver && dev->driver == current_driver) | ||
| 148 | return true; | ||
| 149 | |||
| 150 | /* driver filter on but not yet initialized */ | ||
| 151 | if (!current_driver && current_driver_name[0]) { | ||
| 152 | struct device_driver *drv = get_driver(dev->driver); | ||
| 153 | unsigned long flags; | ||
| 154 | bool ret = false; | ||
| 155 | |||
| 156 | if (!drv) | ||
| 157 | return false; | ||
| 158 | |||
| 159 | /* lock to protect against change of current_driver_name */ | ||
| 160 | read_lock_irqsave(&driver_name_lock, flags); | ||
| 161 | |||
| 162 | if (drv->name && | ||
| 163 | strncmp(current_driver_name, drv->name, 63) == 0) { | ||
| 164 | current_driver = drv; | ||
| 165 | ret = true; | ||
| 166 | } | ||
| 167 | |||
| 168 | read_unlock_irqrestore(&driver_name_lock, flags); | ||
| 169 | put_driver(drv); | ||
| 170 | |||
| 171 | return ret; | ||
| 172 | } | ||
| 173 | |||
| 174 | return false; | ||
| 175 | } | ||
| 176 | |||
| 131 | #define err_printk(dev, entry, format, arg...) do { \ | 177 | #define err_printk(dev, entry, format, arg...) do { \ |
| 132 | error_count += 1; \ | 178 | error_count += 1; \ |
| 133 | if (show_all_errors || show_num_errors > 0) { \ | 179 | if (driver_filter(dev) && \ |
| 180 | (show_all_errors || show_num_errors > 0)) { \ | ||
| 134 | WARN(1, "%s %s: " format, \ | 181 | WARN(1, "%s %s: " format, \ |
| 135 | dev_driver_string(dev), \ | 182 | dev_driver_string(dev), \ |
| 136 | dev_name(dev) , ## arg); \ | 183 | dev_name(dev) , ## arg); \ |
