@@ -56,6 +56,8 @@ static BUS_DEFINE_PROPERTY_GET2(property_get_ioprio_priority, "i", ExecContext,
5656static BUS_DEFINE_PROPERTY_GET_GLOBAL (property_get_empty_string , "s ", NULL) ;
5757static BUS_DEFINE_PROPERTY_GET_REF (property_get_syslog_level , "i ", int , LOG_PRI ) ;
5858static BUS_DEFINE_PROPERTY_GET_REF (property_get_syslog_facility , "i ", int , LOG_FAC ) ;
59+ static BUS_DEFINE_PROPERTY_GET (property_get_cpu_affinity_from_numa , "b ", ExecContext , exec_context_get_cpu_affinity_from_numa ) ;
60+
5961
6062static int property_get_environment_files (
6163 sd_bus * bus ,
@@ -213,14 +215,24 @@ static int property_get_cpu_affinity(
213215 sd_bus_error * error ) {
214216
215217 ExecContext * c = userdata ;
218+ _cleanup_ (cpu_set_reset ) CPUSet s = {};
216219 _cleanup_free_ uint8_t * array = NULL ;
217220 size_t allocated ;
218221
219222 assert (bus );
220223 assert (reply );
221224 assert (c );
222225
223- (void ) cpu_set_to_dbus (& c -> cpu_set , & array , & allocated );
226+ if (c -> cpu_affinity_from_numa ) {
227+ int r ;
228+
229+ r = numa_to_cpu_set (& c -> numa_policy , & s );
230+ if (r < 0 )
231+ return r ;
232+ }
233+
234+ (void ) cpu_set_to_dbus (c -> cpu_affinity_from_numa ? & s : & c -> cpu_set , & array , & allocated );
235+
224236 return sd_bus_message_append_array (reply , 'y' , array , allocated );
225237}
226238
@@ -741,6 +753,7 @@ const sd_bus_vtable bus_exec_vtable[] = {
741753 SD_BUS_PROPERTY ("CPUSchedulingPolicy" , "i" , property_get_cpu_sched_policy , 0 , SD_BUS_VTABLE_PROPERTY_CONST ),
742754 SD_BUS_PROPERTY ("CPUSchedulingPriority" , "i" , property_get_cpu_sched_priority , 0 , SD_BUS_VTABLE_PROPERTY_CONST ),
743755 SD_BUS_PROPERTY ("CPUAffinity" , "ay" , property_get_cpu_affinity , 0 , SD_BUS_VTABLE_PROPERTY_CONST ),
756+ SD_BUS_PROPERTY ("CPUAffinityFromNUMA" , "b" , property_get_cpu_affinity_from_numa , 0 , SD_BUS_VTABLE_PROPERTY_CONST ),
744757 SD_BUS_PROPERTY ("NUMAPolicy" , "i" , property_get_numa_policy , 0 , SD_BUS_VTABLE_PROPERTY_CONST ),
745758 SD_BUS_PROPERTY ("NUMAMask" , "ay" , property_get_numa_mask , 0 , SD_BUS_VTABLE_PROPERTY_CONST ),
746759 SD_BUS_PROPERTY ("TimerSlackNSec" , "t" , property_get_timer_slack_nsec , 0 , SD_BUS_VTABLE_PROPERTY_CONST ),
@@ -1770,6 +1783,20 @@ int bus_exec_context_set_transient_property(
17701783
17711784 return 1 ;
17721785
1786+ } else if (streq (name , "CPUAffinityFromNUMA" )) {
1787+ int q ;
1788+
1789+ r = sd_bus_message_read_basic (message , 'b' , & q );
1790+ if (r < 0 )
1791+ return r ;
1792+
1793+ if (!UNIT_WRITE_FLAGS_NOOP (flags )) {
1794+ c -> cpu_affinity_from_numa = q ;
1795+ unit_write_settingf (u , flags , name , "%s=%s" , "CPUAffinity" , "numa" );
1796+ }
1797+
1798+ return 1 ;
1799+
17731800 } else if (streq (name , "NUMAPolicy" )) {
17741801 int32_t type ;
17751802
@@ -1784,6 +1811,7 @@ int bus_exec_context_set_transient_property(
17841811 c -> numa_policy .type = type ;
17851812
17861813 return 1 ;
1814+
17871815 } else if (streq (name , "Nice" )) {
17881816 int32_t q ;
17891817
0 commit comments