summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrandon Anderson <brandonand@google.com>2024-02-29 18:45:30 +0000
committerBrandon Anderson <brandonand@google.com>2024-03-01 02:12:35 +0000
commit5a11dd657ff3098cee18466fc96ebdc2f1a41fb6 (patch)
tree857e074561816eb402f89beca8f1cf008ebf2251
parent2e02a231b513d6957b3aac939596502e5f61bb6c (diff)
downloadtrusty-5a11dd657ff3098cee18466fc96ebdc2f1a41fb6.tar.gz
Trusty driver compat 6.7 shrinker interface
The Trusty driver from 5.10 needs to be adapted to the new memory shrinker interface of 6.7 Change-Id: Ibf2d2a519198769af70ffbf018978a51e26606ea Bug: 301606895 Signed-off-by: Brandon Anderson <brandonand@google.com>
-rw-r--r--drivers/trusty/trusty-ipc.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/drivers/trusty/trusty-ipc.c b/drivers/trusty/trusty-ipc.c
index ae97605..cc3d377 100644
--- a/drivers/trusty/trusty-ipc.c
+++ b/drivers/trusty/trusty-ipc.c
@@ -19,6 +19,7 @@
#include <linux/uio.h>
#include <linux/file.h>
#include <linux/version.h>
+#include <linux/shrinker.h>
#include <linux/virtio.h>
#include <linux/virtio_ids.h>
@@ -190,7 +191,11 @@ struct tipc_virtio_dev {
struct list_head reclaim_in_progress;
wait_queue_head_t reclaim_done;
bool reuse_msgbuf;
+#if (KERNEL_VERSION(6, 7, 0) <= LINUX_VERSION_CODE)
+ struct shrinker *mb_shrinker;
+#else
struct shrinker mb_shrinker;
+#endif
wait_queue_head_t sendq;
struct idr addr_idr;
enum tipc_device_state state;
@@ -2493,12 +2498,23 @@ static void _txvq_cb(struct virtqueue *txvq)
}
}
+#if (KERNEL_VERSION(6, 7, 0) <= LINUX_VERSION_CODE)
+static struct tipc_virtio_dev *tipc_shrinker_to_vds(struct shrinker *shrink)
+{
+ return shrink->private_data;
+}
+#else
+static struct tipc_virtio_dev *tipc_shrinker_to_vds(struct shrinker *shrink)
+{
+ return container_of(shrink, struct tipc_virtio_dev, mb_shrinker);
+}
+#endif
+
static unsigned long
tipc_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
{
unsigned long vds_actual_free_cnt;
- struct tipc_virtio_dev *vds =
- container_of(shrink, struct tipc_virtio_dev, mb_shrinker);
+ struct tipc_virtio_dev *vds = tipc_shrinker_to_vds(shrink);
long ret;
vds_actual_free_cnt = vds->free_msg_buf_cnt + vds->free_rx_cnt;
@@ -2521,8 +2537,7 @@ tipc_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
static unsigned long
tipc_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
{
- struct tipc_virtio_dev *vds =
- container_of(shrink, struct tipc_virtio_dev, mb_shrinker);
+ struct tipc_virtio_dev *vds = tipc_shrinker_to_vds(shrink);
unsigned long ret;
ret = vds_reduce_buf_cnt(vds, sc->nr_to_scan);
@@ -2609,6 +2624,19 @@ static int tipc_virtio_probe(struct virtio_device *vdev)
vdev->priv = vds;
vds->state = VDS_OFFLINE;
+#if (KERNEL_VERSION(6, 7, 0) <= LINUX_VERSION_CODE)
+ vds->mb_shrinker = shrinker_alloc(0, "trusty-ipc-shrinker");
+ if (!vds->mb_shrinker) {
+ err = -ENOMEM;
+ goto err_shrinker_alloc;
+ }
+
+ vds->mb_shrinker->count_objects = tipc_shrink_count;
+ vds->mb_shrinker->scan_objects = tipc_shrink_scan;
+ vds->mb_shrinker->seeks = DEFAULT_SEEKS;
+ vds->mb_shrinker->private_data = vds;
+ shrinker_register(vds->mb_shrinker);
+#else
vds->mb_shrinker.count_objects = tipc_shrink_count;
vds->mb_shrinker.scan_objects = tipc_shrink_scan;
vds->mb_shrinker.seeks = DEFAULT_SEEKS;
@@ -2617,6 +2645,7 @@ static int tipc_virtio_probe(struct virtio_device *vdev)
err = register_shrinker(&vds->mb_shrinker
TRUSTY_IPC_REGISTER_SHRINKER_ARG
);
+#endif
if (err) {
pr_err("failed to register shrinker: %d\n", err);
goto err_register_shrinker;
@@ -2626,6 +2655,10 @@ static int tipc_virtio_probe(struct virtio_device *vdev)
return 0;
err_register_shrinker:
+#if (KERNEL_VERSION(6, 7, 0) <= LINUX_VERSION_CODE)
+ shrinker_free(vds->mb_shrinker);
+err_shrinker_alloc:
+#endif
err_free_rx_buffers:
_cleanup_vq(vds, vds->rxvq);
err_find_vqs: