Module private locks cannot be used to preserve message ordering, since they cannot be held across calls to putnext(9F) (and the other messages that pass routines to other modules). The alternatives for preserving message ordering are:
Use MT STREAMS perimeters.
Pass all messages through the service procedures. The service procedure can drop the locks before calling putnext(9F) or qreply(9F), without reordering messages, since the framework guarantees that at most one thread will execute in the service procedure for a given queue.
Use perimeters since there is a performance penalty to using service procedures.