LCOV - code coverage report
Current view: top level - mm - backing-dev.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 39 214 18.2 %
Date: 2014-02-18 Functions: 7 30 23.3 %
Branches: 17 78 21.8 %

           Branch data     Line data    Source code
       1                 :            : 
       2                 :            : #include <linux/wait.h>
       3                 :            : #include <linux/backing-dev.h>
       4                 :            : #include <linux/kthread.h>
       5                 :            : #include <linux/freezer.h>
       6                 :            : #include <linux/fs.h>
       7                 :            : #include <linux/pagemap.h>
       8                 :            : #include <linux/mm.h>
       9                 :            : #include <linux/sched.h>
      10                 :            : #include <linux/module.h>
      11                 :            : #include <linux/writeback.h>
      12                 :            : #include <linux/device.h>
      13                 :            : #include <trace/events/writeback.h>
      14                 :            : 
      15                 :            : static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
      16                 :            : 
      17                 :            : struct backing_dev_info default_backing_dev_info = {
      18                 :            :         .name           = "default",
      19                 :            :         .ra_pages       = VM_MAX_READAHEAD * 1024 / PAGE_CACHE_SIZE,
      20                 :            :         .state          = 0,
      21                 :            :         .capabilities   = BDI_CAP_MAP_COPY,
      22                 :            : };
      23                 :            : EXPORT_SYMBOL_GPL(default_backing_dev_info);
      24                 :            : 
      25                 :            : struct backing_dev_info noop_backing_dev_info = {
      26                 :            :         .name           = "noop",
      27                 :            :         .capabilities   = BDI_CAP_NO_ACCT_AND_WRITEBACK,
      28                 :            : };
      29                 :            : EXPORT_SYMBOL_GPL(noop_backing_dev_info);
      30                 :            : 
      31                 :            : static struct class *bdi_class;
      32                 :            : 
      33                 :            : /*
      34                 :            :  * bdi_lock protects updates to bdi_list. bdi_list has RCU reader side
      35                 :            :  * locking.
      36                 :            :  */
      37                 :            : DEFINE_SPINLOCK(bdi_lock);
      38                 :            : LIST_HEAD(bdi_list);
      39                 :            : 
      40                 :            : /* bdi_wq serves all asynchronous writeback tasks */
      41                 :            : struct workqueue_struct *bdi_wq;
      42                 :            : 
      43                 :          0 : void bdi_lock_two(struct bdi_writeback *wb1, struct bdi_writeback *wb2)
      44                 :            : {
      45         [ #  # ]:          0 :         if (wb1 < wb2) {
      46                 :            :                 spin_lock(&wb1->list_lock);
      47                 :          0 :                 spin_lock_nested(&wb2->list_lock, 1);
      48                 :            :         } else {
      49                 :            :                 spin_lock(&wb2->list_lock);
      50                 :          0 :                 spin_lock_nested(&wb1->list_lock, 1);
      51                 :            :         }
      52                 :          0 : }
      53                 :            : 
      54                 :            : #ifdef CONFIG_DEBUG_FS
      55                 :            : #include <linux/debugfs.h>
      56                 :            : #include <linux/seq_file.h>
      57                 :            : 
      58                 :            : static struct dentry *bdi_debug_root;
      59                 :            : 
      60                 :            : static void bdi_debug_init(void)
      61                 :            : {
      62                 :          0 :         bdi_debug_root = debugfs_create_dir("bdi", NULL);
      63                 :            : }
      64                 :            : 
      65                 :          0 : static int bdi_debug_stats_show(struct seq_file *m, void *v)
      66                 :            : {
      67                 :          0 :         struct backing_dev_info *bdi = m->private;
      68                 :            :         struct bdi_writeback *wb = &bdi->wb;
      69                 :            :         unsigned long background_thresh;
      70                 :            :         unsigned long dirty_thresh;
      71                 :            :         unsigned long bdi_thresh;
      72                 :            :         unsigned long nr_dirty, nr_io, nr_more_io;
      73                 :            :         struct inode *inode;
      74                 :            : 
      75                 :            :         nr_dirty = nr_io = nr_more_io = 0;
      76                 :            :         spin_lock(&wb->list_lock);
      77         [ #  # ]:          0 :         list_for_each_entry(inode, &wb->b_dirty, i_wb_list)
      78                 :          0 :                 nr_dirty++;
      79         [ #  # ]:          0 :         list_for_each_entry(inode, &wb->b_io, i_wb_list)
      80                 :          0 :                 nr_io++;
      81         [ #  # ]:          0 :         list_for_each_entry(inode, &wb->b_more_io, i_wb_list)
      82                 :          0 :                 nr_more_io++;
      83                 :            :         spin_unlock(&wb->list_lock);
      84                 :            : 
      85                 :          0 :         global_dirty_limits(&background_thresh, &dirty_thresh);
      86                 :          0 :         bdi_thresh = bdi_dirty_limit(bdi, dirty_thresh);
      87                 :            : 
      88                 :            : #define K(x) ((x) << (PAGE_SHIFT - 10))
      89                 :          0 :         seq_printf(m,
      90                 :            :                    "BdiWriteback:       %10lu kB\n"
      91                 :            :                    "BdiReclaimable:     %10lu kB\n"
      92                 :            :                    "BdiDirtyThresh:     %10lu kB\n"
      93                 :            :                    "DirtyThresh:        %10lu kB\n"
      94                 :            :                    "BackgroundThresh:   %10lu kB\n"
      95                 :            :                    "BdiDirtied:         %10lu kB\n"
      96                 :            :                    "BdiWritten:         %10lu kB\n"
      97                 :            :                    "BdiWriteBandwidth:  %10lu kBps\n"
      98                 :            :                    "b_dirty:            %10lu\n"
      99                 :            :                    "b_io:               %10lu\n"
     100                 :            :                    "b_more_io:          %10lu\n"
     101                 :            :                    "bdi_list:           %10u\n"
     102                 :            :                    "state:              %10lx\n",
     103                 :            :                    (unsigned long) K(bdi_stat(bdi, BDI_WRITEBACK)),
     104                 :            :                    (unsigned long) K(bdi_stat(bdi, BDI_RECLAIMABLE)),
     105                 :            :                    K(bdi_thresh),
     106                 :            :                    K(dirty_thresh),
     107                 :            :                    K(background_thresh),
     108                 :            :                    (unsigned long) K(bdi_stat(bdi, BDI_DIRTIED)),
     109                 :            :                    (unsigned long) K(bdi_stat(bdi, BDI_WRITTEN)),
     110                 :          0 :                    (unsigned long) K(bdi->write_bandwidth),
     111                 :            :                    nr_dirty,
     112                 :            :                    nr_io,
     113                 :            :                    nr_more_io,
     114                 :          0 :                    !list_empty(&bdi->bdi_list), bdi->state);
     115                 :            : #undef K
     116                 :            : 
     117                 :          0 :         return 0;
     118                 :            : }
     119                 :            : 
     120                 :          0 : static int bdi_debug_stats_open(struct inode *inode, struct file *file)
     121                 :            : {
     122                 :          0 :         return single_open(file, bdi_debug_stats_show, inode->i_private);
     123                 :            : }
     124                 :            : 
     125                 :            : static const struct file_operations bdi_debug_stats_fops = {
     126                 :            :         .open           = bdi_debug_stats_open,
     127                 :            :         .read           = seq_read,
     128                 :            :         .llseek         = seq_lseek,
     129                 :            :         .release        = single_release,
     130                 :            : };
     131                 :            : 
     132                 :          0 : static void bdi_debug_register(struct backing_dev_info *bdi, const char *name)
     133                 :            : {
     134                 :          0 :         bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
     135                 :          0 :         bdi->debug_stats = debugfs_create_file("stats", 0444, bdi->debug_dir,
     136                 :            :                                                bdi, &bdi_debug_stats_fops);
     137                 :          0 : }
     138                 :            : 
     139                 :            : static void bdi_debug_unregister(struct backing_dev_info *bdi)
     140                 :            : {
     141                 :          0 :         debugfs_remove(bdi->debug_stats);
     142                 :          0 :         debugfs_remove(bdi->debug_dir);
     143                 :            : }
     144                 :            : #else
     145                 :            : static inline void bdi_debug_init(void)
     146                 :            : {
     147                 :            : }
     148                 :            : static inline void bdi_debug_register(struct backing_dev_info *bdi,
     149                 :            :                                       const char *name)
     150                 :            : {
     151                 :            : }
     152                 :            : static inline void bdi_debug_unregister(struct backing_dev_info *bdi)
     153                 :            : {
     154                 :            : }
     155                 :            : #endif
     156                 :            : 
     157                 :          0 : static ssize_t read_ahead_kb_store(struct device *dev,
     158                 :            :                                   struct device_attribute *attr,
     159                 :            :                                   const char *buf, size_t count)
     160                 :            : {
     161                 :          0 :         struct backing_dev_info *bdi = dev_get_drvdata(dev);
     162                 :            :         unsigned long read_ahead_kb;
     163                 :            :         ssize_t ret;
     164                 :            : 
     165                 :            :         ret = kstrtoul(buf, 10, &read_ahead_kb);
     166         [ #  # ]:          0 :         if (ret < 0)
     167                 :            :                 return ret;
     168                 :            : 
     169                 :          0 :         bdi->ra_pages = read_ahead_kb >> (PAGE_SHIFT - 10);
     170                 :            : 
     171                 :          0 :         return count;
     172                 :            : }
     173                 :            : 
     174                 :            : #define K(pages) ((pages) << (PAGE_SHIFT - 10))
     175                 :            : 
     176                 :            : #define BDI_SHOW(name, expr)                                            \
     177                 :            : static ssize_t name##_show(struct device *dev,                          \
     178                 :            :                            struct device_attribute *attr, char *page)   \
     179                 :            : {                                                                       \
     180                 :            :         struct backing_dev_info *bdi = dev_get_drvdata(dev);            \
     181                 :            :                                                                         \
     182                 :            :         return snprintf(page, PAGE_SIZE-1, "%lld\n", (long long)expr);        \
     183                 :            : }                                                                       \
     184                 :            : static DEVICE_ATTR_RW(name);
     185                 :            : 
     186                 :          0 : BDI_SHOW(read_ahead_kb, K(bdi->ra_pages))
     187                 :            : 
     188                 :          0 : static ssize_t min_ratio_store(struct device *dev,
     189                 :            :                 struct device_attribute *attr, const char *buf, size_t count)
     190                 :            : {
     191                 :          0 :         struct backing_dev_info *bdi = dev_get_drvdata(dev);
     192                 :            :         unsigned int ratio;
     193                 :            :         ssize_t ret;
     194                 :            : 
     195                 :          0 :         ret = kstrtouint(buf, 10, &ratio);
     196         [ #  # ]:          0 :         if (ret < 0)
     197                 :            :                 return ret;
     198                 :            : 
     199                 :          0 :         ret = bdi_set_min_ratio(bdi, ratio);
     200         [ #  # ]:          0 :         if (!ret)
     201                 :          0 :                 ret = count;
     202                 :            : 
     203                 :          0 :         return ret;
     204                 :            : }
     205                 :          0 : BDI_SHOW(min_ratio, bdi->min_ratio)
     206                 :            : 
     207                 :          0 : static ssize_t max_ratio_store(struct device *dev,
     208                 :            :                 struct device_attribute *attr, const char *buf, size_t count)
     209                 :            : {
     210                 :          0 :         struct backing_dev_info *bdi = dev_get_drvdata(dev);
     211                 :            :         unsigned int ratio;
     212                 :            :         ssize_t ret;
     213                 :            : 
     214                 :          0 :         ret = kstrtouint(buf, 10, &ratio);
     215         [ #  # ]:          0 :         if (ret < 0)
     216                 :            :                 return ret;
     217                 :            : 
     218                 :          0 :         ret = bdi_set_max_ratio(bdi, ratio);
     219         [ #  # ]:          0 :         if (!ret)
     220                 :          0 :                 ret = count;
     221                 :            : 
     222                 :          0 :         return ret;
     223                 :            : }
     224                 :          0 : BDI_SHOW(max_ratio, bdi->max_ratio)
     225                 :            : 
     226                 :          0 : static ssize_t stable_pages_required_show(struct device *dev,
     227                 :            :                                           struct device_attribute *attr,
     228                 :            :                                           char *page)
     229                 :            : {
     230                 :          0 :         struct backing_dev_info *bdi = dev_get_drvdata(dev);
     231                 :            : 
     232                 :          0 :         return snprintf(page, PAGE_SIZE-1, "%d\n",
     233                 :            :                         bdi_cap_stable_pages_required(bdi) ? 1 : 0);
     234                 :            : }
     235                 :            : static DEVICE_ATTR_RO(stable_pages_required);
     236                 :            : 
     237                 :            : static struct attribute *bdi_dev_attrs[] = {
     238                 :            :         &dev_attr_read_ahead_kb.attr,
     239                 :            :         &dev_attr_min_ratio.attr,
     240                 :            :         &dev_attr_max_ratio.attr,
     241                 :            :         &dev_attr_stable_pages_required.attr,
     242                 :            :         NULL,
     243                 :            : };
     244                 :            : ATTRIBUTE_GROUPS(bdi_dev);
     245                 :            : 
     246                 :          0 : static __init int bdi_class_init(void)
     247                 :            : {
     248                 :          0 :         bdi_class = class_create(THIS_MODULE, "bdi");
     249         [ #  # ]:          0 :         if (IS_ERR(bdi_class))
     250                 :          0 :                 return PTR_ERR(bdi_class);
     251                 :            : 
     252                 :          0 :         bdi_class->dev_groups = bdi_dev_groups;
     253                 :            :         bdi_debug_init();
     254                 :          0 :         return 0;
     255                 :            : }
     256                 :            : postcore_initcall(bdi_class_init);
     257                 :            : 
     258                 :          0 : static int __init default_bdi_init(void)
     259                 :            : {
     260                 :            :         int err;
     261                 :            : 
     262                 :          0 :         bdi_wq = alloc_workqueue("writeback", WQ_MEM_RECLAIM | WQ_FREEZABLE |
     263                 :            :                                               WQ_UNBOUND | WQ_SYSFS, 0);
     264         [ #  # ]:          0 :         if (!bdi_wq)
     265                 :            :                 return -ENOMEM;
     266                 :            : 
     267                 :          0 :         err = bdi_init(&default_backing_dev_info);
     268         [ #  # ]:          0 :         if (!err)
     269                 :          0 :                 bdi_register(&default_backing_dev_info, NULL, "default");
     270                 :          0 :         err = bdi_init(&noop_backing_dev_info);
     271                 :            : 
     272                 :          0 :         return err;
     273                 :            : }
     274                 :            : subsys_initcall(default_bdi_init);
     275                 :            : 
     276                 :          0 : int bdi_has_dirty_io(struct backing_dev_info *bdi)
     277                 :            : {
     278                 :          0 :         return wb_has_dirty_io(&bdi->wb);
     279                 :            : }
     280                 :            : 
     281                 :            : /*
     282                 :            :  * This function is used when the first inode for this bdi is marked dirty. It
     283                 :            :  * wakes-up the corresponding bdi thread which should then take care of the
     284                 :            :  * periodic background write-out of dirty inodes. Since the write-out would
     285                 :            :  * starts only 'dirty_writeback_interval' centisecs from now anyway, we just
     286                 :            :  * set up a timer which wakes the bdi thread up later.
     287                 :            :  *
     288                 :            :  * Note, we wouldn't bother setting up the timer, but this function is on the
     289                 :            :  * fast-path (used by '__mark_inode_dirty()'), so we save few context switches
     290                 :            :  * by delaying the wake-up.
     291                 :            :  */
     292                 :          0 : void bdi_wakeup_thread_delayed(struct backing_dev_info *bdi)
     293                 :            : {
     294                 :            :         unsigned long timeout;
     295                 :            : 
     296                 :       1551 :         timeout = msecs_to_jiffies(dirty_writeback_interval * 10);
     297                 :       1551 :         mod_delayed_work(bdi_wq, &bdi->wb.dwork, timeout);
     298                 :       1551 : }
     299                 :            : 
     300                 :            : /*
     301                 :            :  * Remove bdi from bdi_list, and ensure that it is no longer visible
     302                 :            :  */
     303                 :          0 : static void bdi_remove_from_list(struct backing_dev_info *bdi)
     304                 :            : {
     305                 :            :         spin_lock_bh(&bdi_lock);
     306                 :            :         list_del_rcu(&bdi->bdi_list);
     307                 :            :         spin_unlock_bh(&bdi_lock);
     308                 :            : 
     309                 :          0 :         synchronize_rcu_expedited();
     310                 :            : 
     311                 :            :         /* bdi_list is now unused, clear it to mark @bdi dying */
     312                 :          0 :         INIT_LIST_HEAD(&bdi->bdi_list);
     313                 :          0 : }
     314                 :            : 
     315                 :          0 : int bdi_register(struct backing_dev_info *bdi, struct device *parent,
     316                 :            :                 const char *fmt, ...)
     317                 :            : {
     318                 :            :         va_list args;
     319                 :            :         struct device *dev;
     320                 :            : 
     321         [ #  # ]:          0 :         if (bdi->dev)        /* The driver needs to use separate queues per device */
     322                 :            :                 return 0;
     323                 :            : 
     324                 :          0 :         va_start(args, fmt);
     325                 :          0 :         dev = device_create_vargs(bdi_class, parent, MKDEV(0, 0), bdi, fmt, args);
     326                 :          0 :         va_end(args);
     327         [ #  # ]:          0 :         if (IS_ERR(dev))
     328                 :          0 :                 return PTR_ERR(dev);
     329                 :            : 
     330                 :          0 :         bdi->dev = dev;
     331                 :            : 
     332                 :          0 :         bdi_debug_register(bdi, dev_name(dev));
     333                 :          0 :         set_bit(BDI_registered, &bdi->state);
     334                 :            : 
     335                 :            :         spin_lock_bh(&bdi_lock);
     336                 :          0 :         list_add_tail_rcu(&bdi->bdi_list, &bdi_list);
     337                 :            :         spin_unlock_bh(&bdi_lock);
     338                 :            : 
     339                 :            :         trace_writeback_bdi_register(bdi);
     340                 :            :         return 0;
     341                 :            : }
     342                 :            : EXPORT_SYMBOL(bdi_register);
     343                 :            : 
     344                 :          0 : int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev)
     345                 :            : {
     346                 :          0 :         return bdi_register(bdi, NULL, "%u:%u", MAJOR(dev), MINOR(dev));
     347                 :            : }
     348                 :            : EXPORT_SYMBOL(bdi_register_dev);
     349                 :            : 
     350                 :            : /*
     351                 :            :  * Remove bdi from the global list and shutdown any threads we have running
     352                 :            :  */
     353                 :          0 : static void bdi_wb_shutdown(struct backing_dev_info *bdi)
     354                 :            : {
     355         [ #  # ]:          0 :         if (!bdi_cap_writeback_dirty(bdi))
     356                 :          0 :                 return;
     357                 :            : 
     358                 :            :         /*
     359                 :            :          * Make sure nobody finds us on the bdi_list anymore
     360                 :            :          */
     361                 :          0 :         bdi_remove_from_list(bdi);
     362                 :            : 
     363                 :            :         /*
     364                 :            :          * Drain work list and shutdown the delayed_work.  At this point,
     365                 :            :          * @bdi->bdi_list is empty telling bdi_Writeback_workfn() that @bdi
     366                 :            :          * is dying and its work_list needs to be drained no matter what.
     367                 :            :          */
     368                 :          0 :         mod_delayed_work(bdi_wq, &bdi->wb.dwork, 0);
     369                 :          0 :         flush_delayed_work(&bdi->wb.dwork);
     370         [ #  # ]:          0 :         WARN_ON(!list_empty(&bdi->work_list));
     371                 :            : 
     372                 :            :         /*
     373                 :            :          * This shouldn't be necessary unless @bdi for some reason has
     374                 :            :          * unflushed dirty IO after work_list is drained.  Do it anyway
     375                 :            :          * just in case.
     376                 :            :          */
     377                 :          0 :         cancel_delayed_work_sync(&bdi->wb.dwork);
     378                 :            : }
     379                 :            : 
     380                 :            : /*
     381                 :            :  * This bdi is going away now, make sure that no super_blocks point to it
     382                 :            :  */
     383                 :          0 : static void bdi_prune_sb(struct backing_dev_info *bdi)
     384                 :            : {
     385                 :            :         struct super_block *sb;
     386                 :            : 
     387                 :            :         spin_lock(&sb_lock);
     388         [ #  # ]:          0 :         list_for_each_entry(sb, &super_blocks, s_list) {
     389         [ #  # ]:          0 :                 if (sb->s_bdi == bdi)
     390                 :          0 :                         sb->s_bdi = &default_backing_dev_info;
     391                 :            :         }
     392                 :            :         spin_unlock(&sb_lock);
     393                 :          0 : }
     394                 :            : 
     395                 :          0 : void bdi_unregister(struct backing_dev_info *bdi)
     396                 :            : {
     397                 :          0 :         struct device *dev = bdi->dev;
     398                 :            : 
     399         [ #  # ]:          0 :         if (dev) {
     400                 :          0 :                 bdi_set_min_ratio(bdi, 0);
     401                 :            :                 trace_writeback_bdi_unregister(bdi);
     402                 :          0 :                 bdi_prune_sb(bdi);
     403                 :            : 
     404                 :          0 :                 bdi_wb_shutdown(bdi);
     405                 :            :                 bdi_debug_unregister(bdi);
     406                 :            : 
     407                 :            :                 spin_lock_bh(&bdi->wb_lock);
     408                 :          0 :                 bdi->dev = NULL;
     409                 :            :                 spin_unlock_bh(&bdi->wb_lock);
     410                 :            : 
     411                 :          0 :                 device_unregister(dev);
     412                 :            :         }
     413                 :          0 : }
     414                 :            : EXPORT_SYMBOL(bdi_unregister);
     415                 :            : 
     416                 :          0 : static void bdi_wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi)
     417                 :            : {
     418                 :          0 :         memset(wb, 0, sizeof(*wb));
     419                 :            : 
     420                 :          0 :         wb->bdi = bdi;
     421                 :          0 :         wb->last_old_flush = jiffies;
     422                 :          0 :         INIT_LIST_HEAD(&wb->b_dirty);
     423                 :          0 :         INIT_LIST_HEAD(&wb->b_io);
     424                 :          0 :         INIT_LIST_HEAD(&wb->b_more_io);
     425                 :          0 :         spin_lock_init(&wb->list_lock);
     426                 :          0 :         INIT_DELAYED_WORK(&wb->dwork, bdi_writeback_workfn);
     427                 :          0 : }
     428                 :            : 
     429                 :            : /*
     430                 :            :  * Initial write bandwidth: 100 MB/s
     431                 :            :  */
     432                 :            : #define INIT_BW         (100 << (20 - PAGE_SHIFT))
     433                 :            : 
     434                 :          0 : int bdi_init(struct backing_dev_info *bdi)
     435                 :            : {
     436                 :            :         int i, err;
     437                 :            : 
     438                 :          0 :         bdi->dev = NULL;
     439                 :            : 
     440                 :          0 :         bdi->min_ratio = 0;
     441                 :          0 :         bdi->max_ratio = 100;
     442                 :          0 :         bdi->max_prop_frac = FPROP_FRAC_BASE;
     443                 :          0 :         spin_lock_init(&bdi->wb_lock);
     444                 :          0 :         INIT_LIST_HEAD(&bdi->bdi_list);
     445                 :          0 :         INIT_LIST_HEAD(&bdi->work_list);
     446                 :            : 
     447                 :          0 :         bdi_wb_init(&bdi->wb, bdi);
     448                 :            : 
     449         [ #  # ]:          0 :         for (i = 0; i < NR_BDI_STAT_ITEMS; i++) {
     450                 :          0 :                 err = percpu_counter_init(&bdi->bdi_stat[i], 0);
     451         [ #  # ]:          0 :                 if (err)
     452                 :            :                         goto err;
     453                 :            :         }
     454                 :            : 
     455                 :          0 :         bdi->dirty_exceeded = 0;
     456                 :            : 
     457                 :          0 :         bdi->bw_time_stamp = jiffies;
     458                 :          0 :         bdi->written_stamp = 0;
     459                 :            : 
     460                 :          0 :         bdi->balanced_dirty_ratelimit = INIT_BW;
     461                 :          0 :         bdi->dirty_ratelimit = INIT_BW;
     462                 :          0 :         bdi->write_bandwidth = INIT_BW;
     463                 :          0 :         bdi->avg_write_bandwidth = INIT_BW;
     464                 :            : 
     465                 :          0 :         err = fprop_local_init_percpu(&bdi->completions);
     466                 :            : 
     467         [ #  # ]:          0 :         if (err) {
     468                 :            : err:
     469         [ #  # ]:          0 :                 while (i--)
     470                 :          0 :                         percpu_counter_destroy(&bdi->bdi_stat[i]);
     471                 :            :         }
     472                 :            : 
     473                 :          0 :         return err;
     474                 :            : }
     475                 :            : EXPORT_SYMBOL(bdi_init);
     476                 :            : 
     477                 :          0 : void bdi_destroy(struct backing_dev_info *bdi)
     478                 :            : {
     479                 :            :         int i;
     480                 :            : 
     481                 :            :         /*
     482                 :            :          * Splice our entries to the default_backing_dev_info, if this
     483                 :            :          * bdi disappears
     484                 :            :          */
     485         [ #  # ]:          0 :         if (bdi_has_dirty_io(bdi)) {
     486                 :            :                 struct bdi_writeback *dst = &default_backing_dev_info.wb;
     487                 :            : 
     488                 :          0 :                 bdi_lock_two(&bdi->wb, dst);
     489                 :            :                 list_splice(&bdi->wb.b_dirty, &dst->b_dirty);
     490                 :          0 :                 list_splice(&bdi->wb.b_io, &dst->b_io);
     491                 :          0 :                 list_splice(&bdi->wb.b_more_io, &dst->b_more_io);
     492                 :            :                 spin_unlock(&bdi->wb.list_lock);
     493                 :            :                 spin_unlock(&dst->list_lock);
     494                 :            :         }
     495                 :            : 
     496                 :          0 :         bdi_unregister(bdi);
     497                 :            : 
     498                 :            :         /*
     499                 :            :          * If bdi_unregister() had already been called earlier, the dwork
     500                 :            :          * could still be pending because bdi_prune_sb() can race with the
     501                 :            :          * bdi_wakeup_thread_delayed() calls from __mark_inode_dirty().
     502                 :            :          */
     503                 :          0 :         cancel_delayed_work_sync(&bdi->wb.dwork);
     504                 :            : 
     505         [ #  # ]:          0 :         for (i = 0; i < NR_BDI_STAT_ITEMS; i++)
     506                 :          0 :                 percpu_counter_destroy(&bdi->bdi_stat[i]);
     507                 :            : 
     508                 :          0 :         fprop_local_destroy_percpu(&bdi->completions);
     509                 :          0 : }
     510                 :            : EXPORT_SYMBOL(bdi_destroy);
     511                 :            : 
     512                 :            : /*
     513                 :            :  * For use from filesystems to quickly init and register a bdi associated
     514                 :            :  * with dirty writeback
     515                 :            :  */
     516                 :          0 : int bdi_setup_and_register(struct backing_dev_info *bdi, char *name,
     517                 :            :                            unsigned int cap)
     518                 :            : {
     519                 :            :         int err;
     520                 :            : 
     521                 :          0 :         bdi->name = name;
     522                 :          0 :         bdi->capabilities = cap;
     523                 :          0 :         err = bdi_init(bdi);
     524         [ #  # ]:          0 :         if (err)
     525                 :            :                 return err;
     526                 :            : 
     527                 :          0 :         err = bdi_register(bdi, NULL, "%.28s-%ld", name,
     528                 :            :                            atomic_long_inc_return(&bdi_seq));
     529         [ #  # ]:          0 :         if (err) {
     530                 :          0 :                 bdi_destroy(bdi);
     531                 :          0 :                 return err;
     532                 :            :         }
     533                 :            : 
     534                 :            :         return 0;
     535                 :            : }
     536                 :            : EXPORT_SYMBOL(bdi_setup_and_register);
     537                 :            : 
     538                 :            : static wait_queue_head_t congestion_wqh[2] = {
     539                 :            :                 __WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[0]),
     540                 :            :                 __WAIT_QUEUE_HEAD_INITIALIZER(congestion_wqh[1])
     541                 :            :         };
     542                 :            : static atomic_t nr_bdi_congested[2];
     543                 :            : 
     544                 :          0 : void clear_bdi_congested(struct backing_dev_info *bdi, int sync)
     545                 :            : {
     546                 :            :         enum bdi_state bit;
     547                 :     421277 :         wait_queue_head_t *wqh = &congestion_wqh[sync];
     548                 :            : 
     549         [ +  + ]:     421277 :         bit = sync ? BDI_sync_congested : BDI_async_congested;
     550         [ +  + ]:     421277 :         if (test_and_clear_bit(bit, &bdi->state))
     551                 :         49 :                 atomic_dec(&nr_bdi_congested[sync]);
     552                 :     421277 :         smp_mb__after_clear_bit();
     553         [ +  + ]:     421277 :         if (waitqueue_active(wqh))
     554                 :          9 :                 wake_up(wqh);
     555                 :     421277 : }
     556                 :            : EXPORT_SYMBOL(clear_bdi_congested);
     557                 :            : 
     558                 :          0 : void set_bdi_congested(struct backing_dev_info *bdi, int sync)
     559                 :            : {
     560                 :            :         enum bdi_state bit;
     561                 :            : 
     562         [ +  + ]:      13102 :         bit = sync ? BDI_sync_congested : BDI_async_congested;
     563         [ +  + ]:      13102 :         if (!test_and_set_bit(bit, &bdi->state))
     564                 :         49 :                 atomic_inc(&nr_bdi_congested[sync]);
     565                 :      13102 : }
     566                 :            : EXPORT_SYMBOL(set_bdi_congested);
     567                 :            : 
     568                 :            : /**
     569                 :            :  * congestion_wait - wait for a backing_dev to become uncongested
     570                 :            :  * @sync: SYNC or ASYNC IO
     571                 :            :  * @timeout: timeout in jiffies
     572                 :            :  *
     573                 :            :  * Waits for up to @timeout jiffies for a backing_dev (any backing_dev) to exit
     574                 :            :  * write congestion.  If no backing_devs are congested then just wait for the
     575                 :            :  * next write to be completed.
     576                 :            :  */
     577                 :          0 : long congestion_wait(int sync, long timeout)
     578                 :            : {
     579                 :            :         long ret;
     580                 :         16 :         unsigned long start = jiffies;
     581                 :         32 :         DEFINE_WAIT(wait);
     582                 :         16 :         wait_queue_head_t *wqh = &congestion_wqh[sync];
     583                 :            : 
     584                 :         16 :         prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
     585                 :         16 :         ret = io_schedule_timeout(timeout);
     586                 :         16 :         finish_wait(wqh, &wait);
     587                 :            : 
     588                 :         16 :         trace_writeback_congestion_wait(jiffies_to_usecs(timeout),
     589                 :            :                                         jiffies_to_usecs(jiffies - start));
     590                 :            : 
     591                 :          0 :         return ret;
     592                 :            : }
     593                 :            : EXPORT_SYMBOL(congestion_wait);
     594                 :            : 
     595                 :            : /**
     596                 :            :  * wait_iff_congested - Conditionally wait for a backing_dev to become uncongested or a zone to complete writes
     597                 :            :  * @zone: A zone to check if it is heavily congested
     598                 :            :  * @sync: SYNC or ASYNC IO
     599                 :            :  * @timeout: timeout in jiffies
     600                 :            :  *
     601                 :            :  * In the event of a congested backing_dev (any backing_dev) and the given
     602                 :            :  * @zone has experienced recent congestion, this waits for up to @timeout
     603                 :            :  * jiffies for either a BDI to exit congestion of the given @sync queue
     604                 :            :  * or a write to complete.
     605                 :            :  *
     606                 :            :  * In the absence of zone congestion, cond_resched() is called to yield
     607                 :            :  * the processor if necessary but otherwise does not sleep.
     608                 :            :  *
     609                 :            :  * The return value is 0 if the sleep is for the full timeout. Otherwise,
     610                 :            :  * it is the number of jiffies that were still remaining when the function
     611                 :            :  * returned. return_value == timeout implies the function did not sleep.
     612                 :            :  */
     613                 :          0 : long wait_iff_congested(struct zone *zone, int sync, long timeout)
     614                 :            : {
     615                 :            :         long ret;
     616                 :      38212 :         unsigned long start = jiffies;
     617                 :      76424 :         DEFINE_WAIT(wait);
     618                 :      38212 :         wait_queue_head_t *wqh = &congestion_wqh[sync];
     619                 :            : 
     620                 :            :         /*
     621                 :            :          * If there is no congestion, or heavy congestion is not being
     622                 :            :          * encountered in the current zone, yield if necessary instead
     623                 :            :          * of sleeping on the congestion queue
     624                 :            :          */
     625 [ -  + ][ #  # ]:      38212 :         if (atomic_read(&nr_bdi_congested[sync]) == 0 ||
     626                 :            :                         !zone_is_reclaim_congested(zone)) {
     627                 :      38212 :                 cond_resched();
     628                 :            : 
     629                 :            :                 /* In case we scheduled, work out time remaining */
     630                 :      38212 :                 ret = timeout - (jiffies - start);
     631         [ -  + ]:      38212 :                 if (ret < 0)
     632                 :            :                         ret = 0;
     633                 :            : 
     634                 :            :                 goto out;
     635                 :            :         }
     636                 :            : 
     637                 :            :         /* Sleep until uncongested or a write happens */
     638                 :          0 :         prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE);
     639                 :          0 :         ret = io_schedule_timeout(timeout);
     640                 :          0 :         finish_wait(wqh, &wait);
     641                 :            : 
     642                 :            : out:
     643                 :      38212 :         trace_writeback_wait_iff_congested(jiffies_to_usecs(timeout),
     644                 :            :                                         jiffies_to_usecs(jiffies - start));
     645                 :            : 
     646                 :          0 :         return ret;
     647                 :            : }
     648                 :            : EXPORT_SYMBOL(wait_iff_congested);
     649                 :            : 
     650                 :          0 : int pdflush_proc_obsolete(struct ctl_table *table, int write,
     651                 :            :                         void __user *buffer, size_t *lenp, loff_t *ppos)
     652                 :            : {
     653                 :          2 :         char kbuf[] = "0\n";
     654                 :            : 
     655 [ +  + ][ -  + ]:          2 :         if (*ppos || *lenp < sizeof(kbuf)) {
     656                 :          1 :                 *lenp = 0;
     657                 :          1 :                 return 0;
     658                 :            :         }
     659                 :            : 
     660         [ +  - ]:          1 :         if (copy_to_user(buffer, kbuf, sizeof(kbuf)))
     661                 :            :                 return -EFAULT;
     662         [ +  - ]:          1 :         printk_once(KERN_WARNING "%s exported in /proc is scheduled for removal\n",
     663                 :            :                         table->procname);
     664                 :            : 
     665                 :          1 :         *lenp = 2;
     666                 :          1 :         *ppos += *lenp;
     667                 :          1 :         return 2;
     668                 :            : }

Generated by: LCOV version 1.9