[PATCH 8/9] ttm/tt: Move ttm_tt_set_page_caching implementation in TTM page pool code.

Konrad Rzeszutek Wilk konrad.wilk at oracle.com
Thu Sep 29 13:33:51 PDT 2011


. and provide in the function callback a method to register
with the backend a new (*set_caching).

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
---
 drivers/gpu/drm/ttm/ttm_page_alloc.c |   46 ++++++++++++++++++++++++++++++++++
 drivers/gpu/drm/ttm/ttm_tt.c         |   46 +++++----------------------------
 include/drm/ttm/ttm_page_alloc.h     |   29 +++++++++++++++++++++
 3 files changed, 82 insertions(+), 39 deletions(-)

diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index f9a4d83..002f64f 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -455,6 +455,36 @@ static int ttm_set_pages_caching(struct page **pages,
 	return r;
 }
 
+#ifdef CONFIG_X86
+static int __ttm_page_set_page_caching(struct page *p,
+				       int flags,
+				       enum ttm_caching_state c_old,
+				       enum ttm_caching_state c_new,
+				       struct device *dev)
+{
+	int ret = 0;
+
+	if (PageHighMem(p))
+		return 0;
+
+	if (c_old != tt_cached) {
+		/* p isn't in the default caching state, set it to
+		 * writeback first to free its current memtype. */
+
+		ret = set_pages_wb(p, 1);
+		if (ret)
+			return ret;
+	}
+
+	if (c_new == tt_wc)
+		ret = set_memory_wc((unsigned long) page_address(p), 1);
+	else if (c_new == tt_uncached)
+		ret = set_pages_uc(p, 1);
+
+	return ret;
+}
+#endif
+
 /**
  * Free pages the pages that failed to change the caching state. If there is
  * any pages that have changed their caching state already put them to the
@@ -865,6 +895,9 @@ struct ttm_page_alloc_func ttm_page_alloc_default = {
 	.alloc_init	= __ttm_page_alloc_init,
 	.alloc_fini	= __ttm_page_alloc_fini,
 	.debugfs	= __ttm_page_alloc_debugfs,
+#ifdef CONFIG_X86
+	.set_caching	= __ttm_page_set_page_caching,
+#endif
 };
 
 int ttm_get_pages(struct list_head *pages, int flags,
@@ -902,3 +935,16 @@ int ttm_page_alloc_debugfs(struct seq_file *m, void *data)
 	return -1;
 }
 EXPORT_SYMBOL(ttm_page_alloc_debugfs);
+
+#ifdef CONFIG_X86
+int ttm_tt_set_page_caching(struct page *p,
+			    int flags,
+			    enum ttm_caching_state c_old,
+			    enum ttm_caching_state c_new,
+			    struct device *dev)
+{
+	if (ttm_page_alloc && ttm_page_alloc->set_caching)
+		return ttm_page_alloc->set_caching(p, flags, c_old, c_new, dev);
+	return -1;
+}
+#endif
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index 1f11a33..0f5ce97 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -176,41 +176,6 @@ int ttm_tt_populate(struct ttm_tt *ttm)
 }
 EXPORT_SYMBOL(ttm_tt_populate);
 
-#ifdef CONFIG_X86
-static inline int ttm_tt_set_page_caching(struct page *p,
-					  enum ttm_caching_state c_old,
-					  enum ttm_caching_state c_new)
-{
-	int ret = 0;
-
-	if (PageHighMem(p))
-		return 0;
-
-	if (c_old != tt_cached) {
-		/* p isn't in the default caching state, set it to
-		 * writeback first to free its current memtype. */
-
-		ret = set_pages_wb(p, 1);
-		if (ret)
-			return ret;
-	}
-
-	if (c_new == tt_wc)
-		ret = set_memory_wc((unsigned long) page_address(p), 1);
-	else if (c_new == tt_uncached)
-		ret = set_pages_uc(p, 1);
-
-	return ret;
-}
-#else /* CONFIG_X86 */
-static inline int ttm_tt_set_page_caching(struct page *p,
-					  enum ttm_caching_state c_old,
-					  enum ttm_caching_state c_new)
-{
-	return 0;
-}
-#endif /* CONFIG_X86 */
-
 /*
  * Change caching policy for the linear kernel map
  * for range of pages in a ttm.
@@ -238,9 +203,9 @@ static int ttm_tt_set_caching(struct ttm_tt *ttm,
 	for (i = 0; i < ttm->num_pages; ++i) {
 		cur_page = ttm->pages[i];
 		if (likely(cur_page != NULL)) {
-			ret = ttm_tt_set_page_caching(cur_page,
+			ret = ttm_tt_set_page_caching(cur_page, ttm->page_flags,
 						      ttm->caching_state,
-						      c_state);
+						      c_state, ttm->dev);
 			if (unlikely(ret != 0))
 				goto out_err;
 		}
@@ -254,8 +219,11 @@ out_err:
 	for (j = 0; j < i; ++j) {
 		cur_page = ttm->pages[j];
 		if (likely(cur_page != NULL)) {
-			(void)ttm_tt_set_page_caching(cur_page, c_state,
-						      ttm->caching_state);
+			(void)ttm_tt_set_page_caching(cur_page,
+						      ttm->page_flags,
+						      c_state,
+						      ttm->caching_state,
+						      ttm->dev);
 		}
 	}
 
diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h
index 1dde3bd..73ad03c 100644
--- a/include/drm/ttm/ttm_page_alloc.h
+++ b/include/drm/ttm/ttm_page_alloc.h
@@ -93,6 +93,18 @@ struct ttm_page_alloc_func {
 	 * Output the state of pools to debugfs file
 	 */
 	int (*debugfs)(struct seq_file *m, void *data);
+
+	/**
+	 *
+	 * struct ttm_page_alloc_func member set_caching
+	 *
+	 * Set the caching on the page retrieved from get_pages.
+	 */
+	int (*set_caching)(struct page *p,
+			   int flags,
+			   enum ttm_caching_state c_old,
+			   enum ttm_caching_state c_new,
+			   struct device *dev);
 };
 
 extern struct ttm_page_alloc_func *ttm_page_alloc;
@@ -163,4 +175,21 @@ void ttm_page_alloc_fini(void);
  * Output the state of pools to debugfs file
  */
 extern int ttm_page_alloc_debugfs(struct seq_file *m, void *data);
+
+#ifdef CONFIG_X86
+int ttm_tt_set_page_caching(struct page *p,
+			    int flags,
+			    enum ttm_caching_state c_old,
+			    enum ttm_caching_state c_new,
+			    struct device *dev);
+#else
+static inline int ttm_tt_set_page_caching(struct page *p,
+					  int flags,
+					  enum ttm_caching_state c_old,
+					  enum ttm_caching_state c_new,
+					  struct device *dev)
+{
+	return 0;
+}
+#endif
 #endif
-- 
1.7.4.1



More information about the dri-devel mailing list