[bug report] io_uring: refactor io_sq_thread() handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Xiaoguang Wang,

The patch e0c06f5ab2c5: "io_uring: refactor io_sq_thread() handling"
from Nov 3, 2020, leads to the following static checker warning:

	fs/io_uring.c:6939 io_sq_thread()
	error: uninitialized symbol 'timeout'.

fs/io_uring.c
  6883  static int io_sq_thread(void *data)
  6884  {
  6885          struct cgroup_subsys_state *cur_css = NULL;
  6886          struct files_struct *old_files = current->files;
  6887          struct nsproxy *old_nsproxy = current->nsproxy;
  6888          struct pid *old_thread_pid = current->thread_pid;
  6889          const struct cred *old_cred = NULL;
  6890          struct io_sq_data *sqd = data;
  6891          struct io_ring_ctx *ctx;
  6892          unsigned long timeout;
                ^^^^^^^^^^^^^^^^^^^^^^

  6893          DEFINE_WAIT(wait);
  6894  
  6895          task_lock(current);
  6896          current->files = NULL;
  6897          current->nsproxy = NULL;
  6898          current->thread_pid = NULL;
  6899          task_unlock(current);
  6900  
  6901          while (!kthread_should_stop()) {
  6902                  int ret;
  6903                  bool cap_entries, sqt_spin, needs_sched;
  6904  
  6905                  /*
  6906                   * Any changes to the sqd lists are synchronized through the
  6907                   * kthread parking. This synchronizes the thread vs users,
  6908                   * the users are synchronized on the sqd->ctx_lock.
  6909                   */
  6910                  if (kthread_should_park())
  6911                          kthread_parkme();
  6912  
  6913                  if (unlikely(!list_empty(&sqd->ctx_new_list))) {
  6914                          io_sqd_init_new(sqd);
  6915                          timeout = jiffies + sqd->sq_thread_idle;
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
timeout not set on else path.

  6916                  }
  6917  
  6918                  sqt_spin = false;
  6919                  cap_entries = !list_is_singular(&sqd->ctx_list);
  6920                  list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) {
  6921                          if (current->cred != ctx->creds) {
  6922                                  if (old_cred)
  6923                                          revert_creds(old_cred);
  6924                                  old_cred = override_creds(ctx->creds);
  6925                          }
  6926                          io_sq_thread_associate_blkcg(ctx, &cur_css);
  6927  #ifdef CONFIG_AUDIT
  6928                          current->loginuid = ctx->loginuid;
  6929                          current->sessionid = ctx->sessionid;
  6930  #endif
  6931  
  6932                          ret = __io_sq_thread(ctx, cap_entries);
  6933                          if (!sqt_spin && (ret > 0 || !list_empty(&ctx->iopoll_list)))
  6934                                  sqt_spin = true;
  6935  
  6936                          io_sq_thread_drop_mm_files();
  6937                  }
  6938  
  6939                  if (sqt_spin || !time_after(jiffies, timeout)) {
                                                             ^^^^^^^
warning

  6940                          io_run_task_work();
  6941                          cond_resched();
  6942                          if (sqt_spin)
  6943                                  timeout = jiffies + sqd->sq_thread_idle;
  6944                          continue;
  6945                  }
  6946  
  6947                  if (kthread_should_park())
  6948                          continue;
  6949  
  6950                  needs_sched = true;
  6951                  prepare_to_wait(&sqd->wait, &wait, TASK_INTERRUPTIBLE);
  6952                  list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) {
  6953                          if ((ctx->flags & IORING_SETUP_IOPOLL) &&
  6954                              !list_empty_careful(&ctx->iopoll_list)) {
  6955                                  needs_sched = false;
  6956                                  break;
  6957                          }
  6958                          if (io_sqring_entries(ctx)) {
  6959                                  needs_sched = false;
  6960                                  break;
  6961                          }
  6962                  }
  6963  
  6964                  if (needs_sched) {
  6965                          list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
  6966                                  io_ring_set_wakeup_flag(ctx);
  6967  
  6968                          schedule();
  6969                          list_for_each_entry(ctx, &sqd->ctx_list, sqd_list)
  6970                                  io_ring_clear_wakeup_flag(ctx);
  6971                  }
  6972  
  6973                  finish_wait(&sqd->wait, &wait);
  6974                  timeout = jiffies + sqd->sq_thread_idle;
  6975          }
  6976  
  6977          io_run_task_work();
  6978  
  6979          if (cur_css)
  6980                  io_sq_thread_unassociate_blkcg();
  6981          if (old_cred)
  6982                  revert_creds(old_cred);
  6983  
  6984          task_lock(current);
  6985          current->files = old_files;
  6986          current->nsproxy = old_nsproxy;
  6987          current->thread_pid = old_thread_pid;
  6988          task_unlock(current);
  6989  
  6990          kthread_parkme();
  6991  
  6992          return 0;
  6993  }

regards,
dan carpenter



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux