NAME | SYNOPSIS | FEATURES | DESCRIPTION | RESTRICTIONS | ATTRIBUTES | SEE ALSO
#include <mem/chMem.h>
#include <mem/chMapper.h>
MpPushOut
request annex (KnMpOut structure) :
int service
KnKey segkey
KnCap lccap
VmOffset dataOffset
VmSize dataSize
VmFlags options
KnAsynIoDesc asynIoDesc
request body:
unsigned char data [bodysize]
response annex (KnMpOutReply structure) :
int diag
MEM_VM
This system call is strictly reserved for internal use only. It MUST NOT be used by any application.
In order to write back the contents of a range of a local cache to the corresponding segment, the kernel memory management system performs a MpPushOut message transaction. It sends, using ipcCall(2K) an MpPushOut request message to the mapper managing the segment. The mapper is identified by the ui field of the segment capability.
The request message consists of an annex whose head matches the KnMpOut structure defined above, and a body containing the data to be written. The service field is set to KN_MPPUSHOUT.
Upon receipt of such a request, the mapper writes data back to the segment specified by segkey from the local cache specified by lccap. If the segment was created using MpCreate(2SEG), the lccap argument is undefined.
The dataOffset field specifies the starting offset of the data in the segment, and the dataSize field the data size. Currently, the dataSize field is always equal to the message body size and "fragment"-aligned. The size of the fragment is implementation--dependent and usually equal to the virtual page size divided by 8 (number of bits in one byte). The dataOffset field is always page-aligned.
If the K_ASYN_REQUEST flag is set in the options field, the mapper can perform an asynchronous write (see below). In this case the kernel fills the asynIoDesc structure which has to be passed as a parameter for a subsequent ioDone call. The asynIoDesc structure is opaque to the mapper.
The mapper must reply to a message whose annex head matches the KnMpOutReply structure, where the diag field is the operation return code. The diag field must be 0 (K_OK) or 1 (K_ASYN_REPLY) or a negative number. If a negative error code is returned, the kernel returns it to the original kernel call (if any). The K_ASYN_REPLY can be returned by the mapper if, and only if, the K_ASYN_REQUEST flag was set by the kernel.
If K_ASYN_REPLY is returned (the mapper performs an asynchronous write), the mapper must invoke an ioDone function in order to notify that a write operation has been peformed, as follows:
void ioDone (diag, asynIoDesc) int diag ; KnAsynIoDesc* asynIoDesc ; |
The diag parameter must be either 0 (K_OK) or a negative number. If a negative error code is returned, the kernel returns it to the original kernel call (if any).
The asynIoDesc parameter points to the KnAsynIoDesc structure corresponding to the MpPushOut request.
The ioDone function can be called asynchronously (in respect of ipcCall reply) from base or interrupt level.
The current kernel implementation never performs asynchronous MpPushOut requests to a remote mapper.
The ioDone function implementation is only for trusted supervisor actors: an attempt to pass an invalid asynIoDesc may produce undefined system behavior.
See attributes(5) for descriptions of the following attributes:
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
---|---|
Interface Stability | Evolving |
NAME | SYNOPSIS | FEATURES | DESCRIPTION | RESTRICTIONS | ATTRIBUTES | SEE ALSO