|
|
int intralloc(struct lockblock_xxtab, int (
xxstart)());
int intrallocs(struct lockb
lock_xxtab, int (
xxstart)(), char
dev_name);
startio(D3oddi) takes the handle returned by intralloc or intrallocs to run xxstart on a processor that can access the I/O bus.
Use either intralloc or intrallocs with startio when not all processors can access the I/O bus from within the driver's strategy(D2oddi) entry point routine (determined by calling all_io(D3oddi)).
Otherwise, the handle value is returned.
``Multithreaded drivers'' in HDK Technical Reference
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(D3oddi)
to determine if all the processors can access the I/O
bus. If so, bdistributed 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( ) to register the driver's start(D2oddi) routine for later use by startio(D3oddi).
If the call to <intralloc( ) fails, a message should be generated to warn users that your driver is denied multiprocessor access; this is illutrated in lines 12 and 13. If <intralloc( ) succeeds, bdistributed(D3oddi) is called in line 15.