<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
Reviewed-by: Eugene Loh <eugene.loh@oracle.com>
<div><br>
</div>
<div>For the dt_bpf_map_get_fd_by_id() comment, I assume:</div>
<div>s/based on it id/based on its id/</div>
<div><br>
</div>
<div>Personally, instead of key1/key2, it'd be better to stick to the in/out terminology that is otherwise used. In fact, converting "name[key1][key2]" to the in/out terminology would be a nice way of illustrating what in/out mean.</div>
<div><br>
</div>
<div>Will dt_bpf_map_get_fd_by_id() be used outside this file? That is, should it be "static" rather than declared in dt_bpf.h?</div>
<br>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Kris Van Hees via DTrace-devel <dtrace-devel@oss.oracle.com><br>
<b>Sent:</b> Friday, August 19, 2022 10:26 AM<br>
<b>To:</b> dtrace-devel@oss.oracle.com <dtrace-devel@oss.oracle.com><br>
<b>Subject:</b> [DTrace-devel] [PATCH 4/5] Implement dt_bpf_map_lookup_inner() and dt_bpf_map_update_inner()</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">Signed-off-by: Kris Van Hees <kris.van.hees@oracle.com><br>
---<br>
libdtrace/dt_bpf.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++<br>
libdtrace/dt_bpf.h | 5 ++++<br>
2 files changed, 64 insertions(+)<br>
<br>
diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c<br>
index 7a886278..66c76022 100644<br>
--- a/libdtrace/dt_bpf.c<br>
+++ b/libdtrace/dt_bpf.c<br>
@@ -164,6 +164,20 @@ dt_bpf_map_create_meta(enum bpf_map_type otype, const char *name,<br>
return ofd;<br>
}<br>
<br>
+/*<br>
+ * Get a file descriptor for a BPF map based on it id.<br>
+ */<br>
+int<br>
+dt_bpf_map_get_fd_by_id(uint32_t id)<br>
+{<br>
+ union bpf_attr attr;<br>
+<br>
+ memset(&attr, 0, sizeof(attr));<br>
+ attr.map_id = id;<br>
+<br>
+ return bpf(BPF_MAP_GET_FD_BY_ID, &attr);<br>
+}<br>
+<br>
/*<br>
* Load the value for the given key in the map referenced by the given fd.<br>
*/<br>
@@ -228,6 +242,51 @@ dt_bpf_map_update(int fd, const void *key, const void *val)<br>
return bpf(BPF_MAP_UPDATE_ELEM, &attr);<br>
}<br>
<br>
+/*<br>
+ * Retrieve the value in a map-of-maps, i.e. map[key1][key2] = value.<br>
+ */<br>
+int<br>
+dt_bpf_map_lookup_inner(int fd, const void *key1, const void *key2, void *val)<br>
+{<br>
+ uint32_t id;<br>
+ int rc;<br>
+<br>
+ if (dt_bpf_map_lookup(fd, key1, &id) < 0)<br>
+ return -1;<br>
+<br>
+ fd = dt_bpf_map_get_fd_by_id(id);<br>
+ if (fd < 0)<br>
+ return -1;<br>
+<br>
+ rc = dt_bpf_map_lookup(fd, key2, val);<br>
+ close(fd);<br>
+<br>
+ return rc;<br>
+}<br>
+<br>
+/*<br>
+ * Store the value in a map-of-maps, i.e. map[key1][key2] = value.<br>
+ */<br>
+int<br>
+dt_bpf_map_update_inner(int fd, const void *key1, const void *key2,<br>
+ const void *val)<br>
+{<br>
+ uint32_t id;<br>
+ int rc;<br>
+<br>
+ if (dt_bpf_map_lookup(fd, key1, &id) < 0)<br>
+ return -1;<br>
+<br>
+ fd = dt_bpf_map_get_fd_by_id(id);<br>
+ if (fd < 0)<br>
+ return -1;<br>
+<br>
+ rc = dt_bpf_map_update(fd, key2, val);<br>
+ close(fd);<br>
+<br>
+ return rc;<br>
+}<br>
+<br>
static int<br>
have_helper(uint32_t func_id)<br>
{<br>
diff --git a/libdtrace/dt_bpf.h b/libdtrace/dt_bpf.h<br>
index f8c75012..7a16c03d 100644<br>
--- a/libdtrace/dt_bpf.h<br>
+++ b/libdtrace/dt_bpf.h<br>
@@ -50,6 +50,11 @@ extern int dt_bpf_map_lookup(int fd, const void *key, void *val);<br>
extern int dt_bpf_map_next_key(int fd, const void *key, void *nxt);<br>
extern int dt_bpf_map_update(int fd, const void *key, const void *val);<br>
extern int dt_bpf_map_delete(int fd, const void *key);<br>
+extern int dt_bpf_map_get_fd_by_id(uint32_t id);<br>
+extern int dt_bpf_map_lookup_inner(int fd, const void *key1, const void *key2,<br>
+ void *val);<br>
+extern int dt_bpf_map_update_inner(int fd, const void *key1, const void *key2,<br>
+ const void *val);<br>
extern int dt_bpf_load_progs(struct dtrace_hdl *, uint_t);<br>
extern void dt_bpf_init_helpers(struct dtrace_hdl *dtp);<br>
<br>
-- <br>
2.34.1<br>
<br>
<br>
_______________________________________________<br>
DTrace-devel mailing list<br>
DTrace-devel@oss.oracle.com<br>
<a href="https://oss.oracle.com/mailman/listinfo/dtrace-devel">https://oss.oracle.com/mailman/listinfo/dtrace-devel</a><br>
</div>
</span></font></div>
</body>
</html>