lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Fri, 26 Aug 2022 20:22:24 +0300
From:   Adrian Hunter <adrian.hunter@...el.com>
To:     Ian Rogers <irogers@...gle.com>
Cc:     Peter Zijlstra <peterz@...radead.org>,
        Ingo Molnar <mingo@...hat.com>,
        Arnaldo Carvalho de Melo <acme@...nel.org>,
        Mark Rutland <mark.rutland@....com>,
        Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
        Jiri Olsa <jolsa@...nel.org>,
        Namhyung Kim <namhyung@...nel.org>,
        Thomas Gleixner <tglx@...utronix.de>,
        Darren Hart <dvhart@...radead.org>,
        Davidlohr Bueso <dave@...olabs.net>,
        André Almeida <andrealmeid@...lia.com>,
        Nathan Chancellor <nathan@...nel.org>,
        Nick Desaulniers <ndesaulniers@...gle.com>,
        Tom Rix <trix@...hat.com>, Weiguo Li <liwg06@...mail.com>,
        Athira Rajeev <atrajeev@...ux.vnet.ibm.com>,
        Thomas Richter <tmricht@...ux.ibm.com>,
        Ravi Bangoria <ravi.bangoria@....com>,
        Dario Petrillo <dario.pk1@...il.com>,
        Hewenliang <hewenliang4@...wei.com>,
        yaowenbin <yaowenbin1@...wei.com>,
        Wenyu Liu <liuwenyu7@...wei.com>,
        Song Liu <songliubraving@...com>,
        Andrii Nakryiko <andrii@...nel.org>,
        Dave Marchevsky <davemarchevsky@...com>,
        Leo Yan <leo.yan@...aro.org>,
        Kim Phillips <kim.phillips@....com>,
        Pavithra Gurushankar <gpavithrasha@...il.com>,
        Alexandre Truong <alexandre.truong@....com>,
        Quentin Monnet <quentin@...valent.com>,
        William Cohen <wcohen@...hat.com>,
        Andres Freund <andres@...razel.de>,
        Martin Liška <mliska@...e.cz>,
        Colin Ian King <colin.king@...el.com>,
        James Clark <james.clark@....com>,
        Fangrui Song <maskray@...gle.com>,
        Stephane Eranian <eranian@...gle.com>,
        Kajol Jain <kjain@...ux.ibm.com>,
        Alexey Bayduraev <alexey.v.bayduraev@...ux.intel.com>,
        Riccardo Mancini <rickyman7@...il.com>,
        Andi Kleen <ak@...ux.intel.com>,
        Masami Hiramatsu <mhiramat@...nel.org>,
        Zechuan Chen <chenzechuan1@...wei.com>,
        Jason Wang <wangborong@...rlc.com>,
        Christophe JAILLET <christophe.jaillet@...adoo.fr>,
        Remi Bernon <rbernon@...eweavers.com>,
        linux-kernel@...r.kernel.org, linux-perf-users@...r.kernel.org,
        bpf@...r.kernel.org, llvm@...ts.linux.dev
Subject: Re: [PATCH v3 09/18] perf ui: Update use of pthread mutex

On 26/08/22 19:02, Ian Rogers wrote:
> On Fri, Aug 26, 2022 at 3:24 AM Adrian Hunter <adrian.hunter@...el.com> wrote:
>>
>> On 24/08/22 18:38, Ian Rogers wrote:
>>> Switch to the use of mutex wrappers that provide better error checking.
>>>
>>> Signed-off-by: Ian Rogers <irogers@...gle.com>
>>> ---
>>>  tools/perf/ui/browser.c           | 20 ++++++++++----------
>>>  tools/perf/ui/browsers/annotate.c |  2 +-
>>>  tools/perf/ui/setup.c             |  5 +++--
>>>  tools/perf/ui/tui/helpline.c      |  5 ++---
>>>  tools/perf/ui/tui/progress.c      |  8 ++++----
>>>  tools/perf/ui/tui/setup.c         |  8 ++++----
>>>  tools/perf/ui/tui/util.c          | 18 +++++++++---------
>>>  tools/perf/ui/ui.h                |  4 ++--
>>>  8 files changed, 35 insertions(+), 35 deletions(-)
>>>
>>> diff --git a/tools/perf/ui/browser.c b/tools/perf/ui/browser.c
>>> index fa5bd5c20e96..78fb01d6ad63 100644
>>> --- a/tools/perf/ui/browser.c
>>> +++ b/tools/perf/ui/browser.c
>>> @@ -268,9 +268,9 @@ void __ui_browser__show_title(struct ui_browser *browser, const char *title)
>>>
>>>  void ui_browser__show_title(struct ui_browser *browser, const char *title)
>>>  {
>>> -     pthread_mutex_lock(&ui__lock);
>>> +     mutex_lock(&ui__lock);
>>>       __ui_browser__show_title(browser, title);
>>> -     pthread_mutex_unlock(&ui__lock);
>>> +     mutex_unlock(&ui__lock);
>>>  }
>>>
>>>  int ui_browser__show(struct ui_browser *browser, const char *title,
>>> @@ -284,7 +284,7 @@ int ui_browser__show(struct ui_browser *browser, const char *title,
>>>
>>>       browser->refresh_dimensions(browser);
>>>
>>> -     pthread_mutex_lock(&ui__lock);
>>> +     mutex_lock(&ui__lock);
>>>       __ui_browser__show_title(browser, title);
>>>
>>>       browser->title = title;
>>> @@ -295,16 +295,16 @@ int ui_browser__show(struct ui_browser *browser, const char *title,
>>>       va_end(ap);
>>>       if (err > 0)
>>>               ui_helpline__push(browser->helpline);
>>> -     pthread_mutex_unlock(&ui__lock);
>>> +     mutex_unlock(&ui__lock);
>>>       return err ? 0 : -1;
>>>  }
>>>
>>>  void ui_browser__hide(struct ui_browser *browser)
>>>  {
>>> -     pthread_mutex_lock(&ui__lock);
>>> +     mutex_lock(&ui__lock);
>>>       ui_helpline__pop();
>>>       zfree(&browser->helpline);
>>> -     pthread_mutex_unlock(&ui__lock);
>>> +     mutex_unlock(&ui__lock);
>>>  }
>>>
>>>  static void ui_browser__scrollbar_set(struct ui_browser *browser)
>>> @@ -352,9 +352,9 @@ static int __ui_browser__refresh(struct ui_browser *browser)
>>>
>>>  int ui_browser__refresh(struct ui_browser *browser)
>>>  {
>>> -     pthread_mutex_lock(&ui__lock);
>>> +     mutex_lock(&ui__lock);
>>>       __ui_browser__refresh(browser);
>>> -     pthread_mutex_unlock(&ui__lock);
>>> +     mutex_unlock(&ui__lock);
>>>
>>>       return 0;
>>>  }
>>> @@ -390,10 +390,10 @@ int ui_browser__run(struct ui_browser *browser, int delay_secs)
>>>       while (1) {
>>>               off_t offset;
>>>
>>> -             pthread_mutex_lock(&ui__lock);
>>> +             mutex_lock(&ui__lock);
>>>               err = __ui_browser__refresh(browser);
>>>               SLsmg_refresh();
>>> -             pthread_mutex_unlock(&ui__lock);
>>> +             mutex_unlock(&ui__lock);
>>>               if (err < 0)
>>>                       break;
>>>
>>> diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c
>>> index 44ba900828f6..b8747e8dd9ea 100644
>>> --- a/tools/perf/ui/browsers/annotate.c
>>> +++ b/tools/perf/ui/browsers/annotate.c
>>> @@ -8,11 +8,11 @@
>>>  #include "../../util/hist.h"
>>>  #include "../../util/sort.h"
>>>  #include "../../util/map.h"
>>> +#include "../../util/mutex.h"
>>>  #include "../../util/symbol.h"
>>>  #include "../../util/evsel.h"
>>>  #include "../../util/evlist.h"
>>>  #include <inttypes.h>
>>> -#include <pthread.h>
>>>  #include <linux/kernel.h>
>>>  #include <linux/string.h>
>>>  #include <linux/zalloc.h>
>>> diff --git a/tools/perf/ui/setup.c b/tools/perf/ui/setup.c
>>> index 700335cde618..25ded88801a3 100644
>>> --- a/tools/perf/ui/setup.c
>>> +++ b/tools/perf/ui/setup.c
>>> @@ -1,5 +1,4 @@
>>>  // SPDX-License-Identifier: GPL-2.0
>>> -#include <pthread.h>
>>>  #include <dlfcn.h>
>>>  #include <unistd.h>
>>>
>>> @@ -8,7 +7,7 @@
>>>  #include "../util/hist.h"
>>>  #include "ui.h"
>>>
>>> -pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
>>> +struct mutex ui__lock;
>>>  void *perf_gtk_handle;
>>>  int use_browser = -1;
>>>
>>> @@ -76,6 +75,7 @@ int stdio__config_color(const struct option *opt __maybe_unused,
>>>
>>>  void setup_browser(bool fallback_to_pager)
>>>  {
>>> +     mutex_init(&ui__lock);
>>>       if (use_browser < 2 && (!isatty(1) || dump_trace))
>>>               use_browser = 0;
>>>
>>> @@ -118,4 +118,5 @@ void exit_browser(bool wait_for_ok)
>>>       default:
>>>               break;
>>>       }
>>> +     mutex_destroy(&ui__lock);
>>
>> Looks like exit_browser() can be called even when setup_browser()
>> was never called.
>>
>> Note, it also looks like PTHREAD_MUTEX_INITIALIZER is all zeros so
>> pthread won't notice.
> 
> Memory sanitizer will notice some cases of this and so I didn't want
> to code defensively around exit being called ahead of setup.

I am not sure you understood.

As I wrote, exit_browser() can be called even when setup_browser()
was never called, so it is not defensive programming, it is necessary
programming that you only get away without doing because
PTHREAD_MUTEX_INITIALIZER is all zeros.

> 
> Thanks,
> Ian
> 
>>>  }
>>> diff --git a/tools/perf/ui/tui/helpline.c b/tools/perf/ui/tui/helpline.c
>>> index 298d6af82fdd..db4952f5990b 100644
>>> --- a/tools/perf/ui/tui/helpline.c
>>> +++ b/tools/perf/ui/tui/helpline.c
>>> @@ -2,7 +2,6 @@
>>>  #include <stdio.h>
>>>  #include <stdlib.h>
>>>  #include <string.h>
>>> -#include <pthread.h>
>>>  #include <linux/kernel.h>
>>>  #include <linux/string.h>
>>>
>>> @@ -33,7 +32,7 @@ static int tui_helpline__show(const char *format, va_list ap)
>>>       int ret;
>>>       static int backlog;
>>>
>>> -     pthread_mutex_lock(&ui__lock);
>>> +     mutex_lock(&ui__lock);
>>>       ret = vscnprintf(ui_helpline__last_msg + backlog,
>>>                       sizeof(ui_helpline__last_msg) - backlog, format, ap);
>>>       backlog += ret;
>>> @@ -45,7 +44,7 @@ static int tui_helpline__show(const char *format, va_list ap)
>>>               SLsmg_refresh();
>>>               backlog = 0;
>>>       }
>>> -     pthread_mutex_unlock(&ui__lock);
>>> +     mutex_unlock(&ui__lock);
>>>
>>>       return ret;
>>>  }
>>> diff --git a/tools/perf/ui/tui/progress.c b/tools/perf/ui/tui/progress.c
>>> index 3d74af5a7ece..71b6c8d9474f 100644
>>> --- a/tools/perf/ui/tui/progress.c
>>> +++ b/tools/perf/ui/tui/progress.c
>>> @@ -45,7 +45,7 @@ static void tui_progress__update(struct ui_progress *p)
>>>       }
>>>
>>>       ui__refresh_dimensions(false);
>>> -     pthread_mutex_lock(&ui__lock);
>>> +     mutex_lock(&ui__lock);
>>>       y = SLtt_Screen_Rows / 2 - 2;
>>>       SLsmg_set_color(0);
>>>       SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols);
>>> @@ -56,7 +56,7 @@ static void tui_progress__update(struct ui_progress *p)
>>>       bar = ((SLtt_Screen_Cols - 2) * p->curr) / p->total;
>>>       SLsmg_fill_region(y, 1, 1, bar, ' ');
>>>       SLsmg_refresh();
>>> -     pthread_mutex_unlock(&ui__lock);
>>> +     mutex_unlock(&ui__lock);
>>>  }
>>>
>>>  static void tui_progress__finish(void)
>>> @@ -67,12 +67,12 @@ static void tui_progress__finish(void)
>>>               return;
>>>
>>>       ui__refresh_dimensions(false);
>>> -     pthread_mutex_lock(&ui__lock);
>>> +     mutex_lock(&ui__lock);
>>>       y = SLtt_Screen_Rows / 2 - 2;
>>>       SLsmg_set_color(0);
>>>       SLsmg_fill_region(y, 0, 3, SLtt_Screen_Cols, ' ');
>>>       SLsmg_refresh();
>>> -     pthread_mutex_unlock(&ui__lock);
>>> +     mutex_unlock(&ui__lock);
>>>  }
>>>
>>>  static struct ui_progress_ops tui_progress__ops = {
>>> diff --git a/tools/perf/ui/tui/setup.c b/tools/perf/ui/tui/setup.c
>>> index b1be59b4e2a4..a3b8c397c24d 100644
>>> --- a/tools/perf/ui/tui/setup.c
>>> +++ b/tools/perf/ui/tui/setup.c
>>> @@ -29,10 +29,10 @@ void ui__refresh_dimensions(bool force)
>>>  {
>>>       if (force || ui__need_resize) {
>>>               ui__need_resize = 0;
>>> -             pthread_mutex_lock(&ui__lock);
>>> +             mutex_lock(&ui__lock);
>>>               SLtt_get_screen_size();
>>>               SLsmg_reinit_smg();
>>> -             pthread_mutex_unlock(&ui__lock);
>>> +             mutex_unlock(&ui__lock);
>>>       }
>>>  }
>>>
>>> @@ -170,10 +170,10 @@ void ui__exit(bool wait_for_ok)
>>>                                   "Press any key...", 0);
>>>
>>>       SLtt_set_cursor_visibility(1);
>>> -     if (!pthread_mutex_trylock(&ui__lock)) {
>>> +     if (mutex_trylock(&ui__lock)) {
>>>               SLsmg_refresh();
>>>               SLsmg_reset_smg();
>>> -             pthread_mutex_unlock(&ui__lock);
>>> +             mutex_unlock(&ui__lock);
>>>       }
>>>       SLang_reset_tty();
>>>       perf_error__unregister(&perf_tui_eops);
>>> diff --git a/tools/perf/ui/tui/util.c b/tools/perf/ui/tui/util.c
>>> index 0f562e2cb1e8..3c5174854ac8 100644
>>> --- a/tools/perf/ui/tui/util.c
>>> +++ b/tools/perf/ui/tui/util.c
>>> @@ -95,7 +95,7 @@ int ui_browser__input_window(const char *title, const char *text, char *input,
>>>               t = sep + 1;
>>>       }
>>>
>>> -     pthread_mutex_lock(&ui__lock);
>>> +     mutex_lock(&ui__lock);
>>>
>>>       max_len += 2;
>>>       nr_lines += 8;
>>> @@ -125,17 +125,17 @@ int ui_browser__input_window(const char *title, const char *text, char *input,
>>>       SLsmg_write_nstring((char *)exit_msg, max_len);
>>>       SLsmg_refresh();
>>>
>>> -     pthread_mutex_unlock(&ui__lock);
>>> +     mutex_unlock(&ui__lock);
>>>
>>>       x += 2;
>>>       len = 0;
>>>       key = ui__getch(delay_secs);
>>>       while (key != K_TIMER && key != K_ENTER && key != K_ESC) {
>>> -             pthread_mutex_lock(&ui__lock);
>>> +             mutex_lock(&ui__lock);
>>>
>>>               if (key == K_BKSPC) {
>>>                       if (len == 0) {
>>> -                             pthread_mutex_unlock(&ui__lock);
>>> +                             mutex_unlock(&ui__lock);
>>>                               goto next_key;
>>>                       }
>>>                       SLsmg_gotorc(y, x + --len);
>>> @@ -147,7 +147,7 @@ int ui_browser__input_window(const char *title, const char *text, char *input,
>>>               }
>>>               SLsmg_refresh();
>>>
>>> -             pthread_mutex_unlock(&ui__lock);
>>> +             mutex_unlock(&ui__lock);
>>>
>>>               /* XXX more graceful overflow handling needed */
>>>               if (len == sizeof(buf) - 1) {
>>> @@ -215,19 +215,19 @@ void __ui__info_window(const char *title, const char *text, const char *exit_msg
>>>
>>>  void ui__info_window(const char *title, const char *text)
>>>  {
>>> -     pthread_mutex_lock(&ui__lock);
>>> +     mutex_lock(&ui__lock);
>>>       __ui__info_window(title, text, NULL);
>>>       SLsmg_refresh();
>>> -     pthread_mutex_unlock(&ui__lock);
>>> +     mutex_unlock(&ui__lock);
>>>  }
>>>
>>>  int ui__question_window(const char *title, const char *text,
>>>                       const char *exit_msg, int delay_secs)
>>>  {
>>> -     pthread_mutex_lock(&ui__lock);
>>> +     mutex_lock(&ui__lock);
>>>       __ui__info_window(title, text, exit_msg);
>>>       SLsmg_refresh();
>>> -     pthread_mutex_unlock(&ui__lock);
>>> +     mutex_unlock(&ui__lock);
>>>       return ui__getch(delay_secs);
>>>  }
>>>
>>> diff --git a/tools/perf/ui/ui.h b/tools/perf/ui/ui.h
>>> index 9b6fdf06e1d2..99f8d2fe9bc5 100644
>>> --- a/tools/perf/ui/ui.h
>>> +++ b/tools/perf/ui/ui.h
>>> @@ -2,11 +2,11 @@
>>>  #ifndef _PERF_UI_H_
>>>  #define _PERF_UI_H_ 1
>>>
>>> -#include <pthread.h>
>>> +#include "../util/mutex.h"
>>>  #include <stdbool.h>
>>>  #include <linux/compiler.h>
>>>
>>> -extern pthread_mutex_t ui__lock;
>>> +extern struct mutex ui__lock;
>>>  extern void *perf_gtk_handle;
>>>
>>>  extern int use_browser;
>>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ