Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e13a14d5 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Ask netd to swap stats map before reading"

parents 33ee4a55 f729cb5f
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -24,7 +24,10 @@ import static android.net.NetworkStats.UID_ALL;
import static com.android.server.NetworkManagementSocketTagger.kernelToTag;

import android.annotation.Nullable;
import android.net.INetd;
import android.net.NetworkStats;
import android.net.util.NetdService;
import android.os.RemoteException;
import android.os.StrictMode;
import android.os.SystemClock;

@@ -65,6 +68,8 @@ public class NetworkStatsFactory {

    private boolean mUseBpfStats;

    private INetd mNetdService;

    // A persistent Snapshot since device start for eBPF stats
    @GuardedBy("mPersistSnapshot")
    private final NetworkStats mPersistSnapshot;
@@ -279,6 +284,19 @@ public class NetworkStatsFactory {
        return stats;
    }

    @GuardedBy("mPersistSnapshot")
    private void requestSwapActiveStatsMapLocked() throws RemoteException {
        // Ask netd to do a active map stats swap. When the binder call successfully returns,
        // the system server should be able to safely read and clean the inactive map
        // without race problem.
        if (mUseBpfStats) {
            if (mNetdService == null) {
                mNetdService = NetdService.getInstance();
            }
            mNetdService.trafficSwapActiveStatsMap();
        }
    }

    // TODO: delete the lastStats parameter
    private NetworkStats readNetworkStatsDetailInternal(int limitUid, String[] limitIfaces,
            int limitTag, NetworkStats lastStats) throws IOException {
@@ -292,6 +310,13 @@ public class NetworkStatsFactory {
            }
            if (mUseBpfStats) {
                synchronized (mPersistSnapshot) {
                    try {
                        requestSwapActiveStatsMapLocked();
                    } catch (RemoteException e) {
                        throw new IOException(e);
                    }
                    // Stats are always read from the inactive map, so they must be read after the
                    // swap
                    if (nativeReadNetworkStatsDetail(stats, mStatsXtUid.getAbsolutePath(), UID_ALL,
                            null, TAG_ALL, mUseBpfStats) != 0) {
                        throw new IOException("Failed to parse network stats");