From patchwork Wed Sep 22 08:31:46 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 65408 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 0C2A4B6F07 for ; Wed, 22 Sep 2010 18:32:05 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752411Ab0IVIbz (ORCPT ); Wed, 22 Sep 2010 04:31:55 -0400 Received: from mail-fx0-f46.google.com ([209.85.161.46]:41136 "EHLO mail-fx0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752017Ab0IVIbw (ORCPT ); Wed, 22 Sep 2010 04:31:52 -0400 Received: by fxm3 with SMTP id 3so140737fxm.19 for ; Wed, 22 Sep 2010 01:31:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:subject:from:to:cc :in-reply-to:references:content-type:date:message-id:mime-version :x-mailer:content-transfer-encoding; bh=QnDqccpRCcTKlmBJTmN/y6iXADZPC/UoGe3zOM22mzQ=; b=nZVaYmQbJU+SZEf/jdH7S3t0ypLlRxe9Xf8jp8dbgWzA/Iz0z/0RTQjSsYwckYiUC0 GNECirbxpxLEz4t1My+Bkhcivv6NdIjCTmIaFpni0jIFHNeVqYQ22/RD0/Gv5lLlbwnR CLcoEwAhryT9xtOn/Z3c7iX7D5L5WlDBZRiVw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:to:cc:in-reply-to:references:content-type:date :message-id:mime-version:x-mailer:content-transfer-encoding; b=gJEMfoS54JGZSLXvMduD1mrk0T1Hq2M7D4UqLCSSMjfLEAuIs7vMsLzPzyLxLaU6IW Dzmw0yzvMAIrka7UuNnhw4V373REGmac/QiX+XgwHv8Ateg13S5bpnG9NkVapQW3ZDvV 7CBD6nU8k4jGYctFNYGFWKF8J5Y6YDknlwy/Q= Received: by 10.223.112.204 with SMTP id x12mr2317380fap.24.1285144310538; Wed, 22 Sep 2010 01:31:50 -0700 (PDT) Received: from [10.150.51.215] (gw0.net.jmsp.net [212.23.165.14]) by mx.google.com with ESMTPS id t6sm4090424faa.3.2010.09.22.01.31.48 (version=SSLv3 cipher=RC4-MD5); Wed, 22 Sep 2010 01:31:48 -0700 (PDT) Subject: Re: [2.6.36-rc5] INET?: possible irq lock inversion dependency From: Eric Dumazet To: Tetsuo Handa Cc: linux-fsdevel@vger.kernel.org, netdev@vger.kernel.org In-Reply-To: <201009220714.o8M7Ebps067361@www262.sakura.ne.jp> References: <201006242053.IAG26562.JHQFFOMSVFtOLO@I-love.SAKURA.ne.jp> <201009072132.FHA93457.MHOJFQOOFLVStF@I-love.SAKURA.ne.jp> <201009210651.o8L6pbkP038129@www262.sakura.ne.jp> <1285055760.2617.27.camel@edumazet-laptop> <201009210910.o8L9Anaf071504@www262.sakura.ne.jp> <1285061757.2617.176.camel@edumazet-laptop> <1285064011.2617.238.camel@edumazet-laptop> <201009220714.o8M7Ebps067361@www262.sakura.ne.jp> Date: Wed, 22 Sep 2010 10:31:46 +0200 Message-ID: <1285144306.2639.90.camel@edumazet-laptop> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Le mercredi 22 septembre 2010 à 16:14 +0900, Tetsuo Handa a écrit : > I established steps to reproduce this warning using clean 2.6.36-rc5 . > > [ 37.539697] ========================================================= > [ 37.541991] [ INFO: possible irq lock inversion dependency detected ] > [ 37.541991] 2.6.36-rc5 #1 > [ 37.541991] --------------------------------------------------------- > [ 37.541991] mount/2681 just changed the state of lock: > [ 37.541991] (clock-AF_INET){++.?..}, at: [] xs_udp_write_space+0x1c/0x50 > [ 37.541991] but this lock was taken by another, SOFTIRQ-safe lock in the past: > [ 37.541991] (slock-AF_INET){+.-...} > [ 37.541991] > [ 37.541991] and interrupts could create inverse lock ordering between them. > [ 37.541991] > [ 37.541991] > [ 37.541991] other info that might help us debug this: > [ 37.541991] no locks held by mount/2681. > [ 37.541991] > [ 37.541991] the shortest dependencies between 2nd lock and 1st lock: > [ 37.541991] -> (slock-AF_INET){+.-...} ops: 562 { > [ 37.541991] HARDIRQ-ON-W at: > [ 37.541991] [] mark_irqflags+0xfe/0x180 > [ 37.541991] [] __lock_acquire+0x38d/0x8e0 > [ 37.541991] [] lock_acquire+0x7a/0xa0 > [ 37.541991] [] _raw_spin_lock_bh+0x3e/0x80 > [ 37.541991] [] lock_sock_fast+0x29/0x90 > [ 37.541991] [] udp_destroy_sock+0x14/0x40 > [ 37.541991] [] sk_common_release+0xb3/0xc0 > [ 37.541991] [] udp_lib_close+0x8/0x10 > [ 37.541991] [] inet_release+0xbe/0x100 > [ 37.541991] [] sock_release+0x66/0x80 > [ 37.541991] [] sock_close+0x12/0x30 > [ 37.541991] [] __fput+0x1cb/0x240 > [ 37.541991] [] fput+0x19/0x20 > [ 37.541991] [] filp_close+0x43/0x70 > [ 37.541991] [] close_files+0xad/0x150 > [ 37.541991] [] put_files_struct+0x29/0xf0 > [ 37.541991] [] exit_files+0x40/0x50 > [ 37.541991] [] do_exit+0x116/0x2e0 > [ 37.541991] [] do_group_exit+0x34/0xb0 > [ 37.541991] [] sys_exit_group+0xf/0x20 > [ 37.541991] [] syscall_call+0x7/0xb > [ 37.541991] IN-SOFTIRQ-W at: > [ 37.541991] [] mark_irqflags+0x11e/0x180 > [ 37.541991] [] __lock_acquire+0x38d/0x8e0 > [ 37.541991] [] lock_acquire+0x7a/0xa0 > [ 37.541991] [] _raw_spin_lock+0x39/0x70 > [ 37.541991] [] sk_clone+0xb1/0x2c0 > [ 37.541991] [] inet_csk_clone+0x1a/0xb0 > [ 37.541991] [] tcp_create_openreq_child+0x1c/0x460 > [ 37.541991] [] tcp_v4_syn_recv_sock+0x3f/0x1e0 > [ 37.940862] [] tcp_check_req+0x18c/0x3b0 > [ 37.940862] [] tcp_v4_hnd_req+0x4d/0x160 > [ 37.940862] [] tcp_v4_do_rcv+0x159/0x280 > [ 37.940862] [] tcp_v4_rcv+0x574/0xa30 > [ 37.940862] [] ip_local_deliver_finish+0x103/0x320 > [ 37.940862] [] ip_local_deliver+0x30/0x40 > [ 37.940862] [] ip_rcv_finish+0x169/0x480 > [ 37.940862] [] ip_rcv+0x19a/0x2b0 > [ 37.940862] [] __netif_receive_skb+0x21d/0x310 > [ 37.940862] [] process_backlog+0x88/0x160 > [ 37.940862] [] net_rx_action+0x127/0x140 > [ 37.940862] [] __do_softirq+0xd0/0x130 > [ 37.940862] INITIAL USE at: > [ 37.940862] [] __lock_acquire+0x1c0/0x8e0 > [ 37.940862] [] lock_acquire+0x7a/0xa0 > [ 37.940862] [] _raw_spin_lock_bh+0x3e/0x80 > [ 37.940862] [] lock_sock_fast+0x29/0x90 > [ 37.940862] [] udp_destroy_sock+0x14/0x40 > [ 37.940862] [] sk_common_release+0xb3/0xc0 > [ 37.940862] [] udp_lib_close+0x8/0x10 > [ 37.940862] [] inet_release+0xbe/0x100 > [ 37.940862] [] sock_release+0x66/0x80 > [ 37.940862] [] sock_close+0x12/0x30 > [ 37.940862] [] __fput+0x1cb/0x240 > [ 37.940862] [] fput+0x19/0x20 > [ 37.940862] [] filp_close+0x43/0x70 > [ 37.940862] [] close_files+0xad/0x150 > [ 37.940862] [] put_files_struct+0x29/0xf0 > [ 37.940862] [] exit_files+0x40/0x50 > [ 37.940862] [] do_exit+0x116/0x2e0 > [ 37.940862] [] do_group_exit+0x34/0xb0 > [ 37.940862] [] sys_exit_group+0xf/0x20 > [ 37.940862] [] syscall_call+0x7/0xb > [ 37.940862] } > [ 37.940862] ... key at: [] af_family_slock_keys+0x10/0x140 > [ 37.940862] ... acquired at: > [ 37.940862] [] check_prevs_add+0xab/0x100 > [ 37.940862] [] validate_chain+0x305/0x5a0 > [ 37.940862] [] __lock_acquire+0x2ad/0x8e0 > [ 37.940862] [] lock_acquire+0x7a/0xa0 > [ 37.940862] [] _raw_write_lock_bh+0x3e/0x80 > [ 37.940862] [] inet_csk_listen_stop+0x86/0x160 > [ 37.940862] [] tcp_close+0x382/0x390 > [ 37.940862] [] inet_release+0xbe/0x100 > [ 37.940862] [] sock_release+0x66/0x80 > [ 37.940862] [] sock_close+0x12/0x30 > [ 37.940862] [] __fput+0x1cb/0x240 > [ 37.940862] [] fput+0x19/0x20 > [ 37.940862] [] filp_close+0x43/0x70 > [ 37.940862] [] sys_close+0x6d/0x110 > [ 37.940862] [] syscall_call+0x7/0xb > [ 37.940862] > [ 37.940862] -> (clock-AF_INET){++.?..} ops: 72 { > [ 37.940862] HARDIRQ-ON-W at: > [ 37.940862] [] mark_irqflags+0xfe/0x180 > [ 37.940862] [] __lock_acquire+0x38d/0x8e0 > [ 37.940862] [] lock_acquire+0x7a/0xa0 > [ 37.940862] [] _raw_write_lock_bh+0x3e/0x80 > [ 37.940862] [] sk_common_release+0x2f/0xc0 > [ 37.940862] [] udp_lib_close+0x8/0x10 > [ 37.940862] [] inet_release+0xbe/0x100 > [ 37.940862] [] sock_release+0x66/0x80 > [ 37.940862] [] sock_close+0x12/0x30 > [ 37.940862] [] __fput+0x1cb/0x240 > [ 37.940862] [] fput+0x19/0x20 > [ 37.940862] [] filp_close+0x43/0x70 > [ 37.940862] [] close_files+0xad/0x150 > [ 37.940862] [] put_files_struct+0x29/0xf0 > [ 37.940862] [] exit_files+0x40/0x50 > [ 37.940862] [] do_exit+0x116/0x2e0 > [ 37.940862] [] do_group_exit+0x34/0xb0 > [ 37.940862] [] sys_exit_group+0xf/0x20 > [ 37.940862] [] syscall_call+0x7/0xb > [ 37.940862] HARDIRQ-ON-R at: > [ 37.940862] [] mark_irqflags+0x6e/0x180 > [ 37.940862] [] __lock_acquire+0x38d/0x8e0 > [ 37.940862] [] lock_acquire+0x7a/0xa0 > [ 37.940862] [] _raw_read_lock+0x39/0x70 > [ 37.940862] [] xs_tcp_state_change+0x1e/0x1d0 > [ 37.940862] [] tcp_rcv_synsent_state_process+0x398/0x590 > [ 37.940862] [] tcp_rcv_state_process+0x4a7/0x560 > [ 37.940862] [] tcp_v4_do_rcv+0x71/0x280 > [ 37.940862] [] __release_sock+0x66/0x150 > [ 37.940862] [] release_sock+0x87/0x90 > [ 37.940862] [] inet_stream_connect+0x5a/0x1b0 > [ 37.940862] [] kernel_connect+0x18/0x30 > [ 37.940862] [] xs_tcp_finish_connecting+0x4e/0x120 > [ 37.940862] [] xs_tcp_setup_socket+0x5b/0x180 > [ 37.940862] [] xs_tcp_connect_worker4+0x14/0x20 > [ 37.940862] [] process_one_work+0x147/0x3a0 > [ 37.940862] [] worker_thread+0xa6/0x200 > [ 37.940862] [] kthread+0x75/0x80 > [ 37.940862] [] kernel_thread_helper+0x6/0x1c > [ 37.940862] IN-SOFTIRQ-R at: > [ 37.940862] [] mark_irqflags+0x11e/0x180 > [ 37.940862] [] __lock_acquire+0x38d/0x8e0 > [ 37.940862] [] lock_acquire+0x7a/0xa0 > [ 37.940862] [] _raw_read_lock+0x39/0x70 > [ 37.940862] [] xs_tcp_data_ready+0x21/0x90 > [ 37.940862] [] tcp_data_queue+0x248/0x820 > [ 37.940862] [] tcp_rcv_established+0xae/0x4e0 > [ 37.940862] [] tcp_v4_do_rcv+0x1d1/0x280 > [ 37.940862] [] tcp_v4_rcv+0x574/0xa30 > [ 37.940862] [] ip_local_deliver_finish+0x103/0x320 > [ 37.940862] [] ip_local_deliver+0x30/0x40 > [ 37.940862] [] ip_rcv_finish+0x169/0x480 > [ 37.940862] [] ip_rcv+0x19a/0x2b0 > [ 37.940862] [] __netif_receive_skb+0x21d/0x310 > [ 37.940862] [] process_backlog+0x88/0x160 > [ 37.940862] [] net_rx_action+0x127/0x140 > [ 37.940862] [] __do_softirq+0xd0/0x130 > [ 37.940862] SOFTIRQ-ON-R at: > [ 37.940862] [] mark_irqflags+0xe2/0x180 > [ 37.940862] [] __lock_acquire+0x38d/0x8e0 > [ 37.940862] [] lock_acquire+0x7a/0xa0 > [ 37.940862] [] _raw_read_lock+0x39/0x70 > [ 37.940862] [] xs_udp_write_space+0x1c/0x50 > [ 37.940862] [] xs_udp_do_set_buffer_size+0x8a/0x90 > [ 37.940862] [] xs_udp_set_buffer_size+0x3d/0x40 > [ 37.940862] [] rpc_setbufsize+0x28/0x30 > [ 37.940862] [] nfs_server_set_fsinfo+0x364/0x400 [nfs] > [ 37.940862] [] nfs_probe_fsinfo+0x65/0x100 [nfs] > [ 37.940862] [] nfs_create_server+0x87/0x240 [nfs] > [ 37.940862] [] nfs_get_sb+0x8b/0x240 [nfs] > [ 37.940862] [] vfs_kern_mount+0x71/0x190 > [ 37.940862] [] do_kern_mount+0x37/0x90 > [ 37.940862] [] do_new_mount+0x57/0xa0 > [ 37.940862] [] do_mount+0x171/0x1b0 > [ 37.940862] [] sys_mount+0x6c/0xa0 > [ 37.940862] [] syscall_call+0x7/0xb > [ 37.940862] INITIAL USE at: > [ 37.940862] [] __lock_acquire+0x1c0/0x8e0 > [ 37.940862] [] lock_acquire+0x7a/0xa0 > [ 37.940862] [] _raw_write_lock_bh+0x3e/0x80 > [ 37.940862] [] sk_common_release+0x2f/0xc0 > [ 37.940862] [] udp_lib_close+0x8/0x10 > [ 37.940862] [] inet_release+0xbe/0x100 > [ 37.940862] [] sock_release+0x66/0x80 > [ 37.940862] [] sock_close+0x12/0x30 > [ 37.940862] [] __fput+0x1cb/0x240 > [ 37.940862] [] fput+0x19/0x20 > [ 37.940862] [] filp_close+0x43/0x70 > [ 37.940862] [] close_files+0xad/0x150 > [ 37.940862] [] put_files_struct+0x29/0xf0 > [ 37.940862] [] exit_files+0x40/0x50 > [ 37.940862] [] do_exit+0x116/0x2e0 > [ 37.940862] [] do_group_exit+0x34/0xb0 > [ 37.940862] [] sys_exit_group+0xf/0x20 > [ 37.940862] [] syscall_call+0x7/0xb > [ 37.940862] } > [ 37.940862] ... key at: [] af_callback_keys+0x10/0x130 > [ 37.940862] ... acquired at: > [ 37.940862] [] check_usage_backwards+0x76/0xd0 > [ 37.940862] [] mark_lock_irq+0x99/0x240 > [ 37.940862] [] mark_lock+0x21c/0x3c0 > [ 37.940862] [] mark_irqflags+0xe2/0x180 > [ 37.940862] [] __lock_acquire+0x38d/0x8e0 > [ 37.940862] [] lock_acquire+0x7a/0xa0 > [ 37.940862] [] _raw_read_lock+0x39/0x70 > [ 37.940862] [] xs_udp_write_space+0x1c/0x50 > [ 37.940862] [] xs_udp_do_set_buffer_size+0x8a/0x90 > [ 37.940862] [] xs_udp_set_buffer_size+0x3d/0x40 > [ 37.940862] [] rpc_setbufsize+0x28/0x30 > [ 37.940862] [] nfs_server_set_fsinfo+0x364/0x400 [nfs] > [ 37.940862] [] nfs_probe_fsinfo+0x65/0x100 [nfs] > [ 37.940862] [] nfs_create_server+0x87/0x240 [nfs] > [ 37.940862] [] nfs_get_sb+0x8b/0x240 [nfs] > [ 37.940862] [] vfs_kern_mount+0x71/0x190 > [ 37.940862] [] do_kern_mount+0x37/0x90 > [ 37.940862] [] do_new_mount+0x57/0xa0 > [ 37.940862] [] do_mount+0x171/0x1b0 > [ 37.940862] [] sys_mount+0x6c/0xa0 > [ 37.940862] [] syscall_call+0x7/0xb > [ 37.940862] > [ 37.940862] > [ 37.940862] stack backtrace: > [ 37.940862] Pid: 2681, comm: mount Not tainted 2.6.36-rc5 #1 > [ 37.940862] Call Trace: > [ 37.940862] [] ? printk+0x18/0x20 > [ 37.940862] [] print_irq_inversion_bug+0x108/0x120 > [ 37.940862] [] check_usage_backwards+0x76/0xd0 > [ 37.940862] [] mark_lock_irq+0x99/0x240 > [ 37.940862] [] ? check_usage_backwards+0x0/0xd0 > [ 37.940862] [] mark_lock+0x21c/0x3c0 > [ 37.940862] [] mark_irqflags+0xe2/0x180 > [ 37.940862] [] __lock_acquire+0x38d/0x8e0 > [ 37.940862] [] ? mempool_free_slab+0xe/0x10 > [ 37.940862] [] ? mempool_free+0x98/0xa0 > [ 37.940862] [] lock_acquire+0x7a/0xa0 > [ 37.940862] [] ? xs_udp_write_space+0x1c/0x50 > [ 37.940862] [] _raw_read_lock+0x39/0x70 > [ 37.940862] [] ? xs_udp_write_space+0x1c/0x50 > [ 37.940862] [] xs_udp_write_space+0x1c/0x50 > [ 37.940862] [] xs_udp_do_set_buffer_size+0x8a/0x90 > [ 37.940862] [] xs_udp_set_buffer_size+0x3d/0x40 > [ 37.940862] [] ? xs_udp_set_buffer_size+0x0/0x40 > [ 37.940862] [] rpc_setbufsize+0x28/0x30 > [ 37.940862] [] nfs_server_set_fsinfo+0x364/0x400 [nfs] > [ 37.940862] [] nfs_probe_fsinfo+0x65/0x100 [nfs] > [ 37.940862] [] ? cache_alloc_debugcheck_after+0x98/0x1d0 > [ 37.940862] [] ? nfs_alloc_fattr+0x23/0x30 [nfs] > [ 37.940862] [] nfs_create_server+0x87/0x240 [nfs] > [ 37.940862] [] ? nfs_alloc_fhandle+0x15/0x30 [nfs] > [ 37.940862] [] nfs_get_sb+0x8b/0x240 [nfs] > [ 37.940862] [] ? nfs_compare_super+0x0/0x90 [nfs] > [ 37.940862] [] vfs_kern_mount+0x71/0x190 > [ 37.940862] [] ? get_fs_type+0x8c/0xa0 > [ 37.940862] [] do_kern_mount+0x37/0x90 > [ 37.940862] [] do_new_mount+0x57/0xa0 > [ 37.940862] [] do_mount+0x171/0x1b0 > [ 37.940862] [] sys_mount+0x6c/0xa0 > [ 37.940862] [] syscall_call+0x7/0xb > > Boot and login and run test.sh below > > --- test.sh start --- > #! /bin/sh > ./a.out > echo 1 > /proc/sys/kernel/printk_delay > mount 127.0.0.1:/usr/src/ /mnt/ > umount /mnt/ > --- test.sh end --- > > where a.out is made by "gcc -Wall -O3 test.c" > > --- test.c start --- > #include > #include > #include > #include > #include > > int main(int argc, char *argv[]) > { > int fd1 = socket(AF_INET, SOCK_STREAM, 0); > int fd2 = socket(AF_INET, SOCK_STREAM, 0); > struct sockaddr_in addr = { }; > socklen_t size = sizeof(addr); > addr.sin_family = AF_INET; > addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); > addr.sin_port = htons(0); > bind(fd1, (struct sockaddr *) &addr, sizeof(addr)); > listen(fd1, 5); > getsockname(fd1, (struct sockaddr *) &addr, &size); > connect(fd2, (struct sockaddr *) &addr, sizeof(addr)); > close(fd1); > close(fd2); > return 0; > } > --- test.c end --- > > Config is at http://I-love.SAKURA.ne.jp/tmp/config-2.6.36-rc5 > Full log is at http://I-love.SAKURA.ne.jp/tmp/dmesg-2.6.36-rc5.txt > > I'm using Debian Sarge on i686. > > Regards. Thanks no splat here using your script/program And I dont really understand why a mixed udp & tcp workload could trigger a lockdep splat. Ah, all sockets of a same family (AF_INET in your case) share a single af_callback_keys : commit da21f24dd7395 said so. Problem is about sk_callback_lock, not the lock_sock_fast() I wonder if we dont need to use a separate "struct lock_class_key" per protocol (stored in struct proto) ... Could you try following interim patch ? Thanks --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/include/net/sock.h b/include/net/sock.h index adab9dc..c5104bc 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -800,6 +800,7 @@ struct proto { #ifdef SOCK_REFCNT_DEBUG atomic_t socks; #endif + struct lock_class_key *callback_key; }; extern int proto_register(struct proto *prot, int alloc_slab); diff --git a/net/core/sock.c b/net/core/sock.c index b05b9b6..afd0f69 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1210,7 +1210,9 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority) spin_lock_init(&newsk->sk_dst_lock); rwlock_init(&newsk->sk_callback_lock); lockdep_set_class_and_name(&newsk->sk_callback_lock, - af_callback_keys + newsk->sk_family, + sk->sk_prot->callback_key ? + sk->sk_prot->callback_key : + af_callback_keys + newsk->sk_family, af_family_clock_key_strings[newsk->sk_family]); newsk->sk_dst_cache = NULL; @@ -1965,6 +1967,9 @@ void sock_init_data(struct socket *sock, struct sock *sk) spin_lock_init(&sk->sk_dst_lock); rwlock_init(&sk->sk_callback_lock); lockdep_set_class_and_name(&sk->sk_callback_lock, + sk->sk_prot->callback_key ? + sk->sk_prot->callback_key : + af_callback_keys + newsk->sk_family, af_callback_keys + sk->sk_family, af_family_clock_key_strings[sk->sk_family]); diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index fb23c2e..c0877b6 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1870,6 +1870,8 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait) } EXPORT_SYMBOL(udp_poll); +static struct lock_class_key udp_callback_key; + struct proto udp_prot = { .name = "UDP", .owner = THIS_MODULE, @@ -1899,6 +1901,7 @@ struct proto udp_prot = { .compat_setsockopt = compat_udp_setsockopt, .compat_getsockopt = compat_udp_getsockopt, #endif + .callback_key = &udp_callback_key, }; EXPORT_SYMBOL(udp_prot); diff --git a/net/ipv4/udplite.c b/net/ipv4/udplite.c index ab76aa9..51b159d 100644 --- a/net/ipv4/udplite.c +++ b/net/ipv4/udplite.c @@ -32,6 +32,8 @@ static const struct net_protocol udplite_protocol = { .netns_ok = 1, }; +static struct lock_class_key udplite_callback_key; + struct proto udplite_prot = { .name = "UDP-Lite", .owner = THIS_MODULE, @@ -57,6 +59,7 @@ struct proto udplite_prot = { .compat_setsockopt = compat_udp_setsockopt, .compat_getsockopt = compat_udp_getsockopt, #endif + .callback_key = &udplite_callback_key, }; EXPORT_SYMBOL(udplite_prot); diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 5acb356..0777934 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -1441,6 +1441,8 @@ void udp6_proc_exit(struct net *net) { /* ------------------------------------------------------------------------ */ +static struct lock_class_key udp6_callback_key; + struct proto udpv6_prot = { .name = "UDPv6", .owner = THIS_MODULE, @@ -1469,6 +1471,7 @@ struct proto udpv6_prot = { .compat_setsockopt = compat_udpv6_setsockopt, .compat_getsockopt = compat_udpv6_getsockopt, #endif + .callback_key = &udp6_callback_key, }; static struct inet_protosw udpv6_protosw = { diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c index 5f48fad..7bbb627 100644 --- a/net/ipv6/udplite.c +++ b/net/ipv6/udplite.c @@ -31,6 +31,8 @@ static const struct inet6_protocol udplitev6_protocol = { .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, }; +static struct lock_class_key udp6lite_callback_key; + struct proto udplitev6_prot = { .name = "UDPLITEv6", .owner = THIS_MODULE, @@ -55,6 +57,7 @@ struct proto udplitev6_prot = { .compat_setsockopt = compat_udpv6_setsockopt, .compat_getsockopt = compat_udpv6_getsockopt, #endif + .callback_key = &udp6lite_callback_key, }; static struct inet_protosw udplite6_protosw = {