Never interact with "phone" while holding locks.
We've seen devices where heavy communication between "system_server" and the "phone" process can exhuast Binder threads, especially when calling while holding locks. To mitigate this, we now interact with the "phone" process before acquiring any locks. Update our internal data structures either when we see a connectivity change, or when SubscriptionManager tells us something changed. Fix bug in resolveSubscriptionPlan() that always picked the 0'th SubscriptionPlan instead of looking for the currently active plan; we now use the same logic for both NSS and NPMS. Bug: 77908520, 77154412 Test: atest com.android.server.NetworkPolicyManagerServiceTest Test: atest com.android.server.net.NetworkStatsServiceTest Change-Id: I177d3fa6cddc78d745b35a9ede12451d458b892c
This commit is contained in:
@@ -116,7 +116,6 @@ import android.provider.Settings;
|
||||
import android.provider.Settings.Global;
|
||||
import android.service.NetworkInterfaceProto;
|
||||
import android.service.NetworkStatsServiceDumpProto;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.telephony.SubscriptionPlan;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.text.format.DateUtils;
|
||||
@@ -679,22 +678,12 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
||||
private SubscriptionPlan resolveSubscriptionPlan(NetworkTemplate template, int flags) {
|
||||
SubscriptionPlan plan = null;
|
||||
if ((flags & NetworkStatsManager.FLAG_AUGMENT_WITH_SUBSCRIPTION_PLAN) != 0
|
||||
&& (template.getMatchRule() == NetworkTemplate.MATCH_MOBILE)
|
||||
&& mSettings.getAugmentEnabled()) {
|
||||
if (LOGD) Slog.d(TAG, "Resolving plan for " + template);
|
||||
final long token = Binder.clearCallingIdentity();
|
||||
try {
|
||||
final SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class);
|
||||
final TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
|
||||
for (int subId : sm.getActiveSubscriptionIdList()) {
|
||||
if (template.matchesSubscriberId(tm.getSubscriberId(subId))) {
|
||||
if (LOGD) Slog.d(TAG, "Found active matching subId " + subId);
|
||||
final List<SubscriptionPlan> plans = sm.getSubscriptionPlans(subId);
|
||||
if (!plans.isEmpty()) {
|
||||
plan = plans.get(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
plan = LocalServices.getService(NetworkPolicyManagerInternal.class)
|
||||
.getSubscriptionPlan(template);
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(token);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user