]> Git Repo - linux.git/commitdiff
Merge branch 'sched-wait-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <[email protected]>
Mon, 2 Apr 2018 23:50:39 +0000 (16:50 -0700)
committerLinus Torvalds <[email protected]>
Mon, 2 Apr 2018 23:50:39 +0000 (16:50 -0700)
Pull wait_var_event updates from Ingo Molnar:
 "This introduces the new wait_var_event() API, which is a more flexible
  waiting primitive than wait_on_atomic_t().

  All wait_on_atomic_t() users are migrated over to the new API and
  wait_on_atomic_t() is removed. The migration fixes one bug and should
  result in no functional changes for the other usecases"

* 'sched-wait-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  sched/wait: Improve __var_waitqueue() code generation
  sched/wait: Remove the wait_on_atomic_t() API
  sched/wait, arch/mips: Fix and convert wait_on_atomic_t() usage to the new wait_var_event() API
  sched/wait, fs/ocfs2: Convert wait_on_atomic_t() usage to the new wait_var_event() API
  sched/wait, fs/nfs: Convert wait_on_atomic_t() usage to the new wait_var_event() API
  sched/wait, fs/fscache: Convert wait_on_atomic_t() usage to the new wait_var_event() API
  sched/wait, fs/btrfs: Convert wait_on_atomic_t() usage to the new wait_var_event() API
  sched/wait, fs/afs: Convert wait_on_atomic_t() usage to the new wait_var_event() API
  sched/wait, drivers/media: Convert wait_on_atomic_t() usage to the new wait_var_event() API
  sched/wait, drivers/drm: Convert wait_on_atomic_t() usage to the new wait_var_event() API
  sched/wait: Introduce wait_var_event()

1  2 
fs/nfs/write.c

diff --combined fs/nfs/write.c
index e7d8ceae8f26b4ad5f6b9c68df14f13d858ab308,fd805771ea2f980794cc3a4b4be3e796e3b8a3cf..6579f3b367bdad8107340fdbbec32e439afd079d
@@@ -1620,8 -1620,8 +1620,8 @@@ static void nfs_writeback_result(struc
  
  static int wait_on_commit(struct nfs_mds_commit_info *cinfo)
  {
-       return wait_on_atomic_t(&cinfo->rpcs_out,
-                       nfs_wait_atomic_killable, TASK_KILLABLE);
+       return wait_var_event_killable(&cinfo->rpcs_out,
+                                      !atomic_read(&cinfo->rpcs_out));
  }
  
  static void nfs_commit_begin(struct nfs_mds_commit_info *cinfo)
  static void nfs_commit_end(struct nfs_mds_commit_info *cinfo)
  {
        if (atomic_dec_and_test(&cinfo->rpcs_out))
-               wake_up_atomic_t(&cinfo->rpcs_out);
+               wake_up_var(&cinfo->rpcs_out);
  }
  
  void nfs_commitdata_release(struct nfs_commit_data *data)
@@@ -1876,43 -1876,40 +1876,43 @@@ int nfs_generic_commit_list(struct inod
        return status;
  }
  
 -int nfs_commit_inode(struct inode *inode, int how)
 +static int __nfs_commit_inode(struct inode *inode, int how,
 +              struct writeback_control *wbc)
  {
        LIST_HEAD(head);
        struct nfs_commit_info cinfo;
        int may_wait = how & FLUSH_SYNC;
 -      int error = 0;
 -      int res;
 +      int ret, nscan;
  
        nfs_init_cinfo_from_inode(&cinfo, inode);
        nfs_commit_begin(cinfo.mds);
 -      res = nfs_scan_commit(inode, &head, &cinfo);
 -      if (res)
 -              error = nfs_generic_commit_list(inode, &head, how, &cinfo);
 +      for (;;) {
 +              ret = nscan = nfs_scan_commit(inode, &head, &cinfo);
 +              if (ret <= 0)
 +                      break;
 +              ret = nfs_generic_commit_list(inode, &head, how, &cinfo);
 +              if (ret < 0)
 +                      break;
 +              ret = 0;
 +              if (wbc && wbc->sync_mode == WB_SYNC_NONE) {
 +                      if (nscan < wbc->nr_to_write)
 +                              wbc->nr_to_write -= nscan;
 +                      else
 +                              wbc->nr_to_write = 0;
 +              }
 +              if (nscan < INT_MAX)
 +                      break;
 +              cond_resched();
 +      }
        nfs_commit_end(cinfo.mds);
 -      if (res == 0)
 -              return res;
 -      if (error < 0)
 -              goto out_error;
 -      if (!may_wait)
 -              goto out_mark_dirty;
 -      error = wait_on_commit(cinfo.mds);
 -      if (error < 0)
 -              return error;
 -      return res;
 -out_error:
 -      res = error;
 -      /* Note: If we exit without ensuring that the commit is complete,
 -       * we must mark the inode as dirty. Otherwise, future calls to
 -       * sync_inode() with the WB_SYNC_ALL flag set will fail to ensure
 -       * that the data is on the disk.
 -       */
 -out_mark_dirty:
 -      __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
 -      return res;
 +      if (ret || !may_wait)
 +              return ret;
 +      return wait_on_commit(cinfo.mds);
 +}
 +
 +int nfs_commit_inode(struct inode *inode, int how)
 +{
 +      return __nfs_commit_inode(inode, how, NULL);
  }
  EXPORT_SYMBOL_GPL(nfs_commit_inode);
  
@@@ -1922,11 -1919,11 +1922,11 @@@ int nfs_write_inode(struct inode *inode
        int flags = FLUSH_SYNC;
        int ret = 0;
  
 -      /* no commits means nothing needs to be done */
 -      if (!atomic_long_read(&nfsi->commit_info.ncommit))
 -              return ret;
 -
        if (wbc->sync_mode == WB_SYNC_NONE) {
 +              /* no commits means nothing needs to be done */
 +              if (!atomic_long_read(&nfsi->commit_info.ncommit))
 +                      goto check_requests_outstanding;
 +
                /* Don't commit yet if this is a non-blocking flush and there
                 * are a lot of outstanding writes for this mapping.
                 */
                flags = 0;
        }
  
 -      ret = nfs_commit_inode(inode, flags);
 -      if (ret >= 0) {
 -              if (wbc->sync_mode == WB_SYNC_NONE) {
 -                      if (ret < wbc->nr_to_write)
 -                              wbc->nr_to_write -= ret;
 -                      else
 -                              wbc->nr_to_write = 0;
 -              }
 -              return 0;
 -      }
 +      ret = __nfs_commit_inode(inode, flags, wbc);
 +      if (!ret) {
 +              if (flags & FLUSH_SYNC)
 +                      return 0;
 +      } else if (atomic_long_read(&nfsi->commit_info.ncommit))
 +              goto out_mark_dirty;
 +
 +check_requests_outstanding:
 +      if (!atomic_read(&nfsi->commit_info.rpcs_out))
 +              return ret;
  out_mark_dirty:
        __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
        return ret;
This page took 0.078248 seconds and 4 git commands to generate.