Whamcloud - gitweb
LU-9431 obd: resolve config log sysfs issues
[fs/lustre-release.git] / lustre / obdclass / linux / linux-module.c
index 7fd9aa3..4b2d257 100644 (file)
@@ -273,6 +273,112 @@ struct miscdevice obd_psdev = {
        .fops   = &obd_psdev_fops,
 };
 
+struct static_lustre_uintvalue_attr {
+       struct {
+               struct attribute attr;
+               ssize_t (*show)(struct kobject *kobj, struct attribute *attr,
+                               char *buf);
+               ssize_t (*store)(struct kobject *kobj, struct attribute *attr,
+                                const char *buf, size_t len);
+       } u;
+       int *value;
+};
+
+static ssize_t static_uintvalue_show(struct kobject *kobj,
+                                    struct attribute *attr,
+                                    char *buf)
+{
+       struct static_lustre_uintvalue_attr *lattr = (void *)attr;
+
+       return sprintf(buf, "%d\n", *lattr->value);
+}
+
+static ssize_t static_uintvalue_store(struct kobject *kobj,
+                                     struct attribute *attr,
+                                     const char *buffer, size_t count)
+{
+       struct static_lustre_uintvalue_attr *lattr = (void *)attr;
+       unsigned int val;
+       int rc;
+
+       rc = kstrtouint(buffer, 10, &val);
+       if (rc)
+               return rc;
+
+       *lattr->value = val;
+
+       return count;
+}
+
+#define LUSTRE_STATIC_UINT_ATTR(name, value)                           \
+static struct static_lustre_uintvalue_attr lustre_sattr_##name =       \
+       { __ATTR(name, 0644, static_uintvalue_show,                     \
+                static_uintvalue_store), value }
+
+LUSTRE_STATIC_UINT_ATTR(timeout, &obd_timeout);
+LUSTRE_STATIC_UINT_ATTR(debug_peer_on_timeout, &obd_debug_peer_on_timeout);
+LUSTRE_STATIC_UINT_ATTR(dump_on_timeout, &obd_dump_on_timeout);
+LUSTRE_STATIC_UINT_ATTR(dump_on_eviction, &obd_dump_on_eviction);
+LUSTRE_STATIC_UINT_ATTR(at_min, &at_min);
+LUSTRE_STATIC_UINT_ATTR(at_max, &at_max);
+LUSTRE_STATIC_UINT_ATTR(at_extra, &at_extra);
+LUSTRE_STATIC_UINT_ATTR(at_early_margin, &at_early_margin);
+LUSTRE_STATIC_UINT_ATTR(at_history, &at_history);
+
+#ifdef HAVE_SERVER_SUPPORT
+LUSTRE_STATIC_UINT_ATTR(ldlm_timeout, &ldlm_timeout);
+LUSTRE_STATIC_UINT_ATTR(bulk_timeout, &bulk_timeout);
+#endif
+
+static ssize_t memused_show(struct kobject *kobj, struct attribute *attr,
+                           char *buf)
+{
+       return sprintf(buf, "%llu\n", obd_memory_sum());
+}
+LUSTRE_RO_ATTR(memused);
+
+static ssize_t memused_max_show(struct kobject *kobj, struct attribute *attr,
+                               char *buf)
+{
+       return sprintf(buf, "%llu\n", obd_memory_max());
+}
+LUSTRE_RO_ATTR(memused_max);
+
+static ssize_t max_dirty_mb_show(struct kobject *kobj, struct attribute *attr,
+                                char *buf)
+{
+       return sprintf(buf, "%lu\n",
+                      obd_max_dirty_pages / (1 << (20 - PAGE_SHIFT)));
+}
+
+static ssize_t max_dirty_mb_store(struct kobject *kobj, struct attribute *attr,
+                                 const char *buffer, size_t count)
+{
+       unsigned long val;
+       int rc;
+
+       rc = kstrtoul(buffer, 10, &val);
+       if (rc)
+               return rc;
+
+       val *= 1 << (20 - PAGE_SHIFT); /* convert to pages */
+
+       if (val > ((totalram_pages / 10) * 9)) {
+               /* Somebody wants to assign too much memory to dirty pages */
+               return -EINVAL;
+       }
+
+       if (val < 4 << (20 - PAGE_SHIFT)) {
+               /* Less than 4 Mb for dirty cache is also bad */
+               return -EINVAL;
+       }
+
+       obd_max_dirty_pages = val;
+
+       return count;
+}
+LUSTRE_RW_ATTR(max_dirty_mb);
+
 static ssize_t version_show(struct kobject *kobj, struct attribute *attr,
                            char *buf)
 {
@@ -431,6 +537,22 @@ static struct attribute *lustre_attrs[] = {
        &lustre_attr_health_check.attr,
        &lustre_attr_jobid_name.attr,
        &lustre_attr_jobid_var.attr,
+       &lustre_sattr_timeout.u.attr,
+       &lustre_attr_max_dirty_mb.attr,
+       &lustre_sattr_debug_peer_on_timeout.u.attr,
+       &lustre_sattr_dump_on_timeout.u.attr,
+       &lustre_sattr_dump_on_eviction.u.attr,
+       &lustre_sattr_at_min.u.attr,
+       &lustre_sattr_at_max.u.attr,
+       &lustre_sattr_at_extra.u.attr,
+       &lustre_sattr_at_early_margin.u.attr,
+       &lustre_sattr_at_history.u.attr,
+       &lustre_attr_memused_max.attr,
+       &lustre_attr_memused.attr,
+#ifdef HAVE_SERVER_SUPPORT
+       &lustre_sattr_ldlm_timeout.u.attr,
+       &lustre_sattr_bulk_timeout.u.attr,
+#endif
        NULL,
 };
 
@@ -518,6 +640,24 @@ static struct attribute_group lustre_attr_group = {
        .attrs = lustre_attrs,
 };
 
+ssize_t class_set_global(const char *param)
+{
+       const char *value = strchr(param, '=') + 1;
+       size_t off = value - param - 1;
+       ssize_t count = -ENOENT;
+       int i;
+
+       for (i = 0; lustre_attrs[i]; i++) {
+               if (!strncmp(lustre_attrs[i]->name, param, off)) {
+                       count = lustre_attr_store(&lustre_kset->kobj,
+                                                 lustre_attrs[i], value,
+                                                 strlen(value));
+                       break;
+               }
+       }
+       return count;
+}
+
 int class_procfs_init(void)
 {
        struct proc_dir_entry *entry;
@@ -536,12 +676,6 @@ int class_procfs_init(void)
                goto out;
        }
 
-       rc = obd_sysctl_init();
-       if (rc) {
-               kset_unregister(lustre_kset);
-               goto out;
-       }
-
        rc = jobid_cache_init();
        if (rc) {
                kset_unregister(lustre_kset);