PURGEABLE_Q_TYPE_MAX
};
-#if (CONFIG_TOKEN_QUEUE_SMALL == 1)
-typedef uint16_t token_idx_t;
-typedef uint16_t token_cnt_t;
-#define TOKEN_COUNT_MAX UINT16_MAX
-#else
typedef uint32_t token_idx_t;
typedef uint32_t token_cnt_t;
#define TOKEN_COUNT_MAX UINT32_MAX
-#endif
#define NUM_VOLATILE_GROUPS 8
struct purgeable_q {
typedef struct purgeable_q * purgeable_q_t;
extern struct purgeable_q purgeable_queues[PURGEABLE_Q_TYPE_MAX];
+extern queue_head_t purgeable_nonvolatile_queue;
+extern int purgeable_nonvolatile_count;
extern int32_t token_new_pagecount;
#define TOKEN_NEW_PAGECOUNT_MAX INT32_MAX
extern int available_for_purge;
/* enter with page queue locked */
void vm_purgeable_token_delete_first(purgeable_q_t queue);
+void vm_purgeable_token_delete_last(purgeable_q_t queue);
/*
* decrement token counters.
/* the object purger. purges the next eligible object from memory. */
/* returns TRUE if an object was purged, otherwise FALSE. */
-boolean_t vm_purgeable_object_purge_one(void);
+boolean_t vm_purgeable_object_purge_one(int force_purge_below_group, int flags);
/* purge all volatile objects now */
void vm_purgeable_object_purge_all(void);
/* look for object. If found, remove from purgeable queue. */
purgeable_q_t vm_purgeable_object_remove(vm_object_t object);
+/* statistics for purgable objects in all queues */
+void vm_purgeable_stats(vm_purgeable_info_t info, task_t target_task);
+
+#if DEVELOPMENT || DEBUG
+/* statistics for purgeable object usage in all queues for a task */
+kern_return_t vm_purgeable_account(task_t task, pvm_account_info_t acnt_info);
+#endif /* DEVELOPMENT || DEBUG */
+
+uint64_t vm_purgeable_purge_task_owned(task_t task);
+void vm_purgeable_nonvolatile_enqueue(vm_object_t object, task_t task);
+void vm_purgeable_nonvolatile_dequeue(vm_object_t object);
+void vm_purgeable_accounting(vm_object_t object,
+ vm_purgable_t old_state,
+ boolean_t disown,
+ boolean_t task_objq_locked);
+void vm_purgeable_compressed_update(vm_object_t object,
+ int delta);
+
+#define PURGEABLE_LOOP_MAX 64
+
+#define TOKEN_ADD 0x40 /* 0x100 */
+#define TOKEN_DELETE 0x41 /* 0x104 */
+#define TOKEN_RIPEN 0x42 /* 0x108 */
+#define OBJECT_ADD 0x48 /* 0x120 */
+#define OBJECT_REMOVE 0x49 /* 0x124 */
+#define OBJECT_PURGE 0x4a /* 0x128 */
+#define OBJECT_PURGE_ALL 0x4b /* 0x12c */
+#define OBJECT_PURGE_ONE 0x4c /* 0x12d */
+#define OBJECT_PURGE_LOOP 0x4e /* 0x12e */
+
#endif /* __VM_PURGEABLE_INTERNAL__ */