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]
Message-ID: <YT5nC8mD2RVBpj0+@krava>
Date:   Sun, 12 Sep 2021 22:46:03 +0200
From:   Jiri Olsa <jolsa@...hat.com>
To:     Alexey Bayduraev <alexey.v.bayduraev@...ux.intel.com>
Cc:     Arnaldo Carvalho de Melo <acme@...nel.org>,
        Namhyung Kim <namhyung@...nel.org>,
        Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
        Peter Zijlstra <peterz@...radead.org>,
        Ingo Molnar <mingo@...hat.com>,
        linux-kernel <linux-kernel@...r.kernel.org>,
        Andi Kleen <ak@...ux.intel.com>,
        Adrian Hunter <adrian.hunter@...el.com>,
        Alexander Antonov <alexander.antonov@...ux.intel.com>,
        Alexei Budankov <abudankov@...wei.com>,
        Riccardo Mancini <rickyman7@...il.com>
Subject: Re: [PATCH v11 07/24] perf record: Start threads in the beginning of
 trace streaming

On Tue, Aug 17, 2021 at 11:23:10AM +0300, Alexey Bayduraev wrote:

SNIP

> +			pollfd->entries[ctlfd_pos].events = 0;
> +		}
> +
> +		pollfd->entries[ctlfd_pos].revents = 0;
> +	}
> +	record__mmap_read_all(thread->rec, true);
> +
> +	err = write(thread->pipes.ack[1], &msg, sizeof(msg));
> +	if (err == -1)
> +		pr_err("threads[%d]: failed to notify on termination: %s",
> +		       thread->tid, strerror(errno));
> +
> +	return NULL;
> +}
> +
>  static void record__init_features(struct record *rec)
>  {
>  	struct perf_session *session = rec->session;
> @@ -1918,13 +1979,59 @@ static int record__terminate_thread(struct record_thread *thread_data)
>  
>  static int record__start_threads(struct record *rec)
>  {
> +	int t, tt, ret = 0, nr_threads = rec->nr_threads;
>  	struct record_thread *thread_data = rec->thread_data;
> +	sigset_t full, mask;
> +	pthread_t handle;
> +	pthread_attr_t attrs;

should we return here in case nr_threads == 1?

jirka

> +
> +	sigfillset(&full);
> +	if (sigprocmask(SIG_SETMASK, &full, &mask)) {
> +		pr_err("Failed to block signals on threads start: %s\n", strerror(errno));
> +		return -1;
> +	}
> +
> +	pthread_attr_init(&attrs);
> +	pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_DETACHED);
> +
> +	for (t = 1; t < nr_threads; t++) {
> +		enum thread_msg msg = THREAD_MSG__UNDEFINED;
> +
> +		pthread_attr_setaffinity_np(&attrs,
> +					    MMAP_CPU_MASK_BYTES(&(thread_data[t].mask->affinity)),
> +					    (cpu_set_t *)(thread_data[t].mask->affinity.bits));
> +
> +		if (pthread_create(&handle, &attrs, record__thread, &thread_data[t])) {
> +			for (tt = 1; tt < t; tt++)
> +				record__terminate_thread(&thread_data[t]);
> +			pr_err("Failed to start threads: %s\n", strerror(errno));
> +			ret = -1;
> +			goto out_err;
> +		}
> +
> +		if (read(thread_data[t].pipes.ack[0], &msg, sizeof(msg)) > 0)
> +			pr_debug2("threads[%d]: sent %s\n", rec->thread_data[t].tid,
> +				 thread_msg_tags[msg]);
> +	}
> +
> +	if (nr_threads > 1) {
> +		sched_setaffinity(0, MMAP_CPU_MASK_BYTES(&thread_data[0].mask->affinity),
> +				  (cpu_set_t *)thread_data[0].mask->affinity.bits);
> +	}
>  
>  	thread = &thread_data[0];
>  
>  	pr_debug("threads[%d]: started on cpu=%d\n", thread->tid, sched_getcpu());
>  
> -	return 0;
> +out_err:
> +	pthread_attr_destroy(&attrs);
> +
> +	if (sigprocmask(SIG_SETMASK, &mask, NULL)) {
> +		pr_err("Failed to unblock signals on threads start: %s\n", strerror(errno));
> +		ret = -1;
> +	}
> +
> +	return ret;
>  }
>  
>  static int record__stop_threads(struct record *rec, unsigned long *waking)
> -- 
> 2.19.0
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ