Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

QoS device level NVMe update #104

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 29 additions & 3 deletions pkg/frontend/nvme.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func calculateTransportAddr(pci *pb.PciEndpoint) string {

// CreateNVMeController creates an NVMe controller
func (s *Server) CreateNVMeController(ctx context.Context, in *pb.CreateNVMeControllerRequest) (*pb.NVMeController, error) {
log.Printf("Intel bridge received from client: %v", in.NvMeController)
log.Printf("Intel bridge CreateNVMeController received from client: %v", in.NvMeController)
if err := s.verifyNVMeController(in.NvMeController); err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
Expand Down Expand Up @@ -75,7 +75,33 @@ func (s *Server) CreateNVMeController(ctx context.Context, in *pb.CreateNVMeCont
return response, err
}

// UpdateNVMeController updates an NVMe controller
func (s *Server) UpdateNVMeController(ctx context.Context, in *pb.UpdateNVMeControllerRequest) (*pb.NVMeController, error) {
log.Printf("Intel bridge UpdateNVMeController received from client: %v", in)
if err := s.verifyNVMeController(in.NvMeController); err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}

originalNvmeController := s.nvme.Controllers[in.NvMeController.Spec.Id.Value]
log.Printf("Passing request to opi-spdk-bridge")
response, err := s.FrontendNvmeServiceServer.UpdateNVMeController(ctx, in)

if err == nil {
if qosErr := s.setNVMeQosLimit(in.NvMeController); qosErr != nil {
log.Println("Failed to set qos settings:", qosErr)
log.Println("Restore original controller")
s.nvme.Controllers[in.NvMeController.Spec.Id.Value] = originalNvmeController
return nil, qosErr
}
}
return response, err
}

func (s *Server) verifyNVMeController(controller *pb.NVMeController) error {
if controller.Spec.Id == nil || controller.Spec.Id.Value == "" {
return fmt.Errorf("id cannot be empty")
}

maxLimit := controller.Spec.MaxLimit
if err := s.verifyNVMeControllerMaxLimits(maxLimit); err != nil {
return err
Expand Down Expand Up @@ -141,10 +167,10 @@ func (s *Server) verifyNVMeControllerMinLimits(minLimit *pb.QosLimit) error {

func (s *Server) verifyNVMeControllerMinMaxLimitCorrespondence(minLimit *pb.QosLimit, maxLimit *pb.QosLimit) error {
if minLimit != nil && maxLimit != nil {
if minLimit.RdBandwidthMbs > maxLimit.RdBandwidthMbs {
if maxLimit.RdBandwidthMbs != 0 && minLimit.RdBandwidthMbs > maxLimit.RdBandwidthMbs {
return fmt.Errorf("QoS limit_min rd_bandwidth_mbs cannot be greater than limit_max rd_bandwidth_mbs")
}
if minLimit.WrBandwidthMbs > maxLimit.WrBandwidthMbs {
if maxLimit.WrBandwidthMbs != 0 && minLimit.WrBandwidthMbs > maxLimit.WrBandwidthMbs {
return fmt.Errorf("QoS limit_min wr_bandwidth_mbs cannot be greater than limit_max wr_bandwidth_mbs")
}
}
Expand Down
Loading