Changeset 350f88dc in rtems for cpukit/sapi
- Timestamp:
- 03/10/14 09:20:40 (10 years ago)
- Branches:
- 4.11, 5, master
- Children:
- f980561
- Parents:
- 29c9eb6
- git-author:
- Sebastian Huber <sebastian.huber@…> (03/10/14 09:20:40)
- git-committer:
- Sebastian Huber <sebastian.huber@…> (03/14/14 07:46:49)
- Location:
- cpukit/sapi
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
cpukit/sapi/include/rtems/profiling.h
r29c9eb6 r350f88dc 67 67 * @see rtems_profiling_per_cpu. 68 68 */ 69 RTEMS_PROFILING_PER_CPU 69 RTEMS_PROFILING_PER_CPU, 70 71 /** 72 * @brief Type of SMP lock profiling data. 73 * 74 * @see rtems_profiling_smp_lock. 75 */ 76 RTEMS_PROFILING_SMP_LOCK 70 77 } rtems_profiling_type; 71 78 … … 171 178 172 179 /** 180 * @brief Count of lock contention counters for SMP lock profiling. 181 */ 182 #define RTEMS_PROFILING_SMP_LOCK_CONTENTION_COUNTS 4 183 184 /** 185 * @brief SMP lock profiling data. 186 * 187 * The lock acquire attempt instant is the point in time right after the 188 * interrupt disable action in the lock acquire sequence. 189 * 190 * The lock acquire instant is the point in time right after the lock 191 * acquisition. This is the begin of the critical section code execution. 192 * 193 * The lock acquire time is the time elapsed between the lock acquire attempt 194 * instant and the lock acquire instant. 195 * 196 * The lock release instant is the point in time right before the interrupt 197 * enable action in the lock release sequence. 198 * 199 * The lock section time is the time elapsed between the lock acquire instant 200 * and the lock release instant. 201 */ 202 typedef struct { 203 /** 204 * @brief The profiling data header. 205 */ 206 rtems_profiling_header header; 207 208 /** 209 * @brief The lock name. 210 */ 211 const char *name; 212 213 /** 214 * @brief The maximum lock acquire time in nanoseconds. 215 */ 216 uint32_t max_acquire_time; 217 218 /** 219 * @brief The maximum lock section time in nanoseconds. 220 */ 221 uint32_t max_section_time; 222 223 /** 224 * @brief The count of lock uses. 225 * 226 * This value may overflow. 227 */ 228 uint64_t usage_count; 229 230 /** 231 * @brief Total lock acquire time in nanoseconds. 232 * 233 * The average lock acquire time is the total acquire time divided by the 234 * lock usage count. The ration of the total section and total acquire times 235 * gives a measure for the lock contention. 236 * 237 * This value may overflow. 238 */ 239 uint64_t total_acquire_time; 240 241 /** 242 * @brief Total lock section time in nanoseconds. 243 * 244 * The average lock section time is the total section time divided by the 245 * lock usage count. 246 * 247 * This value may overflow. 248 */ 249 uint64_t total_section_time; 250 251 /** 252 * @brief The counts of lock acquire operations by contention. 253 * 254 * The contention count for index N corresponds to a lock acquire attempt 255 * with an initial queue length of N. The last index corresponds to all 256 * lock acquire attempts with an initial queue length greater than or equal 257 * to RTEMS_PROFILING_SMP_LOCK_CONTENTION_COUNTS minus one. 258 * 259 * The values may overflow. 260 */ 261 uint64_t contention_counts[RTEMS_PROFILING_SMP_LOCK_CONTENTION_COUNTS]; 262 } rtems_profiling_smp_lock; 263 264 /** 173 265 * @brief Collection of profiling data. 174 266 */ … … 183 275 */ 184 276 rtems_profiling_per_cpu per_cpu; 277 278 /** 279 * @brief SMP lock profiling data if indicated by the header. 280 */ 281 rtems_profiling_smp_lock smp_lock; 185 282 } rtems_profiling_data; 186 283 -
cpukit/sapi/src/profilingreportxml.c
r29c9eb6 r350f88dc 131 131 } 132 132 133 static void report_smp_lock(context *ctx, const rtems_profiling_smp_lock *smp_lock) 134 { 135 rtems_profiling_printf printf_func = ctx->printf_func; 136 void *printf_arg = ctx->printf_arg; 137 int rv; 138 uint32_t i; 139 140 indent(ctx, 1); 141 rv = (*printf_func)( 142 printf_arg, 143 "<SMPLockProfilingReport name=\"%s\">\n", 144 smp_lock->name 145 ); 146 update_retval(ctx, rv); 147 148 indent(ctx, 2); 149 rv = (*printf_func)( 150 printf_arg, 151 "<MaxAcquireTime unit=\"ns\">%" PRIu32 "</MaxAcquireTime>\n", 152 smp_lock->max_acquire_time 153 ); 154 update_retval(ctx, rv); 155 156 indent(ctx, 2); 157 rv = (*printf_func)( 158 printf_arg, 159 "<MaxSectionTime unit=\"ns\">%" PRIu32 "</MaxSectionTime>\n", 160 smp_lock->max_section_time 161 ); 162 update_retval(ctx, rv); 163 164 indent(ctx, 2); 165 rv = (*printf_func)( 166 printf_arg, 167 "<UsageCount>%" PRIu64 "</UsageCount>\n", 168 smp_lock->usage_count 169 ); 170 update_retval(ctx, rv); 171 172 indent(ctx, 2); 173 rv = (*printf_func)( 174 printf_arg, 175 "<TotalAcquireTime unit=\"ns\">%" PRIu64 "</TotalAcquireTime>\n", 176 smp_lock->total_acquire_time 177 ); 178 update_retval(ctx, rv); 179 180 indent(ctx, 2); 181 rv = (*printf_func)( 182 printf_arg, 183 "<TotalSectionTime unit=\"ns\">%" PRIu64 "</TotalSectionTime>\n", 184 smp_lock->total_section_time 185 ); 186 update_retval(ctx, rv); 187 188 for (i = 0; i < RTEMS_PROFILING_SMP_LOCK_CONTENTION_COUNTS; ++i) { 189 indent(ctx, 2); 190 rv = (*printf_func)( 191 printf_arg, 192 "<ContentionCount initialQueueLength=\"%" PRIu32 "\">%" 193 PRIu64 "</ContentionCount>\n", 194 i, 195 smp_lock->contention_counts[i] 196 ); 197 update_retval(ctx, rv); 198 } 199 200 indent(ctx, 1); 201 rv = (*printf_func)( 202 printf_arg, 203 "</SMPLockProfilingReport>\n" 204 ); 205 update_retval(ctx, rv); 206 } 207 133 208 static void report(void *arg, const rtems_profiling_data *data) 134 209 { … … 138 213 case RTEMS_PROFILING_PER_CPU: 139 214 report_per_cpu(ctx, &data->per_cpu); 215 break; 216 case RTEMS_PROFILING_SMP_LOCK: 217 report_smp_lock(ctx, &data->smp_lock); 140 218 break; 141 219 }
Note: See TracChangeset
for help on using the changeset viewer.