/* * Initialize the sysfs support for memory devices... */ int __init memory_dev_init(void) { unsigned int i; int ret; int err; unsigned long block_sz; ret = subsys_system_register(&memory_subsys, memory_root_attr_groups); if (ret) goto out; block_sz = get_memory_block_size(); sections_per_block = block_sz / MIN_MEMORY_BLOCK_SIZE; /* * Create entries for memory sections that were found * during boot and have been initialized */ mutex_lock(&mem_sysfs_mutex); for (i = 0; i < NR_MEM_SECTIONS; i += sections_per_block) { err = add_memory_block(i); if (!ret) ret = err; } mutex_unlock(&mem_sysfs_mutex); out: if (ret) printk(KERN_ERR "%s() failed: %d\n", __func__, ret); return ret; }
/* * Initialize the sysfs support for memory devices... */ int __init memory_dev_init(void) { unsigned int i; int ret; int err; unsigned long block_sz; struct memory_block *mem = NULL; ret = subsys_system_register(&memory_subsys, NULL); if (ret) goto out; block_sz = get_memory_block_size(); sections_per_block = block_sz / MIN_MEMORY_BLOCK_SIZE; /* * Create entries for memory sections that were found * during boot and have been initialized */ for (i = 0; i < NR_MEM_SECTIONS; i++) { if (!present_section_nr(i)) continue; /* don't need to reuse memory_block if only one per block */ err = add_memory_section(0, __nr_to_section(i), (sections_per_block == 1) ? NULL : &mem, MEM_ONLINE, BOOT); if (!ret) ret = err; } err = memory_probe_init(); if (!ret) ret = err; err = memory_fail_init(); if (!ret) ret = err; err = block_size_init(); if (!ret) ret = err; out: if (ret) printk(KERN_ERR "%s() failed: %d\n", __func__, ret); return ret; }
static SYSDEV_ATTR(phys_device, 0444, show_phys_device, NULL); static SYSDEV_ATTR(removable, 0444, show_mem_removable, NULL); #define mem_create_simple_file(mem, attr_name) \ sysdev_create_file(&mem->sysdev, &attr_##attr_name) #define mem_remove_simple_file(mem, attr_name) \ sysdev_remove_file(&mem->sysdev, &attr_##attr_name) /* * Block size attribute stuff */ static ssize_t print_block_size(struct sysdev_class *class, struct sysdev_class_attribute *attr, char *buf) { return sprintf(buf, "%lx\n", get_memory_block_size()); } static SYSDEV_CLASS_ATTR(block_size_bytes, 0444, print_block_size, NULL); static int block_size_init(void) { return sysfs_create_file(&memory_sysdev_class.kset.kobj, &attr_block_size_bytes.attr); } static ssize_t print_movable_size(struct class *class, struct class_attribute *attr, char *buf) { return sprintf(buf, "%lx\n", movable_reserved_size); }
/* * Block size attribute stuff */ static ssize_t print_block_size(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, "%lx\n", get_memory_block_size()); }