lkml.org 
[lkml]   [2023]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [RFC PATCH 10/19] net: skb: Switch to using vm_account
On Tue, Jan 24, 2023 at 04:42:39PM +1100, Alistair Popple wrote:
> diff --git a/include/net/sock.h b/include/net/sock.h
> index dcd72e6..bc3a868 100644
> --- a/include/net/sock.h
> +++ b/include/net/sock.h
> @@ -334,6 +334,7 @@ struct sk_filter;
> * @sk_security: used by security modules
> * @sk_mark: generic packet mark
> * @sk_cgrp_data: cgroup data for this cgroup
> + * @sk_vm_account: data for pinned memory accounting
> * @sk_memcg: this socket's memory cgroup association
> * @sk_write_pending: a write to stream socket waits to start
> * @sk_state_change: callback to indicate change in the state of the sock
> @@ -523,6 +524,7 @@ struct sock {
> void *sk_security;
> #endif
> struct sock_cgroup_data sk_cgrp_data;
> + struct vm_account sk_vm_account;
> struct mem_cgroup *sk_memcg;
> void (*sk_state_change)(struct sock *sk);
> void (*sk_data_ready)(struct sock *sk);

I'm not sure this makes sense in a sock - each sock can be shared with
different proceses..

> diff --git a/net/rds/message.c b/net/rds/message.c
> index b47e4f0..2138a70 100644
> --- a/net/rds/message.c
> +++ b/net/rds/message.c
> @@ -99,7 +99,7 @@ static void rds_rm_zerocopy_callback(struct rds_sock *rs,
> struct list_head *head;
> unsigned long flags;
>
> - mm_unaccount_pinned_pages(&znotif->z_mmp);
> + mm_unaccount_pinned_pages(&rs->rs_sk.sk_vm_account, &znotif->z_mmp);
> q = &rs->rs_zcookie_queue;
> spin_lock_irqsave(&q->lock, flags);
> head = &q->zcookie_head;
> @@ -367,6 +367,7 @@ static int rds_message_zcopy_from_user(struct rds_message *rm, struct iov_iter *
> int ret = 0;
> int length = iov_iter_count(from);
> struct rds_msg_zcopy_info *info;
> + struct vm_account *vm_account = &rm->m_rs->rs_sk.sk_vm_account;
>
> rm->m_inc.i_hdr.h_len = cpu_to_be32(iov_iter_count(from));
>
> @@ -380,7 +381,9 @@ static int rds_message_zcopy_from_user(struct rds_message *rm, struct iov_iter *
> return -ENOMEM;
> INIT_LIST_HEAD(&info->rs_zcookie_next);
> rm->data.op_mmp_znotifier = &info->znotif;
> - if (mm_account_pinned_pages(&rm->data.op_mmp_znotifier->z_mmp,
> + vm_account_init(vm_account, current, current_user(), VM_ACCOUNT_USER);
> + if (mm_account_pinned_pages(vm_account,
> + &rm->data.op_mmp_znotifier->z_mmp,
> length)) {
> ret = -ENOMEM;
> goto err;
> @@ -399,7 +402,7 @@ static int rds_message_zcopy_from_user(struct rds_message *rm, struct iov_iter *
> for (i = 0; i < rm->data.op_nents; i++)
> put_page(sg_page(&rm->data.op_sg[i]));
> mmp = &rm->data.op_mmp_znotifier->z_mmp;
> - mm_unaccount_pinned_pages(mmp);
> + mm_unaccount_pinned_pages(vm_account, mmp);
> ret = -EFAULT;
> goto err;
> }

I wonder if RDS should just not be doing accounting? Usually things
related to iov_iter are short term and we don't account for them.

But then I don't really know how RDS works, Santos?

Regardless, maybe the vm_account should be stored in the
rds_msg_zcopy_info ?

Jason

\
 
 \ /
  Last update: 2023-03-26 23:54    [W:0.468 / U:0.052 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site