rxrpc: Add tracepoint for working out where aborts happen
[deliverable/linux.git] / net / rxrpc / ar-internal.h
index 0c320b2b7b435bd208e5b9134c5c3cb58c5fa7fb..dbfb9ed174834c266576ee637c66dedb1a2d5bb6 100644 (file)
@@ -35,10 +35,22 @@ struct rxrpc_crypt {
 #define rxrpc_queue_delayed_work(WS,D) \
        queue_delayed_work(rxrpc_workqueue, (WS), (D))
 
-#define rxrpc_queue_call(CALL) rxrpc_queue_work(&(CALL)->processor)
-
 struct rxrpc_connection;
 
+/*
+ * Mark applied to socket buffers.
+ */
+enum rxrpc_skb_mark {
+       RXRPC_SKB_MARK_DATA,            /* data message */
+       RXRPC_SKB_MARK_FINAL_ACK,       /* final ACK received message */
+       RXRPC_SKB_MARK_BUSY,            /* server busy message */
+       RXRPC_SKB_MARK_REMOTE_ABORT,    /* remote abort message */
+       RXRPC_SKB_MARK_LOCAL_ABORT,     /* local abort message */
+       RXRPC_SKB_MARK_NET_ERROR,       /* network error message */
+       RXRPC_SKB_MARK_LOCAL_ERROR,     /* local error message */
+       RXRPC_SKB_MARK_NEW_CALL,        /* local error message */
+};
+
 /*
  * sk_state for RxRPC sockets
  */
@@ -57,7 +69,7 @@ enum {
 struct rxrpc_sock {
        /* WARNING: sk has to be the first member */
        struct sock             sk;
-       rxrpc_interceptor_t     interceptor;    /* kernel service Rx interceptor function */
+       rxrpc_notify_new_call_t notify_new_call; /* Func to notify of new call */
        struct rxrpc_local      *local;         /* local endpoint */
        struct list_head        listen_link;    /* link in the local endpoint's listen list */
        struct list_head        secureq;        /* calls awaiting connection security clearance */
@@ -117,13 +129,6 @@ struct rxrpc_skb_priv {
 
 #define rxrpc_skb(__skb) ((struct rxrpc_skb_priv *) &(__skb)->cb)
 
-enum rxrpc_command {
-       RXRPC_CMD_SEND_DATA,            /* send data message */
-       RXRPC_CMD_SEND_ABORT,           /* request abort generation */
-       RXRPC_CMD_ACCEPT,               /* [server] accept incoming call */
-       RXRPC_CMD_REJECT_BUSY,          /* [server] reject a call as busy */
-};
-
 /*
  * RxRPC security module interface
  */
@@ -150,7 +155,8 @@ struct rxrpc_security {
                             void *);
 
        /* verify the security on a received packet */
-       int (*verify_packet)(struct rxrpc_call *, struct sk_buff *, u32 *);
+       int (*verify_packet)(struct rxrpc_call *, struct sk_buff *,
+                            rxrpc_seq_t, u16);
 
        /* issue a challenge */
        int (*issue_challenge)(struct rxrpc_connection *);
@@ -367,6 +373,7 @@ enum rxrpc_call_flag {
        RXRPC_CALL_EXPECT_OOS,          /* expect out of sequence packets */
        RXRPC_CALL_IS_SERVICE,          /* Call is service call */
        RXRPC_CALL_EXPOSED,             /* The call was exposed to the world */
+       RXRPC_CALL_RX_NO_MORE,          /* Don't indicate MSG_MORE from recvmsg() */
 };
 
 /*
@@ -389,7 +396,6 @@ enum rxrpc_call_event {
        RXRPC_CALL_EV_ACCEPTED,         /* incoming call accepted by userspace app */
        RXRPC_CALL_EV_SECURED,          /* incoming call's connection is now secure */
        RXRPC_CALL_EV_POST_ACCEPT,      /* need to post an "accept?" message to the app */
-       RXRPC_CALL_EV_RELEASE,          /* need to release the call's resources */
 };
 
 /*
@@ -409,7 +415,6 @@ enum rxrpc_call_state {
        RXRPC_CALL_SERVER_SEND_REPLY,   /* - server sending reply */
        RXRPC_CALL_SERVER_AWAIT_ACK,    /* - server awaiting final ACK */
        RXRPC_CALL_COMPLETE,            /* - call complete */
-       RXRPC_CALL_DEAD,                /* - call is dead */
        NR__RXRPC_CALL_STATES
 };
 
@@ -434,13 +439,12 @@ struct rxrpc_call {
        struct rcu_head         rcu;
        struct rxrpc_connection *conn;          /* connection carrying call */
        struct rxrpc_peer       *peer;          /* Peer record for remote address */
-       struct rxrpc_sock       *socket;        /* socket responsible */
+       struct rxrpc_sock __rcu *socket;        /* socket responsible */
        struct timer_list       lifetimer;      /* lifetime remaining on call */
-       struct timer_list       deadspan;       /* reap timer for re-ACK'ing, etc  */
        struct timer_list       ack_timer;      /* ACK generation timer */
        struct timer_list       resend_timer;   /* Tx resend timer */
-       struct work_struct      destroyer;      /* call destroyer */
        struct work_struct      processor;      /* packet processor and ACK generator */
+       rxrpc_notify_rx_t       notify_rx;      /* kernel service Rx notification function */
        struct list_head        link;           /* link in master call list */
        struct list_head        chan_wait_link; /* Link in conn->waiting_calls */
        struct hlist_node       error_link;     /* link in error distribution list */
@@ -448,6 +452,7 @@ struct rxrpc_call {
        struct rb_node          sock_node;      /* node in socket call tree */
        struct sk_buff_head     rx_queue;       /* received packets */
        struct sk_buff_head     rx_oos_queue;   /* packets received out of sequence */
+       struct sk_buff_head     knlrecv_queue;  /* Queue for kernel_recv [TODO: replace this] */
        struct sk_buff          *tx_pending;    /* Tx socket buffer being filled */
        wait_queue_head_t       waitq;          /* Wait queue for channel or Tx */
        __be32                  crypto_buf[2];  /* Temporary packet crypto buffer */
@@ -465,6 +470,7 @@ struct rxrpc_call {
        atomic_t                skb_count;      /* Outstanding packets on this call */
        atomic_t                sequence;       /* Tx data packet sequence counter */
        u16                     service_id;     /* service ID */
+       u8                      security_ix;    /* Security type */
        u32                     call_id;        /* call ID on connection  */
        u32                     cid;            /* connection ID plus channel index */
        int                     debug_id;       /* debug ID for printks */
@@ -498,6 +504,24 @@ struct rxrpc_call {
        unsigned long           ackr_window[RXRPC_ACKR_WINDOW_ASZ + 1];
 };
 
+enum rxrpc_call_trace {
+       rxrpc_call_new_client,
+       rxrpc_call_new_service,
+       rxrpc_call_queued,
+       rxrpc_call_queued_ref,
+       rxrpc_call_seen,
+       rxrpc_call_got,
+       rxrpc_call_got_skb,
+       rxrpc_call_got_userid,
+       rxrpc_call_put,
+       rxrpc_call_put_skb,
+       rxrpc_call_put_userid,
+       rxrpc_call_put_noqueue,
+       rxrpc_call__nr_trace
+};
+
+extern const char rxrpc_call_traces[rxrpc_call__nr_trace][4];
+
 #include <trace/events/rxrpc.h>
 
 /*
@@ -512,7 +536,8 @@ extern struct workqueue_struct *rxrpc_workqueue;
  * call_accept.c
  */
 void rxrpc_accept_incoming_calls(struct rxrpc_local *);
-struct rxrpc_call *rxrpc_accept_call(struct rxrpc_sock *, unsigned long);
+struct rxrpc_call *rxrpc_accept_call(struct rxrpc_sock *, unsigned long,
+                                    rxrpc_notify_rx_t);
 int rxrpc_reject_call(struct rxrpc_sock *);
 
 /*
@@ -528,7 +553,6 @@ void rxrpc_process_call(struct work_struct *);
 extern const char *const rxrpc_call_states[];
 extern const char *const rxrpc_call_completions[];
 extern unsigned int rxrpc_max_call_lifetime;
-extern unsigned int rxrpc_dead_call_expiry;
 extern struct kmem_cache *rxrpc_call_jar;
 extern struct list_head rxrpc_calls;
 extern rwlock_t rxrpc_call_lock;
@@ -541,11 +565,13 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *,
 struct rxrpc_call *rxrpc_incoming_call(struct rxrpc_sock *,
                                       struct rxrpc_connection *,
                                       struct sk_buff *);
-void rxrpc_release_call(struct rxrpc_call *);
+void rxrpc_release_call(struct rxrpc_sock *, struct rxrpc_call *);
 void rxrpc_release_calls_on_socket(struct rxrpc_sock *);
+bool __rxrpc_queue_call(struct rxrpc_call *);
+bool rxrpc_queue_call(struct rxrpc_call *);
 void rxrpc_see_call(struct rxrpc_call *);
-void rxrpc_get_call(struct rxrpc_call *);
-void rxrpc_put_call(struct rxrpc_call *);
+void rxrpc_get_call(struct rxrpc_call *, enum rxrpc_call_trace);
+void rxrpc_put_call(struct rxrpc_call *, enum rxrpc_call_trace);
 void rxrpc_get_call_for_skb(struct rxrpc_call *, struct sk_buff *);
 void rxrpc_put_call_for_skb(struct rxrpc_call *, struct sk_buff *);
 void __exit rxrpc_destroy_all_calls(void);
@@ -583,7 +609,7 @@ static inline bool rxrpc_set_call_completion(struct rxrpc_call *call,
                                             u32 abort_code,
                                             int error)
 {
-       int ret;
+       bool ret;
 
        write_lock_bh(&call->state_lock);
        ret = __rxrpc_set_call_completion(call, compl, abort_code, error);
@@ -594,24 +620,30 @@ static inline bool rxrpc_set_call_completion(struct rxrpc_call *call,
 /*
  * Record that a call successfully completed.
  */
-static inline void __rxrpc_call_completed(struct rxrpc_call *call)
+static inline bool __rxrpc_call_completed(struct rxrpc_call *call)
 {
-       __rxrpc_set_call_completion(call, RXRPC_CALL_SUCCEEDED, 0, 0);
+       return __rxrpc_set_call_completion(call, RXRPC_CALL_SUCCEEDED, 0, 0);
 }
 
-static inline void rxrpc_call_completed(struct rxrpc_call *call)
+static inline bool rxrpc_call_completed(struct rxrpc_call *call)
 {
+       bool ret;
+
        write_lock_bh(&call->state_lock);
-       __rxrpc_call_completed(call);
+       ret = __rxrpc_call_completed(call);
        write_unlock_bh(&call->state_lock);
+       return ret;
 }
 
 /*
  * Record that a call is locally aborted.
  */
-static inline bool __rxrpc_abort_call(struct rxrpc_call *call,
+static inline bool __rxrpc_abort_call(const char *why, struct rxrpc_call *call,
+                                     rxrpc_seq_t seq,
                                      u32 abort_code, int error)
 {
+       trace_rxrpc_abort(why, call->cid, call->call_id, seq,
+                         abort_code, error);
        if (__rxrpc_set_call_completion(call,
                                        RXRPC_CALL_LOCALLY_ABORTED,
                                        abort_code, error)) {
@@ -621,13 +653,13 @@ static inline bool __rxrpc_abort_call(struct rxrpc_call *call,
        return false;
 }
 
-static inline bool rxrpc_abort_call(struct rxrpc_call *call,
-                                   u32 abort_code, int error)
+static inline bool rxrpc_abort_call(const char *why, struct rxrpc_call *call,
+                                   rxrpc_seq_t seq, u32 abort_code, int error)
 {
        bool ret;
 
        write_lock_bh(&call->state_lock);
-       ret = __rxrpc_abort_call(call, abort_code, error);
+       ret = __rxrpc_abort_call(why, call, seq, abort_code, error);
        write_unlock_bh(&call->state_lock);
        return ret;
 }
@@ -709,7 +741,6 @@ static inline void rxrpc_put_connection(struct rxrpc_connection *conn)
        }
 }
 
-
 static inline bool rxrpc_queue_conn(struct rxrpc_connection *conn)
 {
        if (!rxrpc_get_connection_maybe(conn))
@@ -796,6 +827,7 @@ extern unsigned int rxrpc_idle_ack_delay;
 extern unsigned int rxrpc_rx_window_size;
 extern unsigned int rxrpc_rx_mtu;
 extern unsigned int rxrpc_rx_jumbo_max;
+extern unsigned int rxrpc_resend_timeout;
 
 extern const char *const rxrpc_pkts[];
 extern const s8 rxrpc_ack_priority[];
@@ -805,10 +837,8 @@ extern const char *rxrpc_acks(u8 reason);
 /*
  * output.c
  */
-extern unsigned int rxrpc_resend_timeout;
-
+int rxrpc_send_call_packet(struct rxrpc_call *, u8);
 int rxrpc_send_data_packet(struct rxrpc_connection *, struct sk_buff *);
-int rxrpc_do_sendmsg(struct rxrpc_sock *, struct msghdr *, size_t);
 
 /*
  * peer_event.c
@@ -853,7 +883,6 @@ extern const struct file_operations rxrpc_connection_seq_fops;
 /*
  * recvmsg.c
  */
-void rxrpc_remove_user_ID(struct rxrpc_sock *, struct rxrpc_call *);
 int rxrpc_recvmsg(struct socket *, struct msghdr *, size_t, int);
 
 /*
@@ -871,9 +900,15 @@ void rxrpc_exit_security(void);
 int rxrpc_init_client_conn_security(struct rxrpc_connection *);
 int rxrpc_init_server_conn_security(struct rxrpc_connection *);
 
+/*
+ * sendmsg.c
+ */
+int rxrpc_do_sendmsg(struct rxrpc_sock *, struct msghdr *, size_t);
+
 /*
  * skbuff.c
  */
+void rxrpc_kernel_data_consumed(struct rxrpc_call *, struct sk_buff *);
 void rxrpc_packet_destructor(struct sk_buff *);
 void rxrpc_new_skb(struct sk_buff *);
 void rxrpc_see_skb(struct sk_buff *);
This page took 0.029482 seconds and 5 git commands to generate.