@@ -9033,46 +9033,35 @@ int parse_telem_info_file(int fd_dir, const char *info_filename, const char *for
9033
9033
9034
9034
struct pmt_mmio * pmt_mmio_open (unsigned int target_guid )
9035
9035
{
9036
- DIR * dirp ;
9037
- struct dirent * entry ;
9036
+ struct pmt_diriter_t pmt_iter ;
9037
+ const struct dirent * entry ;
9038
9038
struct stat st ;
9039
- unsigned int telem_idx ;
9040
9039
int fd_telem_dir , fd_pmt ;
9041
9040
unsigned long guid , size , offset ;
9042
9041
size_t mmap_size ;
9043
9042
void * mmio ;
9044
- struct pmt_mmio * ret = NULL ;
9043
+ struct pmt_mmio * head = NULL , * last = NULL ;
9044
+ struct pmt_mmio * new_pmt = NULL ;
9045
9045
9046
9046
if (stat (SYSFS_TELEM_PATH , & st ) == -1 )
9047
9047
return NULL ;
9048
9048
9049
- dirp = opendir (SYSFS_TELEM_PATH );
9050
- if (dirp == NULL )
9049
+ pmt_diriter_init (& pmt_iter );
9050
+ entry = pmt_diriter_begin (& pmt_iter , SYSFS_TELEM_PATH );
9051
+ if (!entry ) {
9052
+ pmt_diriter_remove (& pmt_iter );
9051
9053
return NULL ;
9054
+ }
9052
9055
9053
- for (;;) {
9054
- entry = readdir (dirp );
9055
-
9056
- if (entry == NULL )
9057
- break ;
9058
-
9059
- if (strcmp (entry -> d_name , "." ) == 0 )
9060
- continue ;
9061
-
9062
- if (strcmp (entry -> d_name , ".." ) == 0 )
9063
- continue ;
9064
-
9065
- if (sscanf (entry -> d_name , "telem%u" , & telem_idx ) != 1 )
9066
- continue ;
9067
-
9068
- if (fstatat (dirfd (dirp ), entry -> d_name , & st , 0 ) == -1 ) {
9056
+ for (;entry != NULL ; entry = pmt_diriter_next (& pmt_iter )) {
9057
+ if (fstatat (dirfd (pmt_iter .dir ), entry -> d_name , & st , 0 ) == -1 ) {
9069
9058
break ;
9070
9059
}
9071
9060
9072
9061
if (!S_ISDIR (st .st_mode ))
9073
9062
continue ;
9074
9063
9075
- fd_telem_dir = openat (dirfd (dirp ), entry -> d_name , O_RDONLY );
9064
+ fd_telem_dir = openat (dirfd (pmt_iter . dir ), entry -> d_name , O_RDONLY );
9076
9065
if (fd_telem_dir == -1 ) {
9077
9066
break ;
9078
9067
}
@@ -9106,35 +9095,51 @@ struct pmt_mmio *pmt_mmio_open(unsigned int target_guid)
9106
9095
mmap_size = ROUND_UP_TO_PAGE_SIZE (size );
9107
9096
mmio = mmap (0 , mmap_size , PROT_READ , MAP_SHARED , fd_pmt , 0 );
9108
9097
if (mmio != MAP_FAILED ) {
9109
-
9110
9098
if (debug )
9111
9099
fprintf (stderr , "%s: 0x%lx mmaped at: %p\n" , __func__ , guid , mmio );
9112
9100
9113
- ret = calloc (1 , sizeof (* ret ));
9101
+ new_pmt = calloc (1 , sizeof (* new_pmt ));
9114
9102
9115
- if (!ret ) {
9103
+ if (!new_pmt ) {
9116
9104
fprintf (stderr , "%s: Failed to allocate pmt_mmio\n" , __func__ );
9117
9105
exit (1 );
9118
9106
}
9119
9107
9120
- ret -> guid = guid ;
9121
- ret -> mmio_base = mmio ;
9122
- ret -> pmt_offset = offset ;
9123
- ret -> size = size ;
9108
+ /*
9109
+ * Create linked list of mmaped regions,
9110
+ * but preserve the ordering from sysfs.
9111
+ * Ordering is important for the user to
9112
+ * use the seq=%u parameter when adding a counter.
9113
+ */
9114
+ new_pmt -> guid = guid ;
9115
+ new_pmt -> mmio_base = mmio ;
9116
+ new_pmt -> pmt_offset = offset ;
9117
+ new_pmt -> size = size ;
9118
+ new_pmt -> next = pmt_mmios ;
9119
+
9120
+ if (last )
9121
+ last -> next = new_pmt ;
9122
+ else
9123
+ head = new_pmt ;
9124
9124
9125
- ret -> next = pmt_mmios ;
9126
- pmt_mmios = ret ;
9125
+ last = new_pmt ;
9127
9126
}
9128
9127
9129
9128
loop_cleanup_and_break :
9130
9129
close (fd_pmt );
9131
9130
close (fd_telem_dir );
9132
- break ;
9133
9131
}
9134
9132
9135
- closedir ( dirp );
9133
+ pmt_diriter_remove ( & pmt_iter );
9136
9134
9137
- return ret ;
9135
+ /*
9136
+ * If we found something, stick just
9137
+ * created linked list to the front.
9138
+ */
9139
+ if (head )
9140
+ pmt_mmios = head ;
9141
+
9142
+ return head ;
9138
9143
}
9139
9144
9140
9145
struct pmt_mmio * pmt_mmio_find (unsigned int guid )
0 commit comments