vm: implement demand-paging via userspace services with vm-controller
This commit is contained in:
@@ -18,16 +18,24 @@ enum page_request_status {
|
||||
struct vm_controller {
|
||||
struct object vc_base;
|
||||
/* tree of struct vm_objects bound to this controller, keyed with the
|
||||
* vm_key_t specified when the object(s) were created. */
|
||||
* equeue_key_t specified when the object(s) were created. */
|
||||
struct btree vc_objects;
|
||||
/* tree of pending page requests */
|
||||
struct btree vc_requests;
|
||||
/* the equeue to send async page requests to */
|
||||
struct equeue *vc_eq;
|
||||
equeue_key_t vc_eq_key;
|
||||
/* the number of page requests queued with status PAGE_REQUEST_PENDING.
|
||||
* used to assert/clear VM_CONTROLLER_SIGNAL_REQUEST_RECEIVED */
|
||||
size_t vc_requests_waiting;
|
||||
};
|
||||
|
||||
struct page_request {
|
||||
uint64_t req_id;
|
||||
unsigned int req_type;
|
||||
enum page_request_status req_status;
|
||||
kern_status_t req_result;
|
||||
spin_lock_t req_lock;
|
||||
struct vm_object *req_object;
|
||||
struct thread *req_sender;
|
||||
struct btree_node req_node;
|
||||
@@ -45,7 +53,8 @@ extern kern_status_t vm_controller_recv(
|
||||
equeue_packet_page_request_t *out);
|
||||
extern kern_status_t vm_controller_recv_async(
|
||||
struct vm_controller *ctrl,
|
||||
struct equeue *eq);
|
||||
struct equeue *eq,
|
||||
equeue_key_t key);
|
||||
|
||||
extern kern_status_t vm_controller_create_object(
|
||||
struct vm_controller *ctrl,
|
||||
@@ -58,10 +67,18 @@ extern kern_status_t vm_controller_create_object(
|
||||
extern kern_status_t vm_controller_detach_object(
|
||||
struct vm_controller *ctrl,
|
||||
struct vm_object *vmo);
|
||||
extern kern_status_t vm_controller_supply_pages(
|
||||
struct vm_controller *ctrl,
|
||||
struct vm_object *dst,
|
||||
off_t dst_offset,
|
||||
struct vm_object *src,
|
||||
off_t src_offset,
|
||||
size_t count);
|
||||
|
||||
extern kern_status_t vm_controller_send_request(
|
||||
struct vm_controller *ctrl,
|
||||
struct page_request *req);
|
||||
struct page_request *req,
|
||||
unsigned long *irq_flags);
|
||||
|
||||
DEFINE_OBJECT_LOCK_FUNCTION(vm_controller, vc_base)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user