All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marc-André Lureau" <marcandre.lureau@gmail.com>
To: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Cc: peterx@redhat.com, qemu-devel@nongnu.org, zhengchuan@huawei.com,
	 dovmurik@linux.vnet.ibm.com, hgcoin@gmail.com,
	 zhangjiachen.jaycee@bytedance.com, lvivier@redhat.com,
	stefanha@redhat.com,  vgoyal@redhat.com, jinyan12@huawei.com,
	ann.zhuangyanying@huawei.com,  quintela@redhat.com
Subject: Re: [PULL 23/26] monitor: Use LOCK_GUARD macros
Date: Tue, 7 Feb 2023 18:06:39 +0400	[thread overview]
Message-ID: <CAJ+F1CKLV_XG3pe_4YJD++-R71F5M4yepGOoR7nYocqs65y0fw@mail.gmail.com> (raw)
In-Reply-To: <Y+JVHUrYY2rFbBes@work-vm>

Hi

On Tue, Feb 7, 2023 at 5:41 PM Dr. David Alan Gilbert
<dgilbert@redhat.com> wrote:
>
> * Marc-André Lureau (marcandre.lureau@gmail.com) wrote:
> > Hi David
> >
> > On Fri, Sep 25, 2020 at 4:27 PM Dr. David Alan Gilbert (git)
> > <dgilbert@redhat.com> wrote:
> > >
> > > From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> > >
> > > Use the lock guard macros in monitor/misc.c - saves
> > > a lot of unlocks in error paths, and the occasional goto.
> > >
> > > Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> > > Message-Id: <20200922095741.101911-1-dgilbert@redhat.com>
> > > Reviewed-by: Markus Armbruster <armbru@redhat.com>
> > > Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> > > Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> > > ---
> > >  monitor/misc.c | 44 ++++++++++++++------------------------------
> > >  1 file changed, 14 insertions(+), 30 deletions(-)
> > >
> > > diff --git a/monitor/misc.c b/monitor/misc.c
> > > index 262f2bd951..6e0da0cb96 100644
> > > --- a/monitor/misc.c
> > > +++ b/monitor/misc.c
> > > @@ -141,13 +141,13 @@ char *qmp_human_monitor_command(const char *command_line, bool has_cpu_index,
> > >      handle_hmp_command(&hmp, command_line);
> > >      cur_mon = old_mon;
> > >
> > > -    qemu_mutex_lock(&hmp.common.mon_lock);
> > > -    if (qstring_get_length(hmp.common.outbuf) > 0) {
> > > -        output = g_strdup(qstring_get_str(hmp.common.outbuf));
> > > -    } else {
> > > -        output = g_strdup("");
> > > +    WITH_QEMU_LOCK_GUARD(&hmp.common.mon_lock) {
> > > +        if (qstring_get_length(hmp.common.outbuf) > 0) {
> > > +            output = g_strdup(qstring_get_str(hmp.common.outbuf));
> > > +        } else {
> > > +            output = g_strdup("");
> > > +        }
> > >      }
> > > -    qemu_mutex_unlock(&hmp.common.mon_lock);
> > >
> > >  out:
> > >      monitor_data_destroy(&hmp.common);
> > > @@ -1248,7 +1248,7 @@ void qmp_getfd(const char *fdname, Error **errp)
> > >          return;
> > >      }
> > >
> > > -    qemu_mutex_lock(&cur_mon->mon_lock);
> > > +    QEMU_LOCK_GUARD(&cur_mon->mon_lock);
> > >      QLIST_FOREACH(monfd, &cur_mon->fds, next) {
> > >          if (strcmp(monfd->name, fdname) != 0) {
> > >              continue;
> > > @@ -1256,7 +1256,6 @@ void qmp_getfd(const char *fdname, Error **errp)
> > >
> > >          tmp_fd = monfd->fd;
> > >          monfd->fd = fd;
> > > -        qemu_mutex_unlock(&cur_mon->mon_lock);
> > >          /* Make sure close() is outside critical section */
> > >          close(tmp_fd);
> >
> > The comment doesn't look true after this patch, since the lock is
> > released before returning. commit 9409fc05fe2 ("monitor: protect
> > mon->fds with mon_lock") introduced the lock & comment. Apparently,
> > you didn't convert qmp_closefd() to LOCK_GUARD, presumably because of
> > the comment. But you did it in qmp_getfd. What's the reason for that
> > though, avoiding syscalls while holding the lock or am I missing
> > something?
>
> No, I think you're right!
> Yeh I think the reason was to avoid the (potentially blocking) syscall
> with the lock held.
>

Ok, I'll send a patch, thanks

> Dave
>
> > thanks
> >
> > >          return;
> > > @@ -1267,7 +1266,6 @@ void qmp_getfd(const char *fdname, Error **errp)
> > >      monfd->fd = fd;
> > >
> > >      QLIST_INSERT_HEAD(&cur_mon->fds, monfd, next);
> > > -    qemu_mutex_unlock(&cur_mon->mon_lock);
> > >  }
> > >
> > >  void qmp_closefd(const char *fdname, Error **errp)
> > > @@ -1299,7 +1297,7 @@ int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
> > >  {
> > >      mon_fd_t *monfd;
> > >
> > > -    qemu_mutex_lock(&mon->mon_lock);
> > > +    QEMU_LOCK_GUARD(&mon->mon_lock);
> > >      QLIST_FOREACH(monfd, &mon->fds, next) {
> > >          int fd;
> > >
> > > @@ -1313,12 +1311,10 @@ int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp)
> > >          QLIST_REMOVE(monfd, next);
> > >          g_free(monfd->name);
> > >          g_free(monfd);
> > > -        qemu_mutex_unlock(&mon->mon_lock);
> > >
> > >          return fd;
> > >      }
> > >
> > > -    qemu_mutex_unlock(&mon->mon_lock);
> > >      error_setg(errp, "File descriptor named '%s' has not been found", fdname);
> > >      return -1;
> > >  }
> > > @@ -1350,11 +1346,10 @@ void monitor_fdsets_cleanup(void)
> > >      MonFdset *mon_fdset;
> > >      MonFdset *mon_fdset_next;
> > >
> > > -    qemu_mutex_lock(&mon_fdsets_lock);
> > > +    QEMU_LOCK_GUARD(&mon_fdsets_lock);
> > >      QLIST_FOREACH_SAFE(mon_fdset, &mon_fdsets, next, mon_fdset_next) {
> > >          monitor_fdset_cleanup(mon_fdset);
> > >      }
> > > -    qemu_mutex_unlock(&mon_fdsets_lock);
> > >  }
> > >
> > >  AddfdInfo *qmp_add_fd(bool has_fdset_id, int64_t fdset_id, bool has_opaque,
> > > @@ -1389,7 +1384,7 @@ void qmp_remove_fd(int64_t fdset_id, bool has_fd, int64_t fd, Error **errp)
> > >      MonFdsetFd *mon_fdset_fd;
> > >      char fd_str[60];
> > >
> > > -    qemu_mutex_lock(&mon_fdsets_lock);
> > > +    QEMU_LOCK_GUARD(&mon_fdsets_lock);
> > >      QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
> > >          if (mon_fdset->id != fdset_id) {
> > >              continue;
> > > @@ -1409,12 +1404,10 @@ void qmp_remove_fd(int64_t fdset_id, bool has_fd, int64_t fd, Error **errp)
> > >              goto error;
> > >          }
> > >          monitor_fdset_cleanup(mon_fdset);
> > > -        qemu_mutex_unlock(&mon_fdsets_lock);
> > >          return;
> > >      }
> > >
> > >  error:
> > > -    qemu_mutex_unlock(&mon_fdsets_lock);
> > >      if (has_fd) {
> > >          snprintf(fd_str, sizeof(fd_str), "fdset-id:%" PRId64 ", fd:%" PRId64,
> > >                   fdset_id, fd);
> > > @@ -1430,7 +1423,7 @@ FdsetInfoList *qmp_query_fdsets(Error **errp)
> > >      MonFdsetFd *mon_fdset_fd;
> > >      FdsetInfoList *fdset_list = NULL;
> > >
> > > -    qemu_mutex_lock(&mon_fdsets_lock);
> > > +    QEMU_LOCK_GUARD(&mon_fdsets_lock);
> > >      QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
> > >          FdsetInfoList *fdset_info = g_malloc0(sizeof(*fdset_info));
> > >          FdsetFdInfoList *fdsetfd_list = NULL;
> > > @@ -1460,7 +1453,6 @@ FdsetInfoList *qmp_query_fdsets(Error **errp)
> > >          fdset_info->next = fdset_list;
> > >          fdset_list = fdset_info;
> > >      }
> > > -    qemu_mutex_unlock(&mon_fdsets_lock);
> > >
> > >      return fdset_list;
> > >  }
> > > @@ -1554,7 +1546,7 @@ int monitor_fdset_dup_fd_add(int64_t fdset_id, int flags)
> > >  #else
> > >      MonFdset *mon_fdset;
> > >
> > > -    qemu_mutex_lock(&mon_fdsets_lock);
> > > +    QEMU_LOCK_GUARD(&mon_fdsets_lock);
> > >      QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
> > >          MonFdsetFd *mon_fdset_fd;
> > >          MonFdsetFd *mon_fdset_fd_dup;
> > > @@ -1569,7 +1561,6 @@ int monitor_fdset_dup_fd_add(int64_t fdset_id, int flags)
> > >          QLIST_FOREACH(mon_fdset_fd, &mon_fdset->fds, next) {
> > >              mon_fd_flags = fcntl(mon_fdset_fd->fd, F_GETFL);
> > >              if (mon_fd_flags == -1) {
> > > -                qemu_mutex_unlock(&mon_fdsets_lock);
> > >                  return -1;
> > >              }
> > >
> > > @@ -1580,25 +1571,21 @@ int monitor_fdset_dup_fd_add(int64_t fdset_id, int flags)
> > >          }
> > >
> > >          if (fd == -1) {
> > > -            qemu_mutex_unlock(&mon_fdsets_lock);
> > >              errno = EACCES;
> > >              return -1;
> > >          }
> > >
> > >          dup_fd = qemu_dup_flags(fd, flags);
> > >          if (dup_fd == -1) {
> > > -            qemu_mutex_unlock(&mon_fdsets_lock);
> > >              return -1;
> > >          }
> > >
> > >          mon_fdset_fd_dup = g_malloc0(sizeof(*mon_fdset_fd_dup));
> > >          mon_fdset_fd_dup->fd = dup_fd;
> > >          QLIST_INSERT_HEAD(&mon_fdset->dup_fds, mon_fdset_fd_dup, next);
> > > -        qemu_mutex_unlock(&mon_fdsets_lock);
> > >          return dup_fd;
> > >      }
> > >
> > > -    qemu_mutex_unlock(&mon_fdsets_lock);
> > >      errno = ENOENT;
> > >      return -1;
> > >  #endif
> > > @@ -1609,7 +1596,7 @@ static int64_t monitor_fdset_dup_fd_find_remove(int dup_fd, bool remove)
> > >      MonFdset *mon_fdset;
> > >      MonFdsetFd *mon_fdset_fd_dup;
> > >
> > > -    qemu_mutex_lock(&mon_fdsets_lock);
> > > +    QEMU_LOCK_GUARD(&mon_fdsets_lock);
> > >      QLIST_FOREACH(mon_fdset, &mon_fdsets, next) {
> > >          QLIST_FOREACH(mon_fdset_fd_dup, &mon_fdset->dup_fds, next) {
> > >              if (mon_fdset_fd_dup->fd == dup_fd) {
> > > @@ -1619,17 +1606,14 @@ static int64_t monitor_fdset_dup_fd_find_remove(int dup_fd, bool remove)
> > >                      if (QLIST_EMPTY(&mon_fdset->dup_fds)) {
> > >                          monitor_fdset_cleanup(mon_fdset);
> > >                      }
> > > -                    goto err;
> > > +                    return -1;
> > >                  } else {
> > > -                    qemu_mutex_unlock(&mon_fdsets_lock);
> > >                      return mon_fdset->id;
> > >                  }
> > >              }
> > >          }
> > >      }
> > >
> > > -err:
> > > -    qemu_mutex_unlock(&mon_fdsets_lock);
> > >      return -1;
> > >  }
> > >
> > > --
> > > 2.26.2
> > >
> > >
> >
> >
> > --
> > Marc-André Lureau
> >
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
>


-- 
Marc-André Lureau


  reply	other threads:[~2023-02-07 14:07 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-25 12:06 [PULL 00/26] migration and friends queue Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 01/26] migration: Properly destroy variables on incoming side Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 02/26] migration: Rework migrate_send_rp_req_pages() function Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 03/26] migration/dirtyrate: setup up query-dirtyrate framwork Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 04/26] migration/dirtyrate: add DirtyRateStatus to denote calculation status Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 05/26] migration/dirtyrate: Add RamblockDirtyInfo to store sampled page info Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 06/26] migration/dirtyrate: Add dirtyrate statistics series functions Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 07/26] migration/dirtyrate: move RAMBLOCK_FOREACH_MIGRATABLE into ram.h Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 08/26] migration/dirtyrate: Record hash results for each sampled page Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 09/26] migration/dirtyrate: Compare page hash results for recorded " Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 10/26] migration/dirtyrate: skip sampling ramblock with size below MIN_RAMBLOCK_SIZE Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 11/26] migration/dirtyrate: Implement set_sample_page_period() and is_sample_period_valid() Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 12/26] migration/dirtyrate: Implement calculate_dirtyrate() function Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 13/26] migration/dirtyrate: Implement qmp_cal_dirty_rate()/qmp_get_dirty_rate() function Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 14/26] migration/dirtyrate: Add trace_calls to make it easier to debug Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 15/26] migration: Truncate state file in xen-save-devices-state Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 16/26] migration: increase max-bandwidth to 128 MiB/s (1 Gib/s) Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 17/26] migration/tls: save hostname into MigrationState Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 18/26] migration/tls: extract migration_tls_client_create for common-use Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 19/26] migration/tls: add tls_hostname into MultiFDSendParams Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 20/26] migration/tls: extract cleanup function for common-use Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 21/26] migration/tls: add support for multifd tls-handshake Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 22/26] migration/tls: add trace points for multifd-tls Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 23/26] monitor: Use LOCK_GUARD macros Dr. David Alan Gilbert (git)
2023-02-07 13:26   ` Marc-André Lureau
2023-02-07 13:41     ` Dr. David Alan Gilbert
2023-02-07 14:06       ` Marc-André Lureau [this message]
2020-09-25 12:06 ` [PULL 24/26] virtiofsd: document cache=auto default Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 25/26] virtiofsd: Used glib "shared" thread pool Dr. David Alan Gilbert (git)
2020-09-25 12:06 ` [PULL 26/26] virtiofsd: Add -o allow_direct_io|no_allow_direct_io options Dr. David Alan Gilbert (git)
2020-09-29 21:53   ` Vivek Goyal
2020-09-30  2:14     ` [External] " Jiachen Zhang
2020-09-25 12:35 ` [PULL 00/26] migration and friends queue no-reply
2020-09-25 14:31   ` Dr. David Alan Gilbert
2020-09-25 16:22 ` Peter Maydell

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=CAJ+F1CKLV_XG3pe_4YJD++-R71F5M4yepGOoR7nYocqs65y0fw@mail.gmail.com \
    --to=marcandre.lureau@gmail.com \
    --cc=ann.zhuangyanying@huawei.com \
    --cc=dgilbert@redhat.com \
    --cc=dovmurik@linux.vnet.ibm.com \
    --cc=hgcoin@gmail.com \
    --cc=jinyan12@huawei.com \
    --cc=lvivier@redhat.com \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=stefanha@redhat.com \
    --cc=vgoyal@redhat.com \
    --cc=zhangjiachen.jaycee@bytedance.com \
    --cc=zhengchuan@huawei.com \
    /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: link
Be 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.