vm: implement lazy-attach cow-duplication of vm-objects attached to a controller
This commit is contained in:
@@ -9,34 +9,35 @@ struct thread;
|
||||
struct equeue;
|
||||
struct vm_object;
|
||||
|
||||
enum page_request_status {
|
||||
PAGE_REQUEST_PENDING = 0,
|
||||
PAGE_REQUEST_IN_PROGRESS,
|
||||
PAGE_REQUEST_COMPLETE,
|
||||
PAGE_REQUEST_ASYNC,
|
||||
enum vm_request_status {
|
||||
VM_REQUEST_PENDING = 0,
|
||||
VM_REQUEST_IN_PROGRESS,
|
||||
VM_REQUEST_COMPLETE,
|
||||
VM_REQUEST_ASYNC,
|
||||
};
|
||||
|
||||
struct vm_controller {
|
||||
struct object vc_base;
|
||||
/* tree of pending page requests */
|
||||
/* tree of pending vm 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.
|
||||
/* the number of page requests queued with status VM_REQUEST_PENDING.
|
||||
* used to assert/clear VM_CONTROLLER_SIGNAL_REQUEST_RECEIVED */
|
||||
size_t vc_requests_waiting;
|
||||
};
|
||||
|
||||
struct page_request {
|
||||
struct vm_request {
|
||||
uint64_t req_id;
|
||||
unsigned int req_type;
|
||||
enum page_request_status req_status;
|
||||
enum vm_request_status req_status;
|
||||
kern_status_t req_result;
|
||||
spin_lock_t req_lock;
|
||||
equeue_key_t req_object;
|
||||
struct vm_object *req_object;
|
||||
struct thread *req_sender;
|
||||
/* this node is added to vm-controller vc_requests list */
|
||||
struct btree_node req_node;
|
||||
/* these values are used for VM_REQUEST_READ and VM_REQUEST_DIRTY */
|
||||
off_t req_offset;
|
||||
size_t req_length;
|
||||
};
|
||||
@@ -48,7 +49,7 @@ extern struct vm_controller *vm_controller_create(void);
|
||||
|
||||
extern kern_status_t vm_controller_recv(
|
||||
struct vm_controller *ctrl,
|
||||
equeue_packet_page_request_t *out);
|
||||
equeue_packet_vm_request_t *out);
|
||||
extern kern_status_t vm_controller_recv_async(
|
||||
struct vm_controller *ctrl,
|
||||
struct equeue *eq,
|
||||
@@ -62,6 +63,14 @@ extern kern_status_t vm_controller_create_object(
|
||||
size_t data_len,
|
||||
vm_prot_t prot,
|
||||
struct vm_object **out);
|
||||
extern kern_status_t vm_controller_prepare_attach(
|
||||
struct vm_controller *ctrl,
|
||||
uint64_t req_id,
|
||||
struct vm_object **out_vmo);
|
||||
extern kern_status_t vm_controller_finish_attach(
|
||||
struct vm_controller *ctrl,
|
||||
uint64_t req_id,
|
||||
equeue_key_t new_key);
|
||||
extern kern_status_t vm_controller_detach_object(
|
||||
struct vm_controller *ctrl,
|
||||
struct vm_object *vmo);
|
||||
@@ -72,10 +81,16 @@ extern kern_status_t vm_controller_supply_pages(
|
||||
struct vm_object *src,
|
||||
off_t src_offset,
|
||||
size_t count);
|
||||
extern void vm_controller_fulfill_requests(
|
||||
struct vm_controller *ctrl,
|
||||
equeue_key_t object,
|
||||
off_t offset,
|
||||
size_t length,
|
||||
kern_status_t result);
|
||||
|
||||
extern kern_status_t vm_controller_send_request(
|
||||
struct vm_controller *ctrl,
|
||||
struct page_request *req,
|
||||
struct vm_request *req,
|
||||
unsigned long *irq_flags);
|
||||
|
||||
DEFINE_OBJECT_LOCK_FUNCTION(vm_controller, vc_base)
|
||||
|
||||
Reference in New Issue
Block a user