code: func (lim *limiter) processDevicesConfigurationLocked(from, to config.Configuration) {
  	seen := make(map[protocol.DeviceID]struct{})
  
  	// Mark devices which should not be removed, create new limiters if needed and assign new limiter rate
  	for _, dev := range to.Devices {
  		if dev.DeviceID == to.MyID {
  			// This limiter was created for local device. Should skip this device
  			continue
  		}
  		seen[dev.DeviceID] = struct{}{}
  
  		if lim.setLimitsLocked(dev) {
  			readLimitStr := "is unlimited"
  			if dev.MaxRecvKbps > 0 {
  				readLimitStr = fmt.Sprintf("limit is %d KiB/s", dev.MaxRecvKbps)
  			}
  			writeLimitStr := "is unlimited"
  			if dev.MaxSendKbps > 0 {
  				writeLimitStr = fmt.Sprintf("limit is %d KiB/s", dev.MaxSendKbps)
  			}
  
  			l.Infof("Device %s send rate %s, receive rate %s", dev.DeviceID, writeLimitStr, readLimitStr)
  		}
  	}
  
  	// Delete remote devices which were removed in new configuration
  	for _, dev := range from.Devices {
  		if _, ok := seen[dev.DeviceID]; !ok {
  			l.Debugf("deviceID: %s should be removed", dev.DeviceID)
  
  			delete(lim.deviceWriteLimiters, dev.DeviceID)
  			delete(lim.deviceReadLimiters, dev.DeviceID)
  		}
  	}
  }
docs: // This function handles removing, adding and updating of device limiters.