Commit 60fbf2bda140f27b0e9ab5b6d17342c9a5f9eacf
Exists in
master
and in
13 other branches
Merge tag 'driver-core-3.15-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core
Pull driver core fixes from Greg KH: "Here are some driver core fixes for 3.15-rc2. Also in here are some documentation updates, as well as an API removal that had to wait for after -rc1 due to the cleanups coming into you from multiple developer trees (this one and the PPC tree.) All have been in linux next successfully" * tag 'driver-core-3.15-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: drivers/base/dd.c incorrect pr_debug() parameters Documentation: Update stable address in Chinese and Japanese translations topology: Fix compilation warning when not in SMP Chinese: add translation of io_ordering.txt stable_kernel_rules: spelling/word usage sysfs, driver-core: remove unused {sysfs|device}_schedule_callback_owner() kernfs: protect lazy kernfs_iattrs allocation with mutex fs: Don't return 0 from get_anon_bdev
Showing 14 changed files Side-by-side Diff
- Documentation/ja_JP/HOWTO
- Documentation/ja_JP/stable_kernel_rules.txt
- Documentation/stable_kernel_rules.txt
- Documentation/zh_CN/HOWTO
- Documentation/zh_CN/io_ordering.txt
- Documentation/zh_CN/stable_kernel_rules.txt
- drivers/base/core.c
- drivers/base/dd.c
- drivers/base/topology.c
- fs/kernfs/inode.c
- fs/super.c
- fs/sysfs/file.c
- include/linux/device.h
- include/linux/sysfs.h
Documentation/ja_JP/HOWTO
... | ... | @@ -315,7 +315,7 @@ |
315 | 315 | もし、3.x.y カーネルが存在しない場合には、番号が一番大きい 3.x が |
316 | 316 | 最新の安定版カーネルです。 |
317 | 317 | |
318 | -3.x.y は "stable" チーム <stable@kernel.org> でメンテされており、必 | |
318 | +3.x.y は "stable" チーム <stable@vger.kernel.org> でメンテされており、必 | |
319 | 319 | 要に応じてリリースされます。通常のリリース期間は 2週間毎ですが、差し迫っ |
320 | 320 | た問題がなければもう少し長くなることもあります。セキュリティ関連の問題 |
321 | 321 | の場合はこれに対してだいたいの場合、すぐにリリースがされます。 |
Documentation/ja_JP/stable_kernel_rules.txt
... | ... | @@ -50,16 +50,16 @@ |
50 | 50 | |
51 | 51 | -stable ツリーにパッチを送付する手続き- |
52 | 52 | |
53 | - - 上記の規則に従っているかを確認した後に、stable@kernel.org にパッチ | |
53 | + - 上記の規則に従っているかを確認した後に、stable@vger.kernel.org にパッチ | |
54 | 54 | を送る。 |
55 | 55 | - 送信者はパッチがキューに受け付けられた際には ACK を、却下された場合 |
56 | 56 | には NAK を受け取る。この反応は開発者たちのスケジュールによって、数 |
57 | 57 | 日かかる場合がある。 |
58 | 58 | - もし受け取られたら、パッチは他の開発者たちと関連するサブシステムの |
59 | 59 | メンテナーによるレビューのために -stable キューに追加される。 |
60 | - - パッチに stable@kernel.org のアドレスが付加されているときには、それ | |
60 | + - パッチに stable@vger.kernel.org のアドレスが付加されているときには、それ | |
61 | 61 | が Linus のツリーに入る時に自動的に stable チームに email される。 |
62 | - - セキュリティパッチはこのエイリアス (stable@kernel.org) に送られるべ | |
62 | + - セキュリティパッチはこのエイリアス (stable@vger.kernel.org) に送られるべ | |
63 | 63 | きではなく、代わりに security@kernel.org のアドレスに送られる。 |
64 | 64 | |
65 | 65 | レビューサイクル- |
Documentation/stable_kernel_rules.txt
... | ... | @@ -39,7 +39,7 @@ |
39 | 39 | the stable tree without anything else needing to be done by the author |
40 | 40 | or subsystem maintainer. |
41 | 41 | - If the patch requires other patches as prerequisites which can be |
42 | - cherry-picked than this can be specified in the following format in | |
42 | + cherry-picked, then this can be specified in the following format in | |
43 | 43 | the sign-off area: |
44 | 44 | |
45 | 45 | Cc: <stable@vger.kernel.org> # 3.3.x: a1f84a3: sched: Check for idle |
Documentation/zh_CN/HOWTO
... | ... | @@ -237,7 +237,7 @@ |
237 | 237 | 如果没有2.6.x.y版本内核存在,那么最新的2.6.x版本内核就相当于是当前的稳定 |
238 | 238 | 版内核。 |
239 | 239 | |
240 | -2.6.x.y版本由“稳定版”小组(邮件地址<stable@kernel.org>)维护,一般隔周发 | |
240 | +2.6.x.y版本由“稳定版”小组(邮件地址<stable@vger.kernel.org>)维护,一般隔周发 | |
241 | 241 | 布新版本。 |
242 | 242 | |
243 | 243 | 内核源码中的Documentation/stable_kernel_rules.txt文件具体描述了可被稳定 |
Documentation/zh_CN/io_ordering.txt
1 | +Chinese translated version of Documentation/io_orderings.txt | |
2 | + | |
3 | +If you have any comment or update to the content, please contact the | |
4 | +original document maintainer directly. However, if you have a problem | |
5 | +communicating in English you can also ask the Chinese maintainer for | |
6 | +help. Contact the Chinese maintainer if this translation is outdated | |
7 | +or if there is a problem with the translation. | |
8 | + | |
9 | +Chinese maintainer: Lin Yongting <linyongting@gmail.com> | |
10 | +--------------------------------------------------------------------- | |
11 | +Documentation/io_ordering.txt 的中文翻译 | |
12 | + | |
13 | +如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文 | |
14 | +交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻 | |
15 | +译存在问题,请联系中文版维护者。 | |
16 | + | |
17 | +中文版维护者: 林永听 Lin Yongting <linyongting@gmail.com> | |
18 | +中文版翻译者: 林永听 Lin Yongting <linyongting@gmail.com> | |
19 | +中文版校译者: 林永听 Lin Yongting <linyongting@gmail.com> | |
20 | + | |
21 | + | |
22 | +以下为正文 | |
23 | +--------------------------------------------------------------------- | |
24 | + | |
25 | +在某些平台上,所谓的内存映射I/O是弱顺序。在这些平台上,驱动开发者有责任 | |
26 | +保证I/O内存映射地址的写操作按程序图意的顺序达到设备。通常读取一个“安全” | |
27 | +设备寄存器或桥寄存器,触发IO芯片清刷未处理的写操作到达设备后才处理读操作, | |
28 | +而达到保证目的。驱动程序通常在spinlock保护的临界区退出之前使用这种技术。 | |
29 | +这也可以保证后面的写操作只在前面的写操作之后到达设备(这非常类似于内存 | |
30 | +屏障操作,mb(),不过仅适用于I/O)。 | |
31 | + | |
32 | +假设一个设备驱动程的具体例子: | |
33 | + | |
34 | + ... | |
35 | +CPU A: spin_lock_irqsave(&dev_lock, flags) | |
36 | +CPU A: val = readl(my_status); | |
37 | +CPU A: ... | |
38 | +CPU A: writel(newval, ring_ptr); | |
39 | +CPU A: spin_unlock_irqrestore(&dev_lock, flags) | |
40 | + ... | |
41 | +CPU B: spin_lock_irqsave(&dev_lock, flags) | |
42 | +CPU B: val = readl(my_status); | |
43 | +CPU B: ... | |
44 | +CPU B: writel(newval2, ring_ptr); | |
45 | +CPU B: spin_unlock_irqrestore(&dev_lock, flags) | |
46 | + ... | |
47 | + | |
48 | +上述例子中,设备可能会先接收到newval2的值,然后接收到newval的值,问题就 | |
49 | +发生了。不过很容易通过下面方法来修复: | |
50 | + | |
51 | + ... | |
52 | +CPU A: spin_lock_irqsave(&dev_lock, flags) | |
53 | +CPU A: val = readl(my_status); | |
54 | +CPU A: ... | |
55 | +CPU A: writel(newval, ring_ptr); | |
56 | +CPU A: (void)readl(safe_register); /* 配置寄存器?*/ | |
57 | +CPU A: spin_unlock_irqrestore(&dev_lock, flags) | |
58 | + ... | |
59 | +CPU B: spin_lock_irqsave(&dev_lock, flags) | |
60 | +CPU B: val = readl(my_status); | |
61 | +CPU B: ... | |
62 | +CPU B: writel(newval2, ring_ptr); | |
63 | +CPU B: (void)readl(safe_register); /* 配置寄存器?*/ | |
64 | +CPU B: spin_unlock_irqrestore(&dev_lock, flags) | |
65 | + | |
66 | +在解决方案中,读取safe_register寄存器,触发IO芯片清刷未处理的写操作, | |
67 | +再处理后面的读操作,防止引发数据不一致问题。 |
Documentation/zh_CN/stable_kernel_rules.txt
drivers/base/core.c
... | ... | @@ -614,39 +614,6 @@ |
614 | 614 | } |
615 | 615 | EXPORT_SYMBOL_GPL(device_remove_bin_file); |
616 | 616 | |
617 | -/** | |
618 | - * device_schedule_callback_owner - helper to schedule a callback for a device | |
619 | - * @dev: device. | |
620 | - * @func: callback function to invoke later. | |
621 | - * @owner: module owning the callback routine | |
622 | - * | |
623 | - * Attribute methods must not unregister themselves or their parent device | |
624 | - * (which would amount to the same thing). Attempts to do so will deadlock, | |
625 | - * since unregistration is mutually exclusive with driver callbacks. | |
626 | - * | |
627 | - * Instead methods can call this routine, which will attempt to allocate | |
628 | - * and schedule a workqueue request to call back @func with @dev as its | |
629 | - * argument in the workqueue's process context. @dev will be pinned until | |
630 | - * @func returns. | |
631 | - * | |
632 | - * This routine is usually called via the inline device_schedule_callback(), | |
633 | - * which automatically sets @owner to THIS_MODULE. | |
634 | - * | |
635 | - * Returns 0 if the request was submitted, -ENOMEM if storage could not | |
636 | - * be allocated, -ENODEV if a reference to @owner isn't available. | |
637 | - * | |
638 | - * NOTE: This routine won't work if CONFIG_SYSFS isn't set! It uses an | |
639 | - * underlying sysfs routine (since it is intended for use by attribute | |
640 | - * methods), and if sysfs isn't available you'll get nothing but -ENOSYS. | |
641 | - */ | |
642 | -int device_schedule_callback_owner(struct device *dev, | |
643 | - void (*func)(struct device *), struct module *owner) | |
644 | -{ | |
645 | - return sysfs_schedule_callback(&dev->kobj, | |
646 | - (void (*)(void *)) func, dev, owner); | |
647 | -} | |
648 | -EXPORT_SYMBOL_GPL(device_schedule_callback_owner); | |
649 | - | |
650 | 617 | static void klist_children_get(struct klist_node *n) |
651 | 618 | { |
652 | 619 | struct device_private *p = to_device_private_parent(n); |
drivers/base/dd.c
... | ... | @@ -187,8 +187,8 @@ |
187 | 187 | return; |
188 | 188 | } |
189 | 189 | |
190 | - pr_debug("driver: '%s': %s: bound to device '%s'\n", dev_name(dev), | |
191 | - __func__, dev->driver->name); | |
190 | + pr_debug("driver: '%s': %s: bound to device '%s'\n", dev->driver->name, | |
191 | + __func__, dev_name(dev)); | |
192 | 192 | |
193 | 193 | klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices); |
194 | 194 |
drivers/base/topology.c
... | ... | @@ -39,8 +39,7 @@ |
39 | 39 | static ssize_t show_##name(struct device *dev, \ |
40 | 40 | struct device_attribute *attr, char *buf) \ |
41 | 41 | { \ |
42 | - unsigned int cpu = dev->id; \ | |
43 | - return sprintf(buf, "%d\n", topology_##name(cpu)); \ | |
42 | + return sprintf(buf, "%d\n", topology_##name(dev->id)); \ | |
44 | 43 | } |
45 | 44 | |
46 | 45 | #if defined(topology_thread_cpumask) || defined(topology_core_cpumask) || \ |
fs/kernfs/inode.c
... | ... | @@ -48,14 +48,18 @@ |
48 | 48 | |
49 | 49 | static struct kernfs_iattrs *kernfs_iattrs(struct kernfs_node *kn) |
50 | 50 | { |
51 | + static DEFINE_MUTEX(iattr_mutex); | |
52 | + struct kernfs_iattrs *ret; | |
51 | 53 | struct iattr *iattrs; |
52 | 54 | |
55 | + mutex_lock(&iattr_mutex); | |
56 | + | |
53 | 57 | if (kn->iattr) |
54 | - return kn->iattr; | |
58 | + goto out_unlock; | |
55 | 59 | |
56 | 60 | kn->iattr = kzalloc(sizeof(struct kernfs_iattrs), GFP_KERNEL); |
57 | 61 | if (!kn->iattr) |
58 | - return NULL; | |
62 | + goto out_unlock; | |
59 | 63 | iattrs = &kn->iattr->ia_iattr; |
60 | 64 | |
61 | 65 | /* assign default attributes */ |
... | ... | @@ -65,8 +69,10 @@ |
65 | 69 | iattrs->ia_atime = iattrs->ia_mtime = iattrs->ia_ctime = CURRENT_TIME; |
66 | 70 | |
67 | 71 | simple_xattrs_init(&kn->iattr->xattrs); |
68 | - | |
69 | - return kn->iattr; | |
72 | +out_unlock: | |
73 | + ret = kn->iattr; | |
74 | + mutex_unlock(&iattr_mutex); | |
75 | + return ret; | |
70 | 76 | } |
71 | 77 | |
72 | 78 | static int __kernfs_setattr(struct kernfs_node *kn, const struct iattr *iattr) |
fs/super.c
... | ... | @@ -800,7 +800,10 @@ |
800 | 800 | |
801 | 801 | static DEFINE_IDA(unnamed_dev_ida); |
802 | 802 | static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */ |
803 | -static int unnamed_dev_start = 0; /* don't bother trying below it */ | |
803 | +/* Many userspace utilities consider an FSID of 0 invalid. | |
804 | + * Always return at least 1 from get_anon_bdev. | |
805 | + */ | |
806 | +static int unnamed_dev_start = 1; | |
804 | 807 | |
805 | 808 | int get_anon_bdev(dev_t *p) |
806 | 809 | { |
fs/sysfs/file.c
... | ... | @@ -453,96 +453,4 @@ |
453 | 453 | kernfs_remove_by_name(kobj->sd, attr->attr.name); |
454 | 454 | } |
455 | 455 | EXPORT_SYMBOL_GPL(sysfs_remove_bin_file); |
456 | - | |
457 | -struct sysfs_schedule_callback_struct { | |
458 | - struct list_head workq_list; | |
459 | - struct kobject *kobj; | |
460 | - void (*func)(void *); | |
461 | - void *data; | |
462 | - struct module *owner; | |
463 | - struct work_struct work; | |
464 | -}; | |
465 | - | |
466 | -static struct workqueue_struct *sysfs_workqueue; | |
467 | -static DEFINE_MUTEX(sysfs_workq_mutex); | |
468 | -static LIST_HEAD(sysfs_workq); | |
469 | -static void sysfs_schedule_callback_work(struct work_struct *work) | |
470 | -{ | |
471 | - struct sysfs_schedule_callback_struct *ss = container_of(work, | |
472 | - struct sysfs_schedule_callback_struct, work); | |
473 | - | |
474 | - (ss->func)(ss->data); | |
475 | - kobject_put(ss->kobj); | |
476 | - module_put(ss->owner); | |
477 | - mutex_lock(&sysfs_workq_mutex); | |
478 | - list_del(&ss->workq_list); | |
479 | - mutex_unlock(&sysfs_workq_mutex); | |
480 | - kfree(ss); | |
481 | -} | |
482 | - | |
483 | -/** | |
484 | - * sysfs_schedule_callback - helper to schedule a callback for a kobject | |
485 | - * @kobj: object we're acting for. | |
486 | - * @func: callback function to invoke later. | |
487 | - * @data: argument to pass to @func. | |
488 | - * @owner: module owning the callback code | |
489 | - * | |
490 | - * sysfs attribute methods must not unregister themselves or their parent | |
491 | - * kobject (which would amount to the same thing). Attempts to do so will | |
492 | - * deadlock, since unregistration is mutually exclusive with driver | |
493 | - * callbacks. | |
494 | - * | |
495 | - * Instead methods can call this routine, which will attempt to allocate | |
496 | - * and schedule a workqueue request to call back @func with @data as its | |
497 | - * argument in the workqueue's process context. @kobj will be pinned | |
498 | - * until @func returns. | |
499 | - * | |
500 | - * Returns 0 if the request was submitted, -ENOMEM if storage could not | |
501 | - * be allocated, -ENODEV if a reference to @owner isn't available, | |
502 | - * -EAGAIN if a callback has already been scheduled for @kobj. | |
503 | - */ | |
504 | -int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *), | |
505 | - void *data, struct module *owner) | |
506 | -{ | |
507 | - struct sysfs_schedule_callback_struct *ss, *tmp; | |
508 | - | |
509 | - if (!try_module_get(owner)) | |
510 | - return -ENODEV; | |
511 | - | |
512 | - mutex_lock(&sysfs_workq_mutex); | |
513 | - list_for_each_entry_safe(ss, tmp, &sysfs_workq, workq_list) | |
514 | - if (ss->kobj == kobj) { | |
515 | - module_put(owner); | |
516 | - mutex_unlock(&sysfs_workq_mutex); | |
517 | - return -EAGAIN; | |
518 | - } | |
519 | - mutex_unlock(&sysfs_workq_mutex); | |
520 | - | |
521 | - if (sysfs_workqueue == NULL) { | |
522 | - sysfs_workqueue = create_singlethread_workqueue("sysfsd"); | |
523 | - if (sysfs_workqueue == NULL) { | |
524 | - module_put(owner); | |
525 | - return -ENOMEM; | |
526 | - } | |
527 | - } | |
528 | - | |
529 | - ss = kmalloc(sizeof(*ss), GFP_KERNEL); | |
530 | - if (!ss) { | |
531 | - module_put(owner); | |
532 | - return -ENOMEM; | |
533 | - } | |
534 | - kobject_get(kobj); | |
535 | - ss->kobj = kobj; | |
536 | - ss->func = func; | |
537 | - ss->data = data; | |
538 | - ss->owner = owner; | |
539 | - INIT_WORK(&ss->work, sysfs_schedule_callback_work); | |
540 | - INIT_LIST_HEAD(&ss->workq_list); | |
541 | - mutex_lock(&sysfs_workq_mutex); | |
542 | - list_add_tail(&ss->workq_list, &sysfs_workq); | |
543 | - mutex_unlock(&sysfs_workq_mutex); | |
544 | - queue_work(sysfs_workqueue, &ss->work); | |
545 | - return 0; | |
546 | -} | |
547 | -EXPORT_SYMBOL_GPL(sysfs_schedule_callback); |
include/linux/device.h
... | ... | @@ -566,13 +566,7 @@ |
566 | 566 | const struct bin_attribute *attr); |
567 | 567 | extern void device_remove_bin_file(struct device *dev, |
568 | 568 | const struct bin_attribute *attr); |
569 | -extern int device_schedule_callback_owner(struct device *dev, | |
570 | - void (*func)(struct device *dev), struct module *owner); | |
571 | 569 | |
572 | -/* This is a macro to avoid include problems with THIS_MODULE */ | |
573 | -#define device_schedule_callback(dev, func) \ | |
574 | - device_schedule_callback_owner(dev, func, THIS_MODULE) | |
575 | - | |
576 | 570 | /* device resource management */ |
577 | 571 | typedef void (*dr_release_t)(struct device *dev, void *res); |
578 | 572 | typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data); |
... | ... | @@ -932,10 +926,7 @@ |
932 | 926 | extern struct device *__root_device_register(const char *name, |
933 | 927 | struct module *owner); |
934 | 928 | |
935 | -/* | |
936 | - * This is a macro to avoid include problems with THIS_MODULE, | |
937 | - * just as per what is done for device_schedule_callback() above. | |
938 | - */ | |
929 | +/* This is a macro to avoid include problems with THIS_MODULE */ | |
939 | 930 | #define root_device_register(name) \ |
940 | 931 | __root_device_register(name, THIS_MODULE) |
941 | 932 |
include/linux/sysfs.h
... | ... | @@ -179,9 +179,6 @@ |
179 | 179 | |
180 | 180 | #ifdef CONFIG_SYSFS |
181 | 181 | |
182 | -int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *), | |
183 | - void *data, struct module *owner); | |
184 | - | |
185 | 182 | int __must_check sysfs_create_dir_ns(struct kobject *kobj, const void *ns); |
186 | 183 | void sysfs_remove_dir(struct kobject *kobj); |
187 | 184 | int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name, |
... | ... | @@ -254,12 +251,6 @@ |
254 | 251 | } |
255 | 252 | |
256 | 253 | #else /* CONFIG_SYSFS */ |
257 | - | |
258 | -static inline int sysfs_schedule_callback(struct kobject *kobj, | |
259 | - void (*func)(void *), void *data, struct module *owner) | |
260 | -{ | |
261 | - return -ENOSYS; | |
262 | -} | |
263 | 254 | |
264 | 255 | static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns) |
265 | 256 | { |