lproc_osc.c revision b0f5aad587ea1fc3563d056609ee54a961ee1256
1d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 2d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER START 3d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 4d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 6d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is free software; you can redistribute it and/or modify 7d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * it under the terms of the GNU General Public License version 2 only, 8d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * as published by the Free Software Foundation. 9d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 10d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is distributed in the hope that it will be useful, but 11d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * WITHOUT ANY WARRANTY; without even the implied warranty of 12d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * General Public License version 2 for more details (a copy is included 14d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * in the LICENSE file that accompanied this code). 15d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 16d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * You should have received a copy of the GNU General Public License 17d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * version 2 along with this program; If not, see 18d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf 19d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 20d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 21d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * CA 95054 USA or visit www.sun.com if you need additional information or 22d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * have any questions. 23d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 24d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER END 25d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 26d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 27d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. 28d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Use is subject to license terms. 29d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 30d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2011, 2012, Intel Corporation. 31d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 32d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 33d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This file is part of Lustre, http://www.lustre.org/ 34d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Lustre is a trademark of Sun Microsystems, Inc. 35d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 36d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define DEBUG_SUBSYSTEM S_CLASS 37d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 38d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include <asm/statfs.h> 393ee300153882afefa2a093b4f5f456ef1b778530Greg Kroah-Hartman#include "../include/obd_cksum.h" 403ee300153882afefa2a093b4f5f456ef1b778530Greg Kroah-Hartman#include "../include/obd_class.h" 413ee300153882afefa2a093b4f5f456ef1b778530Greg Kroah-Hartman#include "../include/lprocfs_status.h" 42d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include <linux/seq_file.h> 43d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include "osc_internal.h" 44d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 4573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_active_seq_show(struct seq_file *m, void *v) 46d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 4773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = m->private; 48d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 49d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 50d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LPROCFS_CLIMP_CHECK(dev); 5173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao rc = seq_printf(m, "%d\n", !dev->u.cli.cl_import->imp_deactive); 52d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LPROCFS_CLIMP_EXIT(dev); 53d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 54d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 55d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 5673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_active_seq_write(struct file *file, const char *buffer, 5773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao size_t count, loff_t *off) 58d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 5973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = ((struct seq_file *)file->private_data)->private; 60d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int val, rc; 61d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 62d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_write_helper(buffer, count, &val); 63d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 64d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 65d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (val < 0 || val > 1) 66d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ERANGE; 67d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 68d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* opposite senses */ 69d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (dev->u.cli.cl_import->imp_deactive == val) 70d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = ptlrpc_set_import_active(dev->u.cli.cl_import, val); 71d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else 72d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CDEBUG(D_CONFIG, "activate %d: ignoring repeat request\n", val); 73d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 74d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return count; 75d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 7673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_active); 77d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 7873bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_max_rpcs_in_flight_seq_show(struct seq_file *m, void *v) 79d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 8073bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = m->private; 81d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 82d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 83d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 84d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock(&cli->cl_loi_list_lock); 8573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao rc = seq_printf(m, "%u\n", cli->cl_max_rpcs_in_flight); 86d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 87d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 88d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 89d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 9073bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_max_rpcs_in_flight_seq_write(struct file *file, 9173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao const char *buffer, size_t count, loff_t *off) 92d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 9373bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = ((struct seq_file *)file->private_data)->private; 94d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 95d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_request_pool *pool = cli->cl_import->imp_rq_pool; 96d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int val, rc; 97d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 98d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_write_helper(buffer, count, &val); 99d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 100d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 101d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 102d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (val < 1 || val > OSC_MAX_RIF_MAX) 103d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ERANGE; 104d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 105d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LPROCFS_CLIMP_CHECK(dev); 106d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (pool && val > cli->cl_max_rpcs_in_flight) 107d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao pool->prp_populate(pool, val-cli->cl_max_rpcs_in_flight); 108d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 109d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock(&cli->cl_loi_list_lock); 110d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_rpcs_in_flight = val; 111d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 112d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 113d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LPROCFS_CLIMP_EXIT(dev); 114d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return count; 115d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 11673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_max_rpcs_in_flight); 117d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 11873bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_max_dirty_mb_seq_show(struct seq_file *m, void *v) 119d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 12073bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = m->private; 121d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 122d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao long val; 123d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int mult; 124d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 125d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock(&cli->cl_loi_list_lock); 126d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao val = cli->cl_dirty_max; 127d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 128d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 129d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao mult = 1 << 20; 13073bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao return lprocfs_seq_read_frac_helper(m, val, mult); 131d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 132d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 13373bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_max_dirty_mb_seq_write(struct file *file, const char *buffer, 13473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao size_t count, loff_t *off) 135d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 13673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = ((struct seq_file *)file->private_data)->private; 137d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 138d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int pages_number, mult, rc; 139d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 140d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao mult = 1 << (20 - PAGE_CACHE_SHIFT); 141d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_write_frac_helper(buffer, count, &pages_number, mult); 142d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 143d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 144d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 145d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (pages_number <= 0 || 146d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao pages_number > OSC_MAX_DIRTY_MB_MAX << (20 - PAGE_CACHE_SHIFT) || 1474f6cc9ab5337879c4a79564b3aed4fa429d1cd12Peng Tao pages_number > totalram_pages / 4) /* 1/4 of RAM */ 148d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ERANGE; 149d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 150d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock(&cli->cl_loi_list_lock); 151d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_dirty_max = (obd_count)(pages_number << PAGE_CACHE_SHIFT); 152d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao osc_wake_cache_waiters(cli); 153d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 154d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 155d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return count; 156d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 15773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_max_dirty_mb); 158d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 15973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_cached_mb_seq_show(struct seq_file *m, void *v) 160d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 16173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = m->private; 162d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 163d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int shift = 20 - PAGE_CACHE_SHIFT; 164d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 165d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 16673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao rc = seq_printf(m, 167d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao "used_mb: %d\n" 168d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao "busy_cnt: %d\n", 169d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao (atomic_read(&cli->cl_lru_in_list) + 170d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_read(&cli->cl_lru_busy)) >> shift, 171d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_read(&cli->cl_lru_busy)); 172d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 173d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 174d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 175d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 176d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* shrink the number of caching pages to a specific number */ 177a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokinstatic ssize_t osc_cached_mb_seq_write(struct file *file, 178a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin const char __user *buffer, 179a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin size_t count, loff_t *off) 180d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 18173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = ((struct seq_file *)file->private_data)->private; 182d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 183d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int pages_number, mult, rc; 184a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin char kernbuf[128]; 185a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin 186a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin if (count >= sizeof(kernbuf)) 187a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin return -EINVAL; 188a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin 189a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin if (copy_from_user(kernbuf, buffer, count)) 190a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin return -EFAULT; 191a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin kernbuf[count] = 0; 192d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 193d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao mult = 1 << (20 - PAGE_CACHE_SHIFT); 194a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin buffer += lprocfs_find_named_value(kernbuf, "used_mb:", &count) - 195a1e7e2d4deab583593e427b3bf9dd62823d81fbcOleg Drokin kernbuf; 196d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_write_frac_helper(buffer, count, &pages_number, mult); 197d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 198d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 199d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 200d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (pages_number < 0) 201d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ERANGE; 202d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 203d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = atomic_read(&cli->cl_lru_in_list) - pages_number; 204d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc > 0) 205d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao (void)osc_lru_shrink(cli, rc); 206d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 207d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return count; 208d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 20973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_cached_mb); 210d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 21173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_cur_dirty_bytes_seq_show(struct seq_file *m, void *v) 212d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 21373bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = m->private; 214d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 215d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 216d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 217d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock(&cli->cl_loi_list_lock); 21873bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao rc = seq_printf(m, "%lu\n", cli->cl_dirty); 219d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 220d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 221d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 22273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO(osc_cur_dirty_bytes); 223d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 22473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_cur_grant_bytes_seq_show(struct seq_file *m, void *v) 225d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 22673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = m->private; 227d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 228d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 229d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 230d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock(&cli->cl_loi_list_lock); 23173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao rc = seq_printf(m, "%lu\n", cli->cl_avail_grant); 232d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 233d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 234d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 235d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 23673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_cur_grant_bytes_seq_write(struct file *file, const char *buffer, 23773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao size_t count, loff_t *off) 238d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 23973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = ((struct seq_file *)file->private_data)->private; 240d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &obd->u.cli; 241d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 242d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u64 val; 243d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 244d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obd == NULL) 245d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 246d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 247d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_write_u64_helper(buffer, count, &val); 248d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 249d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 250d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 251d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* this is only for shrinking grant */ 252d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock(&cli->cl_loi_list_lock); 253d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (val >= cli->cl_avail_grant) { 254d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 255d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 256d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 257d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 258d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 259d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LPROCFS_CLIMP_CHECK(obd); 260d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (cli->cl_import->imp_state == LUSTRE_IMP_FULL) 261d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = osc_shrink_grant_to_target(cli, val); 262d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LPROCFS_CLIMP_EXIT(obd); 263d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 264d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 265d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return count; 266d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 26773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_cur_grant_bytes); 268d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 26973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_cur_lost_grant_bytes_seq_show(struct seq_file *m, void *v) 270d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 27173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = m->private; 272d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 273d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 274d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 275d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock(&cli->cl_loi_list_lock); 27673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao rc = seq_printf(m, "%lu\n", cli->cl_lost_grant); 277d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 278d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 279d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 28073bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO(osc_cur_lost_grant_bytes); 281d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 28273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_grant_shrink_interval_seq_show(struct seq_file *m, void *v) 283d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 28473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = m->private; 285d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 286d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obd == NULL) 287d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 28873bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao return seq_printf(m, "%d\n", 289d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obd->u.cli.cl_grant_shrink_interval); 290d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 291d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 29273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_grant_shrink_interval_seq_write(struct file *file, 29373bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao const char *buffer, size_t count, loff_t *off) 294d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 29573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = ((struct seq_file *)file->private_data)->private; 296d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int val, rc; 297d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 298d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obd == NULL) 299d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 300d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 301d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_write_helper(buffer, count, &val); 302d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 303d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 304d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 305d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (val <= 0) 306d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ERANGE; 307d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 308d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obd->u.cli.cl_grant_shrink_interval = val; 309d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 310d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return count; 311d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 31273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_grant_shrink_interval); 313d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 31473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_checksum_seq_show(struct seq_file *m, void *v) 315d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 31673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = m->private; 317d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 318d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obd == NULL) 319d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 320d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 32173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao return seq_printf(m, "%d\n", 322d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obd->u.cli.cl_checksum ? 1 : 0); 323d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 324d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 32573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_checksum_seq_write(struct file *file, const char *buffer, 32673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao size_t count, loff_t *off) 327d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 32873bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = ((struct seq_file *)file->private_data)->private; 329d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int val, rc; 330d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 331d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obd == NULL) 332d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 333d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 334d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_write_helper(buffer, count, &val); 335d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 336d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 337d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 338d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obd->u.cli.cl_checksum = (val ? 1 : 0); 339d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 340d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return count; 341d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 34273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_checksum); 343d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 34473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_checksum_type_seq_show(struct seq_file *m, void *v) 345d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 34673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = m->private; 34773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao int i; 348d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DECLARE_CKSUM_NAME; 349d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 350d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obd == NULL) 351d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 352d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 35373bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao for (i = 0; i < ARRAY_SIZE(cksum_name); i++) { 354d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (((1 << i) & obd->u.cli.cl_supp_cksum_types) == 0) 355d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao continue; 356d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obd->u.cli.cl_cksum_type == (1 << i)) 35773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao seq_printf(m, "[%s] ", cksum_name[i]); 358d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else 35973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao seq_printf(m, "%s ", cksum_name[i]); 360d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 36173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao seq_printf(m, "\n"); 36273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao return 0; 363d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 364d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 36573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_checksum_type_seq_write(struct file *file, const char *buffer, 36673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao size_t count, loff_t *off) 367d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 36873bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = ((struct seq_file *)file->private_data)->private; 369d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int i; 370d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DECLARE_CKSUM_NAME; 371d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao char kernbuf[10]; 372d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 373d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obd == NULL) 374d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 375d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 376d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (count > sizeof(kernbuf) - 1) 377d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -EINVAL; 378d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (copy_from_user(kernbuf, buffer, count)) 379d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -EFAULT; 380d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (count > 0 && kernbuf[count - 1] == '\n') 381d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao kernbuf[count - 1] = '\0'; 382d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else 383d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao kernbuf[count] = '\0'; 384d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 385d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao for (i = 0; i < ARRAY_SIZE(cksum_name); i++) { 386d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (((1 << i) & obd->u.cli.cl_supp_cksum_types) == 0) 387d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao continue; 388d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!strcmp(kernbuf, cksum_name[i])) { 389d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obd->u.cli.cl_cksum_type = 1 << i; 390d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return count; 391d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 392d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 393d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -EINVAL; 394d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 39573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_checksum_type); 396d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 39773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_resend_count_seq_show(struct seq_file *m, void *v) 398d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 39973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = m->private; 400d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 40173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao return seq_printf(m, "%u\n", atomic_read(&obd->u.cli.cl_resends)); 402d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 403d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 40473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_resend_count_seq_write(struct file *file, const char *buffer, 40573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao size_t count, loff_t *off) 406d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 40773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = ((struct seq_file *)file->private_data)->private; 408d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int val, rc; 409d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 410d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_write_helper(buffer, count, &val); 411d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 412d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 413d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 414d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (val < 0) 415d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -EINVAL; 416d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 417d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&obd->u.cli.cl_resends, val); 418d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 419d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return count; 420d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 42173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_resend_count); 422d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 42373bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_contention_seconds_seq_show(struct seq_file *m, void *v) 424d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 42573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = m->private; 426d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct osc_device *od = obd2osc_dev(obd); 427d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 42873bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao return seq_printf(m, "%u\n", od->od_contention_time); 429d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 430d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 43173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_contention_seconds_seq_write(struct file *file, const char *buffer, 43273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao size_t count, loff_t *off) 433d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 43473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = ((struct seq_file *)file->private_data)->private; 435d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct osc_device *od = obd2osc_dev(obd); 436d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 437d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return lprocfs_write_helper(buffer, count, &od->od_contention_time) ?: 438d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao count; 439d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 44073bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_contention_seconds); 441d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 44273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_lockless_truncate_seq_show(struct seq_file *m, void *v) 443d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 44473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = m->private; 445d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct osc_device *od = obd2osc_dev(obd); 446d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 44773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao return seq_printf(m, "%u\n", od->od_lockless_truncate); 448d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 449d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 45073bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_lockless_truncate_seq_write(struct file *file, const char *buffer, 45173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao size_t count, loff_t *off) 452d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 45373bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = ((struct seq_file *)file->private_data)->private; 454d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct osc_device *od = obd2osc_dev(obd); 455d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 456d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return lprocfs_write_helper(buffer, count, &od->od_lockless_truncate) ?: 457d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao count; 458d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 45973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_lockless_truncate); 460d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 46173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_destroys_in_flight_seq_show(struct seq_file *m, void *v) 462d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 46373bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *obd = m->private; 46473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao return seq_printf(m, "%u\n", 465d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_read(&obd->u.cli.cl_destroy_in_flight)); 466d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 46773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO(osc_destroys_in_flight); 46873bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao 46973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic int osc_obd_max_pages_per_rpc_seq_show(struct seq_file *m, void *v) 47073bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao{ 47173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao return lprocfs_obd_rd_max_pages_per_rpc(m, m->private); 47273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao} 473d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 47473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Taostatic ssize_t osc_obd_max_pages_per_rpc_seq_write(struct file *file, 47573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao const char *buffer, size_t count, loff_t *off) 476d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 47773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao struct obd_device *dev = ((struct seq_file *)file->private_data)->private; 478d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 479d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_connect_data *ocd = &cli->cl_import->imp_connect_data; 480d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int chunk_mask, rc; 481d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u64 val; 482d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 483d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_write_u64_helper(buffer, count, &val); 484d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 485d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 486d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 487d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* if the max_pages is specified in bytes, convert to pages */ 488d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (val >= ONE_MB_BRW_SIZE) 489d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao val >>= PAGE_CACHE_SHIFT; 490d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 491d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LPROCFS_CLIMP_CHECK(dev); 492d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 493d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao chunk_mask = ~((1 << (cli->cl_chunkbits - PAGE_CACHE_SHIFT)) - 1); 494d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* max_pages_per_rpc must be chunk aligned */ 495d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao val = (val + ~chunk_mask) & chunk_mask; 496d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (val == 0 || val > ocd->ocd_brw_size >> PAGE_CACHE_SHIFT) { 497d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LPROCFS_CLIMP_EXIT(dev); 498d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ERANGE; 499d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 500d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock(&cli->cl_loi_list_lock); 501d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_pages_per_rpc = val; 502d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 503d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 504d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LPROCFS_CLIMP_EXIT(dev); 505d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return count; 506d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 50773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS(osc_obd_max_pages_per_rpc); 50873bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao 50973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, uuid); 51073bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, connect_flags); 51173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, blksize); 51273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, kbytestotal); 51373bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, kbytesfree); 51473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, kbytesavail); 51573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, filestotal); 51673bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, filesfree); 51773bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, server_uuid); 51873bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, conn_uuid); 51973bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, timeouts); 52073bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, state); 52173bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao 52273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_WR_ONLY(osc, ping); 52373bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng Tao 52473bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RW_TYPE(osc, import); 52573bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RW_TYPE(osc, pinger_recov); 526d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 527d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct lprocfs_vars lprocfs_osc_obd_vars[] = { 528114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "uuid", &osc_uuid_fops, NULL, 0 }, 529114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "ping", &osc_ping_fops, NULL, 0222 }, 530114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "connect_flags", &osc_connect_flags_fops, NULL, 0 }, 531114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "blocksize", &osc_blksize_fops, NULL, 0 }, 532114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "kbytestotal", &osc_kbytestotal_fops, NULL, 0 }, 533114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "kbytesfree", &osc_kbytesfree_fops, NULL, 0 }, 534114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "kbytesavail", &osc_kbytesavail_fops, NULL, 0 }, 535114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "filestotal", &osc_filestotal_fops, NULL, 0 }, 536114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "filesfree", &osc_filesfree_fops, NULL, 0 }, 537114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich /*{ "filegroups", lprocfs_rd_filegroups, NULL, 0 },*/ 538114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "ost_server_uuid", &osc_server_uuid_fops, NULL, 0 }, 539114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "ost_conn_uuid", &osc_conn_uuid_fops, NULL, 0 }, 540114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "active", &osc_active_fops, NULL }, 541114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "max_pages_per_rpc", &osc_obd_max_pages_per_rpc_fops, NULL }, 542114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "max_rpcs_in_flight", &osc_max_rpcs_in_flight_fops, NULL }, 543114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "destroys_in_flight", &osc_destroys_in_flight_fops, NULL, 0 }, 544114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "max_dirty_mb", &osc_max_dirty_mb_fops, NULL }, 545114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "osc_cached_mb", &osc_cached_mb_fops, NULL }, 546114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "cur_dirty_bytes", &osc_cur_dirty_bytes_fops, NULL, 0 }, 547114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "cur_grant_bytes", &osc_cur_grant_bytes_fops, NULL }, 548114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "cur_lost_grant_bytes", &osc_cur_lost_grant_bytes_fops, NULL, 0}, 549114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "grant_shrink_interval", &osc_grant_shrink_interval_fops, NULL }, 550114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "checksums", &osc_checksum_fops, NULL }, 551114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "checksum_type", &osc_checksum_type_fops, NULL }, 552114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "resend_count", &osc_resend_count_fops, NULL}, 553114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "timeouts", &osc_timeouts_fops, NULL, 0 }, 554114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "contention_seconds", &osc_contention_seconds_fops, NULL }, 555114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "lockless_truncate", &osc_lockless_truncate_fops, NULL }, 556114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "import", &osc_import_fops, NULL }, 557114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "state", &osc_state_fops, NULL, 0 }, 558114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "pinger_recov", &osc_pinger_recov_fops, NULL }, 559114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { NULL } 560d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 561d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 56273bb1da692d0dc3e93b9c9e29084d6a5dcbc37a6Peng TaoLPROC_SEQ_FOPS_RO_TYPE(osc, numrefs); 563d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct lprocfs_vars lprocfs_osc_module_vars[] = { 564114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { "num_refs", &osc_numrefs_fops, NULL, 0 }, 565114a16b1ba918cd8390daaaaf8d5b02f253c97b2Brilliantov Kirill Vladimirovich { NULL } 566d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 567d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 568d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define pct(a,b) (b ? a * 100 / b : 0) 569d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 570d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic int osc_rpc_stats_seq_show(struct seq_file *seq, void *v) 571d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 572d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct timeval now; 573d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_device *dev = seq->private; 574d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 575d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned long read_tot = 0, write_tot = 0, read_cum, write_cum; 576d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int i; 577d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 578d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao do_gettimeofday(&now); 579d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 580d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock(&cli->cl_loi_list_lock); 581d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 582d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", 583996adff883a8c2c81d7beaed9656a1235b6451d6Peng Tao now.tv_sec, (unsigned long)now.tv_usec); 584d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "read RPCs in flight: %d\n", 585d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_r_in_flight); 586d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "write RPCs in flight: %d\n", 587d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_w_in_flight); 588d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "pending write pages: %d\n", 589d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_read(&cli->cl_pending_w_pages)); 590d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "pending read pages: %d\n", 591d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_read(&cli->cl_pending_r_pages)); 592d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 593d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "\n\t\t\tread\t\t\twrite\n"); 594d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "pages per rpc rpcs %% cum %% |"); 595d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, " rpcs %% cum %%\n"); 596d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 597d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_tot = lprocfs_oh_sum(&cli->cl_read_page_hist); 598d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao write_tot = lprocfs_oh_sum(&cli->cl_write_page_hist); 599d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 600d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_cum = 0; 601d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao write_cum = 0; 602d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao for (i = 0; i < OBD_HIST_MAX; i++) { 603d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned long r = cli->cl_read_page_hist.oh_buckets[i]; 604d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned long w = cli->cl_write_page_hist.oh_buckets[i]; 605d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_cum += r; 606d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao write_cum += w; 607d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "%d:\t\t%10lu %3lu %3lu | %10lu %3lu %3lu\n", 608d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 1 << i, r, pct(r, read_tot), 609d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao pct(read_cum, read_tot), w, 610d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao pct(w, write_tot), 611d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao pct(write_cum, write_tot)); 612d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (read_cum == read_tot && write_cum == write_tot) 613d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 614d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 615d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 616d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "\n\t\t\tread\t\t\twrite\n"); 617d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "rpcs in flight rpcs %% cum %% |"); 618d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, " rpcs %% cum %%\n"); 619d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 620d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_tot = lprocfs_oh_sum(&cli->cl_read_rpc_hist); 621d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao write_tot = lprocfs_oh_sum(&cli->cl_write_rpc_hist); 622d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 623d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_cum = 0; 624d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao write_cum = 0; 625d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao for (i = 0; i < OBD_HIST_MAX; i++) { 626d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned long r = cli->cl_read_rpc_hist.oh_buckets[i]; 627d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned long w = cli->cl_write_rpc_hist.oh_buckets[i]; 628d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_cum += r; 629d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao write_cum += w; 630d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "%d:\t\t%10lu %3lu %3lu | %10lu %3lu %3lu\n", 631d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao i, r, pct(r, read_tot), 632d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao pct(read_cum, read_tot), w, 633d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao pct(w, write_tot), 634d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao pct(write_cum, write_tot)); 635d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (read_cum == read_tot && write_cum == write_tot) 636d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 637d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 638d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 639d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "\n\t\t\tread\t\t\twrite\n"); 640d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "offset rpcs %% cum %% |"); 641d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, " rpcs %% cum %%\n"); 642d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 643d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_tot = lprocfs_oh_sum(&cli->cl_read_offset_hist); 644d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao write_tot = lprocfs_oh_sum(&cli->cl_write_offset_hist); 645d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 646d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_cum = 0; 647d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao write_cum = 0; 648d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao for (i = 0; i < OBD_HIST_MAX; i++) { 649d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned long r = cli->cl_read_offset_hist.oh_buckets[i]; 650d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao unsigned long w = cli->cl_write_offset_hist.oh_buckets[i]; 651d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_cum += r; 652d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao write_cum += w; 653d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "%d:\t\t%10lu %3lu %3lu | %10lu %3lu %3lu\n", 654d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao (i == 0) ? 0 : 1 << (i - 1), 655d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao r, pct(r, read_tot), pct(read_cum, read_tot), 656d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao w, pct(w, write_tot), pct(write_cum, write_tot)); 657d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (read_cum == read_tot && write_cum == write_tot) 658d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 659d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 660d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 661d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_unlock(&cli->cl_loi_list_lock); 662d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 663d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 664d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 665d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#undef pct 666d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 667d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic ssize_t osc_rpc_stats_seq_write(struct file *file, const char *buf, 668d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao size_t len, loff_t *off) 669d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 670d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct seq_file *seq = file->private_data; 671d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_device *dev = seq->private; 672d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &dev->u.cli; 673d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 674d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lprocfs_oh_clear(&cli->cl_read_rpc_hist); 675d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lprocfs_oh_clear(&cli->cl_write_rpc_hist); 676d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lprocfs_oh_clear(&cli->cl_read_page_hist); 677d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lprocfs_oh_clear(&cli->cl_write_page_hist); 678d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lprocfs_oh_clear(&cli->cl_read_offset_hist); 679d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lprocfs_oh_clear(&cli->cl_write_offset_hist); 680d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 681d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return len; 682d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 683d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 684d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoLPROC_SEQ_FOPS(osc_rpc_stats); 685d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 686d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic int osc_stats_seq_show(struct seq_file *seq, void *v) 687d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 688d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct timeval now; 689d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_device *dev = seq->private; 690d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct osc_stats *stats = &obd2osc_dev(dev)->od_stats; 691d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 692d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao do_gettimeofday(&now); 693d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 694d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao seq_printf(seq, "snapshot_time: %lu.%lu (secs.usecs)\n", 695996adff883a8c2c81d7beaed9656a1235b6451d6Peng Tao now.tv_sec, (unsigned long)now.tv_usec); 696b0f5aad587ea1fc3563d056609ee54a961ee1256Greg Kroah-Hartman seq_printf(seq, "lockless_write_bytes\t\t%llu\n", 697d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao stats->os_lockless_writes); 698b0f5aad587ea1fc3563d056609ee54a961ee1256Greg Kroah-Hartman seq_printf(seq, "lockless_read_bytes\t\t%llu\n", 699d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao stats->os_lockless_reads); 700b0f5aad587ea1fc3563d056609ee54a961ee1256Greg Kroah-Hartman seq_printf(seq, "lockless_truncate\t\t%llu\n", 701d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao stats->os_lockless_truncates); 702d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 703d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 704d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 705d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic ssize_t osc_stats_seq_write(struct file *file, const char *buf, 706d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao size_t len, loff_t *off) 707d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 708d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct seq_file *seq = file->private_data; 709d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_device *dev = seq->private; 710d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct osc_stats *stats = &obd2osc_dev(dev)->od_stats; 711d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 712d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao memset(stats, 0, sizeof(*stats)); 713d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return len; 714d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 715d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 716d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoLPROC_SEQ_FOPS(osc_stats); 717d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 718d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint lproc_osc_attach_seqstat(struct obd_device *dev) 719d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 720d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 721d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 722d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_seq_create(dev->obd_proc_entry, "osc_stats", 0644, 723d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao &osc_stats_fops, dev); 724d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc == 0) 725d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = lprocfs_obd_seq_create(dev, "rpc_stats", 0644, 726d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao &osc_rpc_stats_fops, dev); 727d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 728d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 729d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 730d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 731d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid lprocfs_osc_init_vars(struct lprocfs_static_vars *lvars) 732d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 733d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lvars->module_vars = lprocfs_osc_module_vars; 734d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lvars->obd_vars = lprocfs_osc_obd_vars; 735d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 736