func()

in perf/uncore_libpfm.go [183:239]


func (c *uncoreCollector) setup(events PerfEvents, devicesPath string) error {
	readUncorePMUs, err := getUncorePMUs(devicesPath)
	if err != nil {
		return err
	}

	c.cpuFiles = make(map[int]map[string]group)
	c.events = events.Uncore.Events
	c.eventToCustomEvent = parseUncoreEvents(events.Uncore)
	c.cpuFilesLock.Lock()
	defer c.cpuFilesLock.Unlock()

	for i, group := range c.events {
		// Check what PMUs are needed.
		groupPMUs, err := parsePMUs(group, readUncorePMUs, c.eventToCustomEvent)
		if err != nil {
			return err
		}

		err = checkGroup(group, groupPMUs)
		if err != nil {
			return err
		}

		// CPUs file descriptors of group leader needed for perf_event_open.
		leaderFileDescriptors := make(map[string]map[uint32]int)
		for _, pmu := range readUncorePMUs {
			leaderFileDescriptors[pmu.name] = make(map[uint32]int)
			for _, cpu := range pmu.cpus {
				leaderFileDescriptors[pmu.name][cpu] = groupLeaderFileDescriptor
			}
		}
		leaderFileDescriptors, err = c.createLeaderFileDescriptors(group.events, i, groupPMUs, leaderFileDescriptors)
		if err != nil {
			klog.Error(err)
			continue
		}
		// Group is prepared so we should reset and enable counting.
		for _, pmuCPUs := range leaderFileDescriptors {
			for _, fd := range pmuCPUs {
				// Call only for used PMUs.
				if fd != groupLeaderFileDescriptor {
					err = c.ioctlSetInt(fd, unix.PERF_EVENT_IOC_RESET, 0)
					if err != nil {
						return err
					}
					err = c.ioctlSetInt(fd, unix.PERF_EVENT_IOC_ENABLE, 0)
					if err != nil {
						return err
					}
				}
			}
		}
	}

	return nil
}