blob: a9e16f196d39e309fdd5d035edd3a5284aa81bc7 [file] [log] [blame]
<?xml version='1.0'?> <!--*-nxml-*-->
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<refentry id="kdbus.pool">
<refentryinfo>
<title>kdbus.pool</title>
<productname>kdbus.pool</productname>
</refentryinfo>
<refmeta>
<refentrytitle>kdbus.pool</refentrytitle>
<manvolnum>7</manvolnum>
</refmeta>
<refnamediv>
<refname>kdbus.pool</refname>
<refpurpose>kdbus pool</refpurpose>
</refnamediv>
<refsect1>
<title>Description</title>
<para>
A pool for data received from the kernel is installed for every
<emphasis>connection</emphasis> of the <emphasis>bus</emphasis>, and
is sized according to the information stored in the
<varname>pool_size</varname> member of <type>struct kdbus_cmd_hello</type>
when <constant>KDBUS_CMD_HELLO</constant> is employed. Internally, the
pool is segmented into <emphasis>slices</emphasis>, each referenced by its
<emphasis>offset</emphasis> in the pool, expressed in <type>bytes</type>.
See
<citerefentry>
<refentrytitle>kdbus.connection</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
for more information about <constant>KDBUS_CMD_HELLO</constant>.
</para>
<para>
The pool is written to by the kernel when one of the following
<emphasis>ioctls</emphasis> is issued:
<variablelist>
<varlistentry>
<term><constant>KDBUS_CMD_HELLO</constant></term>
<listitem><para>
... to receive details about the bus the connection was made to
</para></listitem>
</varlistentry>
<varlistentry>
<term><constant>KDBUS_CMD_RECV</constant></term>
<listitem><para>
... to receive a message
</para></listitem>
</varlistentry>
<varlistentry>
<term><constant>KDBUS_CMD_LIST</constant></term>
<listitem><para>
... to dump the name registry
</para></listitem>
</varlistentry>
<varlistentry>
<term><constant>KDBUS_CMD_CONN_INFO</constant></term>
<listitem><para>
... to retrieve information on a connection
</para></listitem>
</varlistentry>
<varlistentry>
<term><constant>KDBUS_CMD_BUS_CREATOR_INFO</constant></term>
<listitem><para>
... to retrieve information about a connection's bus creator
</para></listitem>
</varlistentry>
</variablelist>
</para>
<para>
The <varname>offset</varname> fields returned by either one of the
aforementioned ioctls describe offsets inside the pool. In order to make
the slice available for subsequent calls,
<constant>KDBUS_CMD_FREE</constant> has to be called on that offset
(see below). Otherwise, the pool will fill up, and the connection won't
be able to receive any more information through its pool.
</para>
</refsect1>
<refsect1>
<title>Pool slice allocation</title>
<para>
Pool slices are allocated by the kernel in order to report information
back to a task, such as messages, returned name list etc.
Allocation of pool slices cannot be initiated by userspace. See
<citerefentry>
<refentrytitle>kdbus.connection</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
and
<citerefentry>
<refentrytitle>kdbus.name</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
for examples of commands that use the <emphasis>pool</emphasis> to
return data.
</para>
</refsect1>
<refsect1>
<title>Accessing the pool memory</title>
<para>
Memory in the pool is read-only for userspace and may only be written
to by the kernel. To read from the pool memory, the caller is expected to
<citerefentry>
<refentrytitle>mmap</refentrytitle>
<manvolnum>2</manvolnum>
</citerefentry>
the buffer into its task, like this:
</para>
<programlisting>
uint8_t *buf = mmap(NULL, size, PROT_READ, MAP_SHARED, conn_fd, 0);
</programlisting>
<para>
In order to map the entire pool, the <varname>size</varname> parameter in
the example above should be set to the value of the
<varname>pool_size</varname> member of
<type>struct kdbus_cmd_hello</type> when
<constant>KDBUS_CMD_HELLO</constant> was employed to create the
connection (see above).
</para>
<para>
The <emphasis>file descriptor</emphasis> used to map the memory must be
the one that was used to create the <emphasis>connection</emphasis>.
In other words, the one that was used to call
<constant>KDBUS_CMD_HELLO</constant>. See
<citerefentry>
<refentrytitle>kdbus.connection</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
for more details.
</para>
<para>
Alternatively, instead of mapping the entire pool buffer, only parts
of it can be mapped. Every kdbus command that returns an
<emphasis>offset</emphasis> (see above) also reports a
<emphasis>size</emphasis> along with it, so programs can be written
in a way that it only maps portions of the pool to access a specific
<emphasis>slice</emphasis>.
</para>
<para>
When access to the pool memory is no longer needed, programs should
call <function>munmap()</function> on the pointer returned by
<function>mmap()</function>.
</para>
</refsect1>
<refsect1>
<title>Freeing pool slices</title>
<para>
The <constant>KDBUS_CMD_FREE</constant> ioctl is used to free a slice
inside the pool, describing an offset that was returned in an
<varname>offset</varname> field of another ioctl struct.
The <constant>KDBUS_CMD_FREE</constant> command takes a
<type>struct kdbus_cmd_free</type> as argument.
</para>
<programlisting>
struct kdbus_cmd_free {
__u64 size;
__u64 flags;
__u64 return_flags;
__u64 offset;
struct kdbus_item items[0];
};
</programlisting>
<para>The fields in this struct are described below.</para>
<variablelist>
<varlistentry>
<term><varname>size</varname></term>
<listitem><para>
The overall size of the struct, including its items.
</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>flags</varname></term>
<listitem><para>
Currently unused.
<constant>KDBUS_FLAG_NEGOTIATE</constant> is accepted to probe for
valid flags. If set, the ioctl will return <errorcode>0</errorcode>,
and the <varname>flags</varname> field is set to
<constant>0</constant>.
</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>return_flags</varname></term>
<listitem><para>
Flags returned by the kernel. Currently unused and always set to
<constant>0</constant> by the kernel.
</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>offset</varname></term>
<listitem><para>
The offset to free, as returned by other ioctls that allocated
memory for returned information.
</para></listitem>
</varlistentry>
<varlistentry>
<term><varname>items</varname></term>
<listitem><para>
Items to specify further details for the receive command.
Currently unused.
Unrecognized items are rejected, and the ioctl will fail with
<varname>errno</varname> set to <constant>EINVAL</constant>.
All items except for
<constant>KDBUS_ITEM_NEGOTIATE</constant> (see
<citerefentry>
<refentrytitle>kdbus.item</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
) will be rejected.
</para></listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>
<title>Return value</title>
<para>
On success, all mentioned ioctl commands return <errorcode>0</errorcode>;
on error, <errorcode>-1</errorcode> is returned, and
<varname>errno</varname> is set to indicate the error.
If the issued ioctl is illegal for the file descriptor used,
<varname>errno</varname> will be set to <constant>ENOTTY</constant>.
</para>
<refsect2>
<title>
<constant>KDBUS_CMD_FREE</constant> may fail with the following
errors
</title>
<variablelist>
<varlistentry>
<term><constant>ENXIO</constant></term>
<listitem><para>
No pool slice found at given offset.
</para></listitem>
</varlistentry>
<varlistentry>
<term><constant>EINVAL</constant></term>
<listitem><para>
Invalid flags provided.
</para></listitem>
</varlistentry>
<varlistentry>
<term><constant>EINVAL</constant></term>
<listitem><para>
The offset is valid, but the user is not allowed to free the slice.
This happens, for example, if the offset was retrieved with
<constant>KDBUS_RECV_PEEK</constant>.
</para></listitem>
</varlistentry>
</variablelist>
</refsect2>
</refsect1>
<refsect1>
<title>See Also</title>
<simplelist type="inline">
<member>
<citerefentry>
<refentrytitle>kdbus</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.bus</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.connection</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.endpoint</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>kdbus.name</refentrytitle>
<manvolnum>7</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>mmap</refentrytitle>
<manvolnum>2</manvolnum>
</citerefentry>
</member>
<member>
<citerefentry>
<refentrytitle>munmap</refentrytitle>
<manvolnum>2</manvolnum>
</citerefentry>
</member>
</simplelist>
</refsect1>
</refentry>