X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosc%2Flproc_osc.c;h=e765e48b73c9bf0749e7c1cce19ad787fba4d604;hb=1d8e1b31d547bb2fdaf2649df68256ede1f363af;hp=5bf6332d89a96d10d9e2136f74796ebb2d0ef9ee;hpb=c2ddf78e51e7a674c3bf9e40559c5b7ca2bfe120;p=fs%2Flustre-release.git diff --git a/lustre/osc/lproc_osc.c b/lustre/osc/lproc_osc.c index 5bf6332..e765e48 100644 --- a/lustre/osc/lproc_osc.c +++ b/lustre/osc/lproc_osc.c @@ -27,7 +27,7 @@ * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, Whamcloud, Inc. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -68,14 +68,12 @@ static int osc_wr_active(struct file *file, const char *buffer, if (val < 0 || val > 1) return -ERANGE; - LPROCFS_CLIMP_CHECK(dev); /* opposite senses */ if (dev->u.cli.cl_import->imp_deactive == val) rc = ptlrpc_set_import_active(dev->u.cli.cl_import, val); else CDEBUG(D_CONFIG, "activate %d: ignoring repeat request\n", val); - LPROCFS_CLIMP_EXIT(dev); return count; } @@ -136,28 +134,28 @@ static int osc_rd_max_dirty_mb(char *page, char **start, off_t off, int count, } static int osc_wr_max_dirty_mb(struct file *file, const char *buffer, - unsigned long count, void *data) + unsigned long count, void *data) { - struct obd_device *dev = data; - struct client_obd *cli = &dev->u.cli; - int pages_number, mult, rc; + struct obd_device *dev = data; + struct client_obd *cli = &dev->u.cli; + int pages_number, mult, rc; - mult = 1 << (20 - CFS_PAGE_SHIFT); - rc = lprocfs_write_frac_helper(buffer, count, &pages_number, mult); - if (rc) - return rc; + mult = 1 << (20 - PAGE_CACHE_SHIFT); + rc = lprocfs_write_frac_helper(buffer, count, &pages_number, mult); + if (rc) + return rc; - if (pages_number < 0 || - pages_number > OSC_MAX_DIRTY_MB_MAX << (20 - CFS_PAGE_SHIFT) || - pages_number > cfs_num_physpages / 4) /* 1/4 of RAM */ - return -ERANGE; + if (pages_number <= 0 || + pages_number > OSC_MAX_DIRTY_MB_MAX << (20 - PAGE_CACHE_SHIFT) || + pages_number > totalram_pages / 4) /* 1/4 of RAM */ + return -ERANGE; - client_obd_list_lock(&cli->cl_loi_list_lock); - cli->cl_dirty_max = (obd_count)(pages_number << CFS_PAGE_SHIFT); - osc_wake_cache_waiters(cli); - client_obd_list_unlock(&cli->cl_loi_list_lock); + client_obd_list_lock(&cli->cl_loi_list_lock); + cli->cl_dirty_max = (obd_count)(pages_number << PAGE_CACHE_SHIFT); + osc_wake_cache_waiters(cli); + client_obd_list_unlock(&cli->cl_loi_list_lock); - return count; + return count; } static int osc_rd_cached_mb(char *page, char **start, off_t off, int count, @@ -165,7 +163,7 @@ static int osc_rd_cached_mb(char *page, char **start, off_t off, int count, { struct obd_device *dev = data; struct client_obd *cli = &dev->u.cli; - int shift = 20 - CFS_PAGE_SHIFT; + int shift = 20 - PAGE_CACHE_SHIFT; int rc; rc = snprintf(page, count, @@ -186,7 +184,7 @@ static int osc_wr_cached_mb(struct file *file, const char *buffer, struct client_obd *cli = &dev->u.cli; int pages_number, mult, rc; - mult = 1 << (20 - CFS_PAGE_SHIFT); + mult = 1 << (20 - PAGE_CACHE_SHIFT); buffer = lprocfs_find_named_value(buffer, "used_mb:", &count); rc = lprocfs_write_frac_helper(buffer, count, &pages_number, mult); if (rc) @@ -197,7 +195,7 @@ static int osc_wr_cached_mb(struct file *file, const char *buffer, rc = cfs_atomic_read(&cli->cl_lru_in_list) - pages_number; if (rc > 0) - (void)osc_lru_shrink(cli, rc); + (void)osc_lru_shrink(cli, rc, true); return count; } @@ -305,149 +303,6 @@ static int osc_wr_grant_shrink_interval(struct file *file, const char *buffer, return count; } -static int osc_rd_create_count(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct obd_device *obd = data; - - if (obd == NULL) - return 0; - - return snprintf(page, count, "%d\n", - obd->u.cli.cl_oscc.oscc_grow_count); -} - -/** - * Set OSC creator's osc_creator::oscc_grow_count - * - * \param file proc file - * \param buffer buffer containing the value - * \param count buffer size - * \param data obd device - * - * \retval \a count - */ -static int osc_wr_create_count(struct file *file, const char *buffer, - unsigned long count, void *data) -{ - struct obd_device *obd = data; - int val, rc, i; - - if (obd == NULL) - return 0; - - rc = lprocfs_write_helper(buffer, count, &val); - if (rc) - return rc; - - /* The MDT ALWAYS needs to limit the precreate count to - * OST_MAX_PRECREATE, and the constant cannot be changed - * because it is a value shared between the OSC and OST - * that is the maximum possible number of objects that will - * ever be handled by MDT->OST recovery processing. - * - * If the OST ever gets a request to delete more orphans, - * this implies that something has gone badly on the MDT - * and the OST will refuse to delete so much data from the - * filesystem as a safety measure. */ - if (val < OST_MIN_PRECREATE || val > OST_MAX_PRECREATE) - return -ERANGE; - if (val > obd->u.cli.cl_oscc.oscc_max_grow_count) - return -ERANGE; - - for (i = 1; (i << 1) <= val; i <<= 1) - ; - obd->u.cli.cl_oscc.oscc_grow_count = i; - - return count; -} - -/** - * Read OSC creator's osc_creator::oscc_max_grow_count - * - * \param page buffer to hold the returning string - * \param start - * \param off - * \param count - * \param eof - * proc read function parameters, please refer to kernel - * code fs/proc/generic.c proc_file_read() - * \param data obd device - * - * \retval number of characters printed. - */ -static int osc_rd_max_create_count(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct obd_device *obd = data; - - if (obd == NULL) - return 0; - - return snprintf(page, count, "%d\n", - obd->u.cli.cl_oscc.oscc_max_grow_count); -} - -/** - * Set OSC creator's osc_creator::oscc_max_grow_count - * - * \param file proc file - * \param buffer buffer containing the value - * \param count buffer size - * \param data obd device - * - * \retval \a count - */ -static int osc_wr_max_create_count(struct file *file, const char *buffer, - unsigned long count, void *data) -{ - struct obd_device *obd = data; - int val, rc; - - if (obd == NULL) - return 0; - - rc = lprocfs_write_helper(buffer, count, &val); - if (rc) - return rc; - - if (val < 0) - return -ERANGE; - if (val > OST_MAX_PRECREATE) - return -ERANGE; - - if (obd->u.cli.cl_oscc.oscc_grow_count > val) - obd->u.cli.cl_oscc.oscc_grow_count = val; - - obd->u.cli.cl_oscc.oscc_max_grow_count = val; - - return count; -} - -static int osc_rd_prealloc_next_id(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct obd_device *obd = data; - - if (obd == NULL) - return 0; - - return snprintf(page, count, LPU64"\n", - obd->u.cli.cl_oscc.oscc_next_id); -} - -static int osc_rd_prealloc_last_id(char *page, char **start, off_t off, - int count, int *eof, void *data) -{ - struct obd_device *obd = data; - - if (obd == NULL) - return 0; - - return snprintf(page, count, LPU64"\n", - obd->u.cli.cl_oscc.oscc_last_id); -} - static int osc_rd_checksum(char *page, char **start, off_t off, int count, int *eof, void *data) { @@ -516,7 +371,7 @@ static int osc_wd_checksum_type(struct file *file, const char *buffer, if (count > sizeof(kernbuf) - 1) return -EINVAL; - if (cfs_copy_from_user(kernbuf, buffer, count)) + if (copy_from_user(kernbuf, buffer, count)) return -EFAULT; if (count > 0 && kernbuf[count - 1] == '\n') kernbuf[count - 1] = '\0'; @@ -613,18 +468,23 @@ static int lprocfs_osc_wr_max_pages_per_rpc(struct file *file, struct obd_device *dev = data; struct client_obd *cli = &dev->u.cli; struct obd_connect_data *ocd = &cli->cl_import->imp_connect_data; - int chunk_mask, val, rc; + int chunk_mask, rc; + __u64 val; - rc = lprocfs_write_helper(buffer, count, &val); + rc = lprocfs_write_u64_helper(buffer, count, &val); if (rc) return rc; + /* if the max_pages is specified in bytes, convert to pages */ + if (val >= ONE_MB_BRW_SIZE) + val >>= PAGE_CACHE_SHIFT; + LPROCFS_CLIMP_CHECK(dev); - chunk_mask = ~((1 << (cli->cl_chunkbits - CFS_PAGE_SHIFT)) - 1); + chunk_mask = ~((1 << (cli->cl_chunkbits - PAGE_CACHE_SHIFT)) - 1); /* max_pages_per_rpc must be chunk aligned */ val = (val + ~chunk_mask) & chunk_mask; - if (val == 0 || val > ocd->ocd_brw_size >> CFS_PAGE_SHIFT) { + if (val == 0 || val > ocd->ocd_brw_size >> PAGE_CACHE_SHIFT) { LPROCFS_CLIMP_EXIT(dev); return -ERANGE; } @@ -636,6 +496,22 @@ static int lprocfs_osc_wr_max_pages_per_rpc(struct file *file, return count; } +static int osc_rd_unstable_stats(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct obd_device *dev = data; + struct client_obd *cli = &dev->u.cli; + int pages, mb; + + pages = cfs_atomic_read(&cli->cl_unstable_count); + mb = (pages * PAGE_CACHE_SIZE) >> 20; + + return snprintf(page, count, + "unstable_pages: %8d\n" + "unstable_mb: %8d\n", + pages, mb); +} + static struct lprocfs_vars lprocfs_osc_obd_vars[] = { { "uuid", lprocfs_rd_uuid, 0, 0 }, { "ping", 0, lprocfs_wr_ping, 0, 0, 0222 }, @@ -664,11 +540,6 @@ static struct lprocfs_vars lprocfs_osc_obd_vars[] = { { "cur_lost_grant_bytes", osc_rd_cur_lost_grant_bytes, 0, 0}, { "grant_shrink_interval", osc_rd_grant_shrink_interval, osc_wr_grant_shrink_interval, 0 }, - { "create_count", osc_rd_create_count, osc_wr_create_count, 0 }, - { "max_create_count", osc_rd_max_create_count, - osc_wr_max_create_count, 0}, - { "prealloc_next_id", osc_rd_prealloc_next_id, 0, 0 }, - { "prealloc_last_id", osc_rd_prealloc_last_id, 0, 0 }, { "checksums", osc_rd_checksum, osc_wr_checksum, 0 }, { "checksum_type", osc_rd_checksum_type, osc_wd_checksum_type, 0 }, { "resend_count", osc_rd_resend_count, osc_wr_resend_count, 0}, @@ -681,6 +552,8 @@ static struct lprocfs_vars lprocfs_osc_obd_vars[] = { { "state", lprocfs_rd_state, 0, 0 }, { "pinger_recov", lprocfs_rd_pinger_recov, lprocfs_wr_pinger_recov, 0, 0 }, + { "unstable_stats", osc_rd_unstable_stats, 0, 0}, + { 0 } }; @@ -697,11 +570,11 @@ static int osc_rpc_stats_seq_show(struct seq_file *seq, void *v) struct obd_device *dev = seq->private; struct client_obd *cli = &dev->u.cli; unsigned long read_tot = 0, write_tot = 0, read_cum, write_cum; - int i; + int i; - cfs_gettimeofday(&now); + do_gettimeofday(&now); - client_obd_list_lock(&cli->cl_loi_list_lock); + client_obd_list_lock(&cli->cl_loi_list_lock); seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", now.tv_sec, now.tv_usec); @@ -809,21 +682,21 @@ LPROC_SEQ_FOPS(osc_rpc_stats); static int osc_stats_seq_show(struct seq_file *seq, void *v) { - struct timeval now; - struct obd_device *dev = seq->private; - struct osc_stats *stats = &obd2osc_dev(dev)->od_stats; + struct timeval now; + struct obd_device *dev = seq->private; + struct osc_stats *stats = &obd2osc_dev(dev)->od_stats; - cfs_gettimeofday(&now); + do_gettimeofday(&now); - seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", - now.tv_sec, now.tv_usec); - seq_printf(seq, "lockless_write_bytes\t\t"LPU64"\n", - stats->os_lockless_writes); - seq_printf(seq, "lockless_read_bytes\t\t"LPU64"\n", - stats->os_lockless_reads); - seq_printf(seq, "lockless_truncate\t\t"LPU64"\n", - stats->os_lockless_truncates); - return 0; + seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", + now.tv_sec, now.tv_usec); + seq_printf(seq, "lockless_write_bytes\t\t"LPU64"\n", + stats->os_lockless_writes); + seq_printf(seq, "lockless_read_bytes\t\t"LPU64"\n", + stats->os_lockless_reads); + seq_printf(seq, "lockless_truncate\t\t"LPU64"\n", + stats->os_lockless_truncates); + return 0; } static ssize_t osc_stats_seq_write(struct file *file, const char *buf, @@ -841,14 +714,15 @@ LPROC_SEQ_FOPS(osc_stats); int lproc_osc_attach_seqstat(struct obd_device *dev) { - int rc; + int rc; - rc = lprocfs_seq_create(dev->obd_proc_entry, "osc_stats", 0444, - &osc_stats_fops, dev); - if (rc == 0) - rc = lprocfs_obd_seq_create(dev, "rpc_stats", 0444, - &osc_rpc_stats_fops, dev); - return rc; + rc = lprocfs_seq_create(dev->obd_proc_entry, "osc_stats", 0644, + &osc_stats_fops, dev); + if (rc == 0) + rc = lprocfs_obd_seq_create(dev, "rpc_stats", 0644, + &osc_rpc_stats_fops, dev); + + return rc; } void lprocfs_osc_init_vars(struct lprocfs_static_vars *lvars)