SCO OpenServer


all_io -- determine if all processors can do device I/O


#include <sys/ci/cidriver.h>

int all_io(int bustype);


The all_io routine determines if all processors can perform device I/O on a specified bus.


Possible values for bustype are defined in <sys/ci/cidriver.h>, however the archtobus(D3oddi) or pci_buspresent(D3oddi) routines are more commonly used to specify the bus in an architecture-independent way (see example below).

Return values

Zero (0) is returned if any processor cannot perform I/O to or from a device on the specified bus.

1 is returned if all processors can perform I/O to or from a device on the specified bus.

1 is also returned if only one processor is present in the system.


all_io is called once from either the driver's init(D2oddi) or open(D2oddi) entry point routine.

Context and synchronization

All contexts.

Hardware applicability

This function was created to support hardware that cannot access all supported busses. Current hardware does not have this limitation.

Version applicability

oddi: 2mp, 3mp, 4mp, 5mp, 6, 6mp

SVR5 DDI compatibility

This function is not supported in DDI.

Future directions

This function may be obsoleted in a future release.


archtobus(D3oddi), bdistributed(D3oddi), cdistributed(D3oddi), pci_buspresent(D3oddi)

``Multithreaded drivers'' in HDK Technical Reference


The following example shows how all_io( ) is called in conjunction with bdistributed(D3oddi). In this example, the strategy(D2oddi) entry point is declared as multi-threaded only if all processors can perform I/O on the main system bus.
    1   #include <sys/arch.h>
    2   #include <sys/conf.h>
    3   int xxhandle = -1;
    4   xxinit()
    5   {
    6          ...
    7          if (all_io(archtobus(arch)))
    8                bdistributed(xxstrategy, DIST_BDEV_STRATEGY);
    9          else if (xxhandle == -1) {
   10                handle = intralloc(&lock_xxtab, xxstart);
   11                if (handle == -1)
   12                  cmn_err(CE_WARN,
   13                      "xxinit: Multiprocessor access denied");
   14                else
   15                  bdistributed(xxstrategy, DIST_BDEV_STRATEGY);
   16          }
   17          ...
   18   }
Line 7 calls all_io( ) to determine if all the processors can access the I/O bus. If so, bdistributed(D3oddi) is called in line 8 to indicate that the driver can be accessed by more than one processor.

If some processors cannot access the I/O bus, the driver must use the startio(D3oddi) routine to ensure that its start(D2oddi) routine is always run on a processor capable of performing I/O. Line 10 calls intralloc(D3oddi) to register the driver's start( ) routine for later use by startio( ).

If the call to intralloc( ) fails, a message should be generated to warn users that your driver is denied multiprocessor access; this is illustrated in lines 12 and 13. If intralloc( ) succeeds, bdistributed( ) is called in line 15.

19 June 2005
© 2005 The SCO Group, Inc. All rights reserved.
OpenServer 5 HDK - June 2005