mm/hmm: use a structure for update callback parameters
[linux-2.6-block.git] / include / linux / hmm.h
index 42b1ae915915390224f2529c51309fe3c5e66a44..c6fb869a81c0e1ca3b6086bb709ba493532bad8a 100644 (file)
@@ -274,13 +274,28 @@ static inline uint64_t hmm_pfn_from_pfn(const struct hmm_range *range,
 struct hmm_mirror;
 
 /*
- * enum hmm_update_type - type of update
+ * enum hmm_update_event - type of update
  * @HMM_UPDATE_INVALIDATE: invalidate range (no indication as to why)
  */
-enum hmm_update_type {
+enum hmm_update_event {
        HMM_UPDATE_INVALIDATE,
 };
 
+/*
+ * struct hmm_update - HMM update informations for callback
+ *
+ * @start: virtual start address of the range to update
+ * @end: virtual end address of the range to update
+ * @event: event triggering the update (what is happening)
+ * @blockable: can the callback block/sleep ?
+ */
+struct hmm_update {
+       unsigned long start;
+       unsigned long end;
+       enum hmm_update_event event;
+       bool blockable;
+};
+
 /*
  * struct hmm_mirror_ops - HMM mirror device operations callback
  *
@@ -300,9 +315,9 @@ struct hmm_mirror_ops {
        /* sync_cpu_device_pagetables() - synchronize page tables
         *
         * @mirror: pointer to struct hmm_mirror
-        * @update_type: type of update that occurred to the CPU page table
-        * @start: virtual start address of the range to update
-        * @end: virtual end address of the range to update
+        * @update: update informations (see struct hmm_update)
+        * Returns: -EAGAIN if update.blockable false and callback need to
+        *          block, 0 otherwise.
         *
         * This callback ultimately originates from mmu_notifiers when the CPU
         * page table is updated. The device driver must update its page table
@@ -313,10 +328,8 @@ struct hmm_mirror_ops {
         * page tables are completely updated (TLBs flushed, etc); this is a
         * synchronous call.
         */
-       void (*sync_cpu_device_pagetables)(struct hmm_mirror *mirror,
-                                          enum hmm_update_type update_type,
-                                          unsigned long start,
-                                          unsigned long end);
+       int (*sync_cpu_device_pagetables)(struct hmm_mirror *mirror,
+                                         const struct hmm_update *update);
 };
 
 /*