mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
qemu & hypervisor: move job object into hypervisor
This patch moves qemuDomainJobObj into hypervisor/ as generalized virDomainJobObj along with generalized private job callbacks as virDomainObjPrivateJobCallbacks. Signed-off-by: Kristina Hanicova <khanicov@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
2e480f0c64
commit
badb7972fd
@ -9,6 +9,9 @@
|
||||
|
||||
#include "internal.h"
|
||||
#include "virenum.h"
|
||||
#include "virthread.h"
|
||||
#include "virbuffer.h"
|
||||
#include "domain_conf.h"
|
||||
|
||||
#define JOB_MASK(job) (job == 0 ? 0 : 1 << (job - 1))
|
||||
#define VIR_JOB_DEFAULT_MASK \
|
||||
@ -101,6 +104,7 @@ struct _virDomainJobDataPrivateDataCallbacks {
|
||||
virDomainJobDataPrivateDataFree freePrivateData;
|
||||
};
|
||||
|
||||
|
||||
typedef struct _virDomainJobData virDomainJobData;
|
||||
struct _virDomainJobData {
|
||||
virDomainJobType jobType;
|
||||
@ -142,3 +146,61 @@ virDomainJobDataCopy(virDomainJobData *data);
|
||||
|
||||
virDomainJobType
|
||||
virDomainJobStatusToType(virDomainJobStatus status);
|
||||
|
||||
|
||||
typedef struct _virDomainObjPrivateJobCallbacks virDomainObjPrivateJobCallbacks;
|
||||
|
||||
typedef struct _virDomainJobObj virDomainJobObj;
|
||||
struct _virDomainJobObj {
|
||||
virCond cond; /* Use to coordinate jobs */
|
||||
|
||||
int jobsQueued;
|
||||
|
||||
/* The following members are for VIR_JOB_* */
|
||||
virDomainJob active; /* currently running job */
|
||||
unsigned long long owner; /* Thread id which set current job */
|
||||
char *ownerAPI; /* The API which owns the job */
|
||||
unsigned long long started; /* When the current job started */
|
||||
|
||||
/* The following members are for VIR_AGENT_JOB_* */
|
||||
virDomainAgentJob agentActive; /* Currently running agent job */
|
||||
unsigned long long agentOwner; /* Thread id which set current agent job */
|
||||
char *agentOwnerAPI; /* The API which owns the agent job */
|
||||
unsigned long long agentStarted; /* When the current agent job started */
|
||||
|
||||
/* The following members are for VIR_ASYNC_JOB_* */
|
||||
virCond asyncCond; /* Use to coordinate with async jobs */
|
||||
virDomainAsyncJob asyncJob; /* Currently active async job */
|
||||
unsigned long long asyncOwner; /* Thread which set current async job */
|
||||
char *asyncOwnerAPI; /* The API which owns the async job */
|
||||
unsigned long long asyncStarted; /* When the current async job started */
|
||||
int phase; /* Job phase (mainly for migrations) */
|
||||
unsigned long long mask; /* Jobs allowed during async job */
|
||||
virDomainJobData *current; /* async job progress data */
|
||||
virDomainJobData *completed; /* statistics data of a recently completed job */
|
||||
bool abortJob; /* abort of the job requested */
|
||||
char *error; /* job event completion error */
|
||||
unsigned long apiFlags; /* flags passed to the API which started the async job */
|
||||
|
||||
void *privateData; /* job specific collection of data */
|
||||
virDomainObjPrivateJobCallbacks *cb;
|
||||
};
|
||||
|
||||
|
||||
typedef void *(*virDomainObjPrivateJobAlloc)(void);
|
||||
typedef void (*virDomainObjPrivateJobFree)(void *);
|
||||
typedef void (*virDomainObjPrivateJobReset)(void *);
|
||||
typedef int (*virDomainObjPrivateJobFormat)(virBuffer *,
|
||||
virDomainJobObj *,
|
||||
virDomainObj *);
|
||||
typedef int (*virDomainObjPrivateJobParse)(xmlXPathContextPtr,
|
||||
virDomainJobObj *,
|
||||
virDomainObj *);
|
||||
|
||||
struct _virDomainObjPrivateJobCallbacks {
|
||||
virDomainObjPrivateJobAlloc allocJobPrivate;
|
||||
virDomainObjPrivateJobFree freeJobPrivate;
|
||||
virDomainObjPrivateJobReset resetJobPrivate;
|
||||
virDomainObjPrivateJobFormat formatJob;
|
||||
virDomainObjPrivateJobParse parseJob;
|
||||
};
|
||||
|
@ -199,7 +199,7 @@ qemuDomainObjPrivateXMLFormatMigrateTempBitmap(virBuffer *buf,
|
||||
|
||||
static int
|
||||
qemuDomainFormatJobPrivate(virBuffer *buf,
|
||||
qemuDomainJobObj *job,
|
||||
virDomainJobObj *job,
|
||||
virDomainObj *vm)
|
||||
{
|
||||
qemuDomainJobPrivate *priv = job->privateData;
|
||||
@ -342,7 +342,7 @@ qemuDomainObjPrivateXMLParseMigrateTempBitmap(qemuDomainJobPrivate *jobPriv,
|
||||
|
||||
static int
|
||||
qemuDomainParseJobPrivate(xmlXPathContextPtr ctxt,
|
||||
qemuDomainJobObj *job,
|
||||
virDomainJobObj *job,
|
||||
virDomainObj *vm)
|
||||
{
|
||||
qemuDomainJobPrivate *priv = job->privateData;
|
||||
@ -360,7 +360,7 @@ qemuDomainParseJobPrivate(xmlXPathContextPtr ctxt,
|
||||
}
|
||||
|
||||
|
||||
static qemuDomainObjPrivateJobCallbacks qemuPrivateJobCallbacks = {
|
||||
static virDomainObjPrivateJobCallbacks qemuPrivateJobCallbacks = {
|
||||
.allocJobPrivate = qemuJobAllocPrivate,
|
||||
.freeJobPrivate = qemuJobFreePrivate,
|
||||
.resetJobPrivate = qemuJobResetPrivate,
|
||||
|
@ -99,7 +99,7 @@ typedef struct _qemuDomainObjPrivate qemuDomainObjPrivate;
|
||||
struct _qemuDomainObjPrivate {
|
||||
virQEMUDriver *driver;
|
||||
|
||||
qemuDomainJobObj job;
|
||||
virDomainJobObj job;
|
||||
|
||||
virBitmap *namespaces;
|
||||
|
||||
|
@ -151,8 +151,8 @@ qemuDomainEventEmitJobCompleted(virQEMUDriver *driver,
|
||||
|
||||
|
||||
int
|
||||
qemuDomainObjInitJob(qemuDomainJobObj *job,
|
||||
qemuDomainObjPrivateJobCallbacks *cb)
|
||||
qemuDomainObjInitJob(virDomainJobObj *job,
|
||||
virDomainObjPrivateJobCallbacks *cb)
|
||||
{
|
||||
memset(job, 0, sizeof(*job));
|
||||
job->cb = cb;
|
||||
@ -177,7 +177,7 @@ qemuDomainObjInitJob(qemuDomainJobObj *job,
|
||||
|
||||
|
||||
static void
|
||||
qemuDomainObjResetJob(qemuDomainJobObj *job)
|
||||
qemuDomainObjResetJob(virDomainJobObj *job)
|
||||
{
|
||||
job->active = VIR_JOB_NONE;
|
||||
job->owner = 0;
|
||||
@ -187,7 +187,7 @@ qemuDomainObjResetJob(qemuDomainJobObj *job)
|
||||
|
||||
|
||||
static void
|
||||
qemuDomainObjResetAgentJob(qemuDomainJobObj *job)
|
||||
qemuDomainObjResetAgentJob(virDomainJobObj *job)
|
||||
{
|
||||
job->agentActive = VIR_AGENT_JOB_NONE;
|
||||
job->agentOwner = 0;
|
||||
@ -197,7 +197,7 @@ qemuDomainObjResetAgentJob(qemuDomainJobObj *job)
|
||||
|
||||
|
||||
static void
|
||||
qemuDomainObjResetAsyncJob(qemuDomainJobObj *job)
|
||||
qemuDomainObjResetAsyncJob(virDomainJobObj *job)
|
||||
{
|
||||
job->asyncJob = VIR_ASYNC_JOB_NONE;
|
||||
job->asyncOwner = 0;
|
||||
@ -226,7 +226,7 @@ qemuDomainObjResetAsyncJob(qemuDomainJobObj *job)
|
||||
*/
|
||||
int
|
||||
qemuDomainObjPreserveJob(virDomainObj *obj,
|
||||
qemuDomainJobObj *job)
|
||||
virDomainJobObj *job)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = obj->privateData;
|
||||
|
||||
@ -262,7 +262,7 @@ qemuDomainObjRestoreAsyncJob(virDomainObj *vm,
|
||||
unsigned long long allowedJobs)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
qemuDomainJobObj *job = &priv->job;
|
||||
virDomainJobObj *job = &priv->job;
|
||||
|
||||
VIR_DEBUG("Restoring %s async job for domain %s",
|
||||
virDomainAsyncJobTypeToString(asyncJob), vm->def->name);
|
||||
@ -287,7 +287,7 @@ qemuDomainObjRestoreAsyncJob(virDomainObj *vm,
|
||||
|
||||
|
||||
void
|
||||
qemuDomainObjClearJob(qemuDomainJobObj *job)
|
||||
qemuDomainObjClearJob(virDomainJobObj *job)
|
||||
{
|
||||
qemuDomainObjResetJob(job);
|
||||
qemuDomainObjResetAsyncJob(job);
|
||||
@ -820,7 +820,7 @@ qemuDomainObjReleaseAsyncJob(virDomainObj *obj)
|
||||
}
|
||||
|
||||
static bool
|
||||
qemuDomainNestedJobAllowed(qemuDomainJobObj *jobs, virDomainJob newJob)
|
||||
qemuDomainNestedJobAllowed(virDomainJobObj *jobs, virDomainJob newJob)
|
||||
{
|
||||
return !jobs->asyncJob ||
|
||||
newJob == VIR_JOB_NONE ||
|
||||
@ -828,7 +828,7 @@ qemuDomainNestedJobAllowed(qemuDomainJobObj *jobs, virDomainJob newJob)
|
||||
}
|
||||
|
||||
static bool
|
||||
qemuDomainObjCanSetJob(qemuDomainJobObj *job,
|
||||
qemuDomainObjCanSetJob(virDomainJobObj *job,
|
||||
virDomainJob newJob,
|
||||
virDomainAgentJob newAgentJob)
|
||||
{
|
||||
@ -1308,7 +1308,7 @@ qemuDomainObjPrivateXMLParseJob(virDomainObj *vm,
|
||||
xmlXPathContextPtr ctxt)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
qemuDomainJobObj *job = &priv->job;
|
||||
virDomainJobObj *job = &priv->job;
|
||||
VIR_XPATH_NODE_AUTORESTORE(ctxt)
|
||||
g_autofree char *tmp = NULL;
|
||||
|
||||
|
@ -60,62 +60,6 @@ struct _qemuDomainJobDataPrivate {
|
||||
|
||||
extern virDomainJobDataPrivateDataCallbacks qemuJobDataPrivateDataCallbacks;
|
||||
|
||||
typedef struct _qemuDomainJobObj qemuDomainJobObj;
|
||||
|
||||
typedef void *(*qemuDomainObjPrivateJobAlloc)(void);
|
||||
typedef void (*qemuDomainObjPrivateJobFree)(void *);
|
||||
typedef void (*qemuDomainObjPrivateJobReset)(void *);
|
||||
typedef int (*qemuDomainObjPrivateJobFormat)(virBuffer *,
|
||||
qemuDomainJobObj *,
|
||||
virDomainObj *);
|
||||
typedef int (*qemuDomainObjPrivateJobParse)(xmlXPathContextPtr,
|
||||
qemuDomainJobObj *,
|
||||
virDomainObj *);
|
||||
|
||||
typedef struct _qemuDomainObjPrivateJobCallbacks qemuDomainObjPrivateJobCallbacks;
|
||||
struct _qemuDomainObjPrivateJobCallbacks {
|
||||
qemuDomainObjPrivateJobAlloc allocJobPrivate;
|
||||
qemuDomainObjPrivateJobFree freeJobPrivate;
|
||||
qemuDomainObjPrivateJobReset resetJobPrivate;
|
||||
qemuDomainObjPrivateJobFormat formatJob;
|
||||
qemuDomainObjPrivateJobParse parseJob;
|
||||
};
|
||||
|
||||
struct _qemuDomainJobObj {
|
||||
virCond cond; /* Use to coordinate jobs */
|
||||
|
||||
int jobsQueued;
|
||||
|
||||
/* The following members are for VIR_JOB_* */
|
||||
virDomainJob active; /* Currently running job */
|
||||
unsigned long long owner; /* Thread id which set current job */
|
||||
char *ownerAPI; /* The API which owns the job */
|
||||
unsigned long long started; /* When the current job started */
|
||||
|
||||
/* The following members are for VIR_AGENT_JOB_* */
|
||||
virDomainAgentJob agentActive; /* Currently running agent job */
|
||||
unsigned long long agentOwner; /* Thread id which set current agent job */
|
||||
char *agentOwnerAPI; /* The API which owns the agent job */
|
||||
unsigned long long agentStarted; /* When the current agent job started */
|
||||
|
||||
/* The following members are for VIR_ASYNC_JOB_* */
|
||||
virCond asyncCond; /* Use to coordinate with async jobs */
|
||||
virDomainAsyncJob asyncJob; /* Currently active async job */
|
||||
unsigned long long asyncOwner; /* Thread which set current async job */
|
||||
char *asyncOwnerAPI; /* The API which owns the async job */
|
||||
unsigned long long asyncStarted; /* When the current async job started */
|
||||
int phase; /* Job phase (mainly for migrations) */
|
||||
unsigned long long mask; /* Jobs allowed during async job */
|
||||
virDomainJobData *current; /* async job progress data */
|
||||
virDomainJobData *completed; /* statistics data of a recently completed job */
|
||||
bool abortJob; /* abort of the job requested */
|
||||
char *error; /* job event completion error */
|
||||
unsigned long apiFlags; /* flags passed to the API which started the async job */
|
||||
|
||||
void *privateData; /* job specific collection of data */
|
||||
qemuDomainObjPrivateJobCallbacks *cb;
|
||||
};
|
||||
|
||||
void qemuDomainJobSetStatsType(virDomainJobData *jobData,
|
||||
qemuDomainJobStatsType type);
|
||||
|
||||
@ -162,7 +106,7 @@ qemuDomainObjStartJobPhase(virDomainObj *obj,
|
||||
void qemuDomainObjSetAsyncJobMask(virDomainObj *obj,
|
||||
unsigned long long allowedJobs);
|
||||
int qemuDomainObjPreserveJob(virDomainObj *obj,
|
||||
qemuDomainJobObj *job);
|
||||
virDomainJobObj *job);
|
||||
void
|
||||
qemuDomainObjRestoreAsyncJob(virDomainObj *vm,
|
||||
virDomainAsyncJob asyncJob,
|
||||
@ -191,12 +135,12 @@ int qemuDomainJobDataToParams(virDomainJobData *jobData,
|
||||
|
||||
bool qemuDomainTrackJob(virDomainJob job);
|
||||
|
||||
void qemuDomainObjClearJob(qemuDomainJobObj *job);
|
||||
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(qemuDomainJobObj, qemuDomainObjClearJob);
|
||||
void qemuDomainObjClearJob(virDomainJobObj *job);
|
||||
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virDomainJobObj, qemuDomainObjClearJob);
|
||||
|
||||
int
|
||||
qemuDomainObjInitJob(qemuDomainJobObj *job,
|
||||
qemuDomainObjPrivateJobCallbacks *cb);
|
||||
qemuDomainObjInitJob(virDomainJobObj *job,
|
||||
virDomainObjPrivateJobCallbacks *cb);
|
||||
|
||||
int
|
||||
qemuDomainObjPrivateXMLFormatJob(virBuffer *buf,
|
||||
|
@ -6385,7 +6385,7 @@ qemuMigrationDstComplete(virQEMUDriver *driver,
|
||||
virDomainObj *vm,
|
||||
bool inPostCopy,
|
||||
virDomainAsyncJob asyncJob,
|
||||
qemuDomainJobObj *job)
|
||||
virDomainJobObj *job)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
qemuDomainJobPrivate *jobPriv = job->privateData;
|
||||
|
@ -204,7 +204,7 @@ qemuMigrationDstComplete(virQEMUDriver *driver,
|
||||
virDomainObj *vm,
|
||||
bool inPostCopy,
|
||||
virDomainAsyncJob asyncJob,
|
||||
qemuDomainJobObj *job);
|
||||
virDomainJobObj *job);
|
||||
|
||||
int
|
||||
qemuMigrationSrcConfirm(virQEMUDriver *driver,
|
||||
|
@ -1181,7 +1181,7 @@ qemuMigrationParamsGetULL(qemuMigrationParams *migParams,
|
||||
* qemuMigrationParamsCheck:
|
||||
*
|
||||
* Check supported migration parameters and keep their original values in
|
||||
* qemuDomainJobObj so that we can properly reset them at the end of migration.
|
||||
* virDomainJobObj so that we can properly reset them at the end of migration.
|
||||
* Reports an error if any of the currently used capabilities in @migParams
|
||||
* are unsupported by QEMU.
|
||||
*/
|
||||
|
@ -3457,7 +3457,7 @@ qemuProcessCleanupMigrationJob(virQEMUDriver *driver,
|
||||
|
||||
static void
|
||||
qemuProcessRestoreMigrationJob(virDomainObj *vm,
|
||||
qemuDomainJobObj *job)
|
||||
virDomainJobObj *job)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
qemuDomainJobPrivate *jobPriv = job->privateData;
|
||||
@ -3496,7 +3496,7 @@ qemuProcessRestoreMigrationJob(virDomainObj *vm,
|
||||
static int
|
||||
qemuProcessRecoverMigrationIn(virQEMUDriver *driver,
|
||||
virDomainObj *vm,
|
||||
qemuDomainJobObj *job,
|
||||
virDomainJobObj *job,
|
||||
virDomainState state)
|
||||
{
|
||||
VIR_DEBUG("Active incoming migration in phase %s",
|
||||
@ -3567,7 +3567,7 @@ qemuProcessRecoverMigrationIn(virQEMUDriver *driver,
|
||||
static int
|
||||
qemuProcessRecoverMigrationOut(virQEMUDriver *driver,
|
||||
virDomainObj *vm,
|
||||
qemuDomainJobObj *job,
|
||||
virDomainJobObj *job,
|
||||
virDomainJobStatus migStatus,
|
||||
virDomainState state,
|
||||
int reason,
|
||||
@ -3673,7 +3673,7 @@ qemuProcessRecoverMigrationOut(virQEMUDriver *driver,
|
||||
static int
|
||||
qemuProcessRecoverMigration(virQEMUDriver *driver,
|
||||
virDomainObj *vm,
|
||||
qemuDomainJobObj *job,
|
||||
virDomainJobObj *job,
|
||||
unsigned int *stopFlags)
|
||||
{
|
||||
virDomainJobStatus migStatus = VIR_DOMAIN_JOB_STATUS_NONE;
|
||||
@ -3735,7 +3735,7 @@ qemuProcessRecoverMigration(virQEMUDriver *driver,
|
||||
static int
|
||||
qemuProcessRecoverJob(virQEMUDriver *driver,
|
||||
virDomainObj *vm,
|
||||
qemuDomainJobObj *job,
|
||||
virDomainJobObj *job,
|
||||
unsigned int *stopFlags)
|
||||
{
|
||||
qemuDomainObjPrivate *priv = vm->privateData;
|
||||
@ -8866,7 +8866,7 @@ qemuProcessReconnect(void *opaque)
|
||||
virQEMUDriver *driver = data->driver;
|
||||
virDomainObj *obj = data->obj;
|
||||
qemuDomainObjPrivate *priv;
|
||||
g_auto(qemuDomainJobObj) oldjob = {
|
||||
g_auto(virDomainJobObj) oldjob = {
|
||||
.cb = NULL,
|
||||
};
|
||||
int state;
|
||||
|
Loading…
x
Reference in New Issue
Block a user