/
hugepages.go
73 lines (57 loc) · 2.33 KB
/
hugepages.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
Copyright 2020 The OpenEBS Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package services
import (
"context"
"io/ioutil"
"strconv"
"strings"
protos "github.com/openebs/node-disk-manager/spec/ndm"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"k8s.io/klog"
)
const hugepagesPath = "/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages"
// SetHugepages service can set 2MB hugepages on a node
func (n *Node) SetHugepages(ctx context.Context, h *protos.Hugepages) (*protos.HugepagesResult, error) {
// Note: Calling this method doesn't guarantee that the said number of pages will be set.
// This is because OS might not have the demanded memory. It would be best to check if this is satisfied with GetHugePages()
klog.Info("Setting Hugepages")
hugepages := protos.Hugepages{
Pages: h.Pages,
}
msg := []byte(strconv.Itoa(int(hugepages.Pages)))
err := ioutil.WriteFile(hugepagesPath, msg, 0644)
if err != nil {
klog.Errorf("Error setting huge pages: %v", err)
return nil, status.Errorf(codes.Internal, "Error setting hugepages")
}
return &protos.HugepagesResult{Result: true}, nil
}
// GetHugepages services gets the number of hugepages on a node
func (n *Node) GetHugepages(ctx context.Context, null *protos.Null) (*protos.Hugepages, error) {
klog.Info("Getting the number of hugepages")
hugepages, err := ioutil.ReadFile(hugepagesPath)
if err != nil {
klog.Errorf("Error fetching number of hugepages %v", err)
return nil, status.Errorf(codes.Internal, "Error fetching the number of hugepages set on the node")
}
pages, err := strconv.Atoi(strings.TrimRight(string(hugepages), "\n"))
if err != nil {
klog.Errorf("Error converting number of hugepages %v", err)
return nil, status.Errorf(codes.Internal, "Error converting the number of hugepages set on the node")
}
return &protos.Hugepages{
Pages: int32(pages),
}, nil
}