diff options
author | Brandon Anderson <brandonand@google.com> | 2024-02-29 18:45:30 +0000 |
---|---|---|
committer | Brandon Anderson <brandonand@google.com> | 2024-03-01 02:12:35 +0000 |
commit | 5a11dd657ff3098cee18466fc96ebdc2f1a41fb6 (patch) | |
tree | 857e074561816eb402f89beca8f1cf008ebf2251 | |
parent | 2e02a231b513d6957b3aac939596502e5f61bb6c (diff) | |
download | trusty-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.c | 41 |
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: |