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(¤t->fs->lock); 1538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd rootmnt = mntget(current->fs->rootmnt); 1548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd root = dget(current->fs->root); 1558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd read_unlock(¤t->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