From: Anthony PERARD <anthony.perard@citrix.com> To: xen-devel@lists.xenproject.org Cc: Anthony PERARD <anthony.perard@citrix.com>, Wei Liu <wei.liu2@citrix.com>, Ian Jackson <ian.jackson@eu.citrix.com> Subject: [PATCH 3/9] libxl_internal: Split out userdata lock function Date: Tue, 9 Apr 2019 17:45:36 +0100 [thread overview] Message-ID: <20190409164542.30274-4-anthony.perard@citrix.com> (raw) In-Reply-To: <20190409164542.30274-1-anthony.perard@citrix.com> We are going to create a new lock and want to reuse the same machinery. Also, hide the detail of struct libxl__domain_userdata_lock as this is only useful as a pointer by the rest of libxl. No functional changes. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> --- tools/libxl/libxl_internal.c | 50 +++++++++++++++++++++++++++++------- tools/libxl/libxl_internal.h | 5 +--- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c index f492dae5ff..fa0bbc3960 100644 --- a/tools/libxl/libxl_internal.c +++ b/tools/libxl/libxl_internal.c @@ -397,21 +397,26 @@ int libxl__device_model_version_running(libxl__gc *gc, uint32_t domid) return value; } +typedef struct { + libxl__carefd *carefd; + char *path; /* path of the lock file itself */ +} libxl__generic_lock; +static void libxl__unlock_generic(libxl__generic_lock * const lock); + /* Portability note: this lock utilises flock(2) so a proper implementation of * flock(2) is required. */ -libxl__domain_userdata_lock *libxl__lock_domain_userdata(libxl__gc *gc, - uint32_t domid) +static int libxl__lock_generic(libxl__gc *gc, libxl_domid domid, + libxl__generic_lock * const lock, + const char *lock_name) { - libxl__domain_userdata_lock *lock = NULL; const char *lockfile; int fd; struct stat stab, fstab; - lockfile = libxl__userdata_path(gc, domid, "domain-userdata-lock", "l"); + lockfile = libxl__userdata_path(gc, domid, lock_name, "l"); if (!lockfile) goto out; - lock = libxl__zalloc(NOGC, sizeof(libxl__domain_userdata_lock)); lock->path = libxl__strdup(NOGC, lockfile); while (true) { @@ -464,14 +469,14 @@ libxl__domain_userdata_lock *libxl__lock_domain_userdata(libxl__gc *gc, if (libxl_domain_info(CTX, NULL, domid)) goto out; - return lock; + return 0; out: - if (lock) libxl__unlock_domain_userdata(lock); - return NULL; + if (lock) libxl__unlock_generic(lock); + return ERROR_FAIL; } -void libxl__unlock_domain_userdata(libxl__domain_userdata_lock *lock) +static void libxl__unlock_generic(libxl__generic_lock * const lock) { /* It's important to unlink the file before closing fd to avoid * the following race (if close before unlink): @@ -490,6 +495,33 @@ void libxl__unlock_domain_userdata(libxl__domain_userdata_lock *lock) if (lock->path) unlink(lock->path); if (lock->carefd) libxl__carefd_close(lock->carefd); free(lock->path); +} + + +struct libxl__domain_userdata_lock { + libxl__generic_lock lock; +}; + +libxl__domain_userdata_lock *libxl__lock_domain_userdata(libxl__gc *gc, + uint32_t domid) +{ + libxl__domain_userdata_lock *lock = NULL; + int rc; + + lock = libxl__zalloc(NOGC, sizeof(*lock)); + rc = libxl__lock_generic(gc, domid, &lock->lock, + "domain-userdata-lock"); + if (rc) { + libxl__unlock_domain_userdata(lock); + return NULL; + } + + return lock; +} + +void libxl__unlock_domain_userdata(libxl__domain_userdata_lock *lock) +{ + libxl__unlock_generic(&lock->lock); free(lock); } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 702acc6d5d..f1aefaf98a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4486,10 +4486,7 @@ static inline int libxl__key_value_list_is_empty(libxl_key_value_list *pkvl) int libxl__cpuid_policy_is_empty(libxl_cpuid_policy_list *pl); /* Portability note: a proper flock(2) implementation is required */ -typedef struct { - libxl__carefd *carefd; - char *path; /* path of the lock file itself */ -} libxl__domain_userdata_lock; +typedef struct libxl__domain_userdata_lock libxl__domain_userdata_lock; /* The CTX_LOCK must be held around uses of this lock */ libxl__domain_userdata_lock *libxl__lock_domain_userdata(libxl__gc *gc, uint32_t domid); -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel
WARNING: multiple messages have this Message-ID (diff)
From: Anthony PERARD <anthony.perard@citrix.com> To: <xen-devel@lists.xenproject.org> Cc: Anthony PERARD <anthony.perard@citrix.com>, Wei Liu <wei.liu2@citrix.com>, Ian Jackson <ian.jackson@eu.citrix.com> Subject: [Xen-devel] [PATCH 3/9] libxl_internal: Split out userdata lock function Date: Tue, 9 Apr 2019 17:45:36 +0100 [thread overview] Message-ID: <20190409164542.30274-4-anthony.perard@citrix.com> (raw) Message-ID: <20190409164536.mz7YbsKQutO8nyS32zkhXng2PYXm6-QXWR2utcvfs7Q@z> (raw) In-Reply-To: <20190409164542.30274-1-anthony.perard@citrix.com> We are going to create a new lock and want to reuse the same machinery. Also, hide the detail of struct libxl__domain_userdata_lock as this is only useful as a pointer by the rest of libxl. No functional changes. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> --- tools/libxl/libxl_internal.c | 50 +++++++++++++++++++++++++++++------- tools/libxl/libxl_internal.h | 5 +--- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c index f492dae5ff..fa0bbc3960 100644 --- a/tools/libxl/libxl_internal.c +++ b/tools/libxl/libxl_internal.c @@ -397,21 +397,26 @@ int libxl__device_model_version_running(libxl__gc *gc, uint32_t domid) return value; } +typedef struct { + libxl__carefd *carefd; + char *path; /* path of the lock file itself */ +} libxl__generic_lock; +static void libxl__unlock_generic(libxl__generic_lock * const lock); + /* Portability note: this lock utilises flock(2) so a proper implementation of * flock(2) is required. */ -libxl__domain_userdata_lock *libxl__lock_domain_userdata(libxl__gc *gc, - uint32_t domid) +static int libxl__lock_generic(libxl__gc *gc, libxl_domid domid, + libxl__generic_lock * const lock, + const char *lock_name) { - libxl__domain_userdata_lock *lock = NULL; const char *lockfile; int fd; struct stat stab, fstab; - lockfile = libxl__userdata_path(gc, domid, "domain-userdata-lock", "l"); + lockfile = libxl__userdata_path(gc, domid, lock_name, "l"); if (!lockfile) goto out; - lock = libxl__zalloc(NOGC, sizeof(libxl__domain_userdata_lock)); lock->path = libxl__strdup(NOGC, lockfile); while (true) { @@ -464,14 +469,14 @@ libxl__domain_userdata_lock *libxl__lock_domain_userdata(libxl__gc *gc, if (libxl_domain_info(CTX, NULL, domid)) goto out; - return lock; + return 0; out: - if (lock) libxl__unlock_domain_userdata(lock); - return NULL; + if (lock) libxl__unlock_generic(lock); + return ERROR_FAIL; } -void libxl__unlock_domain_userdata(libxl__domain_userdata_lock *lock) +static void libxl__unlock_generic(libxl__generic_lock * const lock) { /* It's important to unlink the file before closing fd to avoid * the following race (if close before unlink): @@ -490,6 +495,33 @@ void libxl__unlock_domain_userdata(libxl__domain_userdata_lock *lock) if (lock->path) unlink(lock->path); if (lock->carefd) libxl__carefd_close(lock->carefd); free(lock->path); +} + + +struct libxl__domain_userdata_lock { + libxl__generic_lock lock; +}; + +libxl__domain_userdata_lock *libxl__lock_domain_userdata(libxl__gc *gc, + uint32_t domid) +{ + libxl__domain_userdata_lock *lock = NULL; + int rc; + + lock = libxl__zalloc(NOGC, sizeof(*lock)); + rc = libxl__lock_generic(gc, domid, &lock->lock, + "domain-userdata-lock"); + if (rc) { + libxl__unlock_domain_userdata(lock); + return NULL; + } + + return lock; +} + +void libxl__unlock_domain_userdata(libxl__domain_userdata_lock *lock) +{ + libxl__unlock_generic(&lock->lock); free(lock); } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 702acc6d5d..f1aefaf98a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -4486,10 +4486,7 @@ static inline int libxl__key_value_list_is_empty(libxl_key_value_list *pkvl) int libxl__cpuid_policy_is_empty(libxl_cpuid_policy_list *pl); /* Portability note: a proper flock(2) implementation is required */ -typedef struct { - libxl__carefd *carefd; - char *path; /* path of the lock file itself */ -} libxl__domain_userdata_lock; +typedef struct libxl__domain_userdata_lock libxl__domain_userdata_lock; /* The CTX_LOCK must be held around uses of this lock */ libxl__domain_userdata_lock *libxl__lock_domain_userdata(libxl__gc *gc, uint32_t domid); -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2019-04-09 16:45 UTC|newest] Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-04-09 16:45 [PATCH 0/9] libxl: New slow lock + fix libxl_cdrom_insert with QEMU depriv Anthony PERARD 2019-04-09 16:45 ` [Xen-devel] " Anthony PERARD 2019-04-09 16:45 ` [PATCH 1/9] libxl_internal: Remove lost comment Anthony PERARD 2019-04-09 16:45 ` [Xen-devel] " Anthony PERARD 2019-04-10 9:18 ` Wei Liu 2019-04-10 9:18 ` [Xen-devel] " Wei Liu 2019-06-04 16:42 ` Ian Jackson 2019-04-09 16:45 ` [PATCH 2/9] libxl: Pointer on usage of libxl__domain_userdata_lock Anthony PERARD 2019-04-09 16:45 ` [Xen-devel] " Anthony PERARD 2019-06-04 16:46 ` Ian Jackson 2019-04-09 16:45 ` Anthony PERARD [this message] 2019-04-09 16:45 ` [Xen-devel] [PATCH 3/9] libxl_internal: Split out userdata lock function Anthony PERARD 2019-06-04 16:55 ` Ian Jackson 2019-04-09 16:45 ` [PATCH 4/9] libxl_internal: Create new lock for devices hotplug via QMP Anthony PERARD 2019-04-09 16:45 ` [Xen-devel] " Anthony PERARD 2019-06-04 17:11 ` Ian Jackson 2019-06-05 14:10 ` Anthony PERARD 2019-06-05 14:32 ` Ian Jackson 2019-04-09 16:45 ` [PATCH 5/9] libxl_disk: Reorganise libxl_cdrom_insert Anthony PERARD 2019-04-09 16:45 ` [Xen-devel] " Anthony PERARD 2019-06-04 17:16 ` Ian Jackson 2019-04-09 16:45 ` [PATCH 6/9] libxl_disk: Cut libxl_cdrom_insert into steps Anthony PERARD 2019-04-09 16:45 ` [Xen-devel] " Anthony PERARD 2019-06-04 17:29 ` Ian Jackson 2019-06-07 17:22 ` Anthony PERARD 2019-04-09 16:45 ` [PATCH 7/9] libxl: Move qmp_parameters_* prototypes to libxl_internal.h Anthony PERARD 2019-04-09 16:45 ` [Xen-devel] " Anthony PERARD 2019-06-04 17:32 ` Ian Jackson 2019-04-09 16:45 ` [PATCH 8/9] libxl_disk: Use ev_qmp in libxl_cdrom_insert Anthony PERARD 2019-04-09 16:45 ` [Xen-devel] " Anthony PERARD 2019-06-04 17:45 ` Ian Jackson 2019-04-09 16:45 ` [PATCH 9/9] libxl_disk: Implement missing timeout for libxl_cdrom_insert Anthony PERARD 2019-04-09 16:45 ` [Xen-devel] " Anthony PERARD 2019-06-04 17:47 ` Ian Jackson 2019-06-05 14:22 ` Anthony PERARD 2019-06-05 14:33 ` Ian Jackson 2019-06-04 10:54 ` [Xen-devel] Ping: [PATCH 0/9] libxl: New slow lock + fix libxl_cdrom_insert with QEMU depriv Anthony PERARD
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190409164542.30274-4-anthony.perard@citrix.com \ --to=anthony.perard@citrix.com \ --cc=ian.jackson@eu.citrix.com \ --cc=wei.liu2@citrix.com \ --cc=xen-devel@lists.xenproject.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.