mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 11:50:44 +00:00
Merge pull request #80315 from klueska/upstream-cleanup-socketmask
Cleanup the TopologyManager socketmask abstraction
This commit is contained in:
commit
5b496fe8f5
@ -20,7 +20,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
//SocketMask interface allows hint providers to create SocketMasks for TopologyHints
|
// SocketMask interface allows hint providers to create SocketMasks for TopologyHints
|
||||||
type SocketMask interface {
|
type SocketMask interface {
|
||||||
Add(sockets ...int) error
|
Add(sockets ...int) error
|
||||||
Remove(sockets ...int) error
|
Remove(sockets ...int) error
|
||||||
@ -39,7 +39,13 @@ type SocketMask interface {
|
|||||||
|
|
||||||
type socketMask uint64
|
type socketMask uint64
|
||||||
|
|
||||||
//NewSocketMask creates a new SocketMask
|
// NewEmptySocketMask creates a new, empty SocketMask
|
||||||
|
func NewEmptySocketMask() SocketMask {
|
||||||
|
s := socketMask(0)
|
||||||
|
return &s
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSocketMask creates a new SocketMask
|
||||||
func NewSocketMask(sockets ...int) (SocketMask, error) {
|
func NewSocketMask(sockets ...int) (SocketMask, error) {
|
||||||
s := socketMask(0)
|
s := socketMask(0)
|
||||||
err := (&s).Add(sockets...)
|
err := (&s).Add(sockets...)
|
||||||
@ -49,7 +55,7 @@ func NewSocketMask(sockets ...int) (SocketMask, error) {
|
|||||||
return &s, nil
|
return &s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//Add adds the sockets with topology affinity to the SocketMask
|
// Add adds the sockets with topology affinity to the SocketMask
|
||||||
func (s *socketMask) Add(sockets ...int) error {
|
func (s *socketMask) Add(sockets ...int) error {
|
||||||
mask := *s
|
mask := *s
|
||||||
for _, i := range sockets {
|
for _, i := range sockets {
|
||||||
@ -62,7 +68,7 @@ func (s *socketMask) Add(sockets ...int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//Remove removes specified sockets from SocketMask
|
// Remove removes specified sockets from SocketMask
|
||||||
func (s *socketMask) Remove(sockets ...int) error {
|
func (s *socketMask) Remove(sockets ...int) error {
|
||||||
mask := *s
|
mask := *s
|
||||||
for _, i := range sockets {
|
for _, i := range sockets {
|
||||||
@ -75,36 +81,36 @@ func (s *socketMask) Remove(sockets ...int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//And performs and operation on all bits in masks
|
// And performs and operation on all bits in masks
|
||||||
func (s *socketMask) And(masks ...SocketMask) {
|
func (s *socketMask) And(masks ...SocketMask) {
|
||||||
for _, m := range masks {
|
for _, m := range masks {
|
||||||
*s &= *m.(*socketMask)
|
*s &= *m.(*socketMask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Or performs or operation on all bits in masks
|
// Or performs or operation on all bits in masks
|
||||||
func (s *socketMask) Or(masks ...SocketMask) {
|
func (s *socketMask) Or(masks ...SocketMask) {
|
||||||
for _, m := range masks {
|
for _, m := range masks {
|
||||||
*s |= *m.(*socketMask)
|
*s |= *m.(*socketMask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Clear resets all bits in mask to zero
|
// Clear resets all bits in mask to zero
|
||||||
func (s *socketMask) Clear() {
|
func (s *socketMask) Clear() {
|
||||||
*s = 0
|
*s = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
//Fill sets all bits in mask to one
|
// Fill sets all bits in mask to one
|
||||||
func (s *socketMask) Fill() {
|
func (s *socketMask) Fill() {
|
||||||
*s = socketMask(^uint64(0))
|
*s = socketMask(^uint64(0))
|
||||||
}
|
}
|
||||||
|
|
||||||
//IsEmpty checks mask to see if all bits are zero
|
// IsEmpty checks mask to see if all bits are zero
|
||||||
func (s *socketMask) IsEmpty() bool {
|
func (s *socketMask) IsEmpty() bool {
|
||||||
return *s == 0
|
return *s == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
//IsSet checks socket in mask to see if bit is set to one
|
// IsSet checks socket in mask to see if bit is set to one
|
||||||
func (s *socketMask) IsSet(socket int) bool {
|
func (s *socketMask) IsSet(socket int) bool {
|
||||||
if socket < 0 || socket >= 64 {
|
if socket < 0 || socket >= 64 {
|
||||||
return false
|
return false
|
||||||
@ -112,7 +118,7 @@ func (s *socketMask) IsSet(socket int) bool {
|
|||||||
return (*s & (1 << uint64(socket))) > 0
|
return (*s & (1 << uint64(socket))) > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
//IsEqual checks if masks are equal
|
// IsEqual checks if masks are equal
|
||||||
func (s *socketMask) IsEqual(mask SocketMask) bool {
|
func (s *socketMask) IsEqual(mask SocketMask) bool {
|
||||||
return *s == *mask.(*socketMask)
|
return *s == *mask.(*socketMask)
|
||||||
}
|
}
|
||||||
@ -131,7 +137,7 @@ func (s *socketMask) IsNarrowerThan(mask SocketMask) bool {
|
|||||||
return s.Count() < mask.Count()
|
return s.Count() < mask.Count()
|
||||||
}
|
}
|
||||||
|
|
||||||
//String converts mask to string
|
// String converts mask to string
|
||||||
func (s *socketMask) String() string {
|
func (s *socketMask) String() string {
|
||||||
str := ""
|
str := ""
|
||||||
for i := uint64(0); i < 64; i++ {
|
for i := uint64(0); i < 64; i++ {
|
||||||
@ -144,7 +150,7 @@ func (s *socketMask) String() string {
|
|||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
//Count counts number of bits in mask set to one
|
// Count counts number of bits in mask set to one
|
||||||
func (s *socketMask) Count() int {
|
func (s *socketMask) Count() int {
|
||||||
count := 0
|
count := 0
|
||||||
for i := uint64(0); i < 64; i++ {
|
for i := uint64(0); i < 64; i++ {
|
||||||
@ -155,7 +161,7 @@ func (s *socketMask) Count() int {
|
|||||||
return count
|
return count
|
||||||
}
|
}
|
||||||
|
|
||||||
//GetSockets returns each socket number with bits set to one
|
// GetSockets returns each socket number with bits set to one
|
||||||
func (s *socketMask) GetSockets() []int {
|
func (s *socketMask) GetSockets() []int {
|
||||||
var sockets []int
|
var sockets []int
|
||||||
for i := uint64(0); i < 64; i++ {
|
for i := uint64(0); i < 64; i++ {
|
||||||
@ -165,3 +171,17 @@ func (s *socketMask) GetSockets() []int {
|
|||||||
}
|
}
|
||||||
return sockets
|
return sockets
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// And is a package level implementation of 'and' between first and masks
|
||||||
|
func And(first SocketMask, masks ...SocketMask) SocketMask {
|
||||||
|
s := *first.(*socketMask)
|
||||||
|
s.And(masks...)
|
||||||
|
return &s
|
||||||
|
}
|
||||||
|
|
||||||
|
// Or is a package level implementation of 'or' between first and masks
|
||||||
|
func Or(first SocketMask, masks ...SocketMask) SocketMask {
|
||||||
|
s := *first.(*socketMask)
|
||||||
|
s.Or(masks...)
|
||||||
|
return &s
|
||||||
|
}
|
||||||
|
@ -106,6 +106,12 @@ func TestAnd(t *testing.T) {
|
|||||||
for _, tc := range tcases {
|
for _, tc := range tcases {
|
||||||
firstMask, _ := NewSocketMask(tc.firstMaskBit)
|
firstMask, _ := NewSocketMask(tc.firstMaskBit)
|
||||||
secondMask, _ := NewSocketMask(tc.secondMaskBit)
|
secondMask, _ := NewSocketMask(tc.secondMaskBit)
|
||||||
|
|
||||||
|
result := And(firstMask, secondMask)
|
||||||
|
if result.String() != string(tc.andMask) {
|
||||||
|
t.Errorf("Expected mask to be %v, got %v", tc.andMask, result)
|
||||||
|
}
|
||||||
|
|
||||||
firstMask.And(secondMask)
|
firstMask.And(secondMask)
|
||||||
if firstMask.String() != string(tc.andMask) {
|
if firstMask.String() != string(tc.andMask) {
|
||||||
t.Errorf("Expected mask to be %v, got %v", tc.andMask, firstMask)
|
t.Errorf("Expected mask to be %v, got %v", tc.andMask, firstMask)
|
||||||
@ -130,6 +136,12 @@ func TestOr(t *testing.T) {
|
|||||||
for _, tc := range tcases {
|
for _, tc := range tcases {
|
||||||
firstMask, _ := NewSocketMask(tc.firstMaskBit)
|
firstMask, _ := NewSocketMask(tc.firstMaskBit)
|
||||||
secondMask, _ := NewSocketMask(tc.secondMaskBit)
|
secondMask, _ := NewSocketMask(tc.secondMaskBit)
|
||||||
|
|
||||||
|
result := Or(firstMask, secondMask)
|
||||||
|
if result.String() != string(tc.orMask) {
|
||||||
|
t.Errorf("Expected mask to be %v, got %v", tc.orMask, result)
|
||||||
|
}
|
||||||
|
|
||||||
firstMask.Or(secondMask)
|
firstMask.Or(secondMask)
|
||||||
if firstMask.String() != string(tc.orMask) {
|
if firstMask.String() != string(tc.orMask) {
|
||||||
t.Errorf("Expected mask to be %v, got %v", tc.orMask, firstMask)
|
t.Errorf("Expected mask to be %v, got %v", tc.orMask, firstMask)
|
||||||
|
Loading…
Reference in New Issue
Block a user