perf/urgent fixes:

These are only noticed when doing a detached tarball, i.e. when one does:
 
    make perf-perf-tar-src-pkg
 
 to create a perf-4.2.0-rc1.tar file and then try to build the contents of this
 tarball:
 
 - The python binding also has a MANIFEST like file where we list the files that
   need to be built and linked to form the resulting python shared object module
   file. And it has an entry for rbtree.c that still pointed to the one in the
   kernel sources, fix it by also removing one level of indirection so that it
   uses the tools/lib/rbtree.c copy. (Arnaldo Carvalho de Melo)
 
 - For the same reasons as for rbtree.c, copy the kernel lib/hweight.c file to
   tools/lib/, sanitizing it in the process to remove kernel specific stuff like
   EXPORT_SYMBOL() lines and the linux/export.h include reference, as that file
   doesn't exist anymore in tools/include/linux. (Arnaldo Carvalho de Melo)
 
 Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJVnuOBAAoJENZQFvNTUqpAgQwP/30+PqfZgFl1NQ980/cCguLW
 nMIwlw+GyQerOzffbCjRpilPJSV5IyWl9EwRxb53eyUugD/vUwEw0C3lgP1Txm27
 4yMudNFDLSk4Nux3FIl+z0Y6Zp2y4RnmpDNqbGpro7zv7/G6YzcvSzS/qjhyKeS6
 0leGcFVFRcnezpLFRGvNjChUhVtQ8ldoZW0PR5bGXika1BnQSs15aaUfZU7HDSHr
 RNf5LLO/ODh+XQZdBH42nOKbFlHJBWT6WyuuSC7+3shtM2Z2dS7jpFWILkdhdnSk
 Dypm9qAkU91gxuhLunasfzhJUXf2g+nbP5R75lwiIL6Z97/D3O9WBF8BBZgmfozt
 T29FDO/hPsW8SjHRfceyUysrVjUR4XP6vISj+6W+3ptAg1r7fPRrXzMsIRNJiDgB
 VK7ZWloO6aAHC+C1szudR99CXIxhz0x9sOOyrKmBi7Qc3hi0UszsT0yHOKzfFqga
 4JtGAGUQUijQsiL+jN6vgUuWcuGW9/huGosDH4t7FR7o8eGHBap6e3rxXX0weKer
 Y8MVrm3a3v6SA2hUD6kSlw3XuBOSL0vBid8aAATiTzhQZfmMHKb48yxDt+U3eoO9
 4Ygae6vNveKr0vYMlwvsy0lCcTbwxLwvtG4rRyQVOj7zwW/wdJ+30FAUFowD9r+9
 MhUPsCF4B4OO1RkZtwjZ
 =bQ38
 -----END PGP SIGNATURE-----

Merge tag 'perf-urgent-for-mingo-2' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent

Pull perf/urgent fixes from Arnaldo Carvalho de Melo:

  - Fix 'perf top -u username', where not enough memory per thread_map
    entry was being allocated nor was being initialized, causing a
    segfault (Arnaldo Carvalho de Melo)

  - Fix locking lockup using 32-bit compat vdso (Adrian Hunter)

  - Fix shadow declaration of 'close' with older build environments (Jiri Olsa)

  - Make the 'clean' target do a better job, removing some more temp files (Riku Voipio)

  - The python binding also has a MANIFEST like file where we list the files that
    need to be built and linked to form the resulting python shared object module
    file. And it has an entry for rbtree.c that still pointed to the one in the
    kernel sources, fix it by also removing one level of indirection so that it
    uses the tools/lib/rbtree.c copy. (Arnaldo Carvalho de Melo)

  - For the same reasons as for rbtree.c, copy the kernel lib/hweight.c file to
    tools/lib/, sanitizing it in the process to remove kernel specific stuff like
    EXPORT_SYMBOL() lines and the linux/export.h include reference, as that file
    doesn't exist anymore in tools/include/linux. (Arnaldo Carvalho de Melo)

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
Ingo Molnar 2015-07-10 10:01:29 +02:00
commit 4756e1966c
9 changed files with 74 additions and 15 deletions

View File

@ -36,7 +36,7 @@ $(LIBFILE): $(API_IN)
clean: clean:
$(call QUIET_CLEAN, libapi) $(RM) $(LIBFILE); \ $(call QUIET_CLEAN, libapi) $(RM) $(LIBFILE); \
find $(if $(OUTPUT),$(OUTPUT),.) -name \*.o | xargs $(RM) find $(if $(OUTPUT),$(OUTPUT),.) -name \*.o -or -name \*.o.cmd -or -name \*.o.d | xargs $(RM)
FORCE: FORCE:

62
tools/lib/hweight.c Normal file
View File

@ -0,0 +1,62 @@
#include <linux/bitops.h>
#include <asm/types.h>
/**
* hweightN - returns the hamming weight of a N-bit word
* @x: the word to weigh
*
* The Hamming Weight of a number is the total number of bits set in it.
*/
unsigned int __sw_hweight32(unsigned int w)
{
#ifdef CONFIG_ARCH_HAS_FAST_MULTIPLIER
w -= (w >> 1) & 0x55555555;
w = (w & 0x33333333) + ((w >> 2) & 0x33333333);
w = (w + (w >> 4)) & 0x0f0f0f0f;
return (w * 0x01010101) >> 24;
#else
unsigned int res = w - ((w >> 1) & 0x55555555);
res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
res = (res + (res >> 4)) & 0x0F0F0F0F;
res = res + (res >> 8);
return (res + (res >> 16)) & 0x000000FF;
#endif
}
unsigned int __sw_hweight16(unsigned int w)
{
unsigned int res = w - ((w >> 1) & 0x5555);
res = (res & 0x3333) + ((res >> 2) & 0x3333);
res = (res + (res >> 4)) & 0x0F0F;
return (res + (res >> 8)) & 0x00FF;
}
unsigned int __sw_hweight8(unsigned int w)
{
unsigned int res = w - ((w >> 1) & 0x55);
res = (res & 0x33) + ((res >> 2) & 0x33);
return (res + (res >> 4)) & 0x0F;
}
unsigned long __sw_hweight64(__u64 w)
{
#if BITS_PER_LONG == 32
return __sw_hweight32((unsigned int)(w >> 32)) +
__sw_hweight32((unsigned int)w);
#elif BITS_PER_LONG == 64
#ifdef CONFIG_ARCH_HAS_FAST_MULTIPLIER
w -= (w >> 1) & 0x5555555555555555ul;
w = (w & 0x3333333333333333ul) + ((w >> 2) & 0x3333333333333333ul);
w = (w + (w >> 4)) & 0x0f0f0f0f0f0f0f0ful;
return (w * 0x0101010101010101ul) >> 56;
#else
__u64 res = w - ((w >> 1) & 0x5555555555555555ul);
res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul);
res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful;
res = res + (res >> 8);
res = res + (res >> 16);
return (res + (res >> 32)) & 0x00000000000000FFul;
#endif
#endif
}

View File

@ -268,7 +268,7 @@ install: install_lib
clean: clean:
$(call QUIET_CLEAN, libtraceevent) \ $(call QUIET_CLEAN, libtraceevent) \
$(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d \ $(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d .*.cmd \
$(RM) TRACEEVENT-CFLAGS tags TAGS $(RM) TRACEEVENT-CFLAGS tags TAGS
PHONY += force plugins PHONY += force plugins

View File

@ -18,6 +18,7 @@ tools/arch/x86/include/asm/atomic.h
tools/arch/x86/include/asm/rmwcc.h tools/arch/x86/include/asm/rmwcc.h
tools/lib/traceevent tools/lib/traceevent
tools/lib/api tools/lib/api
tools/lib/hweight.c
tools/lib/rbtree.c tools/lib/rbtree.c
tools/lib/symbol/kallsyms.c tools/lib/symbol/kallsyms.c
tools/lib/symbol/kallsyms.h tools/lib/symbol/kallsyms.h
@ -57,7 +58,6 @@ include/linux/perf_event.h
include/linux/list.h include/linux/list.h
include/linux/hash.h include/linux/hash.h
include/linux/stringify.h include/linux/stringify.h
lib/hweight.c
include/linux/swab.h include/linux/swab.h
arch/*/include/asm/unistd*.h arch/*/include/asm/unistd*.h
arch/*/include/uapi/asm/unistd*.h arch/*/include/uapi/asm/unistd*.h

View File

@ -343,7 +343,7 @@ static int read_counter(struct perf_evsel *counter)
return 0; return 0;
} }
static void read_counters(bool close) static void read_counters(bool close_counters)
{ {
struct perf_evsel *counter; struct perf_evsel *counter;
@ -354,7 +354,7 @@ static void read_counters(bool close)
if (process_counter(counter)) if (process_counter(counter))
pr_warning("failed to process counter %s\n", counter->name); pr_warning("failed to process counter %s\n", counter->name);
if (close) { if (close_counters) {
perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter), perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter),
thread_map__nr(evsel_list->threads)); thread_map__nr(evsel_list->threads));
} }

View File

@ -143,6 +143,6 @@ $(OUTPUT)util/rbtree.o: ../lib/rbtree.c FORCE
$(call rule_mkdir) $(call rule_mkdir)
$(call if_changed_dep,cc_o_c) $(call if_changed_dep,cc_o_c)
$(OUTPUT)util/hweight.o: ../../lib/hweight.c FORCE $(OUTPUT)util/hweight.o: ../lib/hweight.c FORCE
$(call rule_mkdir) $(call rule_mkdir)
$(call if_changed_dep,cc_o_c) $(call if_changed_dep,cc_o_c)

View File

@ -10,7 +10,7 @@ util/ctype.c
util/evlist.c util/evlist.c
util/evsel.c util/evsel.c
util/cpumap.c util/cpumap.c
../../lib/hweight.c ../lib/hweight.c
util/thread_map.c util/thread_map.c
util/util.c util/util.c
util/xyarray.c util/xyarray.c
@ -19,5 +19,5 @@ util/rblist.c
util/stat.c util/stat.c
util/strlist.c util/strlist.c
util/trace-event.c util/trace-event.c
../../lib/rbtree.c ../lib/rbtree.c
util/string.c util/string.c

View File

@ -136,8 +136,7 @@ struct thread_map *thread_map__new_by_uid(uid_t uid)
if (grow) { if (grow) {
struct thread_map *tmp; struct thread_map *tmp;
tmp = realloc(threads, (sizeof(*threads) + tmp = thread_map__realloc(threads, max_threads);
max_threads * sizeof(pid_t)));
if (tmp == NULL) if (tmp == NULL)
goto out_free_namelist; goto out_free_namelist;

View File

@ -236,18 +236,16 @@ static struct dso *__machine__findnew_compat(struct machine *machine,
const char *file_name; const char *file_name;
struct dso *dso; struct dso *dso;
pthread_rwlock_wrlock(&machine->dsos.lock);
dso = __dsos__find(&machine->dsos, vdso_file->dso_name, true); dso = __dsos__find(&machine->dsos, vdso_file->dso_name, true);
if (dso) if (dso)
goto out_unlock; goto out;
file_name = vdso__get_compat_file(vdso_file); file_name = vdso__get_compat_file(vdso_file);
if (!file_name) if (!file_name)
goto out_unlock; goto out;
dso = __machine__addnew_vdso(machine, vdso_file->dso_name, file_name); dso = __machine__addnew_vdso(machine, vdso_file->dso_name, file_name);
out_unlock: out:
pthread_rwlock_unlock(&machine->dsos.lock);
return dso; return dso;
} }