328{
329 uint64_t v;
331 uint32_t num, cpu;
333 int ret;
334
335 if (cpu_list == NULL || n == 0 || ctx == NULL || desc == NULL) {
336 dprint(
"invalid parameters\n");
337 return -1;
338 }
339
341 dprint(
"only works for system wide\n");
342 return -1;
343 }
344
345 *desc = NULL;
346
347
348
349
350 num = 0;
351 for(k=0, cpu = 0; k < n; k++, cpu+=64) {
352 v = cpu_list[k];
353 for(
i=0; v && i < 63; i++, v>>=1, cpu++) {
354 if (v & 0x1) {
356 dprint(
"unavailable CPU%u\n", cpu);
357 return -1;
358 }
359 num++;
360 }
361 }
362 }
363
364 if (num == 0)
365 return 0;
366
367 s = calloc(1,
sizeof(*
s));
369 dprint(
"cannot allocate %u contexts\n", num);
370 return -1;
371 }
373
374 printf("%u-way session\n", num);
375
376
377
378
380 if (ret) {
381 dprint(
"cannot init barrier\n");
382 goto error_free;
383 }
384
385
386
387
388
390
392 goto error_free_unlock;
393
394
395
396
397 for(k=0, cpu = 0; k < n; k++, cpu += 64) {
398 v = cpu_list[k];
399 for(
i=0; v && i < 63; i++, v>>=1, cpu++) {
400 if (v & 0x1) {
401 if (
tds[cpu].barrier) {
402 dprint(
"CPU%u already managing a session\n", cpu);
403 goto error_free_unlock;
404 }
405
406 }
407 }
408 }
409
410
411
412
413 for(k=0, cpu = 0; k < n; k++, cpu += 64) {
414 v = cpu_list[k];
415 for(
i=0; v && i < 63; i++, v>>=1, cpu++) {
416 if (v & 0x1) {
420 sem_post(&
tds[cpu].cmd_sem);
421 }
422 }
423 }
425
426 ret = 0;
427
428
429
430
431 for(k=0; k <
ncpus; k++) {
432 if (
tds[k].barrier == &
s->barrier) {
434 if (ret)
435 break;
436 }
437 }
438
439
440
442 for(k=0; k <
ncpus; k++) {
443 if (
tds[k].barrier == &
s->barrier) {
444 if (
tds[k].ret == 0) {
446 sem_post(&
tds[k].cmd_sem);
447 }
448
450 }
451 }
452 }
454
455 if (ret == 0) *desc =
s;
456
457 return ret ? -1 : 0;
458
459error_free_unlock:
461
462error_free:
464 return -1;
465}
#define PFM_FL_SYSTEM_WIDE
static int create_wthreads(uint64_t *cpu_list, uint32_t n)
static int barrier_init(barrier_t *b, uint32_t count)