]>
git.proxmox.com Git - pve-common.git/blob - src/PVE/CpuSet.pm
9 my ($class, $members) = @_;
12 my $self = bless { members
=> $members }, $class;
17 # Create a new set with the contents of a cgroup-v1 subdirectory.
20 my ($class, $cgroup, $effective) = @_;
22 return $class->new_from_path("/sys/fs/cgroup/cpuset/$cgroup", $effective);
25 # Create a new set from the contents of a complete path to a cgroup directory.
27 my ($class, $path, $effective) = @_;
31 $filename = "$path/cpuset.effective_cpus";
34 $filename = "$path/cpuset.cpus.effective";
37 $filename = "$path/cpuset.cpus";
40 my $set_text = PVE
::Tools
::file_read_firstline
($filename) // '';
42 my ($count, $members) = parse_cpuset
($set_text);
44 return $class->new($members);
53 foreach my $part (split(/,/, $set_text)) {
54 if ($part =~ /^\s*(\d+)(?:-(\d+))?\s*$/) {
55 my ($from, $to) = ($1, $2);
57 die "invalid range: $part ($to < $from)\n" if $to < $from;
58 for (my $i = $from; $i <= $to; $i++) {
63 die "invalid range: $part\n";
67 return ($count, $members);
72 my ($self, $cgroup) = @_;
74 return $self->write_to_path("/sys/fs/cgroup/cpuset/$cgroup");
77 # Takes the cgroup directory containing the cpuset.cpus file (to be closer to
78 # new_from_path behavior this doesn't take the complete file name).
80 my ($self, $path) = @_;
82 my $filename = "$path/cpuset.cpus";
85 my @members = $self->members();
86 foreach my $cpuid (@members) {
87 $value .= ',' if length($value);
91 open(my $fh, '>', $filename) || die "failed to open '$filename' - $!\n";
92 PVE
::Tools
::safe_print
($filename, $fh, "$value\n");
93 close($fh) || die "failed to close '$filename' - $!\n";
97 my ($self, @members) = @_;
101 foreach my $cpu (@members) {
102 next if $self->{members
}->{$cpu};
103 $self->{members
}->{$cpu} = 1;
111 my ($self, @members) = @_;
115 foreach my $cpu (@members) {
116 next if !$self->{members
}->{$cpu};
117 delete $self->{members
}->{$cpu};
125 my ($self, $cpuid) = @_;
127 return $self->{members
}->{$cpuid};
130 # members: this list is always sorted!
134 return sort { $a <=> $b } keys %{$self->{members
}};
140 return scalar(keys %{$self->{members
}});
144 my ($self, $set2) = @_;
146 my $members1 = $self->{members
};
147 my $members2 = $set2->{members
};
149 foreach my $id (keys %$members1) {
150 return 0 if !$members2->{$id};
152 foreach my $id (keys %$members2) {
153 return 0 if !$members1->{$id};
162 my @members = $self->members();
166 foreach my $cpu (@members) {
167 if (!defined($last)) {
168 $last = $next = $cpu;
169 } elsif (($next + 1) == $cpu) {
172 $res .= ',' if length($res);
173 if ($last != $next) {
174 $res .= "$last-$next";
178 $last = $next = $cpu;
182 if (defined($last)) {
183 $res .= ',' if length($res);
184 if ($last != $next) {
185 $res .= "$last-$next";