]>
git.proxmox.com Git - pve-common.git/blob - src/PVE/CpuSet.pm
11 my $class = ref($this) || $this;
13 my $self = bless { members
=> {} }, $class;
19 my ($this, $cgroup, $kind) = @_;
23 my $filename = "/sys/fs/cgroup/cpuset/$cgroup/cpuset.$kind";
24 my $set_text = PVE
::Tools
::file_read_firstline
($filename) // '';
26 my $cpuset = $this->new();
28 my $members = $cpuset->{members
};
32 foreach my $part (split(/,/, $set_text)) {
33 if ($part =~ /^\s*(\d+)(?:-(\d+))?\s*$/) {
34 my ($from, $to) = ($1, $2);
36 die "invalid range: $part ($to < $from)\n" if $to < $from;
37 for (my $i = $from; $i <= $to; $i++) {
42 die "invalid range: $part\n";
46 die "got empty cpuset for cgroup '$cgroup'\n"
53 my ($self, $cgroup) = @_;
55 my $filename = "/sys/fs/cgroup/cpuset/$cgroup/cpuset.cpus";
58 my @members = $self->members();
59 foreach my $cpuid (@members) {
60 $value .= ',' if length($value);
64 die "unable to write empty cpu set\n" if !length($value);
66 open(my $fh, '>', $filename) || die "failed to open '$filename' - $!\n";
67 PVE
::Tools
::safe_print
($filename, $fh, "$value\n");
68 close($fh) || die "failed to close '$filename' - $!\n";
72 my ($self, @members) = @_;
76 foreach my $cpu (@members) {
77 next if $self->{members
}->{$cpu};
78 $self->{members
}->{$cpu} = 1;
86 my ($self, @members) = @_;
90 foreach my $cpu (@members) {
91 next if !$self->{members
}->{$cpu};
92 delete $self->{members
}->{$cpu};
100 my ($self, $cpuid) = @_;
102 return $self->{members
}->{$cpuid};
105 # members: this list is always sorted!
109 return sort { $a <=> $b } keys %{$self->{members
}};
115 return scalar(keys %{$self->{members
}});
119 my ($self, $set2) = @_;
121 my $members1 = $self->{members
};
122 my $members2 = $set2->{members
};
124 foreach my $id (keys %$members1) {
125 return 0 if !$members2->{$id};
127 foreach my $id (keys %$members2) {
128 return 0 if !$members1->{$id};
137 my @members = $self->members();
141 foreach my $cpu (@members) {
142 if (!defined($last)) {
143 $last = $next = $cpu;
144 } elsif (($next + 1) == $cpu) {
147 $res .= ',' if length($res);
148 if ($last != $next) {
149 $res .= "$last-$next";
153 $last = $next = $cpu;
157 if (defined($last)) {
158 $res .= ',' if length($res);
159 if ($last != $next) {
160 $res .= "$last-$next";