[systemd-devel] [PATCH 3/3] kdbus: get some creds during meta append for optimization
Djalal Harouni
tixxdz at opendz.org
Wed Aug 20 09:16:34 PDT 2014
On Tue, Aug 19, 2014 at 09:15:35AM +0200, Daniel Mack wrote:
> Hi Djalal,
Thanks for applying the others.
> On 08/19/2014 03:43 AM, Djalal Harouni wrote:
> > Some creds can be gathered during kdbus_meta_append() instead of
> > kdbus_conn_queue_alloc() where they will be gathered for all the
> > receivers and saved into each receivers queue before installing
> > on the slices.
> >
> > By moving to kdbus_meta_append() it permits to do it only one time
> > for all the receivers, and we reduce some latency in
> > kdbus_conn_queue_alloc().
> >
> > Another point is that all the receivers will get the same uid/gid even
> > if the current sender changes its creds while we are still queueing for
> > all receivers.
> >
> > It seems that we can do the same with auxgroups, but this patch does
> > not implement it.
> >
> > Patch tested with the test-kdbus-metadata-ns
> >
> > Signed-off-by: Djalal Harouni <tixxdz at opendz.org>
> > ---
> > connection.c | 56 ++++++++++++++++++++++++++++++++++++--------------------
> > metadata.c | 6 +++++-
> > metadata.h | 26 ++++++++++++++++++++++++++
> > 3 files changed, 67 insertions(+), 21 deletions(-)
> >
> > diff --git a/connection.c b/connection.c
> > index 9250dab..49c5045 100644
> > --- a/connection.c
> > +++ b/connection.c
> > @@ -42,6 +42,24 @@
> > struct kdbus_conn_reply;
> >
> > /**
> > + * struct kdbus_queue_creds - internal creds data for receiver's
> > + * queue
> > + * @uid: The UID to patch into the final message
> > + * @gid: The GID to patch into the final message
> > + * @pid: The PID to patch into the final message
> > + * @tid: The TID to patch into the final message
> > + *
> > + * Creds that must be translated into the receiver's namespaces
> > + * when the message is installed into its slice.
> > + */
> > +struct kdbus_queue_creds {
> > + kuid_t uid;
> > + kgid_t gid;
> > + struct pid *pid;
> > + struct pid *tid;
> > +};
>
> Hmm, I'm not convinced this buys us anything really. After all, that
> struct has a single user only, and factoring out these fields doesn't
> necessarily lead to more readability.
Hmm with your commit 7bde48f293f5, I guess we have to add a generic
struct like that, or split into multiple structs, the aim would be to
share the struct and operations that perform the:
Translate and install fields into the receiver's slice when requesting
the connection info or when the receiver reads the message ?
> [...]
>
> > /**
> > + * struct kdbus_meta_creds - internal creds data
> > + * @uid: The UID of the sender
> > + * @gid: The GID of the sender
> > + *
> > + * Creds used for optimizations. We need to gather the info during
> > + * kdbus_meta_append() before pushing into the receiver's queue,
> > + * this way we do it only one time for all the receivers.
>
> I'm not strictly against it, but I wonder if this optimization is really
> worth it. Do you think it's that expensive to access these fields in
> 'current'? Because this change certainly doesn't make the code easier to
> understand, so I'm hesitant about this change.
Yes, I agree that the code would not be easy to read, and I failed to
come up with a better solution, perhaps it needs more thoughts!
Well, yes without numbers the optimization for uid/gid perhaps is not
needed, but for the auxgroup perhaps ? we can allocate and get the
auxgrps one time, then just memdup the data into the queue->auxgrps[] ?
Just trying to figure out the best solution...
BTW Daniel, sorry for this stupid question:
Can't the KDBUS_ATTACH_AUXGROUPS be part of the KDBUS_ATTACH_CREDS item?
Will be easy to parse it in the same item with uid/gid...
--
Djalal Harouni
http://opendz.org
More information about the systemd-devel
mailing list