Blame SOURCES/kvm-job-Add-job_transition_to_ready.patch

1bdc94
From 0bf028e317ae12d5559465d15a5780de8abfe464 Mon Sep 17 00:00:00 2001
1bdc94
From: Kevin Wolf <kwolf@redhat.com>
1bdc94
Date: Tue, 26 Jun 2018 09:48:28 +0200
1bdc94
Subject: [PATCH 59/89] job: Add job_transition_to_ready()
1bdc94
1bdc94
RH-Author: Kevin Wolf <kwolf@redhat.com>
1bdc94
Message-id: <20180626094856.6924-46-kwolf@redhat.com>
1bdc94
Patchwork-id: 81114
1bdc94
O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH v2 45/73] job: Add job_transition_to_ready()
1bdc94
Bugzilla: 1513543
1bdc94
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
1bdc94
RH-Acked-by: Max Reitz <mreitz@redhat.com>
1bdc94
RH-Acked-by: Fam Zheng <famz@redhat.com>
1bdc94
1bdc94
The transition to the READY state was still performed in the BlockJob
1bdc94
layer, in the same function that sent the BLOCK_JOB_READY QMP event.
1bdc94
1bdc94
This patch brings the state transition to the Job layer and implements
1bdc94
the QMP event using a notifier called from the Job layer, like we
1bdc94
already do for other events related to state transitions.
1bdc94
1bdc94
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
1bdc94
Reviewed-by: Max Reitz <mreitz@redhat.com>
1bdc94
(cherry picked from commit 2e1795b58131427719c7cd11f8b9b6984b3f24f8)
1bdc94
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
1bdc94
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
1bdc94
---
1bdc94
 block/mirror.c               |  6 +++---
1bdc94
 blockjob.c                   | 33 ++++++++++++++++++---------------
1bdc94
 include/block/blockjob.h     |  3 +++
1bdc94
 include/block/blockjob_int.h |  8 --------
1bdc94
 include/qemu/job.h           |  9 ++++++---
1bdc94
 job.c                        | 16 +++++++++++++---
1bdc94
 tests/test-bdrv-drain.c      |  2 +-
1bdc94
 tests/test-blockjob.c        |  2 +-
1bdc94
 8 files changed, 45 insertions(+), 34 deletions(-)
1bdc94
1bdc94
diff --git a/block/mirror.c b/block/mirror.c
1bdc94
index 687f955..bdc1b5b 100644
1bdc94
--- a/block/mirror.c
1bdc94
+++ b/block/mirror.c
1bdc94
@@ -727,8 +727,8 @@ static void coroutine_fn mirror_run(void *opaque)
1bdc94
     }
1bdc94
 
1bdc94
     if (s->bdev_length == 0) {
1bdc94
-        /* Report BLOCK_JOB_READY and wait for complete. */
1bdc94
-        block_job_event_ready(&s->common);
1bdc94
+        /* Transition to the READY state and wait for complete. */
1bdc94
+        job_transition_to_ready(&s->common.job);
1bdc94
         s->synced = true;
1bdc94
         while (!job_is_cancelled(&s->common.job) && !s->should_complete) {
1bdc94
             job_yield(&s->common.job);
1bdc94
@@ -824,7 +824,7 @@ static void coroutine_fn mirror_run(void *opaque)
1bdc94
                  * report completion.  This way, block-job-cancel will leave
1bdc94
                  * the target in a consistent state.
1bdc94
                  */
1bdc94
-                block_job_event_ready(&s->common);
1bdc94
+                job_transition_to_ready(&s->common.job);
1bdc94
                 s->synced = true;
1bdc94
             }
1bdc94
 
1bdc94
diff --git a/blockjob.c b/blockjob.c
1bdc94
index 38f18e9..da11b3b 100644
1bdc94
--- a/blockjob.c
1bdc94
+++ b/blockjob.c
1bdc94
@@ -338,6 +338,22 @@ static void block_job_event_pending(Notifier *n, void *opaque)
1bdc94
                                       &error_abort);
1bdc94
 }
1bdc94
 
1bdc94
+static void block_job_event_ready(Notifier *n, void *opaque)
1bdc94
+{
1bdc94
+    BlockJob *job = opaque;
1bdc94
+
1bdc94
+    if (block_job_is_internal(job)) {
1bdc94
+        return;
1bdc94
+    }
1bdc94
+
1bdc94
+    qapi_event_send_block_job_ready(job_type(&job->job),
1bdc94
+                                    job->job.id,
1bdc94
+                                    job->len,
1bdc94
+                                    job->offset,
1bdc94
+                                    job->speed, &error_abort);
1bdc94
+}
1bdc94
+
1bdc94
+
1bdc94
 /*
1bdc94
  * API for block job drivers and the block layer.  These functions are
1bdc94
  * declared in blockjob_int.h.
1bdc94
@@ -386,12 +402,14 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver,
1bdc94
     job->finalize_cancelled_notifier.notify = block_job_event_cancelled;
1bdc94
     job->finalize_completed_notifier.notify = block_job_event_completed;
1bdc94
     job->pending_notifier.notify = block_job_event_pending;
1bdc94
+    job->ready_notifier.notify = block_job_event_ready;
1bdc94
 
1bdc94
     notifier_list_add(&job->job.on_finalize_cancelled,
1bdc94
                       &job->finalize_cancelled_notifier);
1bdc94
     notifier_list_add(&job->job.on_finalize_completed,
1bdc94
                       &job->finalize_completed_notifier);
1bdc94
     notifier_list_add(&job->job.on_pending, &job->pending_notifier);
1bdc94
+    notifier_list_add(&job->job.on_ready, &job->ready_notifier);
1bdc94
 
1bdc94
     error_setg(&job->blocker, "block device is in use by block job: %s",
1bdc94
                job_type_str(&job->job));
1bdc94
@@ -433,21 +451,6 @@ void block_job_user_resume(Job *job)
1bdc94
     block_job_iostatus_reset(bjob);
1bdc94
 }
1bdc94
 
1bdc94
-void block_job_event_ready(BlockJob *job)
1bdc94
-{
1bdc94
-    job_state_transition(&job->job, JOB_STATUS_READY);
1bdc94
-
1bdc94
-    if (block_job_is_internal(job)) {
1bdc94
-        return;
1bdc94
-    }
1bdc94
-
1bdc94
-    qapi_event_send_block_job_ready(job_type(&job->job),
1bdc94
-                                    job->job.id,
1bdc94
-                                    job->len,
1bdc94
-                                    job->offset,
1bdc94
-                                    job->speed, &error_abort);
1bdc94
-}
1bdc94
-
1bdc94
 BlockErrorAction block_job_error_action(BlockJob *job, BlockdevOnError on_err,
1bdc94
                                         int is_read, int error)
1bdc94
 {
1bdc94
diff --git a/include/block/blockjob.h b/include/block/blockjob.h
1bdc94
index 8e1e1ee..4fca45f 100644
1bdc94
--- a/include/block/blockjob.h
1bdc94
+++ b/include/block/blockjob.h
1bdc94
@@ -76,6 +76,9 @@ typedef struct BlockJob {
1bdc94
     /** Called when the job transitions to PENDING */
1bdc94
     Notifier pending_notifier;
1bdc94
 
1bdc94
+    /** Called when the job transitions to READY */
1bdc94
+    Notifier ready_notifier;
1bdc94
+
1bdc94
     /** BlockDriverStates that are involved in this block job */
1bdc94
     GSList *nodes;
1bdc94
 } BlockJob;
1bdc94
diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h
1bdc94
index 806ac64..5cd50c6 100644
1bdc94
--- a/include/block/blockjob_int.h
1bdc94
+++ b/include/block/blockjob_int.h
1bdc94
@@ -116,14 +116,6 @@ void block_job_drain(Job *job);
1bdc94
 int64_t block_job_ratelimit_get_delay(BlockJob *job, uint64_t n);
1bdc94
 
1bdc94
 /**
1bdc94
- * block_job_event_ready:
1bdc94
- * @job: The job which is now ready to be completed.
1bdc94
- *
1bdc94
- * Send a BLOCK_JOB_READY event for the specified job.
1bdc94
- */
1bdc94
-void block_job_event_ready(BlockJob *job);
1bdc94
-
1bdc94
-/**
1bdc94
  * block_job_error_action:
1bdc94
  * @job: The job to signal an error for.
1bdc94
  * @on_err: The error action setting.
1bdc94
diff --git a/include/qemu/job.h b/include/qemu/job.h
1bdc94
index 487f9d9..bfc2bc5 100644
1bdc94
--- a/include/qemu/job.h
1bdc94
+++ b/include/qemu/job.h
1bdc94
@@ -132,6 +132,9 @@ typedef struct Job {
1bdc94
     /** Notifiers called when the job transitions to PENDING */
1bdc94
     NotifierList on_pending;
1bdc94
 
1bdc94
+    /** Notifiers called when the job transitions to READY */
1bdc94
+    NotifierList on_ready;
1bdc94
+
1bdc94
     /** Element of the list of jobs */
1bdc94
     QLIST_ENTRY(Job) job_list;
1bdc94
 
1bdc94
@@ -426,6 +429,9 @@ int job_apply_verb(Job *job, JobVerb verb, Error **errp);
1bdc94
 /** The @job could not be started, free it. */
1bdc94
 void job_early_fail(Job *job);
1bdc94
 
1bdc94
+/** Moves the @job from RUNNING to READY */
1bdc94
+void job_transition_to_ready(Job *job);
1bdc94
+
1bdc94
 /**
1bdc94
  * @job: The job being completed.
1bdc94
  * @ret: The status code.
1bdc94
@@ -522,7 +528,4 @@ void job_defer_to_main_loop(Job *job, JobDeferToMainLoopFn *fn, void *opaque);
1bdc94
  */
1bdc94
 int job_finish_sync(Job *job, void (*finish)(Job *, Error **errp), Error **errp);
1bdc94
 
1bdc94
-/* TODO To be removed from the public interface */
1bdc94
-void job_state_transition(Job *job, JobStatus s1);
1bdc94
-
1bdc94
 #endif
1bdc94
diff --git a/job.c b/job.c
1bdc94
index aa4c746..b5bd51b 100644
1bdc94
--- a/job.c
1bdc94
+++ b/job.c
1bdc94
@@ -157,9 +157,7 @@ static int job_txn_apply(JobTxn *txn, int fn(Job *), bool lock)
1bdc94
     return rc;
1bdc94
 }
1bdc94
 
1bdc94
-
1bdc94
-/* TODO Make static once the whole state machine is in job.c */
1bdc94
-void job_state_transition(Job *job, JobStatus s1)
1bdc94
+static void job_state_transition(Job *job, JobStatus s1)
1bdc94
 {
1bdc94
     JobStatus s0 = job->status;
1bdc94
     assert(s1 >= 0 && s1 <= JOB_STATUS__MAX);
1bdc94
@@ -321,6 +319,7 @@ void *job_create(const char *job_id, const JobDriver *driver, JobTxn *txn,
1bdc94
     notifier_list_init(&job->on_finalize_cancelled);
1bdc94
     notifier_list_init(&job->on_finalize_completed);
1bdc94
     notifier_list_init(&job->on_pending);
1bdc94
+    notifier_list_init(&job->on_ready);
1bdc94
 
1bdc94
     job_state_transition(job, JOB_STATUS_CREATED);
1bdc94
     aio_timer_init(qemu_get_aio_context(), &job->sleep_timer,
1bdc94
@@ -380,6 +379,11 @@ static void job_event_pending(Job *job)
1bdc94
     notifier_list_notify(&job->on_pending, job);
1bdc94
 }
1bdc94
 
1bdc94
+static void job_event_ready(Job *job)
1bdc94
+{
1bdc94
+    notifier_list_notify(&job->on_ready, job);
1bdc94
+}
1bdc94
+
1bdc94
 void job_enter_cond(Job *job, bool(*fn)(Job *job))
1bdc94
 {
1bdc94
     if (!job_started(job)) {
1bdc94
@@ -799,6 +803,12 @@ static int job_transition_to_pending(Job *job)
1bdc94
     return 0;
1bdc94
 }
1bdc94
 
1bdc94
+void job_transition_to_ready(Job *job)
1bdc94
+{
1bdc94
+    job_state_transition(job, JOB_STATUS_READY);
1bdc94
+    job_event_ready(job);
1bdc94
+}
1bdc94
+
1bdc94
 static void job_completed_txn_success(Job *job)
1bdc94
 {
1bdc94
     JobTxn *txn = job->txn;
1bdc94
diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c
1bdc94
index 3600ffd..2cba63b 100644
1bdc94
--- a/tests/test-bdrv-drain.c
1bdc94
+++ b/tests/test-bdrv-drain.c
1bdc94
@@ -505,7 +505,7 @@ static void coroutine_fn test_job_start(void *opaque)
1bdc94
 {
1bdc94
     TestBlockJob *s = opaque;
1bdc94
 
1bdc94
-    block_job_event_ready(&s->common);
1bdc94
+    job_transition_to_ready(&s->common.job);
1bdc94
     while (!s->should_complete) {
1bdc94
         job_sleep_ns(&s->common.job, 100000);
1bdc94
     }
1bdc94
diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c
1bdc94
index 8180d03..e408d52 100644
1bdc94
--- a/tests/test-blockjob.c
1bdc94
+++ b/tests/test-blockjob.c
1bdc94
@@ -186,7 +186,7 @@ static void coroutine_fn cancel_job_start(void *opaque)
1bdc94
         }
1bdc94
 
1bdc94
         if (!job_is_ready(&s->common.job) && s->should_converge) {
1bdc94
-            block_job_event_ready(&s->common);
1bdc94
+            job_transition_to_ready(&s->common.job);
1bdc94
         }
1bdc94
 
1bdc94
         job_sleep_ns(&s->common.job, 100000);
1bdc94
-- 
1bdc94
1.8.3.1
1bdc94