From 9f5f401d608b42d7fc170fb8395b862c0b69e0ef Mon Sep 17 00:00:00 2001 From: Kevin Klues Date: Sat, 18 Jul 2020 18:31:39 +0000 Subject: [PATCH] Add AnySet() to topologymanager bitmask API --- .../cm/topologymanager/bitmask/bitmask.go | 11 +++++ .../topologymanager/bitmask/bitmask_test.go | 47 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/pkg/kubelet/cm/topologymanager/bitmask/bitmask.go b/pkg/kubelet/cm/topologymanager/bitmask/bitmask.go index 468f94f951a..fb2043e0182 100644 --- a/pkg/kubelet/cm/topologymanager/bitmask/bitmask.go +++ b/pkg/kubelet/cm/topologymanager/bitmask/bitmask.go @@ -33,6 +33,7 @@ type BitMask interface { IsEqual(mask BitMask) bool IsEmpty() bool IsSet(bit int) bool + AnySet(bits []int) bool IsNarrowerThan(mask BitMask) bool String() string Count() int @@ -120,6 +121,16 @@ func (s *bitMask) IsSet(bit int) bool { return (*s & (1 << uint64(bit))) > 0 } +// AnySet checks bit in mask to see if any provided bit is set to one +func (s *bitMask) AnySet(bits []int) bool { + for _, b := range bits { + if s.IsSet(b) { + return true + } + } + return false +} + // IsEqual checks if masks are equal func (s *bitMask) IsEqual(mask BitMask) bool { return *s == *mask.(*bitMask) diff --git a/pkg/kubelet/cm/topologymanager/bitmask/bitmask_test.go b/pkg/kubelet/cm/topologymanager/bitmask/bitmask_test.go index 1a02902ad34..d4a5f569509 100644 --- a/pkg/kubelet/cm/topologymanager/bitmask/bitmask_test.go +++ b/pkg/kubelet/cm/topologymanager/bitmask/bitmask_test.go @@ -381,6 +381,53 @@ func TestIsSet(t *testing.T) { } } +func TestAnySet(t *testing.T) { + tcases := []struct { + name string + mask []int + checkBits []int + expectedSet bool + }{ + { + name: "Check if any bits from 11 in mask 00 is set", + mask: nil, + checkBits: []int{0, 1}, + expectedSet: false, + }, + { + name: "Check if any bits from 11 in mask 01 is set", + mask: []int{0}, + checkBits: []int{0, 1}, + expectedSet: true, + }, + { + name: "Check if any bits from 11 in mask 11 is set", + mask: []int{0, 1}, + checkBits: []int{0, 1}, + expectedSet: true, + }, + { + name: "Check if any bit outside range 0-63 is set", + mask: []int{0, 1}, + checkBits: []int{64, 65}, + expectedSet: false, + }, + { + name: "Check if any bits from 1001 in mask 0110 is set", + mask: []int{1, 2}, + checkBits: []int{0, 3}, + expectedSet: false, + }, + } + for _, tc := range tcases { + mask, _ := NewBitMask(tc.mask...) + set := mask.AnySet(tc.checkBits) + if set != tc.expectedSet { + t.Errorf("Expected value to be %v, got %v", tc.expectedSet, set) + } + } +} + func TestIsEqual(t *testing.T) { tcases := []struct { name string