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

Commit d147a04a authored by Steven Moreland's avatar Steven Moreland Committed by Automerger Merge Worker
Browse files

Merge "libbinder: support inheriting realtime priority" am: ab861953 am:...

Merge "libbinder: support inheriting realtime priority" am: ab861953 am: 1ab2b818 am: fb364a49

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/1516611

Change-Id: Ie4c0f34c02a37685b279ba234be3e85405beec2b
parents 058235da fb364a49
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -133,6 +133,7 @@ class BBinder::Extras
public:
    // unlocked objects
    bool mRequestingSid = false;
    bool mInheritRt = false;
    sp<IBinder> mExtension;
    int mPolicy = SCHED_NORMAL;
    int mPriority = 0;
@@ -327,6 +328,27 @@ int BBinder::getMinSchedulerPriority() {
    return e->mPriority;
}

bool BBinder::isInheritRt() {
    Extras* e = mExtras.load(std::memory_order_acquire);

    return e && e->mInheritRt;
}

void BBinder::setInheritRt(bool inheritRt) {
    Extras* e = mExtras.load(std::memory_order_acquire);

    if (!e) {
        if (!inheritRt) {
            return;
        }

        e = getOrCreateExtras();
        if (!e) return; // out of memory
    }

    e->mInheritRt = inheritRt;
}

pid_t BBinder::getDebugPid() {
    return getpid();
}
+3 −0
Original line number Diff line number Diff line
@@ -222,6 +222,9 @@ status_t Parcel::flattenBinder(const sp<IBinder>& binder)
            if (local->isRequestingSid()) {
                obj.flags |= FLAT_BINDER_FLAG_TXN_SECURITY_CTX;
            }
            if (local->isInheritRt()) {
                obj.flags |= FLAT_BINDER_FLAG_INHERIT_RT;
            }
            obj.hdr.type = BINDER_TYPE_BINDER;
            obj.binder = reinterpret_cast<uintptr_t>(local->getWeakRefs());
            obj.cookie = reinterpret_cast<uintptr_t>(local);
+5 −0
Original line number Diff line number Diff line
@@ -87,6 +87,11 @@ public:
    int                 getMinSchedulerPolicy();
    int                 getMinSchedulerPriority();

    // Whether realtime scheduling policies are inherited.
    bool                isInheritRt();
    // This must be called before the object is sent to another process. Not thread safe.
    void                setInheritRt(bool inheritRt);

    pid_t               getDebugPid();

protected:
+23 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include <binder/IServiceManager.h>

#include <private/binder/binder_module.h>
#include <linux/sched.h>
#include <sys/epoll.h>
#include <sys/prctl.h>

@@ -53,6 +54,7 @@ static char binderserverarg[] = "--binderserver";

static constexpr int kSchedPolicy = SCHED_RR;
static constexpr int kSchedPriority = 7;
static constexpr int kSchedPriorityMore = 8;

static String16 binderLibTestServiceName = String16("test.binderLib");

@@ -1088,6 +1090,25 @@ TEST_F(BinderLibTest, SchedPolicySet) {
    EXPECT_EQ(kSchedPriority, priority);
}

TEST_F(BinderLibTest, InheritRt) {
    sp<IBinder> server = addServer();
    ASSERT_TRUE(server != nullptr);

    const struct sched_param param {
        .sched_priority = kSchedPriorityMore,
    };
    EXPECT_EQ(0, sched_setscheduler(getpid(), SCHED_RR, &param));

    Parcel data, reply;
    status_t ret = server->transact(BINDER_LIB_TEST_GET_SCHEDULING_POLICY, data, &reply);
    EXPECT_EQ(NO_ERROR, ret);

    int policy = reply.readInt32();
    int priority = reply.readInt32();

    EXPECT_EQ(kSchedPolicy, policy & (~SCHED_RESET_ON_FORK));
    EXPECT_EQ(kSchedPriorityMore, priority);
}

TEST_F(BinderLibTest, VectorSent) {
    Parcel data, reply;
@@ -1460,6 +1481,8 @@ int run_server(int index, int readypipefd, bool usePoll)

        testService->setMinSchedulerPolicy(kSchedPolicy, kSchedPriority);

        testService->setInheritRt(true);

        /*
         * Normally would also contain functionality as well, but we are only
         * testing the extension mechanism.
+9 −2
Original line number Diff line number Diff line
@@ -37,8 +37,8 @@ static const std::vector<std::function<void(FuzzedDataProvider*, const sp<BBinde
                                  bbinder->isRequestingSid();
                              },
                              [](FuzzedDataProvider* fdp, const sp<BBinder>& bbinder) -> void {
                                  bool request_sid = fdp->ConsumeBool();
                                  bbinder->setRequestingSid(request_sid);
                                  bool requestSid = fdp->ConsumeBool();
                                  bbinder->setRequestingSid(requestSid);
                              },
                              [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
                                  bbinder->getExtension();
@@ -63,6 +63,13 @@ static const std::vector<std::function<void(FuzzedDataProvider*, const sp<BBinde
                              [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
                                  bbinder->getMinSchedulerPriority();
                              },
                              [](FuzzedDataProvider* fdp, const sp<BBinder>& bbinder) -> void {
                                  bool inheritRt = fdp->ConsumeBool();
                                  bbinder->setInheritRt(inheritRt);
                              },
                              [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
                                  bbinder->isInheritRt();
                              },
                              [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
                                  bbinder->getDebugPid();
                              }};