]>
git.proxmox.com Git - pve-common.git/blob - src/PVE/CpuSet.pm
12 return $MAX_CPUID if defined($MAX_CPUID);
14 my $cpuinfo = PVE
::ProcFSTools
::read_cpuinfo
();
16 $MAX_CPUID = $cpuinfo->{cpus
} || 1;
24 my $class = ref($this) || $this;
26 my $self = bless { members
=> {} }, $class;
28 max_cpuid
() if !defined($MAX_CPUID); # initialize $MAX_CPUID
34 my ($this, $cgroup, $kind) = @_;
38 my $filename = "/sys/fs/cgroup/cpuset/$cgroup/cpuset.$kind";
39 my $set_text = PVE
::Tools
::file_read_firstline
($filename) // '';
41 my $cpuset = $this->new();
43 my $members = $cpuset->{members
};
47 foreach my $part (split(/,/, $set_text)) {
48 if ($part =~ /^\s*(\d+)(?:-(\d+))?\s*$/) {
49 my ($from, $to) = ($1, $2);
51 die "cpu id '$from' is out of range\n" if $from >= $MAX_CPUID;
52 die "cpu id '$to' is out of range\n" if $to >= $MAX_CPUID;
53 die "invalid range: $part ($to < $from)\n" if $to < $from;
54 for (my $i = $from; $i <= $to; $i++) {
59 die "invalid range: $part\n";
63 die "got empty cpuset for cgroup '$cgroup'\n"
70 my ($self, $cgroup) = @_;
72 my $filename = "/sys/fs/cgroup/cpuset/$cgroup/cpuset.cpus";
75 my @members = $self->members();
76 foreach my $cpuid (@members) {
77 $value .= ',' if length($value);
81 die "unable to write empty cpu set\n" if !length($value);
83 open(my $fh, '>', $filename) || die "failed to open '$filename' - $!\n";
84 PVE
::Tools
::safe_print
($filename, $fh, "$value\n");
85 close($fh) || die "failed to close '$filename' - $!\n";
89 my ($self, @members) = @_;
93 foreach my $cpu (@members) {
94 die "cpu id '$cpu' is out of range\n" if $cpu >= $MAX_CPUID;
95 next if $self->{members
}->{$cpu};
96 $self->{members
}->{$cpu} = 1;
104 my ($self, @members) = @_;
108 foreach my $cpu (@members) {
109 die "cpu id '$cpu' is out of range\n" if $cpu >= $MAX_CPUID;
110 next if !$self->{members
}->{$cpu};
111 delete $self->{members
}->{$cpu};
119 my ($self, $cpuid) = @_;
121 return $self->{members
}->{$cpuid};
124 # members: this list is always sorted!
128 return sort keys %{$self->{members
}};
134 return scalar(keys %{$self->{members
}});
138 my ($self, $set2) = @_;
140 my $members1 = $self->{members
};
141 my $members2 = $set2->{members
};
143 foreach my $id (keys %$members1) {
144 return 0 if !$members2->{$id};
146 foreach my $id (keys %$members2) {
147 return 0 if !$members1->{$id};
156 my @members = $self->members();
160 foreach my $cpu (@members) {
161 if (!defined($last)) {
162 $last = $next = $cpu;
163 } elsif (($next + 1) == $cpu) {
166 $res .= ',' if length($res);
167 if ($last != $next) {
168 $res .= "$last-$next";
172 $last = $next = $cpu;
176 if (defined($last)) {
177 $res .= ',' if length($res);
178 if ($last != $next) {
179 $res .= "$last-$next";