aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-05-21 00:26:15 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-21 00:26:15 -0400
commit3aa2fc1667acdd9cca816a2bc9529f494bd61b05 (patch)
tree2379f33e47edacbc7a4bdf19607642d9c53caa11 /include
parent5af2344013454640e0133bb62e8cf2e30190a472 (diff)
parentc6e360a0d9d282e9c8688dcdabdc3669912b66ef (diff)
Merge tag 'driver-core-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core
Pull driver core updates from Greg KH: "Here's the "big" driver core update for 4.7-rc1. Mostly just debugfs changes, the long-known and messy races with removing debugfs files should be fixed thanks to the great work of Nicolai Stange. We also have some isa updates in here (the x86 maintainers told me to take it through this tree), a new warning when we run out of dynamic char major numbers, and a few other assorted changes, details in the shortlog. All have been in linux-next for some time with no reported issues" * tag 'driver-core-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (32 commits) Revert "base: dd: don't remove driver_data in -EPROBE_DEFER case" gpio: ws16c48: Utilize the ISA bus driver gpio: 104-idio-16: Utilize the ISA bus driver gpio: 104-idi-48: Utilize the ISA bus driver gpio: 104-dio-48e: Utilize the ISA bus driver watchdog: ebc-c384_wdt: Utilize the ISA bus driver iio: stx104: Utilize the module_isa_driver and max_num_isa_dev macros iio: stx104: Add X86 dependency to STX104 Kconfig option Documentation: Add ISA bus driver documentation isa: Implement the max_num_isa_dev macro isa: Implement the module_isa_driver macro pnp: pnpbios: Add explicit X86_32 dependency to PNPBIOS isa: Decouple X86_32 dependency from the ISA Kconfig option driver-core: use 'dev' argument in dev_dbg_ratelimited stub base: dd: don't remove driver_data in -EPROBE_DEFER case kernfs: Move faulting copy_user operations outside of the mutex devcoredump: add scatterlist support debugfs: unproxify files created through debugfs_create_u32_array() debugfs: unproxify files created through debugfs_create_blob() debugfs: unproxify files created through debugfs_create_bool() ...
Diffstat (limited to 'include')
-rw-r--r--include/linux/debugfs.h49
-rw-r--r--include/linux/devcoredump.h86
-rw-r--r--include/linux/device.h7
-rw-r--r--include/linux/fs.h2
-rw-r--r--include/linux/isa.h32
-rw-r--r--include/linux/kernfs.h1
6 files changed, 164 insertions, 13 deletions
diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h
index 981e53ab84e8..1438e2322d5c 100644
--- a/include/linux/debugfs.h
+++ b/include/linux/debugfs.h
@@ -19,9 +19,11 @@
19#include <linux/seq_file.h> 19#include <linux/seq_file.h>
20 20
21#include <linux/types.h> 21#include <linux/types.h>
22#include <linux/compiler.h>
22 23
23struct device; 24struct device;
24struct file_operations; 25struct file_operations;
26struct srcu_struct;
25 27
26struct debugfs_blob_wrapper { 28struct debugfs_blob_wrapper {
27 void *data; 29 void *data;
@@ -41,14 +43,16 @@ struct debugfs_regset32 {
41 43
42extern struct dentry *arch_debugfs_dir; 44extern struct dentry *arch_debugfs_dir;
43 45
44#if defined(CONFIG_DEBUG_FS) 46extern struct srcu_struct debugfs_srcu;
45 47
46/* declared over in file.c */ 48#if defined(CONFIG_DEBUG_FS)
47extern const struct file_operations debugfs_file_operations;
48 49
49struct dentry *debugfs_create_file(const char *name, umode_t mode, 50struct dentry *debugfs_create_file(const char *name, umode_t mode,
50 struct dentry *parent, void *data, 51 struct dentry *parent, void *data,
51 const struct file_operations *fops); 52 const struct file_operations *fops);
53struct dentry *debugfs_create_file_unsafe(const char *name, umode_t mode,
54 struct dentry *parent, void *data,
55 const struct file_operations *fops);
52 56
53struct dentry *debugfs_create_file_size(const char *name, umode_t mode, 57struct dentry *debugfs_create_file_size(const char *name, umode_t mode,
54 struct dentry *parent, void *data, 58 struct dentry *parent, void *data,
@@ -68,6 +72,31 @@ struct dentry *debugfs_create_automount(const char *name,
68void debugfs_remove(struct dentry *dentry); 72void debugfs_remove(struct dentry *dentry);
69void debugfs_remove_recursive(struct dentry *dentry); 73void debugfs_remove_recursive(struct dentry *dentry);
70 74
75int debugfs_use_file_start(const struct dentry *dentry, int *srcu_idx)
76 __acquires(&debugfs_srcu);
77
78void debugfs_use_file_finish(int srcu_idx) __releases(&debugfs_srcu);
79
80ssize_t debugfs_attr_read(struct file *file, char __user *buf,
81 size_t len, loff_t *ppos);
82ssize_t debugfs_attr_write(struct file *file, const char __user *buf,
83 size_t len, loff_t *ppos);
84
85#define DEFINE_DEBUGFS_ATTRIBUTE(__fops, __get, __set, __fmt) \
86static int __fops ## _open(struct inode *inode, struct file *file) \
87{ \
88 __simple_attr_check_format(__fmt, 0ull); \
89 return simple_attr_open(inode, file, __get, __set, __fmt); \
90} \
91static const struct file_operations __fops = { \
92 .owner = THIS_MODULE, \
93 .open = __fops ## _open, \
94 .release = simple_attr_release, \
95 .read = debugfs_attr_read, \
96 .write = debugfs_attr_write, \
97 .llseek = generic_file_llseek, \
98}
99
71struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry, 100struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
72 struct dentry *new_dir, const char *new_name); 101 struct dentry *new_dir, const char *new_name);
73 102
@@ -176,6 +205,20 @@ static inline void debugfs_remove(struct dentry *dentry)
176static inline void debugfs_remove_recursive(struct dentry *dentry) 205static inline void debugfs_remove_recursive(struct dentry *dentry)
177{ } 206{ }
178 207
208static inline int debugfs_use_file_start(const struct dentry *dentry,
209 int *srcu_idx)
210 __acquires(&debugfs_srcu)
211{
212 return 0;
213}
214
215static inline void debugfs_use_file_finish(int srcu_idx)
216 __releases(&debugfs_srcu)
217{ }
218
219#define DEFINE_DEBUGFS_ATTRIBUTE(__fops, __get, __set, __fmt) \
220 static const struct file_operations __fops = { 0 }
221
179static inline struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry, 222static inline struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
180 struct dentry *new_dir, char *new_name) 223 struct dentry *new_dir, char *new_name)
181{ 224{
diff --git a/include/linux/devcoredump.h b/include/linux/devcoredump.h
index c0a360e99f64..269521f143ac 100644
--- a/include/linux/devcoredump.h
+++ b/include/linux/devcoredump.h
@@ -1,3 +1,22 @@
1/*
2 * This file is provided under the GPLv2 license.
3 *
4 * GPL LICENSE SUMMARY
5 *
6 * Copyright(c) 2015 Intel Deutschland GmbH
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of version 2 of the GNU General Public License as
10 * published by the Free Software Foundation.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * The full GNU General Public License is included in this distribution
18 * in the file called COPYING.
19 */
1#ifndef __DEVCOREDUMP_H 20#ifndef __DEVCOREDUMP_H
2#define __DEVCOREDUMP_H 21#define __DEVCOREDUMP_H
3 22
@@ -5,17 +24,62 @@
5#include <linux/module.h> 24#include <linux/module.h>
6#include <linux/vmalloc.h> 25#include <linux/vmalloc.h>
7 26
27#include <linux/scatterlist.h>
28#include <linux/slab.h>
29
30/*
31 * _devcd_free_sgtable - free all the memory of the given scatterlist table
32 * (i.e. both pages and scatterlist instances)
33 * NOTE: if two tables allocated and chained using the sg_chain function then
34 * this function should be called only once on the first table
35 * @table: pointer to sg_table to free
36 */
37static inline void _devcd_free_sgtable(struct scatterlist *table)
38{
39 int i;
40 struct page *page;
41 struct scatterlist *iter;
42 struct scatterlist *delete_iter;
43
44 /* free pages */
45 iter = table;
46 for_each_sg(table, iter, sg_nents(table), i) {
47 page = sg_page(iter);
48 if (page)
49 __free_page(page);
50 }
51
52 /* then free all chained tables */
53 iter = table;
54 delete_iter = table; /* always points on a head of a table */
55 while (!sg_is_last(iter)) {
56 iter++;
57 if (sg_is_chain(iter)) {
58 iter = sg_chain_ptr(iter);
59 kfree(delete_iter);
60 delete_iter = iter;
61 }
62 }
63
64 /* free the last table */
65 kfree(delete_iter);
66}
67
68
8#ifdef CONFIG_DEV_COREDUMP 69#ifdef CONFIG_DEV_COREDUMP
9void dev_coredumpv(struct device *dev, const void *data, size_t datalen, 70void dev_coredumpv(struct device *dev, void *data, size_t datalen,
10 gfp_t gfp); 71 gfp_t gfp);
11 72
12void dev_coredumpm(struct device *dev, struct module *owner, 73void dev_coredumpm(struct device *dev, struct module *owner,
13 const void *data, size_t datalen, gfp_t gfp, 74 void *data, size_t datalen, gfp_t gfp,
14 ssize_t (*read)(char *buffer, loff_t offset, size_t count, 75 ssize_t (*read)(char *buffer, loff_t offset, size_t count,
15 const void *data, size_t datalen), 76 void *data, size_t datalen),
16 void (*free)(const void *data)); 77 void (*free)(void *data));
78
79void dev_coredumpsg(struct device *dev, struct scatterlist *table,
80 size_t datalen, gfp_t gfp);
17#else 81#else
18static inline void dev_coredumpv(struct device *dev, const void *data, 82static inline void dev_coredumpv(struct device *dev, void *data,
19 size_t datalen, gfp_t gfp) 83 size_t datalen, gfp_t gfp)
20{ 84{
21 vfree(data); 85 vfree(data);
@@ -23,13 +87,19 @@ static inline void dev_coredumpv(struct device *dev, const void *data,
23 87
24static inline void 88static inline void
25dev_coredumpm(struct device *dev, struct module *owner, 89dev_coredumpm(struct device *dev, struct module *owner,
26 const void *data, size_t datalen, gfp_t gfp, 90 void *data, size_t datalen, gfp_t gfp,
27 ssize_t (*read)(char *buffer, loff_t offset, size_t count, 91 ssize_t (*read)(char *buffer, loff_t offset, size_t count,
28 const void *data, size_t datalen), 92 void *data, size_t datalen),
29 void (*free)(const void *data)) 93 void (*free)(void *data))
30{ 94{
31 free(data); 95 free(data);
32} 96}
97
98static inline void dev_coredumpsg(struct device *dev, struct scatterlist *table,
99 size_t datalen, gfp_t gfp)
100{
101 _devcd_free_sgtable(table);
102}
33#endif /* CONFIG_DEV_COREDUMP */ 103#endif /* CONFIG_DEV_COREDUMP */
34 104
35#endif /* __DEVCOREDUMP_H */ 105#endif /* __DEVCOREDUMP_H */
diff --git a/include/linux/device.h b/include/linux/device.h
index ca90ad8bcd61..38f02814d53a 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -1288,8 +1288,11 @@ do { \
1288 dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \ 1288 dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \
1289} while (0) 1289} while (0)
1290#else 1290#else
1291#define dev_dbg_ratelimited(dev, fmt, ...) \ 1291#define dev_dbg_ratelimited(dev, fmt, ...) \
1292 no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) 1292do { \
1293 if (0) \
1294 dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); \
1295} while (0)
1293#endif 1296#endif
1294 1297
1295#ifdef VERBOSE_DEBUG 1298#ifdef VERBOSE_DEBUG
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 10d3d8f8a65b..b8b3c72c2aae 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2427,6 +2427,8 @@ static inline void bd_unlink_disk_holder(struct block_device *bdev,
2427 2427
2428/* fs/char_dev.c */ 2428/* fs/char_dev.c */
2429#define CHRDEV_MAJOR_HASH_SIZE 255 2429#define CHRDEV_MAJOR_HASH_SIZE 255
2430/* Marks the bottom of the first segment of free char majors */
2431#define CHRDEV_MAJOR_DYN_END 234
2430extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *); 2432extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);
2431extern int register_chrdev_region(dev_t, unsigned, const char *); 2433extern int register_chrdev_region(dev_t, unsigned, const char *);
2432extern int __register_chrdev(unsigned int major, unsigned int baseminor, 2434extern int __register_chrdev(unsigned int major, unsigned int baseminor,
diff --git a/include/linux/isa.h b/include/linux/isa.h
index b0270e3814c8..5ab85281230b 100644
--- a/include/linux/isa.h
+++ b/include/linux/isa.h
@@ -36,4 +36,36 @@ static inline void isa_unregister_driver(struct isa_driver *d)
36} 36}
37#endif 37#endif
38 38
39/**
40 * module_isa_driver() - Helper macro for registering a ISA driver
41 * @__isa_driver: isa_driver struct
42 * @__num_isa_dev: number of devices to register
43 *
44 * Helper macro for ISA drivers which do not do anything special in module
45 * init/exit. This eliminates a lot of boilerplate code. Each module may only
46 * use this macro once, and calling it replaces module_init and module_exit.
47 */
48#define module_isa_driver(__isa_driver, __num_isa_dev) \
49static int __init __isa_driver##_init(void) \
50{ \
51 return isa_register_driver(&(__isa_driver), __num_isa_dev); \
52} \
53module_init(__isa_driver##_init); \
54static void __exit __isa_driver##_exit(void) \
55{ \
56 isa_unregister_driver(&(__isa_driver)); \
57} \
58module_exit(__isa_driver##_exit);
59
60/**
61 * max_num_isa_dev() - Maximum possible number registered of an ISA device
62 * @__ida_dev_ext: ISA device address extent
63 *
64 * The highest base address possible for an ISA device is 0x3FF; this results in
65 * 1024 possible base addresses. Dividing the number of possible base addresses
66 * by the address extent taken by each device results in the maximum number of
67 * devices on a system.
68 */
69#define max_num_isa_dev(__isa_dev_ext) (1024 / __isa_dev_ext)
70
39#endif /* __LINUX_ISA_H */ 71#endif /* __LINUX_ISA_H */
diff --git a/include/linux/kernfs.h b/include/linux/kernfs.h
index 30f089ebe0a4..96356ef012de 100644
--- a/include/linux/kernfs.h
+++ b/include/linux/kernfs.h
@@ -179,6 +179,7 @@ struct kernfs_open_file {
179 179
180 /* private fields, do not use outside kernfs proper */ 180 /* private fields, do not use outside kernfs proper */
181 struct mutex mutex; 181 struct mutex mutex;
182 struct mutex prealloc_mutex;
182 int event; 183 int event;
183 struct list_head list; 184 struct list_head list;
184 char *prealloc_buf; 185 char *prealloc_buf;