270
270
* There is no point in collecting VM shared memory if other memory
271
* statistics are not available yet. Or is it?
271
* statistics are not available yet. Or is there?
275
275
/* Query the missing per-VM memory statistics. */
276
276
rc = PGMR3QueryMemoryStats(pVM.raw(), &uTotalMem, &uPrivateMem, &uSharedMem, &uZeroMem);
277
277
if (rc == VINF_SUCCESS)
279
278
validStats |= pm::VMSTATMASK_GUEST_MEMSHARED;
283
281
if (mCollectVMMStats)
285
283
rc = PGMR3QueryGlobalMemoryStats(pVM.raw(), &uAllocTotal, &uFreeTotal, &uBalloonedTotal, &uSharedTotal);
287
285
if (rc == VINF_SUCCESS)
290
pm::VMSTATMASK_VMM_ALLOC | pm::VMSTATMASK_VMM_FREE |
291
pm::VMSTATMASK_VMM_BALOON | pm::VMSTATMASK_VMM_SHARED;
286
validStats |= pm::VMSTATMASK_VMM_ALLOC | pm::VMSTATMASK_VMM_FREE
287
| pm::VMSTATMASK_VMM_BALOON | pm::VMSTATMASK_VMM_SHARED;
295
290
uint64_t uRxPrev = mNetStatRx;
296
291
uint64_t uTxPrev = mNetStatTx;
297
292
mNetStatRx = mNetStatTx = 0;
298
293
rc = STAMR3Enum(pVM, "*/ReceiveBytes|*/TransmitBytes", staticEnumStatsCallback, this);
299
296
uint64_t uTsNow = RTTimeNanoTS();
300
uint64_t uTimePassed = uTsNow - mNetStatLastTs;
301
mNetStatLastTs = uTsNow;
302
uNetStatRx = (ULONG)((mNetStatRx - uRxPrev) * 1000000 / (uTimePassed / 1000)); /* in bytes per second */
303
uNetStatTx = (ULONG)((mNetStatTx - uTxPrev) * 1000000 / (uTimePassed / 1000)); /* in bytes per second */
304
LogFlowThisFunc(("Net Rx=%llu Tx=%llu Ts=%llu Delta=%llu\n", mNetStatRx, mNetStatTx, uTsNow, uTimePassed));
306
validStats |= pm::VMSTATMASK_NET_RX | pm::VMSTATMASK_NET_TX;
297
uint64_t cNsPassed = uTsNow - mNetStatLastTs;
298
if (cNsPassed >= 1000)
300
mNetStatLastTs = uTsNow;
302
uNetStatRx = (ULONG)((mNetStatRx - uRxPrev) * 1000000 / (cNsPassed / 1000)); /* in bytes per second */
303
uNetStatTx = (ULONG)((mNetStatTx - uTxPrev) * 1000000 / (cNsPassed / 1000)); /* in bytes per second */
304
validStats |= pm::VMSTATMASK_NET_RX | pm::VMSTATMASK_NET_TX;
305
LogFlowThisFunc(("Net Rx=%llu Tx=%llu Ts=%llu Delta=%llu\n", mNetStatRx, mNetStatTx, uTsNow, cNsPassed));
309
/* Can happen on resume or if we're using a non-monotonic clock
310
source for the timer and the time is adjusted. */
311
mNetStatRx = uRxPrev;
312
mNetStatTx = uTxPrev;
313
LogThisFunc(("Net Ts=%llu cNsPassed=%llu - too small interval\n", uTsNow, cNsPassed));
309
317
mParent->reportVmStatistics(validStats,