|
24 | 24 | #include "dax.h"
|
25 | 25 |
|
26 | 26 | static dev_t dax_devt;
|
| 27 | +DEFINE_STATIC_SRCU(dax_srcu); |
27 | 28 | static struct class *dax_class;
|
28 | 29 | static DEFINE_IDA(dax_minor_ida);
|
29 | 30 | static int nr_dax = CONFIG_NR_DEV_DAX;
|
@@ -59,7 +60,7 @@ struct dax_region {
|
59 | 60 | * @region - parent region
|
60 | 61 | * @dev - device backing the character device
|
61 | 62 | * @cdev - core chardev data
|
62 |
| - * @alive - !alive + rcu grace period == no new mappings can be established |
| 63 | + * @alive - !alive + srcu grace period == no new mappings can be established |
63 | 64 | * @id - child id in the region
|
64 | 65 | * @num_resources - number of physical address extents in this device
|
65 | 66 | * @res - array of physical address ranges
|
@@ -530,17 +531,17 @@ static int __dax_dev_pmd_fault(struct dax_dev *dax_dev,
|
530 | 531 | static int dax_dev_pmd_fault(struct vm_area_struct *vma, unsigned long addr,
|
531 | 532 | pmd_t *pmd, unsigned int flags)
|
532 | 533 | {
|
533 |
| - int rc; |
| 534 | + int rc, id; |
534 | 535 | struct file *filp = vma->vm_file;
|
535 | 536 | struct dax_dev *dax_dev = filp->private_data;
|
536 | 537 |
|
537 | 538 | dev_dbg(&dax_dev->dev, "%s: %s: %s (%#lx - %#lx)\n", __func__,
|
538 | 539 | current->comm, (flags & FAULT_FLAG_WRITE)
|
539 | 540 | ? "write" : "read", vma->vm_start, vma->vm_end);
|
540 | 541 |
|
541 |
| - rcu_read_lock(); |
| 542 | + id = srcu_read_lock(&dax_srcu); |
542 | 543 | rc = __dax_dev_pmd_fault(dax_dev, vma, addr, pmd, flags);
|
543 |
| - rcu_read_unlock(); |
| 544 | + srcu_read_unlock(&dax_srcu, id); |
544 | 545 |
|
545 | 546 | return rc;
|
546 | 547 | }
|
@@ -656,11 +657,11 @@ static void unregister_dax_dev(void *dev)
|
656 | 657 | * Note, rcu is not protecting the liveness of dax_dev, rcu is
|
657 | 658 | * ensuring that any fault handlers that might have seen
|
658 | 659 | * dax_dev->alive == true, have completed. Any fault handlers
|
659 |
| - * that start after synchronize_rcu() has started will abort |
| 660 | + * that start after synchronize_srcu() has started will abort |
660 | 661 | * upon seeing dax_dev->alive == false.
|
661 | 662 | */
|
662 | 663 | dax_dev->alive = false;
|
663 |
| - synchronize_rcu(); |
| 664 | + synchronize_srcu(&dax_srcu); |
664 | 665 | unmap_mapping_range(dax_dev->inode->i_mapping, 0, 0, 1);
|
665 | 666 | cdev_del(cdev);
|
666 | 667 | device_unregister(dev);
|
|
0 commit comments