Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
283dff93
Commit
283dff93
authored
May 27, 2019
by
nolancon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update SocketMask based on feedback
TODO: Unit tests to be updated
parent
e8566caa
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
102 additions
and
113 deletions
+102
-113
BUILD
pkg/kubelet/cm/topologymanager/socketmask/BUILD
+0
-1
socketmask.go
pkg/kubelet/cm/topologymanager/socketmask/socketmask.go
+102
-112
No files found.
pkg/kubelet/cm/topologymanager/socketmask/BUILD
View file @
283dff93
...
@@ -5,7 +5,6 @@ go_library(
...
@@ -5,7 +5,6 @@ go_library(
srcs = ["socketmask.go"],
srcs = ["socketmask.go"],
importpath = "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/socketmask",
importpath = "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/socketmask",
visibility = ["//visibility:public"],
visibility = ["//visibility:public"],
deps = ["//vendor/k8s.io/klog:go_default_library"],
)
)
filegroup(
filegroup(
...
...
pkg/kubelet/cm/topologymanager/socketmask/socketmask.go
View file @
283dff93
...
@@ -17,146 +17,136 @@ limitations under the License.
...
@@ -17,146 +17,136 @@ limitations under the License.
package
socketmask
package
socketmask
import
(
import
(
"bytes"
"fmt"
"k8s.io/klog"
"math"
"strconv"
"strings"
)
)
// SocketMask represents the NUMA affinity of a socket.
//SocketMask interface allows hint providers to create SocketMasks for TopologyHints
type
SocketMask
[]
int64
type
SocketMask
interface
{
Add
(
sockets
...
int
)
error
// NewSocketMask creates a new socket mask.
Remove
(
sockets
...
int
)
error
func
NewSocketMask
(
Mask
[]
int64
)
SocketMask
{
And
(
masks
...
SocketMask
)
return
Mask
Or
(
masks
...
SocketMask
)
Clear
()
Fill
()
IsEqual
(
mask
SocketMask
)
bool
IsEmpty
()
bool
IsSet
(
socket
int
)
bool
String
()
string
Count
()
int
GetSockets
()
[]
int
}
}
// GetSocketMask calculates the socket mask.
type
socketMask
uint64
func
(
sm
SocketMask
)
GetSocketMask
(
socketMaskInt64
[][]
int64
,
maskHolder
[]
string
,
count
int
)
(
SocketMask
,
[]
string
)
{
if
count
==
0
{
//NewSocketMask creates a new SocketMask
maskHolder
=
buildMaskHolder
(
socketMaskInt64
)
func
NewSocketMask
(
sockets
...
int
)
(
SocketMask
,
error
)
{
s
:=
socketMask
(
0
)
err
:=
(
&
s
)
.
Add
(
sockets
...
)
if
err
!=
nil
{
return
nil
,
err
}
}
klog
.
V
(
4
)
.
Infof
(
"[socketmask] MaskHolder : %v"
,
maskHolder
)
return
&
s
,
nil
klog
.
V
(
4
)
.
Infof
(
"[socketmask] %v is passed into arrange function"
,
socketMaskInt64
)
arrangedMask
:=
arrangeMask
(
socketMaskInt64
)
newMask
:=
getTopologyAffinity
(
arrangedMask
,
maskHolder
)
klog
.
V
(
4
)
.
Infof
(
"[socketmask] New Mask after getTopologyAffinity (new mask) : %v "
,
newMask
)
finalMaskValue
:=
parseMask
(
newMask
)
klog
.
V
(
4
)
.
Infof
(
"[socketmask] Mask []Int64 (finalMaskValue): %v"
,
finalMaskValue
)
maskHolder
=
newMask
klog
.
V
(
4
)
.
Infof
(
"[socketmask] New MaskHolder: %v"
,
maskHolder
)
return
SocketMask
(
finalMaskValue
),
maskHolder
}
}
func
buildMaskHolder
(
mask
[][]
int64
)
[]
string
{
//Add adds the sockets with topology affinity to the SocketMask
outerLen
:=
len
(
mask
)
func
(
s
*
socketMask
)
Add
(
sockets
...
int
)
error
{
var
innerLen
int
mask
:=
*
s
for
i
:=
0
;
i
<
outerLen
;
i
++
{
for
_
,
i
:=
range
sockets
{
if
innerLen
<
len
(
mask
[
i
])
{
if
i
<
0
||
i
>=
64
{
innerLen
=
len
(
mask
[
i
])
return
fmt
.
Errorf
(
"socket number must be in range 0-63"
)
}
}
var
maskHolder
[]
string
var
buffer
bytes
.
Buffer
var
i
,
j
int
=
0
,
0
for
i
=
0
;
i
<
outerLen
;
i
++
{
for
j
=
0
;
j
<
innerLen
;
j
++
{
buffer
.
WriteString
(
"1"
)
}
}
maskHolder
=
append
(
maskHolder
,
buffer
.
String
())
mask
|=
1
<<
uint64
(
i
)
buffer
.
Reset
()
}
}
return
maskHolder
*
s
=
mask
return
nil
}
}
func
getTopologyAffinity
(
arrangedMask
,
maskHolder
[]
string
)
[]
string
{
//Remove removes specified sockets from SocketMask
var
topologyTemp
[]
string
func
(
s
*
socketMask
)
Remove
(
sockets
...
int
)
error
{
for
i
:=
0
;
i
<
len
(
maskHolder
);
i
++
{
mask
:=
*
s
for
j
:=
0
;
j
<
len
(
arrangedMask
);
j
++
{
for
_
,
i
:=
range
sockets
{
tempStr
:=
andOperation
(
maskHolder
[
i
],
arrangedMask
[
j
])
if
i
<
0
||
i
>=
64
{
if
strings
.
Contains
(
tempStr
,
"1"
)
{
return
fmt
.
Errorf
(
"socket number must be in range 0-63"
)
topologyTemp
=
append
(
topologyTemp
,
tempStr
)
}
}
}
mask
&^=
1
<<
uint64
(
i
)
}
}
duplicates
:=
map
[
string
]
bool
{}
*
s
=
mask
for
v
:=
range
topologyTemp
{
return
nil
duplicates
[
topologyTemp
[
v
]]
=
true
}
//And performs and operation on all bits in masks
func
(
s
*
socketMask
)
And
(
masks
...
SocketMask
)
{
for
_
,
m
:=
range
masks
{
*
s
&=
*
m
.
(
*
socketMask
)
}
}
// Place all keys from the map into a slice.
}
topologyResult
:=
[]
string
{}
for
key
:=
range
duplicates
{
//Or performs or operation on all bits in masks
topologyResult
=
append
(
topologyResult
,
key
)
func
(
s
*
socketMask
)
Or
(
masks
...
SocketMask
)
{
for
_
,
m
:=
range
masks
{
*
s
|=
*
m
.
(
*
socketMask
)
}
}
}
return
topologyResult
//Clear resets all bits in mask to zero
func
(
s
*
socketMask
)
Clear
()
{
*
s
=
0
}
}
func
parseMask
(
mask
[]
string
)
[]
int64
{
//Fill sets all bits in mask to one
var
maskStr
string
func
(
s
*
socketMask
)
Fill
()
{
min
:=
strings
.
Count
(
mask
[
0
],
"1"
)
*
s
=
socketMask
(
^
uint64
(
0
)
)
var
num
,
index
int
}
for
i
:=
0
;
i
<
len
(
mask
);
i
++
{
//IsEmpty checks mask to see if all bits are zero
num
=
strings
.
Count
(
mask
[
i
],
"1"
)
func
(
s
*
socketMask
)
IsEmpty
()
bool
{
if
num
<
min
{
return
*
s
==
0
min
=
num
}
index
=
i
}
//IsSet checks socket in mask to see if bit is set to one
maskStr
=
mask
[
index
]
func
(
s
*
socketMask
)
IsSet
(
socket
int
)
bool
{
if
socket
<
0
||
socket
>=
64
{
return
false
}
}
var
maskInt
[]
int64
return
(
*
s
&
(
1
<<
uint64
(
socket
)))
>
0
for
_
,
char
:=
range
maskStr
{
}
convertedStr
,
err
:=
strconv
.
Atoi
(
string
(
char
))
if
err
!=
nil
{
//IsEqual checks if masks are equal
klog
.
V
(
4
)
.
Infof
(
"could not convert mask character: %v"
,
err
)
func
(
s
*
socketMask
)
IsEqual
(
mask
SocketMask
)
bool
{
return
maskInt
return
*
s
==
*
mask
.
(
*
socketMask
)
}
//String converts mask to string
func
(
s
*
socketMask
)
String
()
string
{
str
:=
""
for
i
:=
uint64
(
0
);
i
<
64
;
i
++
{
if
(
*
s
&
(
1
<<
i
))
>
0
{
str
+=
"1"
}
else
{
str
+=
"0"
}
}
maskInt
=
append
(
maskInt
,
int64
(
convertedStr
))
}
}
klog
.
V
(
4
)
.
Infof
(
"[socketmask] Mask Int in Parse Mask: %v"
,
maskInt
)
return
str
return
maskInt
}
}
func
arrangeMask
(
mask
[][]
int64
)
[]
string
{
//Count counts number of bits in mask set to one
var
socketStr
[]
string
func
(
s
*
socketMask
)
Count
()
int
{
var
bufferNew
bytes
.
Buffer
count
:=
0
outerLen
:=
len
(
mask
)
for
i
:=
uint64
(
0
);
i
<
64
;
i
++
{
innerLen
:=
len
(
mask
[
0
])
if
(
*
s
&
(
1
<<
i
))
>
0
{
for
i
:=
0
;
i
<
outerLen
;
i
++
{
count
++
for
j
:=
0
;
j
<
innerLen
;
j
++
{
if
mask
[
i
][
j
]
==
1
{
bufferNew
.
WriteString
(
"1"
)
}
else
if
mask
[
i
][
j
]
==
0
{
bufferNew
.
WriteString
(
"0"
)
}
}
}
socketStr
=
append
(
socketStr
,
bufferNew
.
String
())
bufferNew
.
Reset
()
}
}
return
socketStr
return
count
}
}
func
andOperation
(
val1
,
val2
string
)
string
{
//GetSockets returns each socket number with bits set to one
l1
,
l2
:=
len
(
val1
),
len
(
val2
)
func
(
s
*
socketMask
)
GetSockets
()
[]
int
{
//compare lengths of strings - pad shortest with trailing zeros
var
sockets
[]
int
if
l1
!=
l2
{
for
i
:=
uint64
(
0
);
i
<
64
;
i
++
{
// Get the bit difference
if
(
*
s
&
(
1
<<
i
))
>
0
{
var
num
int
sockets
=
append
(
sockets
,
int
(
i
))
diff
:=
math
.
Abs
(
float64
(
l1
)
-
float64
(
l2
))
num
=
int
(
diff
)
if
l1
<
l2
{
val1
=
val1
+
strings
.
Repeat
(
"0"
,
num
)
}
else
{
val2
=
val2
+
strings
.
Repeat
(
"0"
,
num
)
}
}
}
}
length
:=
len
(
val1
)
return
sockets
byteArr
:=
make
([]
byte
,
length
)
for
i
:=
0
;
i
<
length
;
i
++
{
byteArr
[
i
]
=
val1
[
i
]
&
val2
[
i
]
}
return
string
(
byteArr
[
:
])
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment