@@ -4635,6 +4635,7 @@ iperf_new_stream(struct iperf_test *test, int s, int sender)
46354635
46364636 memset (sp , 0 , sizeof (struct iperf_stream ));
46374637
4638+ sp -> affinity = -1 ;
46384639 sp -> sender = sender ;
46394640 sp -> test = test ;
46404641 sp -> settings = test -> settings ;
@@ -5169,6 +5170,85 @@ iperf_json_finish(struct iperf_test *test)
51695170
51705171
51715172/* CPU affinity stuff - Linux, FreeBSD, and Windows only. */
5173+ /* init streams cpu map
5174+ If the number of CPUs >= streams (-P), map each stream to a specific CPU core.
5175+ */
5176+ void
5177+ iperf_affinity_streams_init (struct iperf_test * test )
5178+ {
5179+ #if defined(HAVE_SCHED_SETAFFINITY )
5180+ if (sched_getaffinity (0 , sizeof (cpu_set_t ), & test -> cpumask ) != 0 ) {
5181+ return ;
5182+ }
5183+
5184+ /* Assign bindings according to main process affinity */
5185+ int available_cpu_num = CPU_COUNT (& test -> cpumask );
5186+ int affinity_stream_cnt = 0 ;
5187+ if (available_cpu_num > 0 ) {
5188+ affinity_stream_cnt = (test -> num_streams / available_cpu_num ) * available_cpu_num ;
5189+ }
5190+
5191+ for (int i = 0 ; i < test -> num_streams ; i ++ ) {
5192+ if (affinity_stream_cnt > 0 ) {
5193+ int offset = i % available_cpu_num ;
5194+ int j = 0 ;
5195+ for (; j < CPU_SETSIZE ; j ++ ) {
5196+ if (CPU_ISSET (j , & test -> cpumask )) {
5197+ if (offset == 0 ) {
5198+ break ;
5199+ }
5200+ offset -- ;
5201+ }
5202+ }
5203+ test -> streams_affinity [i ] = j ;
5204+ affinity_stream_cnt -- ;
5205+ } else {
5206+ test -> streams_affinity [i ] = -1 ;
5207+ }
5208+ }
5209+ #else
5210+ for (int i = 0 ; i < test -> num_streams ; i ++ ) {
5211+ test -> streams_affinity [i ] = -1 ;
5212+ }
5213+ #endif
5214+ }
5215+
5216+ void
5217+ iperf_setaffinity_streams_raw (int affinity )
5218+ {
5219+ #if defined(HAVE_SCHED_SETAFFINITY )
5220+ cpu_set_t cpu_set ;
5221+ CPU_ZERO (& cpu_set );
5222+ CPU_SET (affinity , & cpu_set );
5223+ if (sched_setaffinity (0 , sizeof (cpu_set_t ), & cpu_set ) != 0 ) {
5224+ return ;
5225+ }
5226+ #endif
5227+ }
5228+
5229+ void
5230+ iperf_setaffinity_streams (struct iperf_test * test , int index )
5231+ {
5232+ #if defined(HAVE_SCHED_SETAFFINITY )
5233+ iperf_setaffinity_streams_raw (test -> streams_affinity [index ]);
5234+ #endif
5235+ }
5236+
5237+ void
5238+ iperf_setaffinity_streams_post (struct iperf_test * test )
5239+ {
5240+ #if defined(HAVE_SCHED_SETAFFINITY )
5241+ if (sched_setaffinity (0 , sizeof (cpu_set_t ), & test -> cpumask ) != 0 ) {
5242+ return ;
5243+ }
5244+
5245+ struct iperf_stream * sp ;
5246+ int index = 0 ;
5247+ SLIST_FOREACH (sp , & test -> streams , streams ){
5248+ sp -> affinity = test -> streams_affinity [index ++ % test -> num_streams ];
5249+ }
5250+ #endif
5251+ }
51725252
51735253int
51745254iperf_setaffinity (struct iperf_test * test , int affinity )
0 commit comments