Lines Matching +full:i +full:- +full:leak +full:- +full:current

1 // SPDX-License-Identifier: GPL-2.0+
57 torture_param(int, nthreads, -1, "# threads, defaults to -1 for all CPUs.");
65 torture_param(int, weight_single, -1, "Testing weight for single-CPU no-wait operations.");
66 torture_param(int, weight_single_wait, -1, "Testing weight for single-CPU operations.");
67 torture_param(int, weight_many, -1, "Testing weight for multi-CPU no-wait operations.");
68 torture_param(int, weight_many_wait, -1, "Testing weight for multi-CPU operations.");
69 torture_param(int, weight_all, -1, "Testing weight for all-CPU no-wait operations.");
70 torture_param(int, weight_all_wait, -1, "Testing weight for all-CPU operations.");
103 #define SCF_NPRIMS (2 * 3) // Need wait and no-wait versions of each.
124 int scfc_cpu; // -1 for not _single().
143 int i; in scf_torture_stats_print() local
150 for (i = 0; i < nthreads; i++) { in scf_torture_stats_print()
151 scfs.n_single += scf_stats_p[i].n_single; in scf_torture_stats_print()
152 scfs.n_single_ofl += scf_stats_p[i].n_single_ofl; in scf_torture_stats_print()
153 scfs.n_single_wait += scf_stats_p[i].n_single_wait; in scf_torture_stats_print()
154 scfs.n_single_wait_ofl += scf_stats_p[i].n_single_wait_ofl; in scf_torture_stats_print()
155 scfs.n_many += scf_stats_p[i].n_many; in scf_torture_stats_print()
156 scfs.n_many_wait += scf_stats_p[i].n_many_wait; in scf_torture_stats_print()
157 scfs.n_all += scf_stats_p[i].n_all; in scf_torture_stats_print()
158 scfs.n_all_wait += scf_stats_p[i].n_all_wait; in scf_torture_stats_print()
193 // If no weight, if array would overflow, if computing three-place in scf_sel_add()
198 WARN_ON_ONCE(0 - 100000 * weight <= 100000 * scf_sel_totweight) || in scf_sel_add()
202 scfsp->scfs_weight = scf_sel_totweight; in scf_sel_add()
203 scfsp->scfs_prim = prim; in scf_sel_add()
204 scfsp->scfs_wait = wait; in scf_sel_add()
211 int i; in scf_sel_dump() local
216 for (i = 0; i < scf_sel_array_len; i++) { in scf_sel_dump()
217 scfsp = &scf_sel_array[i]; in scf_sel_dump()
218 w = (scfsp->scfs_weight - oldw) * 100000 / scf_sel_totweight; in scf_sel_dump()
220 scf_prim_name[scfsp->scfs_prim], in scf_sel_dump()
221 scfsp->scfs_wait ? "wait" : "nowait"); in scf_sel_dump()
222 oldw = scfsp->scfs_weight; in scf_sel_dump()
229 int i; in scf_sel_rand() local
232 for (i = 0; i < scf_sel_array_len; i++) in scf_sel_rand()
233 if (scf_sel_array[i].scfs_weight >= w) in scf_sel_rand()
234 return &scf_sel_array[i]; in scf_sel_rand()
244 int i; in scf_handler() local
250 WRITE_ONCE(scfcp->scfc_out, false); // For multiple receivers. in scf_handler()
251 if (WARN_ON_ONCE(unlikely(!READ_ONCE(scfcp->scfc_in)))) in scf_handler()
269 for (i = 0; i < r; i++) { in scf_handler()
278 if (scfcp->scfc_wait) in scf_handler()
279 WRITE_ONCE(scfcp->scfc_out, true); in scf_handler()
289 …fcp) && WARN_ONCE(smp_processor_id() != scfcp->scfc_cpu, "%s: Wanted CPU %d got CPU %d\n", __func_… in scf_handler_1()
307 if (scfsp->scfs_prim == SCF_PRIM_SINGLE || scfsp->scfs_wait) { in scftorture_invoke_one()
312 scfcp->scfc_cpu = -1; in scftorture_invoke_one()
313 scfcp->scfc_wait = scfsp->scfs_wait; in scftorture_invoke_one()
314 scfcp->scfc_out = false; in scftorture_invoke_one()
317 switch (scfsp->scfs_prim) { in scftorture_invoke_one()
320 if (scfsp->scfs_wait) in scftorture_invoke_one()
321 scfp->n_single_wait++; in scftorture_invoke_one()
323 scfp->n_single++; in scftorture_invoke_one()
325 scfcp->scfc_cpu = cpu; in scftorture_invoke_one()
326 barrier(); // Prevent race-reduction compiler optimizations. in scftorture_invoke_one()
327 scfcp->scfc_in = true; in scftorture_invoke_one()
329 ret = smp_call_function_single(cpu, scf_handler_1, (void *)scfcp, scfsp->scfs_wait); in scftorture_invoke_one()
331 if (scfsp->scfs_wait) in scftorture_invoke_one()
332 scfp->n_single_wait_ofl++; in scftorture_invoke_one()
334 scfp->n_single_ofl++; in scftorture_invoke_one()
340 if (scfsp->scfs_wait) in scftorture_invoke_one()
341 scfp->n_many_wait++; in scftorture_invoke_one()
343 scfp->n_many++; in scftorture_invoke_one()
345 barrier(); // Prevent race-reduction compiler optimizations. in scftorture_invoke_one()
346 scfcp->scfc_in = true; in scftorture_invoke_one()
348 smp_call_function_many(cpu_online_mask, scf_handler, scfcp, scfsp->scfs_wait); in scftorture_invoke_one()
351 if (scfsp->scfs_wait) in scftorture_invoke_one()
352 scfp->n_all_wait++; in scftorture_invoke_one()
354 scfp->n_all++; in scftorture_invoke_one()
356 barrier(); // Prevent race-reduction compiler optimizations. in scftorture_invoke_one()
357 scfcp->scfc_in = true; in scftorture_invoke_one()
359 smp_call_function(scf_handler, scfcp, scfsp->scfs_wait); in scftorture_invoke_one()
364 scfcp->scfc_out = true; in scftorture_invoke_one()
366 if (scfcp && scfsp->scfs_wait) { in scftorture_invoke_one()
367 if (WARN_ON_ONCE((num_online_cpus() > 1 || scfsp->scfs_prim == SCF_PRIM_SINGLE) && in scftorture_invoke_one()
368 !scfcp->scfc_out)) in scftorture_invoke_one()
369 atomic_inc(&n_mb_out_errs); // Leak rather than trash! in scftorture_invoke_one()
372 barrier(); // Prevent race-reduction compiler optimizations. in scftorture_invoke_one()
391 VERBOSE_SCFTORTOUT("scftorture_invoker %d: task started", scfp->cpu); in scftorture_invoker()
392 cpu = scfp->cpu % nr_cpu_ids; in scftorture_invoker()
393 set_cpus_allowed_ptr(current, cpumask_of(cpu)); in scftorture_invoker()
394 set_user_nice(current, MAX_NICE); in scftorture_invoker()
398 …VERBOSE_SCFTORTOUT("scftorture_invoker %d: Waiting for all SCF torturers from cpu %d", scfp->cpu, … in scftorture_invoker()
401 WARN_ON_ONCE(smp_processor_id() != scfp->cpu); in scftorture_invoker()
406 VERBOSE_SCFTORTOUT("scftorture_invoker %d ended before starting", scfp->cpu); in scftorture_invoker()
412 VERBOSE_SCFTORTOUT("scftorture_invoker %d started", scfp->cpu); in scftorture_invoker()
421 set_cpus_allowed_ptr(current, cpumask_of(cpu)); in scftorture_invoker()
427 VERBOSE_SCFTORTOUT("scftorture_invoker %d ended", scfp->cpu); in scftorture_invoker()
437 …"--- %s: verbose=%d holdoff=%d longwait=%d nthreads=%d onoff_holdoff=%d onoff_interval=%d shutdow… in scftorture_print_module_parms()
447 int i; in scf_torture_cleanup() local
454 for (i = 0; i < nthreads; i++) in scf_torture_cleanup()
455 torture_stop_kthread("scftorture_invoker", scf_stats_p[i].task); in scf_torture_cleanup()
460 scf_torture_stats_print(); // -After- the stats thread is stopped! in scf_torture_cleanup()
461 kfree(scf_stats_p); // -After- the last stats print has completed! in scf_torture_cleanup()
477 long i; in scf_torture_init() local
487 return -EBUSY; in scf_torture_init()
491 if (weight_single == -1 && weight_single_wait == -1 && in scf_torture_init()
492 weight_many == -1 && weight_many_wait == -1 && in scf_torture_init()
493 weight_all == -1 && weight_all_wait == -1) { in scf_torture_init()
501 if (weight_single == -1) in scf_torture_init()
503 if (weight_single_wait == -1) in scf_torture_init()
505 if (weight_many == -1) in scf_torture_init()
507 if (weight_many_wait == -1) in scf_torture_init()
509 if (weight_all == -1) in scf_torture_init()
511 if (weight_all_wait == -1) in scf_torture_init()
518 firsterr = -EINVAL; in scf_torture_init()
546 firsterr = -ENOMEM; in scf_torture_init()
553 for (i = 0; i < nthreads; i++) { in scf_torture_init()
554 scf_stats_p[i].cpu = i; in scf_torture_init()
555 firsterr = torture_create_kthread(scftorture_invoker, (void *)&scf_stats_p[i], in scf_torture_init()
556 scf_stats_p[i].task); in scf_torture_init()