mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-07 20:33:58 -04:00
RxRPC rewrite
-----BEGIN PGP SIGNATURE-----
iQIVAwUAWHNwyPSw1s6N8H32AQKoqw//Wi8fpY/7SlQ8UT0RcF4KlBtfKux4dhMh
c4P2ARqEi3hVHz0MAJSYwhJDiXmPT8FboXq7yQmXj7DpkwDUgEHJlOZyoZFrStWC
hE72lbwD/m57jYgTG694wJZnGvTtqBEEkoMMIiUTSpEkSxB8aGsL+8dP9E6Q5hBS
ixLUHINdjaubsu+uzlI3MZdDk7TWBwp5fNekf4Jbjlb9anoICEkJsjZJHTR9n3nM
d9QpEbh42+YHAn2EFL8gXN+Cb7o75QppT3K+b68Pz43yvPgMLd78Q4tSN0aCo190
9ynR1szpniiw3T/xW0dGanpRjKLs7HZubTujc1oQ+TD1Q1Uh+2/nZWb9PxWAAe3S
CW+ssn6slv9IS+KXyoIMbDtyPaJOu1pMxYcFVXlZOAPXnYGl8P0A610f8u9833jT
OEqVKQ/bHAPiiTl2X/ATzCePhATtoYUq7jIc71pP01WK+o054bzm0r9Wyjxgs7g6
iPi4cfueZFOJMilkE9ZWuIws43YDv5wIEOWtpTkRCIHKCmkeVXkDfdRnnXhJCUeF
6y3iW0staR/pnTqI6g8LEnGku2gbteBQNCueYoJA5jsxLyl6oJw1Bur7yGTzzPnJ
SP+9+RBlyGI5EzIcqQWsReOhGY4U/hOWDtltYR/gmlhlQ2o/iO4U1aiN0qa1AiaH
3ixixVygYOA=
=H/FD
-----END PGP SIGNATURE-----
Merge tag 'rxrpc-rewrite-20170109' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs
David Howells says:
====================
afs: Refcount afs_call struct
These patches provide some tracepoints for AFS and fix a potential leak by
adding refcounting to the afs_call struct.
The patches are:
(1) Add some tracepoints for logging incoming calls and monitoring
notifications from AF_RXRPC and data reception.
(2) Get rid of afs_wait_mode as it didn't turn out to be as useful as
initially expected. It can be brought back later if needed. This
clears some stuff out that I don't then need to fix up in (4).
(3) Allow listen(..., 0) to be used to disable listening. This makes
shutting down the AFS cache manager server in the kernel much easier
and the accounting simpler as we can then be sure that (a) all
preallocated afs_call structs are relesed and (b) no new incoming
calls are going to be started.
For the moment, listening cannot be reenabled.
(4) Add refcounting to the afs_call struct to fix a potential multiple
release detected by static checking and add a tracepoint to follow the
lifecycle of afs_call objects.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
aaa9c1071d
13 changed files with 442 additions and 242 deletions
184
include/trace/events/afs.h
Normal file
184
include/trace/events/afs.h
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
/* AFS tracepoints
|
||||
*
|
||||
* Copyright (C) 2016 Red Hat, Inc. All Rights Reserved.
|
||||
* Written by David Howells (dhowells@redhat.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public Licence
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the Licence, or (at your option) any later version.
|
||||
*/
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM afs
|
||||
|
||||
#if !defined(_TRACE_AFS_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_AFS_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
/*
|
||||
* Define enums for tracing information.
|
||||
*/
|
||||
#ifndef __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
|
||||
#define __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
|
||||
|
||||
enum afs_call_trace {
|
||||
afs_call_trace_alloc,
|
||||
afs_call_trace_free,
|
||||
afs_call_trace_put,
|
||||
afs_call_trace_wake,
|
||||
afs_call_trace_work,
|
||||
};
|
||||
|
||||
#endif /* end __AFS_DECLARE_TRACE_ENUMS_ONCE_ONLY */
|
||||
|
||||
/*
|
||||
* Declare tracing information enums and their string mappings for display.
|
||||
*/
|
||||
#define afs_call_traces \
|
||||
EM(afs_call_trace_alloc, "ALLOC") \
|
||||
EM(afs_call_trace_free, "FREE ") \
|
||||
EM(afs_call_trace_put, "PUT ") \
|
||||
EM(afs_call_trace_wake, "WAKE ") \
|
||||
E_(afs_call_trace_work, "WORK ")
|
||||
|
||||
/*
|
||||
* Export enum symbols via userspace.
|
||||
*/
|
||||
#undef EM
|
||||
#undef E_
|
||||
#define EM(a, b) TRACE_DEFINE_ENUM(a);
|
||||
#define E_(a, b) TRACE_DEFINE_ENUM(a);
|
||||
|
||||
afs_call_traces;
|
||||
|
||||
/*
|
||||
* Now redefine the EM() and E_() macros to map the enums to the strings that
|
||||
* will be printed in the output.
|
||||
*/
|
||||
#undef EM
|
||||
#undef E_
|
||||
#define EM(a, b) { a, b },
|
||||
#define E_(a, b) { a, b }
|
||||
|
||||
TRACE_EVENT(afs_recv_data,
|
||||
TP_PROTO(struct afs_call *call, unsigned count, unsigned offset,
|
||||
bool want_more, int ret),
|
||||
|
||||
TP_ARGS(call, count, offset, want_more, ret),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(struct rxrpc_call *, rxcall )
|
||||
__field(struct afs_call *, call )
|
||||
__field(enum afs_call_state, state )
|
||||
__field(unsigned int, count )
|
||||
__field(unsigned int, offset )
|
||||
__field(unsigned short, unmarshall )
|
||||
__field(bool, want_more )
|
||||
__field(int, ret )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->rxcall = call->rxcall;
|
||||
__entry->call = call;
|
||||
__entry->state = call->state;
|
||||
__entry->unmarshall = call->unmarshall;
|
||||
__entry->count = count;
|
||||
__entry->offset = offset;
|
||||
__entry->want_more = want_more;
|
||||
__entry->ret = ret;
|
||||
),
|
||||
|
||||
TP_printk("c=%p ac=%p s=%u u=%u %u/%u wm=%u ret=%d",
|
||||
__entry->rxcall,
|
||||
__entry->call,
|
||||
__entry->state, __entry->unmarshall,
|
||||
__entry->offset, __entry->count,
|
||||
__entry->want_more, __entry->ret)
|
||||
);
|
||||
|
||||
TRACE_EVENT(afs_notify_call,
|
||||
TP_PROTO(struct rxrpc_call *rxcall, struct afs_call *call),
|
||||
|
||||
TP_ARGS(rxcall, call),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(struct rxrpc_call *, rxcall )
|
||||
__field(struct afs_call *, call )
|
||||
__field(enum afs_call_state, state )
|
||||
__field(unsigned short, unmarshall )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->rxcall = rxcall;
|
||||
__entry->call = call;
|
||||
__entry->state = call->state;
|
||||
__entry->unmarshall = call->unmarshall;
|
||||
),
|
||||
|
||||
TP_printk("c=%p ac=%p s=%u u=%u",
|
||||
__entry->rxcall,
|
||||
__entry->call,
|
||||
__entry->state, __entry->unmarshall)
|
||||
);
|
||||
|
||||
TRACE_EVENT(afs_cb_call,
|
||||
TP_PROTO(struct afs_call *call),
|
||||
|
||||
TP_ARGS(call),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(struct rxrpc_call *, rxcall )
|
||||
__field(struct afs_call *, call )
|
||||
__field(const char *, name )
|
||||
__field(u32, op )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->rxcall = call->rxcall;
|
||||
__entry->call = call;
|
||||
__entry->name = call->type->name;
|
||||
__entry->op = call->operation_ID;
|
||||
),
|
||||
|
||||
TP_printk("c=%p ac=%p %s o=%u",
|
||||
__entry->rxcall,
|
||||
__entry->call,
|
||||
__entry->name,
|
||||
__entry->op)
|
||||
);
|
||||
|
||||
TRACE_EVENT(afs_call,
|
||||
TP_PROTO(struct afs_call *call, enum afs_call_trace op,
|
||||
int usage, int outstanding, const void *where),
|
||||
|
||||
TP_ARGS(call, op, usage, outstanding, where),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(struct afs_call *, call )
|
||||
__field(int, op )
|
||||
__field(int, usage )
|
||||
__field(int, outstanding )
|
||||
__field(const void *, where )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->call = call;
|
||||
__entry->op = op;
|
||||
__entry->usage = usage;
|
||||
__entry->outstanding = outstanding;
|
||||
__entry->where = where;
|
||||
),
|
||||
|
||||
TP_printk("c=%p %s u=%d o=%d sp=%pSR",
|
||||
__entry->call,
|
||||
__print_symbolic(__entry->op, afs_call_traces),
|
||||
__entry->usage,
|
||||
__entry->outstanding,
|
||||
__entry->where)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_AFS_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
#include <trace/define_trace.h>
|
||||
Loading…
Reference in a new issue