18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file op_dname.c
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * dentry stack walking
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <linux/sched.h>
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <linux/unistd.h>
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <linux/mman.h>
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <linux/file.h>
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "oprofile.h"
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_dcache.h"
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_util.h"
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* --------- device routines ------------- */
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodduint op_dname_top;
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct qstr ** op_dname_stack;
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddchar * op_pool_pos;
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddchar * op_pool_start;
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddchar * op_pool_end;
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic ulong hash_map_open;
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic struct op_hash_index * hash_map;
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddunsigned long is_map_ready(void)
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return hash_map_open;
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint oprof_init_hashmap(void)
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint i;
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_dname_stack = kmalloc(DNAME_STACK_MAX * sizeof(struct qstr *), GFP_KERNEL);
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!op_dname_stack)
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return -EFAULT;
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_dname_top = 0;
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	memset(op_dname_stack, 0, DNAME_STACK_MAX * sizeof(struct qstr *));
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	hash_map = rvmalloc(PAGE_ALIGN(OP_HASH_MAP_SIZE));
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!hash_map)
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return -EFAULT;
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (i = 0; i < OP_HASH_MAP_NR; ++i) {
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		hash_map[i].name = 0;
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		hash_map[i].parent = -1;
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_pool_start = (char *)(hash_map + OP_HASH_MAP_NR);
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_pool_end = op_pool_start + POOL_SIZE;
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_pool_pos = op_pool_start;
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* Ensure that the zero hash map entry is never used, we use this
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * value as end of path terminator */
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	hash_map[0].name = alloc_in_pool("/", 1);
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	hash_map[0].parent = 0;
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return 0;
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid oprof_free_hashmap(void)
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	kfree(op_dname_stack);
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	rvfree(hash_map, PAGE_ALIGN(OP_HASH_MAP_SIZE));
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint oprof_hash_map_open(void)
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (test_and_set_bit(0, &hash_map_open))
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return -EBUSY;
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return 0;
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint oprof_hash_map_release(void)
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!hash_map_open)
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return -EFAULT;
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	clear_bit(0, &hash_map_open);
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return 0;
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint oprof_hash_map_mmap(struct file * file, struct vm_area_struct * vma)
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ulong start = (ulong)vma->vm_start;
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ulong page, pos;
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	ulong size = (ulong)(vma->vm_end-vma->vm_start);
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (size > PAGE_ALIGN(OP_HASH_MAP_SIZE) || (vma->vm_flags & VM_WRITE) || GET_VM_OFFSET(vma))
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return -EINVAL;
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pos = (ulong)hash_map;
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while (size > 0) {
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		page = kvirt_to_pa(pos);
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return -EAGAIN;
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		start += PAGE_SIZE;
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		pos += PAGE_SIZE;
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		size -= PAGE_SIZE;
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return 0;
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef NEED_2_2_DENTRIES
1148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint wind_dentries_2_4(struct dentry * dentry, struct vfsmount * vfsmnt, struct dentry * root, struct vfsmount * rootmnt)
1158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct dentry * d = dentry;
1178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct vfsmount * v = vfsmnt;
1188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* wind the dentries onto the stack pages */
1208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	for (;;) {
1218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* deleted ? */
1228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!IS_ROOT(d) && list_empty(&d->d_hash))
1238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			return 0;
1248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* the root */
1268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (d == root && v == rootmnt)
1278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			break;
1288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (d == v->mnt_root || IS_ROOT(d)) {
1308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (v->mnt_parent == v)
1318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				break;
1328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			/* cross the mount point */
1338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			d = v->mnt_mountpoint;
1348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			v = v->mnt_parent;
1358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
1368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		push_dname(&d->d_name);
1388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		d = d->d_parent;
1408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
1418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return 1;
1438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* called with note_lock held */
1468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodduint do_path_hash_2_4(struct dentry * dentry, struct vfsmount * vfsmnt)
1478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint value;
1498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct vfsmount * rootmnt;
1508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct dentry * root;
1518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	read_lock(&current->fs->lock);
1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	rootmnt = mntget(current->fs->rootmnt);
1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	root = dget(current->fs->root);
1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	read_unlock(&current->fs->lock);
1568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	spin_lock(&dcache_lock);
1588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	value = do_hash(dentry, vfsmnt, root, rootmnt);
1608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	spin_unlock(&dcache_lock);
1628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	dput(root);
1638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	mntput(rootmnt);
1648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return value;
1658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
1668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* NEED_2_2_DENTRIES */
1678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/* called with note_lock held */
1698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodduint do_hash(struct dentry * dentry, struct vfsmount * vfsmnt, struct dentry * root, struct vfsmount * rootmnt)
1708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
1718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct qstr * dname;
1728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint value = -1;
1738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint firsthash;
1748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint incr;
1758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	uint parent = 0;
1768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct op_hash_index * entry;
1778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!wind_dentries(dentry, vfsmnt, root, rootmnt))
1798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		goto out;
1808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/* unwind and hash */
1828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while ((dname = pop_dname())) {
1848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* if N is prime, value in [0-N[ and incr = max(1, value) then
1858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		 * iteration: value = (value + incr) % N covers the range [0-N[
1868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		 * in N iterations */
1878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		incr = firsthash = value = name_hash(dname->name, dname->len, parent);
1888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (incr == 0)
1898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			incr = 1;
1908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	retry:
1928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		entry = &hash_map[value];
1938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* existing entry ? */
1948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (streq(get_from_pool(entry->name), dname->name)
1958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			&& entry->parent == parent)
1968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			goto next;
1978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* new entry ? */
1998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (entry->parent == -1) {
2008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (add_hash_entry(entry, parent, dname->name, dname->len))
2018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				goto fullpool;
2028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			goto next;
2038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
2048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		/* nope, find another place in the table */
2068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		value = (value + incr) % OP_HASH_MAP_NR;
2078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (value == firsthash)
2098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			goto fulltable;
2108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		goto retry;
2128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	next:
2138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		parent = value;
2148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
2158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
2168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddout:
2178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	op_dname_top = 0;
2188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return value;
2198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfullpool:
2208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	printk(KERN_ERR "oprofile: string pool exhausted.\n");
2218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	value = -1;
2228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	goto out;
2238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddfulltable:
2248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	printk(KERN_ERR "oprofile: component hash table full :(\n");
2258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	value = -1;
2268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	goto out;
2278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
228