On Oct 16, 2016, at 11:14 AM, Greg Kroah-Hartman wrote: > Digging up an old email... > > On Tue, Aug 16, 2016 at 04:19:10PM -0400, James Simmons wrote: >> From: Jinshan Xiong <jinshan.xiong@xxxxxxxxx> >> >> A few changes are made in this patch for unstable pages tracking: >> >> 1. Remove kernel NFS unstable pages tracking because it killed >> performance >> 2. Track unstable pages as part of LRU cache. Otherwise Lustre >> can use much more memory than max_cached_mb >> 3. Remove obd_unstable_pages tracking to avoid using global >> atomic counter >> 4. Make unstable pages track optional. Tracking unstable pages is >> turned off by default, and can be controlled by >> llite.*.unstable_stats. >> >> Signed-off-by: Jinshan Xiong <jinshan.xiong@xxxxxxxxx> >> Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-4841 >> Reviewed-on: http://review.whamcloud.com/10003 >> Reviewed-by: Andreas Dilger <andreas.dilger@xxxxxxxxx> >> Reviewed-by: Lai Siyao <lai.siyao@xxxxxxxxx> >> Reviewed-by: Oleg Drokin <oleg.drokin@xxxxxxxxx> >> Signed-off-by: James Simmons <jsimmons@xxxxxxxxxxxxx> >> --- >> drivers/staging/lustre/lustre/include/cl_object.h | 35 +++- >> .../staging/lustre/lustre/include/obd_support.h | 1 - >> drivers/staging/lustre/lustre/llite/lproc_llite.c | 41 ++++- >> drivers/staging/lustre/lustre/obdclass/class_obd.c | 2 - >> drivers/staging/lustre/lustre/osc/osc_cache.c | 96 +--------- >> drivers/staging/lustre/lustre/osc/osc_internal.h | 2 +- >> drivers/staging/lustre/lustre/osc/osc_page.c | 208 +++++++++++++++++--- >> drivers/staging/lustre/lustre/osc/osc_request.c | 13 +- >> 8 files changed, 253 insertions(+), 145 deletions(-) >> >> diff --git a/drivers/staging/lustre/lustre/include/cl_object.h b/drivers/staging/lustre/lustre/include/cl_object.h >> index d269b32..ec6cf7c 100644 >> --- a/drivers/staging/lustre/lustre/include/cl_object.h >> +++ b/drivers/staging/lustre/lustre/include/cl_object.h >> @@ -1039,23 +1039,32 @@ do { \ >> } \ >> } while (0) >> >> -static inline int __page_in_use(const struct cl_page *page, int refc) >> -{ >> - if (page->cp_type == CPT_CACHEABLE) >> - ++refc; >> - LASSERT(atomic_read(&page->cp_ref) > 0); >> - return (atomic_read(&page->cp_ref) > refc); >> -} >> - >> -#define cl_page_in_use(pg) __page_in_use(pg, 1) >> -#define cl_page_in_use_noref(pg) __page_in_use(pg, 0) >> - >> static inline struct page *cl_page_vmpage(struct cl_page *page) >> { >> LASSERT(page->cp_vmpage); >> return page->cp_vmpage; >> } >> >> +/** >> + * Check if a cl_page is in use. >> + * >> + * Client cache holds a refcount, this refcount will be dropped when >> + * the page is taken out of cache, see vvp_page_delete(). >> + */ >> +static inline bool __page_in_use(const struct cl_page *page, int refc) >> +{ >> + return (atomic_read(&page->cp_ref) > refc + 1); >> +} >> + >> +/** >> + * Caller itself holds a refcount of cl_page. >> + */ >> +#define cl_page_in_use(pg) __page_in_use(pg, 1) >> +/** >> + * Caller doesn't hold a refcount. >> + */ >> +#define cl_page_in_use_noref(pg) __page_in_use(pg, 0) >> + >> /** @} cl_page */ >> >> /** \addtogroup cl_lock cl_lock >> @@ -2331,6 +2340,10 @@ struct cl_client_cache { >> */ >> spinlock_t ccc_lru_lock; >> /** >> + * Set if unstable check is enabled >> + */ >> + unsigned int ccc_unstable_check:1; >> + /** >> * # of unstable pages for this mount point >> */ >> atomic_t ccc_unstable_nr; >> diff --git a/drivers/staging/lustre/lustre/include/obd_support.h b/drivers/staging/lustre/lustre/include/obd_support.h >> index 26fdff6..a11fff1 100644 >> --- a/drivers/staging/lustre/lustre/include/obd_support.h >> +++ b/drivers/staging/lustre/lustre/include/obd_support.h >> @@ -54,7 +54,6 @@ extern int at_early_margin; >> extern int at_extra; >> extern unsigned int obd_sync_filter; >> extern unsigned int obd_max_dirty_pages; >> -extern atomic_t obd_unstable_pages; >> extern atomic_t obd_dirty_pages; >> extern atomic_t obd_dirty_transit_pages; >> extern char obd_jobid_var[]; >> diff --git a/drivers/staging/lustre/lustre/llite/lproc_llite.c b/drivers/staging/lustre/lustre/llite/lproc_llite.c >> index 2f1f389..5f8e78d 100644 >> --- a/drivers/staging/lustre/lustre/llite/lproc_llite.c >> +++ b/drivers/staging/lustre/lustre/llite/lproc_llite.c >> @@ -828,10 +828,45 @@ static ssize_t unstable_stats_show(struct kobject *kobj, >> pages = atomic_read(&cache->ccc_unstable_nr); >> mb = (pages * PAGE_SIZE) >> 20; >> >> - return sprintf(buf, "unstable_pages: %8d\n" >> - "unstable_mb: %8d\n", pages, mb); >> + return sprintf(buf, "unstable_check: %8d\n" >> + "unstable_pages: %8d\n" >> + "unstable_mb: %8d\n", >> + cache->ccc_unstable_check, pages, mb); >> } >> -LUSTRE_RO_ATTR(unstable_stats); >> + >> +static ssize_t unstable_stats_store(struct kobject *kobj, >> + struct attribute *attr, >> + const char *buffer, >> + size_t count) >> +{ >> + struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info, >> + ll_kobj); >> + char kernbuf[128]; >> + int val, rc; >> + >> + if (!count) >> + return 0; >> + if (count < 0 || count >= sizeof(kernbuf)) >> + return -EINVAL; >> + >> + if (copy_from_user(kernbuf, buffer, count)) >> + return -EFAULT; > > It was just pointed out to me that this code has obviously never been > tested at all. Whoops. > Sorry for missing this before, do you want me to revert this? Or will > you send me a fix? I'll have a fix for you in a moment. > Also, go fix your test harness, it's not being used, or is totally buggy :) Well, at least there was no crash, right? ;) _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel