@@ -342,6 +342,22 @@ pub fn validate_cdi_device_names(devices: &[String], field: &str) -> Result<(),
342342 Ok ( ( ) )
343343}
344344
345+ /// Validate explicit CDI selectors and their GPU request requirements.
346+ ///
347+ /// Docker and Podman use this helper; drivers with other identifier formats use
348+ /// [`validate_specific_gpu_device_request`] directly.
349+ ///
350+ /// # Errors
351+ /// Returns an error for malformed CDI names or invalid GPU request requirements.
352+ pub fn validate_cdi_gpu_device_request (
353+ gpu : Option < & DriverGpuResourceRequirements > ,
354+ devices : & [ String ] ,
355+ field : & str ,
356+ ) -> Result < ( ) , String > {
357+ validate_cdi_device_names ( devices, field) ?;
358+ validate_specific_gpu_device_request ( gpu, devices, field)
359+ }
360+
345361/// Validate a compute-driver GPU request against driver-owned specific devices.
346362///
347363/// Drivers call this when a sandbox request combines portable GPU requirements
@@ -350,7 +366,7 @@ pub fn validate_cdi_device_names(devices: &[String], field: &str) -> Result<(),
350366/// # Errors
351367/// Returns an error when the sandbox GPU request is absent, when `gpu.count`
352368/// is zero, when device IDs are duplicated, or when the effective GPU count
353- /// does not equal the number of specific devices, or when CDI names are malformed .
369+ /// does not equal the number of specific devices.
354370pub fn validate_specific_gpu_device_request (
355371 gpu : Option < & DriverGpuResourceRequirements > ,
356372 specific_devices : & [ String ] ,
@@ -361,8 +377,6 @@ pub fn validate_specific_gpu_device_request(
361377 return Ok ( ( ) ) ;
362378 }
363379
364- validate_cdi_device_names ( specific_devices, driver_config_field) ?;
365-
366380 let mut seen = HashSet :: with_capacity ( device_count) ;
367381 for device in specific_devices {
368382 if !seen. insert ( device. as_str ( ) ) {
@@ -403,8 +417,7 @@ mod tests {
403417 "v/c=0" ,
404418 ] {
405419 let devices = vec ! [ device. to_string( ) ] ;
406- let gpu = DriverGpuResourceRequirements { count : None } ;
407- validate_specific_gpu_device_request ( Some ( & gpu) , & devices, "driver_config.cdi_devices" )
420+ validate_cdi_device_names ( & devices, "driver_config.cdi_devices" )
408421 . unwrap_or_else ( |error| panic ! ( "{device:?}: {error}" ) ) ;
409422 }
410423 }
@@ -441,13 +454,9 @@ mod tests {
441454 "vendor/gpu-=0" ,
442455 "vendor/gpu/other=0" ,
443456 ] {
444- let gpu = DriverGpuResourceRequirements { count : None } ;
445- let error = validate_specific_gpu_device_request (
446- Some ( & gpu) ,
447- & [ device. to_string ( ) ] ,
448- "driver_config.cdi_devices" ,
449- )
450- . unwrap_err ( ) ;
457+ let error =
458+ validate_cdi_device_names ( & [ device. to_string ( ) ] , "driver_config.cdi_devices" )
459+ . unwrap_err ( ) ;
451460 assert ! ( error. contains( "CDI qualified names" ) , "{device:?}: {error}" ) ;
452461 }
453462 }
@@ -652,6 +661,18 @@ mod tests {
652661 ) ;
653662 }
654663
664+ #[ test]
665+ fn specific_gpu_device_request_preserves_non_cdi_identifiers ( ) {
666+ let gpu = DriverGpuResourceRequirements { count : Some ( 1 ) } ;
667+ let devices = vec ! [ "0000:2d:00.0" . to_string( ) ] ;
668+ validate_specific_gpu_device_request ( Some ( & gpu) , & devices, "driver_config.gpu_device_ids" )
669+ . expect ( "generic GPU request validation must accept PCI device identifiers" ) ;
670+ let error =
671+ validate_cdi_gpu_device_request ( Some ( & gpu) , & devices, "driver_config.cdi_devices" )
672+ . expect_err ( "CDI drivers must reject non-CDI identifiers" ) ;
673+ assert ! ( error. contains( "CDI qualified names" ) ) ;
674+ }
675+
655676 #[ test]
656677 fn validate_specific_gpu_device_request_ignores_empty_devices ( ) {
657678 validate_specific_gpu_device_request ( None , & [ ] , "driver_config.cdi_devices" )
0 commit comments