Commit d9d47901 authored by Jinshan Xiong's avatar Jinshan Xiong Committed by Greg Kroah-Hartman
Browse files

staging/lustre/clio: collapse layer of cl_page



Move radix tree to osc layer to for performance improvement.

Signed-off-by: default avatarJinshan Xiong <jinshan.xiong@intel.com>
Reviewed-on: http://review.whamcloud.com/7892
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-3321


Reviewed-by: default avatarLai Siyao <lai.siyao@intel.com>
Reviewed-by: default avatarBobi Jam <bobijam@gmail.com>
Signed-off-by: default avatarOleg Drokin <green@linuxhacker.ru>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2579d8d0
Loading
Loading
Loading
Loading
+10 −26
Original line number Diff line number Diff line
@@ -388,6 +388,12 @@ struct cl_object_operations {
	 */
	int (*coo_glimpse)(const struct lu_env *env,
			   const struct cl_object *obj, struct ost_lvb *lvb);
	/**
	 * Object prune method. Called when the layout is going to change on
	 * this object, therefore each layer has to clean up their cache,
	 * mainly pages and locks.
	 */
	int (*coo_prune)(const struct lu_env *env, struct cl_object *obj);
};

/**
@@ -403,15 +409,9 @@ struct cl_object_header {
	 * mostly useless otherwise.
	 */
	/** @{ */
	/** Lock protecting page tree. */
	spinlock_t		 coh_page_guard;
	/** Lock protecting lock list. */
	spinlock_t		 coh_lock_guard;
	/** @} locks */
	/** Radix tree of cl_page's, cached for this object. */
	struct radix_tree_root   coh_tree;
	/** # of pages in radix tree. */
	unsigned long	    coh_pages;
	/** List of cl_lock's granted for this object. */
	struct list_head	       coh_locks;

@@ -896,14 +896,6 @@ struct cl_page_operations {
	 */
	void  (*cpo_export)(const struct lu_env *env,
			    const struct cl_page_slice *slice, int uptodate);
	/**
	 * Unmaps page from the user space (if it is mapped).
	 *
	 * \see cl_page_unmap()
	 * \see vvp_page_unmap()
	 */
	int (*cpo_unmap)(const struct lu_env *env,
			 const struct cl_page_slice *slice, struct cl_io *io);
	/**
	 * Checks whether underlying VM page is locked (in the suitable
	 * sense). Used for assertions.
@@ -2794,19 +2786,13 @@ enum {
};

/* callback of cl_page_gang_lookup() */
typedef int   (*cl_page_gang_cb_t)  (const struct lu_env *, struct cl_io *,
				     struct cl_page *, void *);
int cl_page_gang_lookup(const struct lu_env *env, struct cl_object *obj,
			struct cl_io *io, pgoff_t start, pgoff_t end,
			cl_page_gang_cb_t cb, void *cbdata);
struct cl_page *cl_page_lookup(struct cl_object_header *hdr, pgoff_t index);
struct cl_page *cl_page_find(const struct lu_env *env, struct cl_object *obj,
			     pgoff_t idx, struct page *vmpage,
			     enum cl_page_type type);
struct cl_page *cl_page_find_sub(const struct lu_env *env,
				 struct cl_object *obj,
				 pgoff_t idx, struct page *vmpage,
				     struct cl_page *parent);
struct cl_page *cl_page_alloc(const struct lu_env *env,
			      struct cl_object *o, pgoff_t ind,
			      struct page *vmpage,
			      enum cl_page_type type);
void cl_page_get(struct cl_page *page);
void cl_page_put(const struct lu_env *env, struct cl_page *page);
void cl_page_print(const struct lu_env *env, void *cookie, lu_printer_t printer,
@@ -2872,8 +2858,6 @@ int cl_page_flush(const struct lu_env *env, struct cl_io *io,
void cl_page_discard(const struct lu_env *env, struct cl_io *io,
		     struct cl_page *pg);
void cl_page_delete(const struct lu_env *env, struct cl_page *pg);
int cl_page_unmap(const struct lu_env *env, struct cl_io *io,
		  struct cl_page *pg);
int cl_page_is_vmlocked(const struct lu_env *env, const struct cl_page *pg);
void cl_page_export(const struct lu_env *env, struct cl_page *pg, int uptodate);
int cl_page_is_under_lock(const struct lu_env *env, struct cl_io *io,
+1 −1
Original line number Diff line number Diff line
@@ -442,7 +442,7 @@ static int cl_read_ahead_page(const struct lu_env *env, struct cl_io *io,
			cl_page_list_add(queue, page);
			rc = 1;
		} else {
			cl_page_delete(env, page);
			cl_page_discard(env, io, page);
			rc = -ENOLCK;
		}
	} else {
+0 −4
Original line number Diff line number Diff line
@@ -95,11 +95,7 @@ static void ll_invalidatepage(struct page *vmpage, unsigned int offset,
			if (obj) {
				page = cl_vmpage_page(vmpage, obj);
				if (page) {
					lu_ref_add(&page->cp_reference,
						   "delete", vmpage);
					cl_page_delete(env, page);
					lu_ref_del(&page->cp_reference,
						   "delete", vmpage);
					cl_page_put(env, page);
				}
			} else
+25 −22
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@
 * cl_device and cl_device_type implementation for VVP layer.
 *
 *   Author: Nikita Danilov <nikita.danilov@sun.com>
 *   Author: Jinshan Xiong <jinshan.xiong@intel.com>
 */

#define DEBUG_SUBSYSTEM S_LLITE
@@ -356,23 +357,18 @@ static loff_t vvp_pgcache_find(const struct lu_env *env,
			return ~0ULL;
		clob = vvp_pgcache_obj(env, dev, &id);
		if (clob) {
			struct cl_object_header *hdr;
			struct inode *inode = ccc_object_inode(clob);
			struct page *vmpage;
			int nr;
			struct cl_page	  *pg;

			/* got an object. Find next page. */
			hdr = cl_object_header(clob);

			spin_lock(&hdr->coh_page_guard);
			nr = radix_tree_gang_lookup(&hdr->coh_tree,
						    (void **)&pg,
						    id.vpi_index, 1);
			nr = find_get_pages_contig(inode->i_mapping,
						   id.vpi_index, 1, &vmpage);
			if (nr > 0) {
				id.vpi_index = pg->cp_index;
				id.vpi_index = vmpage->index;
				/* Cant support over 16T file */
				nr = !(pg->cp_index > 0xffffffff);
				nr = !(vmpage->index > 0xffffffff);
				page_cache_release(vmpage);
			}
			spin_unlock(&hdr->coh_page_guard);

			lu_object_ref_del(&clob->co_lu, "dump", current);
			cl_object_put(env, clob);
@@ -431,8 +427,6 @@ static int vvp_pgcache_show(struct seq_file *f, void *v)
	struct ll_sb_info       *sbi;
	struct cl_object	*clob;
	struct lu_env	   *env;
	struct cl_page	  *page;
	struct cl_object_header *hdr;
	struct vvp_pgcache_id    id;
	int		      refcheck;
	int		      result;
@@ -444,14 +438,23 @@ static int vvp_pgcache_show(struct seq_file *f, void *v)
		sbi = f->private;
		clob = vvp_pgcache_obj(env, &sbi->ll_cl->cd_lu_dev, &id);
		if (clob) {
			hdr = cl_object_header(clob);
			struct inode *inode = ccc_object_inode(clob);
			struct cl_page *page = NULL;
			struct page *vmpage;

			spin_lock(&hdr->coh_page_guard);
			page = cl_page_lookup(hdr, id.vpi_index);
			spin_unlock(&hdr->coh_page_guard);
			result = find_get_pages_contig(inode->i_mapping,
						       id.vpi_index, 1,
						       &vmpage);
			if (result > 0) {
				lock_page(vmpage);
				page = cl_vmpage_page(vmpage, clob);
				unlock_page(vmpage);

				page_cache_release(vmpage);
			}

			seq_printf(f, "%8x@"DFID": ",
				   id.vpi_index, PFID(&hdr->coh_lu.loh_fid));
			seq_printf(f, "%8x@" DFID ": ", id.vpi_index,
				   PFID(lu_object_fid(&clob->co_lu)));
			if (page) {
				vvp_pgcache_page_show(env, f, page);
				cl_page_put(env, page);
+0 −1
Original line number Diff line number Diff line
@@ -763,7 +763,6 @@ static int vvp_io_fault_start(const struct lu_env *env,

			vmpage = NULL;
			if (result < 0) {
				cl_page_unmap(env, io, page);
				cl_page_discard(env, io, page);
				cl_page_disown(env, io, page);

Loading